MySQL Cheat Sheet
Complete reference guide for MySQL with interactive examples and live playground links
Basic Operations
Database Operations
Basic database operations
MySQL
-- Create database
CREATE DATABASE mydb;
-- Use database
USE mydb;
-- Show databases
SHOW DATABASES;
-- Drop database
DROP DATABASE mydb;
-- Show tables
SHOW TABLES;
-- Show table structure
DESCRIBE users;
SHOW COLUMNS FROM users;
Table Operations
Table creation and modification
MySQL
-- Create table
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Alter table
ALTER TABLE users
ADD COLUMN phone VARCHAR(20),
MODIFY COLUMN name VARCHAR(150),
DROP COLUMN age;
-- Drop table
DROP TABLE users;
-- Truncate table
TRUNCATE TABLE users;
-- Rename table
RENAME TABLE old_name TO new_name;
Data Types
Common MySQL data types
MySQL
-- Numeric Types
INT, BIGINT, TINYINT, SMALLINT
DECIMAL(10,2), FLOAT, DOUBLE
-- String Types
CHAR(10), VARCHAR(255), TEXT
TINYTEXT, MEDIUMTEXT, LONGTEXT
-- Date and Time
DATE, TIME, DATETIME, TIMESTAMP
YEAR
-- Binary Types
BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB
-- Other Types
BOOLEAN, ENUM('value1', 'value2')
JSON, GEOMETRY
Queries
SELECT Queries
SELECT query patterns
MySQL
-- Basic SELECT
SELECT * FROM users;
-- Specific columns
SELECT name, email FROM users;
-- With conditions
SELECT * FROM users WHERE age > 18;
-- Sorting
SELECT * FROM users ORDER BY name ASC;
SELECT * FROM users ORDER BY age DESC, name ASC;
-- Limiting results
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10 OFFSET 20;
-- Distinct values
SELECT DISTINCT country FROM users;
-- Aliases
SELECT u.name AS user_name, p.title AS post_title
FROM users u
JOIN posts p ON u.id = p.user_id;
JOIN Operations
JOIN operations and patterns
MySQL
-- Inner Join
SELECT users.name, orders.order_number
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- Left Join
SELECT users.name, orders.order_number
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- Right Join
SELECT users.name, orders.order_number
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
-- Cross Join
SELECT users.name, products.name
FROM users
CROSS JOIN products;
-- Self Join
SELECT a.name AS employee, b.name AS manager
FROM employees a
LEFT JOIN employees b ON a.manager_id = b.id;
Aggregate Functions
Aggregate functions and grouping
MySQL
-- Basic aggregates
SELECT
COUNT(*) as total_users,
AVG(age) as average_age,
MAX(age) as max_age,
MIN(age) as min_age,
SUM(points) as total_points
FROM users;
-- Group By
SELECT
country,
COUNT(*) as user_count,
AVG(age) as avg_age
FROM users
GROUP BY country
HAVING COUNT(*) > 10;
-- With conditions
SELECT
department,
COUNT(*) as employee_count
FROM employees
WHERE salary > 50000
GROUP BY department;
Data Modifications
INSERT Operations
INSERT operations and patterns
MySQL
-- Single row insert
INSERT INTO users (name, email, age)
VALUES ('John Doe', 'john@example.com', 30);
-- Multiple rows
INSERT INTO users (name, email, age)
VALUES
('Jane Doe', 'jane@example.com', 25),
('Bob Smith', 'bob@example.com', 35);
-- Insert from select
INSERT INTO new_users (name, email)
SELECT name, email FROM old_users
WHERE status = 'active';
-- Insert ignore
INSERT IGNORE INTO users (email, name)
VALUES ('john@example.com', 'John Doe');
UPDATE Operations
UPDATE operations and patterns
MySQL
-- Basic update
UPDATE users
SET name = 'John Smith',
email = 'john.smith@example.com'
WHERE id = 1;
-- Update with join
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.total_orders = u.total_orders + 1
WHERE o.status = 'completed';
-- Update with limit
UPDATE users
SET status = 'inactive'
WHERE last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR)
LIMIT 1000;
-- Update with case
UPDATE products
SET price = CASE
WHEN category = 'premium' THEN price * 1.1
WHEN category = 'standard' THEN price * 1.05
ELSE price
END;
DELETE Operations
DELETE operations and patterns
MySQL
-- Basic delete
DELETE FROM users WHERE id = 1;
-- Delete with join
DELETE u FROM users u
JOIN inactive_users i ON u.id = i.user_id
WHERE i.last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR);
-- Delete with limit
DELETE FROM logs
WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 MONTH)
LIMIT 1000;
-- Delete with order
DELETE FROM users
WHERE status = 'inactive'
ORDER BY last_login ASC
LIMIT 100;
Advanced Features
Indexes
Index creation and management
MySQL
-- Create index
CREATE INDEX idx_email ON users(email);
-- Create unique index
CREATE UNIQUE INDEX idx_username ON users(username);
-- Create composite index
CREATE INDEX idx_name_age ON users(name, age);
-- Create fulltext index
CREATE FULLTEXT INDEX idx_content ON posts(content);
-- Drop index
DROP INDEX idx_email ON users;
-- Show indexes
SHOW INDEXES FROM users;
Transactions
Transaction management
MySQL
-- Basic transaction
START TRANSACTION;
INSERT INTO orders (user_id, total) VALUES (1, 100);
UPDATE users SET balance = balance - 100 WHERE id = 1;
COMMIT;
-- Transaction with rollback
START TRANSACTION;
INSERT INTO orders (user_id, total) VALUES (1, 100);
UPDATE users SET balance = balance - 100 WHERE id = 1;
IF (SELECT balance FROM users WHERE id = 1) < 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
-- Savepoints
START TRANSACTION;
INSERT INTO orders (user_id, total) VALUES (1, 100);
SAVEPOINT order_created;
UPDATE users SET balance = balance - 100 WHERE id = 1;
IF (SELECT balance FROM users WHERE id = 1) < 0 THEN
ROLLBACK TO SAVEPOINT order_created;
END IF;
COMMIT;
Stored Procedures
Stored procedures and functions
MySQL
-- Create procedure
DELIMITER //
CREATE PROCEDURE GetUserOrders(IN user_id INT)
BEGIN
SELECT o.*, p.name as product_name
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.user_id = user_id;
END //
DELIMITER ;
-- Call procedure
CALL GetUserOrders(1);
-- Procedure with parameters
DELIMITER //
CREATE PROCEDURE UpdateUserBalance(
IN user_id INT,
IN amount DECIMAL(10,2)
)
BEGIN
START TRANSACTION;
UPDATE users
SET balance = balance + amount
WHERE id = user_id;
INSERT INTO transactions (user_id, amount)
VALUES (user_id, amount);
COMMIT;
END //
DELIMITER ;
Optimization
Query Optimization
Query optimization techniques
MySQL
-- Explain query
EXPLAIN SELECT * FROM users WHERE email = 'john@example.com';
-- Force index
SELECT * FROM users FORCE INDEX (idx_email)
WHERE email = 'john@example.com';
-- Optimize table
OPTIMIZE TABLE users;
-- Analyze table
ANALYZE TABLE users;
-- Show process list
SHOW PROCESSLIST;
-- Kill process
KILL 123;
Performance Tuning
Performance tuning and monitoring
MySQL
-- Show variables
SHOW VARIABLES LIKE '%buffer%';
SHOW VARIABLES LIKE '%cache%';
-- Set variables
SET GLOBAL innodb_buffer_pool_size = 1073741824;
SET GLOBAL query_cache_size = 67108864;
-- Show status
SHOW STATUS LIKE '%Innodb_buffer%';
SHOW STATUS LIKE '%Threads%';
-- Show engine status
SHOW ENGINE INNODB STATUS;
-- Show table status
SHOW TABLE STATUS LIKE 'users';
Backup and Recovery
Backup and recovery procedures
MySQL
-- Create backup
mysqldump -u username -p database_name > backup.sql
-- Restore from backup
mysql -u username -p database_name < backup.sql
-- Backup specific tables
mysqldump -u username -p database_name table1 table2 > backup.sql
-- Backup with compression
mysqldump -u username -p database_name | gzip > backup.sql.gz
-- Restore compressed backup
gunzip < backup.sql.gz | mysql -u username -p database_name
-- Backup with conditions
mysqldump -u username -p --where="created_at > '2023-01-01'" database_name table_name > backup.sql
MySQL - Interactive Developer Reference
Hover over code blocks to copy or run in live playground