Ultimate MySQL Handbook
Welcome to the complete, beginner-to-advanced guide to MySQL. This handbook covers everything from installation to powerful SQL features like joins, views, subqueries, triggers, and performance tips.
๐ Installing MySQL
Windows/macOS
- Download: MySQL Installer
- Choose Developer Default
- Set a root password
- Optionally install MySQL Workbench
Ubuntu/Linux
sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation
sudo mysql
Create a user:
CREATE USER 'suraj'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'suraj'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Login:
mysql -u suraj -p
๐งฑ MySQL Basics
What is a DBMS?
A DBMS (Database Management System) helps you create, retrieve, and manage data.
What is a Database?
Think of a database as a folder:
- Each table is like a file
- Each row is like a record
Creating a Database
CREATE DATABASE startersql;
USE startersql;
Creating a Table
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
gender ENUM('Male', 'Female', 'Other'),
date_of_birth DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Dropping a Database
DROP DATABASE startersql;
๐ฆ Data Types
INT
,DECIMAL(10,2)
VARCHAR(100)
ENUM('Male','Female','Other')
DATE
,TIMESTAMP
BOOLEAN
๐ Constraints
PRIMARY KEY
UNIQUE
NOT NULL
DEFAULT
AUTO_INCREMENT
CHECK
๐ CRUD Operations
Inserting Data
INSERT INTO users (name, email, gender, date_of_birth)
VALUES ('Alice', 'alice@example.com', 'Female', '1995-05-14');
Multiple Rows:
INSERT INTO users (name, email, gender, date_of_birth)
VALUES
('Bob', 'bob@example.com', 'Male', '1990-11-23'),
('Charlie', 'charlie@example.com', 'Other', '1988-02-17');
Selecting Data
SELECT * FROM users;
SELECT name, email FROM users;
With filters:
SELECT * FROM users WHERE gender = 'Male';
SELECT * FROM users WHERE date_of_birth BETWEEN '1990-01-01' AND '2000-12-31';
๐ฅฐ Updating & Deleting
Update
UPDATE users SET name = 'Alicia' WHERE id = 1;
UPDATE users SET salary = salary + 10000 WHERE salary < 60000;
Delete
DELETE FROM users WHERE id = 3;
DELETE FROM users; -- caution!
๐ Advanced Queries
Aggregate Functions
SELECT COUNT(*) FROM users;
SELECT AVG(salary), MIN(salary), MAX(salary) FROM users;
String Functions
SELECT LENGTH(name), UPPER(name), LOWER(name) FROM users;
SELECT CONCAT(name, ' <', email, '>') FROM users;
Date Functions
SELECT NOW(), YEAR(date_of_birth) FROM users;
SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS age FROM users;
Math & Logic
SELECT MOD(id, 2) AS is_even FROM users;
SELECT IF(gender = 'Female', 'Yes', 'No') AS is_female FROM users;
๐ Transactions
SET autocommit = 0;
UPDATE users SET salary = 80000 WHERE id = 5;
COMMIT; -- or ROLLBACK;
SET autocommit = 1;
๐ Relationships & Joins
Foreign Key
CREATE TABLE addresses (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
city VARCHAR(100),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
JOINS
-- INNER JOIN
SELECT users.name, addresses.city
FROM users
INNER JOIN addresses ON users.id = addresses.user_id;
-- LEFT JOIN
SELECT users.name, addresses.city
FROM users
LEFT JOIN addresses ON users.id = addresses.user_id;
๐ UNION & SELF JOIN
SELECT name FROM users
UNION
SELECT name FROM admin_users;
-- Self Join
SELECT a.name AS user, b.name AS referred_by
FROM users a
LEFT JOIN users b ON a.referred_by_id = b.id;
๐ Views
CREATE VIEW high_salary_users AS
SELECT id, name, salary FROM users WHERE salary > 70000;
SELECT * FROM high_salary_users;
DROP VIEW high_salary_users;
๐ Indexing
SHOW INDEXES FROM users;
CREATE INDEX idx_email ON users(email);
DROP INDEX idx_email ON users;
Multi-column:
CREATE INDEX idx_gender_salary ON users(gender, salary);
๐ค Subqueries
SELECT name FROM users
WHERE salary > (SELECT AVG(salary) FROM users);
SELECT name, salary,
(SELECT AVG(salary) FROM users) AS avg_salary
FROM users;
๐ GROUP BY & HAVING
SELECT gender, AVG(salary) FROM users GROUP BY gender;
SELECT gender, AVG(salary) FROM users GROUP BY gender HAVING AVG(salary) > 75000;
๐ Stored Procedures
DELIMITER $$
CREATE PROCEDURE AddUser(
IN p_name VARCHAR(100),
IN p_email VARCHAR(100),
IN p_gender ENUM('Male','Female','Other'),
IN p_dob DATE,
IN p_salary INT
)
BEGIN
INSERT INTO users (name, email, gender, date_of_birth, salary)
VALUES (p_name, p_email, p_gender, p_dob, p_salary);
END$$
DELIMITER ;
CALL AddUser('Kiran Sharma', 'kiran@example.com', 'Female', '1994-06-15', 72000);
๐จ Triggers
CREATE TABLE user_log (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
name VARCHAR(100),
created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DELIMITER $$
CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_log (user_id, name)
VALUES (NEW.id, NEW.name);
END$$
DELIMITER ;
๐ง Miscellaneous
Logical Operators
AND
,OR
,NOT
Wildcards
SELECT * FROM users WHERE name LIKE 'A%'; -- starts with A
DISTINCT
SELECT DISTINCT gender FROM users;
TRUNCATE
TRUNCATE TABLE users;
ALTER
ALTER TABLE users ADD COLUMN city VARCHAR(100);
ALTER TABLE users CHANGE COLUMN city location VARCHAR(150);
๐ Final Words
This handbook gives you everything you need to master MySQL for real-world applications โ whether you're building a full-stack app, data dashboard, or working with analytics.
Happy Querying! ๐
Written by
Suraj Kumar Jha
At
Tue Jul 15 2025