EuraStudy
Appunti/Informatica/Linguaggi di interrogazione e manipolazione dei dati (SQL)
Appunti · InformaticaIT · Maturità

Linguaggi di interrogazione e manipolazione dei dati (SQL)

SQL (Structured Query Language) è il linguaggio standard per definire, interrogare e manipolare le basi di dati relazionali: con poche istruzioni dichiarative consente di descrivere lo schema (DDL), inserire e modificare i dati (DML) e soprattutto estrarre informazioni con la potente istruzione «SELECT». Questo appunto ricostruisce il linguaggio dalla creazione delle tabelle con i loro vincoli fino alle interrogazioni complesse con «JOIN», funzioni di aggregazione e raggruppamenti, mostrando come ogni richiesta informativa si traduca in una query corretta sul modello relazionale. È materia pienamente valutabile all'Esame di Stato del secondo ciclo (in particolare nella seconda prova di Informatica per il Liceo Scientifico — opzione Scienze Applicate).

5 sezioni·~23 min di lettura·3 competenze·Livello Base 1 · Standard 3 · Approfondimento 1·Verificato · 07/2026

T·111111 / 14
Profilo d’esame
Interrogare e manipolare i dati di una base di dati relazionale con il linguaggio SQLTradurre una richiesta informativa in linguaggio naturale in una query SQL corretta ed efficienteCollegare il modello relazionale (tabelle, chiavi, vincoli) alle operazioni di interrogazione e manipolazione dei dati
Operatori:descrivispiegadeterminatraducianalizzaconfrontaclassificaillustragiustificainterpreta

livello base

Si richiede di leggere e scrivere interrogazioni «SELECT» su una sola tabella con «WHERE» e «ORDER BY», di eseguire inserimenti, aggiornamenti e cancellazioni e di riconoscere le clausole fondamentali del linguaggio.

livello avanzato

L'indirizzo del Liceo Scientifico — opzione Scienze Applicate chiede di progettare interrogazioni con «JOIN» fra più tabelle, funzioni di aggregazione con «GROUP BY» e «HAVING», sottointerrogazioni e viste, partendo da uno schema relazionale e da una traccia in linguaggio naturale, come nella seconda prova d'esame.

Profondità

Profondità di lettura: Approfondimento

Testo

Dimensione del testo: Standard

Contenuti · 5 sezioni▾
  1. Linguaggi di interrogazione e manipolazione dei dati (SQL)
    • 01SQL: un linguaggio in due anime (DDL e DML)○
    • 02Definire la struttura: tabelle e vincoli (DDL)◐
    • 03Manipolare i dati: INSERT, UPDATE, DELETE (DML)◐
    • 04Interrogare i dati: SELECT, WHERE e ORDER BY◐
    • 05Collegare e sintetizzare: JOIN, funzioni di aggregazione e GROUP BY●
§ 01

SQL: un linguaggio in due anime (DDL e DML)#

●○○BaseLPOSA-informatica-SQL-interrogazione

I sottolinguaggi di SQL

I sottolinguaggi di SQLDiagramma ad albero, 9 percorsi, Dati: DDL → CREATE; DDL → ALTER; DDL → DROP; DML → INSERT; DML → UPDATE; DML → DELETE; DML → SELECT; DCL → GRANT; DCL → REVOKEDDLDMLDCLSQLCREATEALTERDROPINSERTUPDATEDELETESELECTGRANTREVOKE
Fig. 1DDL definisce la struttura (CREATE, ALTER, DROP), DML manipola il contenuto (INSERT, UPDATE, DELETE, SELECT), DCL gestisce i permessi (GRANT, REVOKE).

Punti chiave

