SQL Course
Cheatsheet
Un riferimento veloce — la sintassi essenziale di SQL su una pagina sola. Usa Ctrl/Cmd + P per stamparla.
SQL · Cheatsheet — eLearner.app
SELECT base
Lettura semplice
SELECT col1, col2 FROM tabella; SELECT * FROM tabella;Filtro WHERE
SELECT * FROM employees WHERE salary > 50000 AND city = 'Roma';AND / OR / NOT. Stringhe fra apici singoli.
Ordinamento
SELECT * FROM products ORDER BY price DESC, name ASC;Paginazione
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 20;DISTINCT
SELECT DISTINCT country FROM customers;Alias
SELECT first_name AS nome, last_name AS cognome FROM employees AS e;
Aggregati e GROUP BY
Funzioni aggregate
SELECT COUNT(*), AVG(price), SUM(stock), MAX(launched_on), MIN(price) FROM products;GROUP BY
SELECT category_id, COUNT(*) AS n, AVG(price) AS prezzo_medio FROM products GROUP BY category_id;HAVING
SELECT category_id, COUNT(*) AS n FROM products GROUP BY category_id HAVING COUNT(*) >= 3;WHERE filtra le righe, HAVING i gruppi.
JOIN
INNER JOIN
SELECT o.id, c.first_name FROM orders AS o JOIN customers AS c ON c.id = o.customer_id;LEFT / RIGHT / FULL OUTER
SELECT c.first_name, o.id FROM customers AS c LEFT JOIN orders AS o ON o.customer_id = c.id;Le righe senza match danno NULL nelle colonne dell’altra tabella.
Multi-JOIN
SELECT c.first_name, p.name, oi.quantity FROM customers AS c JOIN orders AS o ON o.customer_id = c.id JOIN order_items AS oi ON oi.order_id = o.id JOIN products AS p ON p.id = oi.product_id;Self-join
SELECT c.name AS figlia, p.name AS madre FROM categories AS c JOIN categories AS p ON p.id = c.parent_id;Set operations
SELECT city FROM customers UNION SELECT city FROM employees; -- anche: INTERSECT, EXCEPT, UNION ALL
Sintassi pratica
IN / NOT IN
WHERE country IN ('Italia', 'Spagna');BETWEEN
WHERE price BETWEEN 50 AND 200;Estremi inclusi.
IS NULL / COALESCE
WHERE shipped_at IS NULL; SELECT COALESCE(body, '(nessun testo)') FROM reviews;CASE WHEN
SELECT name, CASE WHEN price < 50 THEN 'economico' WHEN price < 200 THEN 'medio' ELSE 'premium' END AS fascia FROM products;Sottoquery
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);LIKE / ILIKE
WHERE email LIKE '%@example.com' OR name ILIKE 'cuffie%';
Funzioni utili
Stringa
LOWER(s), UPPER(s), LENGTH(s) CONCAT(a, ' ', b) -- oppure a || ' ' || b SUBSTRING(s FROM 1 FOR 3) TRIM(s), REPLACE(s, 'old', 'new')Numeriche
ROUND(x, 2), CEIL(x), FLOOR(x), ABS(x) MOD(a, b) -- oppure a % bData e ora
CURRENT_DATE, NOW() EXTRACT(YEAR FROM ordered_at) EXTRACT(MONTH FROM ordered_at) DATE_TRUNC('month', ordered_at) ordered_at + INTERVAL '7 days'CAST
CAST(price AS INTEGER) price::INTEGER -- shorthand PostgreSQL
Analitica
Window function
SELECT name, price, AVG(price) OVER (PARTITION BY category_id) AS media_categoria, RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank FROM products;Niente collapse delle righe come fa GROUP BY.
LAG / LEAD
SELECT ordered_at, total, LAG(total) OVER (ORDER BY ordered_at) AS precedente, LEAD(total) OVER (ORDER BY ordered_at) AS successivo FROM orders_summary;CTE (WITH)
WITH spesa AS ( SELECT customer_id, SUM(quantity * unit_price) AS tot FROM order_items oi JOIN orders o ON o.id = oi.order_id GROUP BY customer_id ) SELECT * FROM spesa WHERE tot > 500;WITH RECURSIVE
WITH RECURSIVE tree AS ( SELECT id, name, parent_id, 1 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 ORDER BY depth, id;
Scrivere e modificare i dati
INSERT
INSERT INTO customers (first_name, last_name, email, city, country, signed_up_on) VALUES ('Marco', 'Bianchi', 'm.b@example.com', 'Verona', 'Italia', CURRENT_DATE); INSERT INTO categories (name, parent_id) VALUES ('Gaming', 1) RETURNING id, name;UPDATE
UPDATE products SET price = price * 1.10 WHERE category_id = 5;Mai senza WHERE, se non vuoi davvero toccarle tutte.
DELETE
DELETE FROM reviews WHERE rating < 3;CREATE TABLE
CREATE TABLE wishlists ( id SERIAL PRIMARY KEY, customer_id INTEGER NOT NULL REFERENCES customers(id), product_id INTEGER NOT NULL REFERENCES products(id), added_on DATE NOT NULL DEFAULT CURRENT_DATE, UNIQUE (customer_id, product_id) );ALTER / DROP
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false; ALTER TABLE customers DROP COLUMN newsletter; DROP TABLE wishlists;Transazioni
BEGIN; UPDATE products SET stock = stock - 1 WHERE id = 1; UPDATE products SET stock = stock + 1 WHERE id = 2; COMMIT; -- oppure ROLLBACK;ACID: Atomicity, Consistency, Isolation, Durability.