SQL — Cheat Sheet

Tag: sql, postgresql, mysql, indexing, transactions, database

Livello: intermedio

TL;DR: Sintassi fondamentale, logica di join, indici e transazioni ACID consultabili rapidamente per colloqui tecnici.

Concetti chiave

I database relazionali organizzano i dati in tabelle strutturate con vincoli di integrita' e chiavi primarie/esterne.

WHERE filtra le singole righe prima di qualsiasi aggregazione.

HAVING filtra i gruppi generati da GROUP BY applicando condizioni su funzioni di aggregazione.

INNER JOIN restituisce solo i record con corrispondenza esatta su entrambe le tabelle.

LEFT JOIN restituisce tutti i record della tabella sinistra e i valori della tabella destra o NULL.

ACID garantisce Atomicity, Consistency, Isolation e Durability per la persistenza sicura dei dati.

Gli indici B-Tree velocizzano ricerche per uguaglianza e range, ma aumentano l'overhead in scrittura.

Le Window Function (OVER (PARTITION BY ... ORDER BY ...)) calcolano aggregati senza collassare le righe.

L'ordine logico di esecuzione e': FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT.

Le sottoquery possono essere correlate (eseguite riga per riga) o non correlate (valutate una sola volta).

Domande tipiche e risposte pronte

Q: Qual e' la differenza pratica tra WHERE ed HAVING?R: WHERE filtra le tuple prima che avvenga l'aggregazione, mentre HAVING valuta i filtri direttamente sui risultati aggregati generati da GROUP BY.

Q: Come ottimizzeresti una query lenta su un database relazionale?R: Analizzo prima il piano di esecuzione con EXPLAIN ANALYZE per individuare table scan, poi aggiungo indici mirati o riscrivo le join evitando subquery correlate pesanti.

Q: Cosa rappresentano i livelli di isolamento delle transazioni?R: Regolano il bilanciamento tra concorrenza e anomalie (dirty read, non-repeatable read, phantom read), da Read Uncommitted fino al massimo livello Serializable.

Insidie e errori comuni

Il valore NULL richiede IS NULL o IS NOT NULL; controlli come = NULL restituiscono sempre UNKNOWN.

Eseguire join su colonne senza indici provoca costose scansioni sequenziali (Seq Scan) su tabelle grandi.

L'operatore COUNT(column) ignora i valori NULL, a differenza di COUNT(*).

Le funzioni applicate alle colonne indicizzate nella clausola WHERE (es. WHERE YEAR(date) = 2026) disabilitano l'uso dell'indice standard.

La divisione per zero nelle espressioni matematiche causa errori immediati se non protetta da NULLIF.

Snippet e comandiSQL

```-- Analisi piano di esecuzione

EXPLAIN ANALYZE

SELECT id, email, created_at

FROM users

WHERE status = 'active';

-- Window function: ranking utenti per ordini

SELECT

user_id,

amount,

RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) as rank_position

FROM orders;

-- Transazione sicura con rollback

BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;

UPDATE accounts SET balance = balance + 100 WHERE id = 2;

COMMIT;

```

Da ripassare

[ ] Sintassi e casi d'uso delle Common Table Expressions (CTE) ricorsive

[ ] Differenza tra indici B-Tree, Hash, GIN e GiST

[x] Regole di filtraggio tra WHERE e HAVING

[x] Tipologie di join e gestione di valori NULL

Jarvis Interviews
Jarvis