SQL (Structured Query Language) è il linguaggio standard, nato dai lavori di IBM sul modello relazionale di Edgar F. Codd e successivamente normato dall'ISO/ANSI, con cui si dialoga con una base di dati relazionale gestita da un DBMS: invece di descrivere COME ottenere i dati, l'utente DICHIARA QUALE risultato desidera e lascia al sistema il compito di calcolarlo. Per questo SQL è detto linguaggio «dichiarativo», in contrapposizione ai linguaggi imperativi come C o Python studiati in precedenza (ripasso).
Le istruzioni di SQL si raccolgono in sottolinguaggi funzionali. Il «DDL» (Data Definition Language, linguaggio di definizione dei dati) serve a creare e modificare la STRUTTURA della base di dati — le tabelle, le colonne, i tipi e i vincoli — con i comandi «CREATE», «ALTER» e «DROP». Il «DML» (Data Manipulation Language, linguaggio di manipolazione dei dati) opera invece sul CONTENUTO delle tabelle: «INSERT» per inserire righe, «UPDATE» per modificarle, «DELETE» per eliminarle e «SELECT» per interrogarle. Spesso si distingue anche un «DCL» (Data Control Language) per i permessi, con «GRANT» e «REVOKE».
L'unità di base su cui SQL lavora è la tabella (in termini formali una «relazione»): un insieme di righe (le «tuple», ciascuna un record) e di colonne (gli «attributi», ciascuno con un proprio dominio, cioè il tipo di dato ammesso). Ogni tabella possiede di norma una chiave primaria che identifica univocamente le sue righe, e può fare riferimento ad altre tabelle tramite chiavi esterne: SQL non fa che tradurre in comandi le operazioni sul modello relazionale studiato in precedenza (ripasso).
Una caratteristica logica importante è la gestione dell'informazione mancante con il valore speciale «NULL», che indica «valore assente o sconosciuto» e NON coincide con lo zero o con la stringa vuota. La presenza di «NULL» introduce una logica a tre valori (vero, falso, sconosciuto) che condiziona il comportamento dei confronti nelle interrogazioni: per questo i confronti con «NULL» si scrivono «IS NULL» e «IS NOT NULL», mai con il segno di uguale.
Esempio svolto

Classificazione dei comandi SQL

Per ciascuno dei seguenti comandi indica se appartiene al DDL o al DML e descrivine la funzione: (1) CREATE TABLE Studente(...); (2) INSERT INTO Studente VALUES(...); (3) SELECT * FROM Studente; (4) DROP TABLE Studente;

  1. 01Comando 1

    CREATE TABLE definisce una nuova tabella e la sua struttura (colonne, tipi, vincoli). Agisce sullo schema: appartiene al DDL.

  2. 02Comando 2

    INSERT INTO aggiunge una nuova riga (tupla) con i valori indicati. Agisce sul contenuto: appartiene al DML.

  3. 03Comando 3

    SELECT estrae righe e colonne dalla tabella senza modificarla. È un'interrogazione: appartiene al DML.

  4. 04Comando 4

    DROP TABLE elimina l'intera tabella, struttura e dati compresi. Agisce sullo schema: appartiene al DDL.

Risultato: DDL: comandi 1 e 4 (definizione/eliminazione della struttura). DML: comandi 2 e 3 (manipolazione e interrogazione del contenuto).

Obiettivo Maturità

  • Sapere distinguere con precisione DDL (struttura: CREATE/ALTER/DROP) e DML (contenuto: INSERT/UPDATE/DELETE/SELECT) e collocare correttamente un comando dato: è una domanda frequente sia nella seconda prova sia nel colloquio.
  • Saper spiegare perché SQL è un linguaggio dichiarativo e cosa significa: all'esame va motivata la differenza rispetto ai linguaggi imperativi, non solo enunciata.

Errori frequenti

  • Confondere il «NULL» con lo zero numerico o con la stringa vuota: sono valori diversi e i confronti con «NULL» richiedono «IS NULL», non «= NULL».
  • Classificare «SELECT» come DDL: «SELECT» appartiene al DML perché interroga il contenuto, non modifica la struttura della base di dati.

Approfondimento

Che SQL sia dichiarativo ha una conseguenza tecnica profonda: fra la query scritta e l'esecuzione si interpone l'ottimizzatore del DBMS, che traduce l'interrogazione in un piano di esecuzione — una sequenza di operazioni dell'algebra relazionale — scegliendo l'ordine e i metodi più efficienti (quale tabella scandire per prima, se usare un indice). L'utente dichiara il «che cosa» e il sistema decide il «come»: la stessa query può essere eseguita in modi diversi, tutti corretti ma di costo assai diverso, ed è compito dell'ottimizzatore trovare il migliore basandosi su statistiche sui dati. Un pilastro dell'eleganza di SQL è la proprietà di chiusura: il risultato di una SELECT è a sua volta una tabella, e come tale può essere riutilizzato — annidato in un'altra query come sottointerrogazione (subquery), salvato in una vista, unito ad altre tabelle. È questa componibilità che permette di costruire interrogazioni complesse a partire da mattoni semplici, esattamente come nell'algebra relazionale sottostante. Va infine ricordato che, sebbene SQL sia normato dallo standard ISO/ANSI, ogni DBMS (MySQL, PostgreSQL, Oracle, SQLite) ne implementa un proprio dialetto con estensioni e piccole differenze: il nucleo — CREATE, INSERT, SELECT, JOIN — è portabile, mentre le funzioni avanzate spesso no, e conviene sempre sapere quale sistema si sta usando.

