Fondamenti di
Informatica
Prof. Fenza Giuseppe
DBMS – Linguaggio SQL
Interrogazioni Semplici
SQL Structured Query Language
• SQL è il linguaggio per DBMS più implementato
• Esso è un linguaggio di
– definizione dei dati (DDL)
• Agisce sulla struttura del DB
• per la definizione di
schemi
(logici, esterni, fisici) e altre
operazioni generali
– interrogazione e aggiornamento dei dati (DML)
• Agisce sul contenuto del DB.
• inserimento, cancellazione e modifica di dati
• interrogazione dei dati (per questo spesso il DML è detto
Query Language)
SQL
• Descritto teoricamente nel 1970 da Codd
• Progettato nel 1974 in IBM da Chamberlin e Boyce. • Sviluppato
– negli anni '70 da IBM a San José per il DBMS “System R”
– L’Università di Berkeley nel suo RDBMS Ingres prima, e la futura
Oracle poi, contribuirono alla definizione dello standard.
• Dichiarato standard
– 1986 da ANSI (American National Standards Institute), – 1987 da ISO (International Organization for Standards) • Esistono più Dialetti di SQL. Il principale è:
– SQL-92 (detto anche SQL-2), ultima versione universalmente accettata e corrisponde al nucleo del linguaggio; le sue regole sintattiche sono identiche in ogni versione.
SQL
• SQL è un
linguaggio dichiarativo
• specifichiamo l’obiettivo dell’interrogazione e non il
modo con cui ottenerlo
• È poi compito di una componente interna del DBMS (il
Query Optimization) trasformare l’interrogazione dal
formato dichiarativo al formato procedurale equivalente
• Noi siamo interessati alle sole funzionalità di
• interrogazione dei dati (DML) di SQL
• Le funzionalità di descrizione della struttura (DDL) le
realizziamo direttamente in ACCESS
SQL
•
La clausola WHERE è facoltativa e può contenere
•
gli operatori relazionali >, >=, etc.,
•i connettivi logici AND, OR e NOT,
•
L’istruzione SELECT seleziona
•
tra le righe del
Prodotto Cartesiano R
1x …xR
k •quelle che
soddisfano la condizione
Y
•
Il risultato di una SELECT è una tabella che presenta
•
Le colonne A
1, …, A
rnell’ordine in cui compaiono qui
•Una riga per ogni riga selezionata dalla clausola WHERE
Tabelle esempio: Impiegato/Dipartimento
Nome Cognome Dipartimento Ufficio Stipendio annuo Città
Impiegato Anna Bianco Amministrazione 75 € 40.000,00 Venezia
Carlo Bianchi Produzione 20 € 36.000,00 Torino Carlo Rossi Direzione € 80.000,00 Milano Franco Neri Distribuzione 16 € 45.000,00 Napoli
Giuseppe Verdi Amministrazione 20 € 40.000,00Roma Lorenzo Gialli Direzione € 73.000,00Genova Marco Franco Produzione 20 € 46.000,00Roma Mario Rossi Amministrazione 10 € 45.000,00 Milano
Impiegato (Nome, Cognome, Dipartimento, Ufficio, Stipendio annuo, Città)
Stipendio degli impiegati di cognome “Rossi”
SELECT FROM WHERE [Stipendio annuo] Impiegato Cognome="Rossi";
Query 01 - Alias su Attributi
Salario annuo degli impiegati di cognome “Rossi”
SELECT FROM WHERE [Stipendio annuo] Impiegato Cognome="Rossi"; Salario € 80.000,00 € 45.000,00 AS Salario
QUERY 02 - Wildcard
Tutti i dati degli impiegati di cognome “Rossi”
SELECT FROM WHERE * Impiegato Cognome="Rossi"; WILDCARD Equivale ad elencare
tutti i nomi dei campi
nell’ordine in cui
compaiono nella tabella input
QUERY 03 - Ordine delle colonne
Cognome, Nome, Stipendio, Ufficio, Dipartimento,
Città degli impiegati di cognome “Rossi”
SELECT FROM WHERE
Cognome, Nome, [Stipendio annuo], Ufficio, Dipartimento, Città
Impiegato
QUERY 04 - Funzioni di tuple
Nome, Cognome e stipendio mensile degli impiegati
di cognome “Rossi”
SELECT FROM WHERE
Nome, Cognome, [Stipendio annuo]/12 AS [Stipendio Mensile] Impiegato
Cognome="Rossi";
•
SELECT può presentare come argomenti anche
QUERY 05 - Assenza della WHERE
Cognome, Nome e Stipendio di tutti gli Impiegati
SELECTFROM
Cognome, Nome, [Stipendio annuo] Impiegato
•
È possibile omettere la clausola WHERE (in questo
QUERY 06 - Condizioni multiple (1)
Nome e Cognome di tutti gli impiegati che lavorano
nell’ufficio 20 del dipartimento Amministrazione
SELECT FROM WHERE
Nome, Cognome Impiegato
Ufficio= 20 AND Dipartimento=“Amministrazione”;
Nome Cognome Dipartimento Ufficio Stipendio annuo Città
Impiegato Anna Bianco Amministrazione 75 € 40.000,00 Venezia
Carlo Bianchi Produzione 20 € 36.000,00 Torino Carlo Rossi Direzione € 80.000,00 Milano Franco Neri Distribuzione 16 € 45.000,00 Napoli
Giuseppe Verdi Amministrazione 20 € 40.000,00Roma Lorenzo Gialli Direzione € 73.000,00Genova Marco Franco Produzione 20 € 46.000,00Roma Mario Rossi Amministrazione 10 € 45.000,00 Milano
QUERY 08 - Condizioni multiple (2)
Nome e Cognome di tutti gli impiegati che lavorano nel Dipartimento
Amministrazione o nel Dipartimento Produzione
SELECT FROM WHERE Nome, Cognome Impiegato Dipartimento=“Amministrazione” OR Dipartimento=“Produzione”;
QUERY 08 - Condizioni multiple (3)
Nome e Dipartimento degli impiegati che
a)lavorano nel Dipartimento Amministrazione o nel Dipartimento Produzione e che
b)hanno per cognome “Rossi” SELECT FROM WHERE Nome, Cognome Impiegato (Dipartimento=“Amministrazione” OR
QUERY 08bis - ERRATA
Nome e Dipartimento degli impiegati che
a)lavorano nel Dipartimento Amministrazione o nel Dipartimento Produzione e che
b)hanno per cognome “Rossi” SELECT FROM WHERE Nome, Cognome Impiegato Dipartimento=“Amministrazione” OR
Dipartimento=“Produzione” AND Cognome=“Rossi”
Formulazione errata. Mancano le parentesi che isolano l’OR
QUERY 09 - Ricerca in Intervalli
Tutti gli impiegati che hanno uno stipendio annuo compreso tra 40.000 e 75.000 Euro SELECT FROM WHERE * Impiegato
[Stipendio annuo]>= 40000 AND
QUERY 09bis - BETWEEN ... AND
Tutti gli impiegati che hanno uno stipendio annuo compreso tra
40.000 e 75.000 Euro SELECT FROM WHERE * Impiegato
QUERY 10 – Senza Ordinamento
Tutti gli impiegati che guadagnano almeno 45000 euro, ordinati rispetto alla chiave (modalità standard)
SELECT FROM WHERE * Impiegato [Stipendio annuo] >=45000
QUERY 11 - Ordinamento della risposta
Tutti gli impiegati che guadagnano almeno 45000 euro, ordinando la risposta in base allo Stipendio
SELECT FROM WHERE * Impiegato [Stipendio annuo] >=45000
QUERY 12 - Ordinamento doppio
Tutti gli impiegati che guadagnano almeno 45000 euro, ordinando la risposta in base allo Stipendio e, a parità di stipendio, rispetto al
cognome SELECT FROM WHERE * Impiegato [Stipendio annuo] >=45000
QUERY 13 - Ordinamento decrescente
Tutti gli impiegati che guadagnano almeno 45000 euro, ordinando in modo decrescente la tabella in base allo stipendio
SELECT FROM WHERE * Impiegato [Stipendio annuo] >=45000
QUERY 14 - Ordinamento doppio
Gli impiegati che guadagnano almeno 45000 euro, ordinando la
risposta in base a Stipendio decrescente e, a parità di stipendio, rispetto a cognome crescente
SELECT FROM WHERE * Impiegato [Stipendio annuo] >=45000
QUERY 15 - Ricerca parziale (LIKE)
Tutti gli impiegati con il cognome che comincia con la lettera “B”
SELECT FROM WHERE * Impiegato Cognome LIKE ‘B*’;
Condizioni di ricerca parziale (LIKE)
• Seleziona le tuple in cui il valore è recuperato con le wildcards (l’operatore LIKE non fa differenza tra maiuscolo e minuscolo).
QUERY 16 - Ricerca Parziale (LIKE)
Tutti gli impiegati con il cognome che presenta una “i” in seconda posizione
SELECT FROM WHERE
*
Impiegato
QUERY 17 - Ricerca Parziale (LIKE)
Tutti gli impiegati con il cognome che presenta una “i” in seconda posizione e una “i” in ultima posizione SELECT FROM WHERE * Impiegato
QUERY 18 - Ricerca Parziale (LIKE)
Tutti gli impiegati con il cognome che presenta una “i” in ultima posizione
SELECT FROM WHERE
*
Impiegato
QUERY 19 - Ricerca Parziale (LIKE)
Tutti gli impiegati con il cognome che presenta almeno una “r” in una qualsiasi posizione SELECT FROM WHERE * Impiegato Cognome LIKE ‘*R*’;
QUERY 20 - Ricerca parziale (LIKE)
Tutti gli impiegati con il cognome lungo esattamente 5 caratteri
SELECT FROM WHERE * Impiegato Cognome LIKE “?????”;
Fondamenti di
Informatica
Prof. Fenza Giuseppe
DBMS – Linguaggio SQL
Operatori di Aggregazione
Tabelle esempio: Impiegato/Dipartimento
Nome Cognome Dipartimento Ufficio Stipendio annuo Città
Impiegato Anna Bianco Amministrazione 75 € 40.000,00 Venezia
Carlo Bianchi Produzione 20 € 36.000,00 Torino Carlo Rossi Direzione € 80.000,00 Milano Franco Neri Distribuzione 16 € 45.000,00 Napoli
Giuseppe Verdi Amministrazione 20 € 40.000,00Roma Lorenzo Gialli Direzione € 73.000,00Genova Marco Franco Produzione 20 € 46.000,00Roma Mario Rossi Amministrazione 10 € 45.000,00 Milano
Operatori di Aggregazione
• Una Query normalmente è applicata all’intera tabella, ma ne
analizza una riga per volta, estraendo tutte quelle che verificano le condizioni della WHERE
–
Es: Si vuole conoscere il numero di matricola di tutti gli studenti che abitano a Napoli.•
Se ci sono 100 studenti di Napoli, la risposta sarà una tabella con 100 righe• Una Query aggregata estrae un risultato che dipende da un
insieme di righe. Il risultato è un valore che non è posseduto da una particolare riga
–
Es: Si vuole il numero di studenti che abitano a NapoliOperatori di Aggregazione
• Le Queries con operatori aggregati sono delle estensioni delle
normali interrogazioni
• Un’interrogazione con un operatore aggregato viene eseguita in 2
momenti successivi:
1. (Selezione di righe) Viene prima eseguita la query considerando
le parti FROM e WHERE, procedendo una riga alla volta
selezionando quelle che rispondono alle condizioni della clausola WHERE.
2. (Applicazione della funzione sulle righe selezionate) Sulla tabella risultante viene poi applicato l’operatore aggregato
QUERY 21 - COUNT
Numero di Dipendenti del Dipartimento
Produzione
SELECT FROM WHERE Count (*) Impiegato Dipartimento=“Produzione";QUERY 21bis - COUNT
Numero di Dipendenti del Dipartimento Produzione
(metodo alternativo)
SELECT FROM WHERE Count ([Cognome]) Impiegato Dipartimento=“Produzione";QUERY 22 - COUNT
Numero di tutti i Dipendenti
SELECT FROM
Count (*)
Altri Operatori di Aggregazione
• FUNZIONI di aggregazione su un insieme di tuple
–
COUNT–
SUM–
AVG•
Ammettono come argomento solo espressioni numeriche o di tempo–
MAX–
MIN•
Richiedono che sull’espressione sia definito un ordinamento (per cui si possono applicare anche a Caratteri, ad esempio)QUERY 23 - SUM
Somma degli stipendi dei dipendenti del Dipartimento
Amministrazione
SELECT FROM WHERE
Sum ([Stipendio annuo]) AS [Stipendio Totale] Impiegato
QUERY 24 - MIN, MAX, AVG
Stipendi minimo, massimo e medio fra quelli di tutti i
Dipendenti
SELECT FROM
Min ([Stipendio annuo]), Max ([Stipendio annuo]), Avg ([Stipendio annuo])
QUERY 25 – MAX su testo
Cognome del Dipendente che, in ordine alfabetico, è in
ultima posizione
SELECT FROM
Max (Cognome)
Fondamenti di
Informatica
Prof. Fenza Giuseppe
DBMS – Linguaggio SQL
Raggruppamenti
Raggruppamenti
• Gli operatori aggregati visti fino ad ora forniscono
–
un risultato “complessivo” (SUM, COUNT, …) e–
operano su tutte le righe prodotte da un’interrogazione• Altre volte è, invece, necessario applicare un operatore aggregato
–
a sottoinsiemi di righe raggruppate su valori comuni–
Ad esempio: se per ogni Dipartimento si volesse conoscere iltotale degli stipendi pagati bisognerebbe
•
raggruppare i dipendenti per dipartimento•
e applicare l’operatore SUM ad ognuno di questi gruppi•
È cioè necessario suddividere le righe in sottoinsiemi omogeneiRaggruppamenti
• Basta aggiungere in coda alla SELECT-FROM-WHERE la clausola GROUP BY
GROUP BY A1,…Ak
HAVING Y
- A1,…,Ak è un insieme di campi
Un sottoinsieme di A1,…,Ak può comparire nella clausola SELECT (che non può contenere campi diversi da A1,…,Ak)
- Y è una clausola opzionale che si applica ai gruppi (permette di selezionarne solo un sottoinsieme)
La query raggrupperà tutte le righe che presentano gli stessi valori sui campi A1,…Ak
QUERY 26 - GROUP BY
Per ogni Dipartimento si vuole conoscere il totale degli
stipendi pagati
SELECT FROM
GROUP BY Dipartimento;
Dipartimento, Sum([Stipendio annuo]) AS Totale
Come “funziona” una query con GROUP BY
SELECT FROM
Dipartimento, [Stipendio annuo] Impiegato
Come “funziona” una query con GROUP BY
Nell’esempio il valore in base a cui raggruppare è il nome del Dipartimento
2) Le righe vengono poi raggruppate mettendo assieme tutte quelle con uguale valore degli attributi che compaiono nella clausola GROUP BY
Come “funziona” una query con GROUP BY
Nel nostro esempio, l’operatore è SUM e si applica ad ognuno dei 4 sottoinsiemi individuati
3) Viene applicato l’operatore aggregato ad ognuno dei sottoinsiemi individuati
GROUP BY - HAVING
• La lista dei campi della clausola SELECT deve essere un
sottoinsieme di quella della clausola GROUP BY.
• Se siamo interessati solamente ad alcuni dei sottoinsiemi
utilizziamo il predicato HAVING
–
Nota: HAVING può anche essere usato senza GROUP BY. In questo caso la tabella si considera come un unico granderaggruppamento.
–
HAVING presenta espressioni che contengono campi solo se questi sono argomenti di operatori aggregatiQUERY 27 - HAVING
Nome e spesa complessiva dei Dipartimenti che spendono più di 100.000 euro in stipendi
SELECT FROM
GROUP BY HAVING
Dipartimento, Sum ([Stipendio annuo]) Impiegato
Dipartimento
QUERY 28 - HAVING
Tutti i Dipartimenti in cui la media degli stipendi dei dipendenti che lavorano nell’ufficio 20 è superiore a 25.000 euro
SELECT FROM WHERE GROUP BY HAVING Dipartimento Impiegato Ufficio = 20 Dipartimento Avg([Stipendio annuo])>25000;
Query
1. Elencare i valori di tutti i campi dei vini;
2. Elencare i nomi di tutti i produttori;
3. Elencare i vini prodotti nel 2000;
Soluzioni
• Elencare i valori di tutti i campi dei vini:
– SELECT * – FROM Vini;
• Elencare i nomi di tutti i produttori:
– SELECT [Nome Produttore] – FROM Produttori;
• Elencare i vini prodotti nel 2000:
– SELECT [Nome del Vino] – FROM Vini
– WHERE Vini.[Anno di Produzione])=2000;
• Elencare i vini prodotti prima del 2000:
– SELECT [Nome del Vino] – FROM Vini