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.
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).
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.
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.
```-- 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;
```
[ ] 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