Quick reference for SQL developers — 90+ queries
Showing all commands
SELECT * FROM users;SELECT name, email FROM users;SELECT DISTINCT city FROM users;SELECT * FROM users WHERE age > 25;SELECT * FROM users WHERE name LIKE '%john%';SELECT * FROM users WHERE age BETWEEN 20 AND 30;SELECT * FROM users WHERE city IN ('NYC', 'LA');SELECT * FROM users WHERE email IS NOT NULL;SELECT * FROM users ORDER BY name ASC;SELECT * FROM users LIMIT 10 OFFSET 20;SELECT name AS full_name FROM users;SELECT * FROM users u
INNER JOIN orders o ON u.id = o.user_id;SELECT * FROM users u
LEFT JOIN orders o ON u.id = o.user_id;SELECT * FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;SELECT * FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;SELECT * FROM users u
CROSS JOIN products p;SELECT * FROM employees e
JOIN employees m ON e.manager_id = m.id;SELECT * FROM users u
JOIN orders o USING (user_id);SELECT COUNT(*) FROM users;SELECT COUNT(DISTINCT city) FROM users;SELECT SUM(amount) FROM orders;SELECT AVG(salary) FROM employees;SELECT MIN(price), MAX(price) FROM products;SELECT city, COUNT(*) FROM users
GROUP BY city;SELECT city, COUNT(*) FROM users
GROUP BY city HAVING COUNT(*) > 5;SELECT dept, AVG(salary) avg_sal FROM emp
GROUP BY dept ORDER BY avg_sal DESC;INSERT INTO users (name, email)
VALUES ('John', 'john@example.com');INSERT INTO users (name, email) VALUES
('John', 'j@e.com'), ('Jane', 'ja@e.com');INSERT INTO archive SELECT * FROM users
WHERE created_at < '2024-01-01';UPDATE users SET name = 'Jane'
WHERE id = 1;UPDATE users SET active = false
WHERE last_login < '2024-01-01';DELETE FROM users WHERE id = 1;TRUNCATE TABLE temp_data;INSERT INTO users (id, name) VALUES (1, 'John')
ON CONFLICT (id) DO UPDATE SET name = 'John';SELECT * FROM users WHERE id IN
(SELECT user_id FROM orders);SELECT *, (SELECT COUNT(*) FROM orders o
WHERE o.user_id = u.id) AS order_count
FROM users u;SELECT * FROM users WHERE EXISTS
(SELECT 1 FROM orders WHERE user_id = users.id);WITH active AS (
SELECT * FROM users WHERE active = true
)
SELECT * FROM active WHERE age > 25;WITH RECURSIVE tree AS (
SELECT id, name, parent_id, 0 AS depth FROM categories WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.name, c.parent_id, t.depth + 1 FROM categories c JOIN tree t ON c.parent_id = t.id
)
SELECT * FROM tree;SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;SELECT dept, name, salary,
RANK() OVER (PARTITION BY dept ORDER BY salary DESC)
FROM employees;SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC)
FROM employees;SELECT date, amount,
SUM(amount) OVER (ORDER BY date) AS running_total
FROM sales;SELECT date, amount,
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM sales;SELECT name, salary,
LAG(salary) OVER (ORDER BY hire_date) AS prev_salary,
LEAD(salary) OVER (ORDER BY hire_date) AS next_salary
FROM employees;SELECT dept, name, salary,
NTILE(4) OVER (ORDER BY salary) AS quartile
FROM employees;CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);ALTER TABLE users ADD COLUMN phone VARCHAR(20);ALTER TABLE users DROP COLUMN phone;ALTER TABLE users RENAME COLUMN name TO full_name;ALTER TABLE users ALTER COLUMN name TYPE TEXT;DROP TABLE IF EXISTS temp_data;CREATE TABLE orders_backup AS
SELECT * FROM orders;CREATE INDEX idx_email ON users(email);CREATE UNIQUE INDEX idx_email ON users(email);CREATE INDEX idx_comp ON orders(user_id, status);DROP INDEX idx_email;EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'a@b.com';CREATE INDEX idx_gin ON docs USING GIN(tags);SELECT name FROM employees
UNION
SELECT name FROM contractors;SELECT name FROM employees
UNION ALL
SELECT name FROM contractors;SELECT id FROM set_a
INTERSECT
SELECT id FROM set_b;SELECT id FROM set_a
EXCEPT
SELECT id FROM set_b;SELECT CONCAT(first_name, ' ', last_name) FROM users;SELECT UPPER(name), LOWER(email) FROM users;SELECT LENGTH(name) FROM users;SELECT SUBSTRING(name FROM 1 FOR 3) FROM users;SELECT TRIM(' hello ');SELECT REPLACE(name, 'old', 'new') FROM users;SELECT COALESCE(phone, email, 'N/A') FROM users;SELECT NOW();SELECT EXTRACT(YEAR FROM created_at) FROM users;SELECT DATE_TRUNC('month', created_at) FROM users;SELECT AGE(NOW(), created_at) FROM users;SELECT CASE
WHEN age < 18 THEN 'minor'
WHEN age < 65 THEN 'adult'
ELSE 'senior'
END AS category FROM users;CREATE VIEW active_users AS
SELECT * FROM users WHERE active = true;CREATE OR REPLACE VIEW v AS SELECT ...;DROP VIEW IF EXISTS active_users;CREATE MATERIALIZED VIEW mv AS
SELECT dept, AVG(salary) FROM emp GROUP BY dept;REFRESH MATERIALIZED VIEW mv;BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;ROLLBACK;SAVEPOINT sp1;
-- ... operations ...
ROLLBACK TO sp1;SELECT data->>'name' FROM users;SELECT data->'address'->>'city' FROM users;SELECT * FROM users WHERE data @> '{"role":"admin"}';SELECT jsonb_array_elements(data->'tags') FROM posts;UPDATE users SET data = data || '{"verified":true}';