Ripasso attivo

Dato l'elenco di comandi CREATE TABLE, INSERT, SELECT, ALTER TABLE, UPDATE, DROP TABLE, DELETE, classifica ciascuno come DDL o DML e, per ognuno, scrivi in una frase l'operazione che compie sulla base di dati.

Richiamo attivo

Ricorda i punti chiave — poi rivela.

Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))

§ 02

Definire la struttura: tabelle e vincoli (DDL)#

●●○StandardLPOSA-informatica-SQL-interrogazione

Integrità referenziale tra due tabelle

Integrità referenzialeGrafo, Voto (matricola FK) → Studente (matricola PK)Studente(matricola P…Voto(matricola F…REFERENCES
Fig. 2Ogni Voto deve riferirsi a uno Studente esistente. Studente(matricola PK, cognome, nome, classe); Voto(id PK, matricola FK, materia, valore).

Punti chiave

Prima di poter contenere dati, una base di dati deve avere una struttura: con il DDL si dichiarano le tabelle, le colonne con il loro tipo di dato e i vincoli che garantiscono la qualità dell'informazione. Il comando fondamentale è «CREATE TABLE», che elenca per ciascun attributo un nome e un dominio (per esempio «INTEGER», «VARCHAR(n)» per stringhe di lunghezza massima n, «DECIMAL(p,s)», «DATE», «BOOLEAN»).
I vincoli (constraint) sono regole che il DBMS fa rispettare automaticamente a ogni operazione, traducendo in SQL i vincoli di integrità del modello relazionale (ripasso). I principali sono: «PRIMARY KEY», che individua la chiave primaria e impone unicità e non-nullità; «FOREIGN KEY ... REFERENCES», che dichiara una chiave esterna garantendo l'integrità referenziale (un valore deve esistere nella tabella riferita); «NOT NULL», che vieta il valore assente; «UNIQUE», che impedisce duplicati su una colonna; «CHECK(condizione)», che impone una regola sui valori; «DEFAULT», che assegna un valore predefinito.
L'integrità referenziale espressa dalla «FOREIGN KEY» è centrale: collega una tabella «figlia» a una «padre» e impedisce che esistano riferimenti «sospesi» (per esempio un voto associato a uno studente inesistente). Si possono definire le politiche di propagazione «ON DELETE» e «ON UPDATE» (per esempio «CASCADE», che propaga la cancellazione, oppure «RESTRICT», che la vieta finché esistono righe figlie), così che la coerenza sia mantenuta anche quando la tabella padre cambia.
La struttura non è immutabile: con «ALTER TABLE» si modifica una tabella già esistente — aggiungere o togliere una colonna («ADD COLUMN», «DROP COLUMN»), aggiungere un vincolo («ADD CONSTRAINT») — mentre «DROP TABLE» elimina definitivamente l'intera tabella con tutti i suoi dati. Sono operazioni di DDL potenti e in parte irreversibili, quindi vanno usate con la consapevolezza che «DROP» perde i dati, a differenza di «DELETE» che invece svuota le righe lasciando in piedi la tabella.
Esempio svolto

Creazione di due tabelle collegate con vincoli

Scrivi i comandi DDL per creare la tabella Studente(matricola, cognome, nome, classe) con matricola chiave primaria, e la tabella Voto(id, matricola, materia, valore) con id chiave primaria, matricola chiave esterna verso Studente e un vincolo che imponga 1 <= valore <= 10.

  1. 01Tabella padre

    Si crea Studente dichiarando matricola come PRIMARY KEY e vietando i valori nulli sui campi anagrafici.

  2. 02Tabella figlia

    Si crea Voto con id come PRIMARY KEY; il campo matricola riprende il tipo della chiave riferita.

  3. 03Vincolo di integrità referenziale

    Si aggiunge la FOREIGN KEY che collega Voto a Studente, garantendo che ogni voto si riferisca a uno studente esistente.

  4. 04Vincolo di dominio

    Un CHECK impone l'intervallo ammesso per il voto, scartando inserimenti fuori scala.

Risultato: Due tabelle collegate: Studente con matricola come chiave primaria; Voto con id chiave primaria, matricola come chiave esterna verso Studente e il CHECK che vincola valore nell'intervallo [1, 10].

Obiettivo Maturità

  • Saper scrivere un comando CREATE TABLE completo a partire da uno schema relazionale, dichiarando correttamente PRIMARY KEY e FOREIGN KEY: è il tipico primo punto della seconda prova dopo la progettazione dello schema.
  • Distinguere con sicurezza DROP TABLE (elimina la tabella, struttura e dati) da DELETE (rimuove righe, la tabella resta) e da TRUNCATE (svuota la tabella): la confusione tra questi comandi è penalizzata.

Errori frequenti

  • Dimenticare di dichiarare la FOREIGN KEY, perdendo così l'integrità referenziale, oppure tipare la chiave esterna in modo diverso dalla chiave primaria riferita.
  • Usare DROP TABLE pensando di svuotare la tabella: DROP la distrugge del tutto; per togliere solo le righe servono DELETE o TRUNCATE.

Approfondimento

Un aspetto di progettazione fisica che incide enormemente sulle prestazioni è l'indice. Un indice (creato con «CREATE INDEX») è una struttura dati ausiliaria che il DBMS mantiene su una o più colonne per ritrovare rapidamente le righe con un dato valore, senza scandire l'intera tabella. La struttura tipica è il B-albero (o la sua variante B+-albero), un albero di ricerca bilanciato e a molte vie che mantiene sempre l'altezza bassa, così che una ricerca costi «O(log n)» invece degli «O(n)» di una scansione completa — la stessa idea della ricerca binaria e degli alberi bilanciati, qui applicata ai dati su disco. La chiave primaria e i vincoli UNIQUE sono di norma indicizzati automaticamente, ed è per questo che le ricerche e i JOIN su chiave risultano veloci. Ogni indice, però, ha un costo: occupa spazio e va aggiornato a ogni INSERT, UPDATE o DELETE, rallentando le scritture. Nasce così un compromesso di progetto: indicizzare le colonne usate spesso nei filtri e nei join accelera le letture, ma indicizzare tutto appesantisce inutilmente le modifiche. Sapere quando conviene un indice è parte della competenza di chi progetta una base di dati efficiente, e mostra concretamente come la teoria delle strutture dati (alberi bilanciati, complessità logaritmica) governi la pratica dei DBMS.

Ripasso attivo

Dato lo schema relazionale Studente(matricola, cognome, nome, classe) e Voto(id, matricola, materia, valore), scrivi i comandi CREATE TABLE che definiscano le due tabelle, la chiave primaria di ciascuna e la chiave esterna che collega Voto a Studente, imponendo inoltre che il valore del voto sia compreso tra 1 e 10.

Richiamo attivo

Ricorda i punti chiave — poi rivela.

Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))

