Ultimate MySQL Handbook

A complete beginner-to-advanced guide on mastering MySQL, from installation and CRUD operations to joins, views, transactions, triggers, stored procedures, and performance optimization

Back

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

  1. Download: MySQL Installer
  2. Choose Developer Default
  3. Set a root password
  4. 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