SQL syntax highlighting
Example:
-- Retrieve all users
SELECT * FROM users;
-- Select specific columns
SELECT id, name, email FROM users WHERE active = 1;
Example:
-- Insert a new user
INSERT INTO users (name, email, created_at)
VALUES ('John Doe', 'john@example.com', NOW());
-- Insert multiple rows
INSERT INTO products (name, price, stock)
VALUES
('Widget', 19.99, 100),
('Gadget', 29.99, 50),
('Doohickey', 9.99, 200);
Example:
-- Update a single user
UPDATE users
SET name = 'Jane Smith', updated_at = NOW()
WHERE id = 42;
-- Update with calculations
UPDATE products
SET price = price * 1.1
WHERE category = 'electronics';
Example:
-- Delete a specific record
DELETE FROM users WHERE id = 999;
-- Delete with conditions
DELETE FROM logs
WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
Example:
-- Create a new table
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash CHAR(64) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_email (email),
INDEX idx_created (created_at)
);
-- Create table with foreign keys
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10, 2) NOT NULL,
status ENUM('pending', 'processing', 'completed', 'cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Example:
-- Add a new column
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Modify a column
ALTER TABLE users MODIFY COLUMN name VARCHAR(200) NOT NULL;
-- Drop a column
ALTER TABLE users DROP COLUMN temporary_field;
-- Add an index
ALTER TABLE users ADD INDEX idx_phone (phone);
Example:
-- INNER JOIN
SELECT u.name, o.total, o.created_at
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';
-- LEFT JOIN
SELECT u.id, u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
-- Multiple JOINs
SELECT
u.name AS customer_name,
o.id AS order_id,
p.name AS product_name,
oi.quantity,
oi.price
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.status = 'completed'
ORDER BY o.created_at DESC;
Example:
-- COUNT, SUM, AVG
SELECT
COUNT(*) AS total_orders,
SUM(total) AS total_revenue,
AVG(total) AS average_order_value,
MIN(total) AS smallest_order,
MAX(total) AS largest_order
FROM orders
WHERE status = 'completed';
-- GROUP BY with HAVING
SELECT
category,
COUNT(*) AS product_count,
AVG(price) AS avg_price
FROM products
GROUP BY category
HAVING COUNT(*) > 5
ORDER BY avg_price DESC;
Example:
-- Subquery in WHERE clause
SELECT name, email
FROM users
WHERE id IN (
SELECT DISTINCT user_id
FROM orders
WHERE total > 1000
);
-- Subquery in FROM clause
SELECT
category,
avg_price,
product_count
FROM (
SELECT
category,
AVG(price) AS avg_price,
COUNT(*) AS product_count
FROM products
GROUP BY category
) AS category_stats
WHERE product_count > 10;
-- Correlated subquery
SELECT u.name, u.email
FROM users u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id AND o.total > 500
);
Example:
-- ROW_NUMBER
SELECT
name,
category,
price,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS price_rank
FROM products;
-- Running totals
SELECT
date,
amount,
SUM(amount) OVER (ORDER BY date) AS running_total
FROM transactions;
-- LAG and LEAD
SELECT
date,
revenue,
LAG(revenue) OVER (ORDER BY date) AS previous_day,
LEAD(revenue) OVER (ORDER BY date) AS next_day,
revenue - LAG(revenue) OVER (ORDER BY date) AS day_over_day_change
FROM daily_revenue;
Example:
-- Simple CTE
WITH active_users AS (
SELECT id, name, email
FROM users
WHERE active = 1
)
SELECT
au.name,
COUNT(o.id) AS order_count
FROM active_users au
LEFT JOIN orders o ON au.id = o.user_id
GROUP BY au.id, au.name;
-- Recursive CTE
WITH RECURSIVE category_tree AS (
SELECT id, name, parent_id, 1 AS level
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.name, c.parent_id, ct.level + 1
FROM categories c
INNER JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree ORDER BY level, name;
Example:
-- Simple CASE
SELECT
name,
price,
CASE
WHEN price < 10 THEN 'Budget'
WHEN price < 50 THEN 'Standard'
WHEN price < 100 THEN 'Premium'
ELSE 'Luxury'
END AS price_category
FROM products;
-- CASE with aggregation
SELECT
category,
COUNT(*) AS total_products,
SUM(CASE WHEN price < 20 THEN 1 ELSE 0 END) AS budget_count,
SUM(CASE WHEN price >= 20 AND price < 100 THEN 1 ELSE 0 END) AS mid_range_count,
SUM(CASE WHEN price >= 100 THEN 1 ELSE 0 END) AS premium_count
FROM products
GROUP BY category;
Example:
-- Basic transaction
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- Transaction with rollback on error
BEGIN;
INSERT INTO orders (user_id, total) VALUES (42, 99.99);
SET @order_id = LAST_INSERT_ID();
INSERT INTO order_items (order_id, product_id, quantity, price)
VALUES (@order_id, 1, 2, 19.99);
-- If error occurs, rollback
-- ROLLBACK;
COMMIT;
Example:
-- Create indexes
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_status ON orders(status, created_at);
CREATE UNIQUE INDEX idx_username ON users(username);
-- Full-text index
CREATE FULLTEXT INDEX idx_product_description ON products(name, description);
-- Full-text search
SELECT * FROM products
WHERE MATCH(name, description) AGAINST ('widget gadget' IN BOOLEAN MODE);
-- Analyze query performance
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = 'completed';
Example:
-- Create a view
CREATE VIEW active_customers AS
SELECT
u.id,
u.name,
u.email,
COUNT(o.id) AS order_count,
SUM(o.total) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.active = 1
GROUP BY u.id, u.name, u.email;
-- Use the view
SELECT * FROM active_customers WHERE total_spent > 1000;
-- Drop a view
DROP VIEW IF EXISTS active_customers;