§ 03

Manipolare i dati: INSERT, UPDATE, DELETE (DML)#

●●○StandardLPOSA-informatica-SQL-interrogazione

Effetto dei comandi DML sulle righe di una tabella

Effetto dei comandi DMLTabella con 2 colonne e 3 righe, Dati: Comando · Effetto sulle righe; INSERT · aggiunge una riga; UPDATE … WHERE · modifica le righe; DELETE … WHERE · rimuove le righeCOMANDOEFFETTO SULLE RIGHEINSERTaggiunge una rigaUPDATE … WHEREmodifica le righeDELETE … WHERErimuove le righe
Fig. 3Il WHERE decide QUALI righe sono coinvolte; senza WHERE l’operazione riguarda tutte le righe della tabella.

Punti chiave

Una volta definita la struttura, occorre popolarla e mantenerla: il DML offre tre comandi per modificare il contenuto delle tabelle. «INSERT INTO» aggiunge nuove righe, «UPDATE» modifica righe esistenti e «DELETE» le rimuove. A differenza di «SELECT», che è solo lettura, questi tre comandi cambiano effettivamente lo stato della base di dati e devono perciò rispettare tutti i vincoli dichiarati nel DDL.
L'inserimento si scrive «INSERT INTO Tabella (colonne) VALUES (valori)»: elencare esplicitamente le colonne è buona prassi perché rende il comando indipendente dall'ordine fisico degli attributi e permette di omettere quelle con un valore «DEFAULT» o che ammettono «NULL». Se si inserisce una stringa o una data si usano gli apici singoli ('Rossi', '2026-06-22'); i numeri si scrivono senza apici.
L'aggiornamento si scrive «UPDATE Tabella SET colonna = nuovo_valore WHERE condizione»: la clausola «SET» indica cosa cambiare, la clausola «WHERE» indica QUALI righe. Il punto cruciale è proprio il «WHERE»: senza di esso l'aggiornamento si applica a TUTTE le righe della tabella. La stessa avvertenza vale per «DELETE FROM Tabella WHERE condizione», dove l'omissione del «WHERE» cancella ogni riga.
I comandi di manipolazione interagiscono con i vincoli: un «INSERT» che violi una chiave primaria duplicata, un «NOT NULL» o una «FOREIGN KEY» viene rifiutato dal DBMS; una «DELETE» su una riga padre con politica «RESTRICT» è bloccata se esistono righe figlie. In contesti reali queste modifiche sono raggruppate in «transazioni», sequenze di operazioni che vengono confermate con «COMMIT» o annullate con «ROLLBACK» per garantire la coerenza dei dati (cenni).
Esempio svolto

Inserimento, aggiornamento e cancellazione mirati

Sulla tabella Studente(matricola, cognome, nome, classe): inserisci lo studente (105, Bianchi, Luca, 5A); poi sposta in 5B tutti gli studenti di 5A; infine elimina lo studente con matricola 105.

  1. 01Inserimento

    Si elencano le colonne e si forniscono i valori; le stringhe vanno tra apici, il numero senza.

  2. 02Aggiornamento mirato

    SET fissa il nuovo valore della classe; WHERE limita l'effetto ai soli studenti di 5A.

  3. 03Cancellazione mirata

    WHERE seleziona la singola riga da rimuovere tramite la chiave primaria.

  4. 04Verifica dei vincoli

    La cancellazione di matricola 105 riesce solo se nessuna riga figlia (per esempio in Voto, con politica RESTRICT) vi fa riferimento; altrimenti il DBMS la rifiuta.

Risultato: Tre comandi DML mirati: un INSERT con colonne esplicite, un UPDATE con WHERE che sposta solo la 5A, un DELETE con WHERE sulla chiave primaria, tutti coerenti con i vincoli dichiarati.

Obiettivo Maturità

  • Ricordare sempre che UPDATE e DELETE senza WHERE agiscono su TUTTE le righe: all'esame la presenza corretta del WHERE è uno dei dettagli più controllati.
  • Saper scrivere un INSERT che elenca esplicitamente le colonne e usa correttamente gli apici per stringhe e date: una sintassi pulita e tipata correttamente è premiata.

Errori frequenti

  • Eseguire UPDATE o DELETE dimenticando la clausola WHERE, modificando o cancellando per errore l'intera tabella.
  • Omettere gli apici attorno a stringhe e date (o, viceversa, metterli attorno ai numeri), generando un errore di sintassi o di tipo.

Approfondimento

I comandi che cambiano i dati (INSERT, UPDATE, DELETE) prendono pieno significato dentro le transazioni SQL. Una transazione si delimita con «BEGIN» (o «START TRANSACTION»), si conferma con «COMMIT», che rende permanenti tutte le modifiche, o si annulla con «ROLLBACK», che le disfa riportando la base di dati allo stato iniziale — è il meccanismo con cui si realizza l'atomicità ACID: un trasferimento di fondi che aggiorna due conti o va a buon fine per intero, o non lascia alcuna traccia. In un sistema con molti utenti simultanei, il DBMS deve inoltre isolare le transazioni concorrenti; lo standard definisce livelli di isolamento crescenti che bilanciano correttezza e prestazioni, perché un isolamento più debole è più veloce ma espone ad anomalie: la lettura sporca (dirty read, in cui si legge un dato non ancora confermato da un'altra transazione), la lettura non ripetibile e la lettura fantasma. Salendo di livello, fino a «SERIALIZABLE» (il più forte), queste anomalie spariscono, al prezzo di più blocchi e minore parallelismo. È per questo che una singola «UPDATE» dimenticata fuori da una transazione, o un livello di isolamento scelto male, possono causare in produzione incoerenze difficili da diagnosticare: il DML va sempre pensato nel contesto della concorrenza, non come una sequenza di comandi isolati.

Ripasso attivo

Sulla tabella Studente(matricola, cognome, nome, classe): (a) inserisci lo studente con matricola 105, cognome Bianchi, nome Luca, classe 5A; (b) sposta nella classe 5B tutti gli studenti attualmente in 5A; (c) elimina lo studente con matricola 105.

Richiamo attivo

Ricorda i punti chiave — poi rivela.

Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))

§ 04

Interrogare i dati: SELECT, WHERE e ORDER BY#

●●○StandardLPOSA-informatica-SQL-interrogazione

Anatomia di una query SELECT

Anatomia di una query SELECTTabella con 3 colonne e 4 righe, Dati: Clausola · Esempio · Ruolo; SELECT · nome, prezzo · colonne; FROM · Prodotto · tabella; WHERE · prezzo < 5 · filtro righe; ORDER BY · prezzo DESC · ordinamentoCLAUSOLAESEMPIORUOLOSELECTnome, prezzocolonneFROMProdottotabellaWHEREprezzo < 5filtro righeORDER BYprezzo DESCordinamento
Fig. 4Ordine logico di esecuzione: FROM → WHERE → SELECT → ORDER BY.

Punti chiave

L'istruzione «SELECT» è il cuore di SQL e la più usata: serve a estrarre informazioni da una o più tabelle senza modificarle. La sua forma essenziale è «SELECT colonne FROM tabella WHERE condizione», a cui si aggiungono clausole opzionali come «ORDER BY». Concettualmente «FROM» individua la sorgente, «WHERE» filtra le righe, «SELECT» sceglie e proietta le colonne (l'asterisco «*» le seleziona tutte).
La clausola «WHERE» esprime la condizione di filtro mediante operatori di confronto («=», «<>» o «!=», «<», «>», «<=», «>=»), operatori logici («AND», «OR», «NOT»), e operatori specifici molto utili: «BETWEEN a AND b» per gli intervalli, «IN (lista)» per l'appartenenza a un insieme, «LIKE» per i confronti su stringhe con i caratteri jolly «%» (qualunque sequenza) e «_» (un solo carattere), e «IS NULL» / «IS NOT NULL» per i valori assenti. Combinando questi operatori si traduce qualsiasi criterio in linguaggio naturale.
Il risultato di una «SELECT» è a sua volta una tabella (un insieme di righe): per ordinarlo si usa «ORDER BY colonna [ASC|DESC]», dove «ASC» (predefinito) ordina in modo crescente e «DESC» decrescente; si possono indicare più colonne per ordinamenti annidati. Per eliminare le righe duplicate dal risultato si antepone «DISTINCT» alla lista delle colonne, mentre con «AS» si può rinominare una colonna o assegnare un alias a un'espressione calcolata.
SQL consente anche di calcolare nuove colonne direttamente nella «SELECT» (per esempio «SELECT prezzo * quantita AS totale FROM ...») e di applicare funzioni scalari su singoli valori, distinte dalle funzioni di aggregazione che opereranno su gruppi di righe (Fig. successiva). La logica a tre valori introdotta dai «NULL» va tenuta presente: una riga il cui valore confrontato è «NULL» NON soddisfa né la condizione né la sua negazione, e quindi viene esclusa da entrambe.
Esempio svolto

Interrogazione con filtro multiplo e ordinamento

Data la tabella Prodotto(codice, nome, categoria, prezzo), seleziona nome e prezzo dei prodotti di categoria 'Cancelleria' con prezzo tra 1 e 5 euro, ordinati per prezzo decrescente.

  1. 01Colonne e sorgente

    Si proiettano solo nome e prezzo dalla tabella Prodotto.

  2. 02Filtro sulla categoria

    Si confronta la stringa categoria, usando gli apici.

  3. 03Filtro sull'intervallo di prezzo

    BETWEEN include gli estremi: prezzo >= 1 AND prezzo <= 5.

  4. 04Ordinamento

    ORDER BY ... DESC ordina dal prezzo più alto al più basso.

Risultato: SELECT nome, prezzo FROM Prodotto WHERE categoria = 'Cancelleria' AND prezzo BETWEEN 1 AND 5 ORDER BY prezzo DESC;

Obiettivo Maturità

  • Saper tradurre una richiesta in linguaggio naturale in una SELECT con il WHERE corretto, usando con proprietà BETWEEN, IN, LIKE e gli operatori logici: è la competenza centrale valutata nella seconda prova.
  • Conoscere la differenza tra ORDER BY ASC e DESC e l'uso di DISTINCT e degli alias AS: dettagli che rendono la query leggibile e corretta.

Errori frequenti

  • Usare «= NULL» invece di «IS NULL»: il confronto con NULL non è mai vero, quindi la riga non viene mai selezionata.
  • Dimenticare gli apici nelle stringhe del WHERE o confondere il carattere jolly di LIKE («%») con quello di altri linguaggi (per esempio «*»).

Approfondimento

Per padroneggiare le interrogazioni conviene conoscere l'ordine logico di valutazione di una SELECT, che non coincide con l'ordine in cui la si scrive: prima «FROM» (individua e combina le sorgenti), poi «WHERE» (filtra le righe), quindi «GROUP BY» e «HAVING» (raggruppa e filtra i gruppi), poi «SELECT» (proietta e calcola le colonne, ed è qui che gli alias diventano definiti), infine «ORDER BY» (ordina) e l'eventuale «LIMIT» (limita il numero di righe restituite). Comprendere questo ordine spiega molti comportamenti apparentemente strani, per esempio perché un alias introdotto nella SELECT non è sempre utilizzabile nel WHERE. Lo strumento più potente che si aggiunge alla SELECT è la sottointerrogazione (subquery): una query annidata dentro un'altra, resa possibile dalla proprietà di chiusura del modello relazionale. Una subquery può comparire nel WHERE come valore scalare («... WHERE prezzo > (SELECT AVG(prezzo) FROM Prodotto)»), come insieme con «IN», o come test di esistenza con «EXISTS». Particolarmente espressiva è la subquery correlata, che si riferisce a una colonna della query esterna e viene rivalutata per ciascuna riga di questa: permette di esprimere condizioni come «i prodotti più cari della loro categoria», che un singolo livello di query non catturerebbe. È in questa componibilità che SQL rivela tutta la sua potenza dichiarativa.

Ripasso attivo

Data la tabella Prodotto(codice, nome, categoria, prezzo), scrivi una query che selezioni nome e prezzo dei prodotti della categoria 'Cancelleria' con prezzo compreso tra 1 e 5 euro, ordinando il risultato per prezzo decrescente.

Richiamo attivo

Ricorda i punti chiave — poi rivela.

Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))

§ 05

Collegare e sintetizzare: JOIN, funzioni di aggregazione e GROUP BY#

●●●ApprofondimentoLPOSA-informatica-SQL-interrogazione

INNER JOIN tra due tabelle correlate

Risultato di un INNER JOINTabella con 3 colonne e 2 righe, Dati: matricola · cognome · materia; 101 · Rossi · Mate; 101 · Rossi · InfoMATRICOLACOGNOMEMATERIA101RossiMate101RossiInfo
Fig. 5INNER JOIN su Voto.matricola = Studente.matricola: si accostano le righe corrispondenti; restano solo le corrispondenze (INNER).

Punti chiave

Il modello relazionale distribuisce l'informazione su più tabelle collegate da chiavi: per ricomporla in un'unica risposta si usa l'operazione di «JOIN», che combina le righe di due (o più) tabelle in base a una condizione di accostamento, tipicamente l'uguaglianza tra la chiave esterna di una e la chiave primaria dell'altra. La forma moderna è «SELECT ... FROM A JOIN B ON A.fk = B.pk», dove la clausola «ON» esprime il legame; il «JOIN» così descritto è l'INNER JOIN, che restituisce solo le coppie di righe che si corrispondono.
Esistono varianti di «JOIN» utili a casi diversi: il «LEFT (OUTER) JOIN» mantiene tutte le righe della tabella di sinistra anche quando non hanno corrispondenza a destra (riempendo con «NULL» le colonne mancanti), simmetricamente il «RIGHT JOIN», e il «FULL OUTER JOIN» conserva le righe non accoppiate di entrambe. Per disambiguare colonne con lo stesso nome si qualifica l'attributo con il nome (o l'alias) della tabella, per esempio «Studente.matricola».
Le funzioni di aggregazione condensano molte righe in un solo valore di sintesi: «COUNT» conta le righe (o i valori non nulli di una colonna), «SUM» somma, «AVG» calcola la media, «MIN» e «MAX» restituiscono il minimo e il massimo. Applicate da sole producono un'unica riga di riepilogo (per esempio «SELECT AVG(valore) FROM Voto»); è importante ricordare che, tranne «COUNT(*)», le funzioni di aggregazione IGNORANO i valori «NULL».
Per ottenere un riepilogo PER GRUPPI si usa «GROUP BY colonna», che partiziona le righe in gruppi omogenei e calcola l'aggregato per ciascuno (per esempio la media dei voti per ogni materia). Il filtro sui gruppi si esprime con «HAVING» (non con «WHERE»): la regola d'oro è che «WHERE» filtra le singole righe PRIMA del raggruppamento, mentre «HAVING» filtra i gruppi DOPO, sulla base del risultato delle funzioni di aggregazione. Infine, una «VISTA» («CREATE VIEW») è una tabella virtuale definita da una «SELECT» salvata, comoda per riusare interrogazioni complesse e per controllare l'accesso ai dati (cenni).
Esempio svolto

JOIN con aggregazione e filtro sui gruppi

Date Studente(matricola, cognome, classe) e Voto(id, matricola, materia, valore), per ogni materia calcola la media dei voti e mostra solo le materie con media maggiore di 6, ordinando per media decrescente. Mostra anche il numero di voti per materia.

  1. 01Sorgente e collegamento

    Si uniscono le due tabelle sulla chiave matricola (qui basterebbe la sola tabella Voto, ma il JOIN è richiesto quando servono dati anagrafici).

  2. 02Aggregati e raggruppamento

    Si raggruppa per materia e per ogni gruppo si calcolano media e conteggio.

  3. 03Filtro sui gruppi

    HAVING agisce DOPO il raggruppamento, sulla media calcolata.

  4. 04Ordinamento finale

    Si ordina il riepilogo dalla media più alta alla più bassa.

Risultato: SELECT materia, AVG(valore) AS media, COUNT(*) AS numero FROM Voto JOIN Studente ON Voto.matricola = Studente.matricola GROUP BY materia HAVING AVG(valore) > 6 ORDER BY media DESC;

Obiettivo Maturità

  • Saper progettare una query con JOIN tra due o più tabelle a partire dallo schema relazionale, qualificando correttamente le colonne e scrivendo la condizione ON fk = pk: è il nucleo della seconda prova di Informatica.
  • Distinguere con sicurezza WHERE (filtra le righe prima del GROUP BY) da HAVING (filtra i gruppi dopo, sulle funzioni di aggregazione): è uno degli errori più ricorrenti e più valutati.

Errori frequenti

  • Usare WHERE per filtrare un risultato di aggregazione (per esempio «WHERE COUNT(*) > 3»): il filtro sui gruppi va scritto con HAVING.
  • Inserire nella SELECT, accanto a una funzione di aggregazione, una colonna non aggregata e non presente nel GROUP BY, producendo una query ambigua o errata; oppure dimenticare la condizione ON in un JOIN, ottenendo un prodotto cartesiano.

Approfondimento

Vale la pena svolgere per intero una query di sintesi che intreccia JOIN, aggregazione e raggruppamento. Per ottenere «la media dei voti per ogni materia, limitata alle materie con media superiore a 6, in ordine decrescente» si scrive: «SELECT materia, AVG(valore) AS media FROM Voto GROUP BY materia HAVING AVG(valore) > 6 ORDER BY media DESC». Se servisse anche il nome del docente di ciascuna materia, si aggiungerebbe un JOIN con la tabella dei docenti sulla chiave della materia. Sul piano teorico, un JOIN non è altro che un prodotto cartesiano seguito da una selezione: «A JOIN B ON A.fk = B.pk» equivale a formare tutte le coppie di righe (prodotto) e tenere solo quelle che soddisfano la condizione — dimenticare la clausola «ON» produce infatti l'intero prodotto cartesiano, con un numero di righe pari al prodotto delle cardinalità, un errore tanto comune quanto costoso. Un caso particolare è il self-join, in cui una tabella si unisce a sé stessa con due alias diversi per confrontare righe della stessa tabella (per esempio gli studenti della medesima classe). Poiché il JOIN è spesso l'operazione più onerosa di una query, la sua efficienza dipende dalla presenza di indici sulle colonne di accostamento: senza indice il DBMS deve confrontare moltissime righe, con l'indice ritrova rapidamente le corrispondenze — di nuovo il legame diretto fra strutture dati efficienti e prestazioni delle interrogazioni.

Ripasso attivo

Date le tabelle Studente(matricola, cognome, classe) e Voto(id, matricola, materia, valore), scrivi una query che, per ogni materia, calcoli la media dei voti e mostri solo le materie con media maggiore di 6, ordinando per media decrescente.

Richiamo attivo

Ricorda i punti chiave — poi rivela.

Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM)) · Esame di Stato del secondo ciclo — quadri di riferimento e griglie di valutazione (Ministero dell'Istruzione e del Merito (MIM))

Contenuti

Sezione -- / 05

    • 01SQL: un linguaggio in due anime (DDL e DML)○
    • 02Definire la struttura: tabelle e vincoli (DDL)◐
    • 03Manipolare i dati: INSERT, UPDATE, DELETE (DML)◐
    • 04Interrogare i dati: SELECT, WHERE e ORDER BY◐
    • 05Collegare e sintetizzare: JOIN, funzioni di aggregazione e GROUP BY●

0/5 Letti

Dagli appunti all'allenamento

Linguaggi di interrogazione e manipolazione dei dati (SQL)

Consolida questo argomento con domande dalla banca dati.

~23
min
3
Competenze
Esercitati

Riferimenti e fonti

Fonti

Ministero dell'Istruzione e del Merito (MIM)

  • Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento
  • Esame di Stato del secondo ciclo — quadri di riferimento e griglie di valutazione

Argomento precedente

Basi di dati e modello relazionale

Argomento successivo

Computazione e calcolo numerico

EuraStudy·Appunti T·11·MMXXVI

Continua con l'argomento successivo: il percorso viene conservato.