vuoi
o PayPal
tutte le volte che vuoi
Utilizzo degli alias nelle query SQL
WHERE Tab1.codice = Tab2.codice; come si può notare, sono stati utilizzati degli "alias" per i nomi della tabella, proprio per indicare quali campi di quali tabelle confrontare. Se, ad esempio, si esegue la stessa query prendendo in considerazione solo i nomi e i cognomi degli studenti e dei genitori, si utilizzerà una SELECT simile:
SELECT Tab1.Nome, Tab1.Cognome, Tab2.Nome, Tab2.Cognome FROM Genitore AS Tab1, Studenti AS Tab2 WHERE Tab1.codice = Tab2.codice;
Funzioni di aggregazione
Nel comando SELECT possono essere utilizzate opportune funzioni predefinite in grado di agire sui valori contenuti in un insieme di righe di una tabella; tali funzioni vengono chiamate funzioni di aggregazione.
Funzione COUNT
La funzione COUNT conta il numero di righe presenti in una tabella:
SELECT COUNT (*) FROM Studenti;
oppure:
SELECT COUNT (Nome) FROM Studenti;
La differenza tra questi due comandi sta nel fatto che, mentre per la prima vengono prese in considerazione tutte le righe, nella seconda vengono considerate solo le righe in cui il campo "Nome" non è nullo.
seconda vengono prese in considerazione tutte le righe in cui il valore di "Nome" è specificato e che quindi non è Null. Anche qui è possibile utilizzare la clausola DISTINCT, in questo modo:
<SELECT COUNT(DISTINCT Nome)
FROM Studenti;>
Funzione SUM
La funzione SUM restituisce il valore della somma di tutti i valori presenti in una colonna. Ad esempio, volendo la somma degli stipendi, si esegue la seguente query:
<SELECT SUM (Stipendio)
FROM Dipendenti;>
se vogliamo la somma dei valori degli stipendi, aumentati del 10%, possiamo eseguire la query:
<SELECT SUM (Stipendio * 1.10) AS Totale
FROM Dipendenti;>
in output avremo un campo di nome "Totale" con la somma degli stipendi, aumentati del 10%. È possibile utilizzare questa funzione anche con la clausola WHERE:
<SELECT SUM (Stipendio * 1.15) AS Totale
FROM Dipendenti
WHERE Stipendio < 1500;>
Funzione AVG
Questa funzione calcola la media dei valori numerici contenuti in una colonna. AVG deriva dall'inglese
Average che significa appunto media. Ad esempio, possiamo calcolare la media degli stipendi dei dipendenti:<SELECT AVG(Stipendio) AS Totale FROM Dipendenti;>
funziona in modo analogo a SUM.
Funzioni MIN e MAX
Queste funzioni restituiscono rispettivamente il valore minimo e il valore massimo tra i valori (che possono essere numerici o alfanumerici) della colonna specificata. Ad esempio, se vogliamo i valori, minimo e massimo, degli stipendi, si scriverà:
<SELECT MIN(Stipendio), MAX(Stipendio) FROM Dipendenti;>
Ordinamenti e raggruppamenti
Per ottenere dei valori ordinati viene utilizzata la clausola ORDER BY. Se ad esempio vogliamo il nome e il cognome degli studenti ordinati alfabeticamente, si esegue la seguente query:
<SELECT Cognome, Nome FROM Studenti ORDER BY Cognome ASC, Nome;>
Vi sono due tipi di ordinamento: in ascendente (ASC) e in discendente (DESC). Si utilizza la clausola GROUP BY per raggruppare un insieme di righe aventi lo stesso valore nelle colonne indicate. Se, ad esempio, si vuole...recuperare la somma degli stipendi dei dipendenti per categoria e il numero di dipendenti per categoria, conviene utilizzare la clausola GROUP BY
per raggruppare i dipendenti appartenenti alla stessa categoria:
SELECT Categoria, SUM(Stipendio), COUNT(*)
FROM Dipendenti
GROUP BY Categoria;
Una SELECT
con funzioni di aggregazione e raggruppamenti può essere ampliata sottoponendo i gruppi al controllo di una o più condizioni. In questi casi può essere utile la clausola HAVING
.
Ad esempio, volendo recuperare la somma degli stipendi dei dipendenti per categoria, solo per le categorie aventi più di tre dipendenti:
SELECT Categoria, SUM(Stipendio)
FROM Dipendenti
GROUP BY Categoria
HAVING COUNT(*) > 3;
La clausola HAVING
viene sempre utilizzata insieme a GROUP BY
, proprio perché rappresenta una condizione, come WHERE
, con la differenza che, anziché per le righe, viene utilizzata per funzioni di aggregazione applicate a gruppi di righe.
La ricerca
Con particolari
condizione opposta. LIKE L'operatore LIKE viene utilizzato per cercare un pattern all'interno di una stringa. È possibile utilizzare i caratteri speciali "%" e "_" per rappresentare rispettivamente una sequenza di caratteri arbitraria e un singolo carattere. Ad esempio, per recuperare i nomi dei dipendenti che iniziano con la lettera "A", si può eseguire la query: SELECT Nome FROM Dipendenti WHERE Nome LIKE 'A%'; ORDER BY La clausola ORDER BY viene utilizzata per ordinare i risultati di una query in base a una o più colonne. È possibile specificare l'ordine di ordinamento utilizzando le parole chiave ASC (ascendente) o DESC (discendente). Ad esempio, per ordinare i dipendenti per cognome in ordine alfabetico discendente, si può eseguire la query: SELECT Cognome, Nome FROM Dipendenti ORDER BY Cognome DESC; LIMIT La clausola LIMIT viene utilizzata per limitare il numero di righe restituite da una query. È possibile specificare il numero massimo di righe da restituire utilizzando un valore numerico. Ad esempio, per restituire solo i primi 10 dipendenti, si può eseguire la query: SELECT Cognome, Nome FROM Dipendenti LIMIT 10;La condizione opposta. L'operatore LIKE confronta il valore di un attributo di tipo carattere (char) con un modello di stringa che può contenere caratteri jolly.
I caratteri jolly sono:
- _ : (underline), per indicare un singolo carattere in una determinata posizione della stringa;
- %: (percento), per indicare una sequenza qualsiasi di caratteri in una posizione determinata della stringa.
Ad esempio:
- con LIKE 'Ni%' vengono ricercate tutte le stringhe che iniziano con 'Ni';
- con LIKE '%o' vengono ricercate tutte le stringhe che finiscono con 'o';
- con LIKE '%io%' vengono ricercate tutte le stringhe che contengono 'io';
- con LIKE 'Nic_' ricerca le stringhe di 4 caratteri che iniziano per 'Nic'.
Un esempio è:
SELECT Cognome, Nome
FROM Dipendenti
WHERE Cognome LIKE 'Nic%';
Questa query ricerca i Cognomi e i Nomi dei dipendenti che iniziano con 'Nic' per cognome.
Anche con LIKE è
possibile utilizzare l'operatore logico NOT, prima di LIKE, per prendere in considerazione la condizione opposta.<p>Il predicato IS NULL controlla se un valore in una colonna è nullo. Ad esempio, volendo recuperare i Cognomi degli studenti il cui nome non è specificato, si scriverà:</p>
<pre>SELECT Cognome FROM Studenti WHERE Nome IS NULL;</pre>
<p>Anche con IS NULL è possibile utilizzare l'operatore logico NOT, per prendere in considerazione la condizione opposta (IS NOT NULL).</p>
<p>Join tra tabelle</p>
<p>Nell'SQL l'operazione di "selezione", che permette di ricavare da una tabella un'altra tabella che contiene solo le tuple (le righe) che soddisfano una determinata condizione, si realizza usando la clausola WHERE, mentre l'operazione di "proiezione", che consente di ricavare una tabella che contiene solo alcuni attributi della tabella di partenza, si realizza semplicemente indicando l'elenco degli attributi richiesti.</p>
<p>Se la struttura delle tabelle è tale che è possibile stabilire una relazione tra di esse, è possibile utilizzare l'operatore JOIN per combinare i dati di più tabelle in un'unica query. L'operatore JOIN specifica come le tabelle sono collegate tra di loro, utilizzando le chiavi primarie e le chiavi esterne.</p>
tabelle è omogenea, è possibile applicare le normali operazioni insiemistiche di unione, intersezione e differenza.
Ora si vuole illustrare l'operazione di "congiunzione" (join) di due tabelle in base ad un attributo comune.
Consideriamo due tabelle, A e B:
Tabella A | Tabella B | |
---|---|---|
id_dipartimento | id | Nome |
1 | Architettura | Gino |
2 | Economia | Pino |
3 | Storia | Maria |
4 | Scienze | Rosa |
5 | Filosofia |
SELECT * FROM TabellaA INNER JOIN TabellaB ON TabellaA.id_dipartimento = tabellaB.id;
risultato è:
id dipartimento | nome | id_dipartimento |
---|---|---|
1 | Architettura | Gino |
2 | Economia | Pino |
3 | Storia | Maria |
4 | Filosofia | Rosa |
Il dipartimento di Scienze, non avendo iscritti, non è stato considerato. Nel caso dei due insiemi, viene presa in considerazione solo la parte che si sovrappone.
OUTER JOIN
L'Outer Join restituisce tutti i record che non corrispondono alle chiavi di ricerca. È il contrario della Inner Join. Ciò avviene solo in linea teorica, poiché verrebbero estratti solo i risultati non corrispondenti visualizzati con una serie di NULL. In realtà l'Outer Join si utilizza insieme a Left o Right diventando Left Outer Join o Right Outer Join.
Nel caso dei due insiemi viene selezionato tutto ciò che sta al di fuori dall'intersezione.
LEFT OUTER JOIN (RIGHT OUTER JOIN)
Questo tipo di selezione si ottiene mettendo insieme il concetto di Inner Join e Outer Join. Il risultato che si ottiene è la selezione di tutti i record della
TabellaA | TabellaB |
---|---|
id_dipartimento | id |
1 | 1 |
2 | 2 |
3 | 3 |
4 | NULL |
5 | 5 |
TabellaA che hanno corrispondenza con la TabellaB, più i record della TabellaA che non hanno corrispondenza. I record che non trovano corrispondenza vengono impostati a valore NULL. Esiste anche la Right Outer Join ma in genere non si usa e per ottenere lo stesso risultato si cambia l'ordine delle tabelle. A volte è possibile omettere il termine OUTER, quindi rimane semplicemente LEFT JOIN o RIGHT JOIN.
Vediamo un esempio:
SELECT * FROM TabellaA LEFT JOIN TabellaB ON TabellaA.id_dipartimenti = TabellaB.id;
Il risultato è:
id_dipartimento | nome | id_dipartimento |
---|---|---|
1 | Architettura | Gino |
2 | Economia | Pino |
3 | Storia | Maria |
4 | Scienze | NULL |
5 | Filosofia | Rosa |
In questo caso anche la riga Scienze è stata inserita, ma, dal momento che non vi sono iscritti, viene inserito NULL nel campi che non hanno corrispondenza.
Subquery
Per introdurre il concetto di Subquery, rivediamo innanzitutto l'utilizzo della specifica IN. La clausola IN controlla se un valore è presente in una
- In altre parole il predicato
IN
formulato con:campo IN (a, b, c, ...)
; è equivalente acampo = a OR campo = b OR campo = c OR ...
; - I valori della lista potrebbero essere quelli selezionati da uno statement
SELECT
e cioè potremmo fare una sottoquery per ricavare i dati della lista che ci interessano. - Ad esempio potremmo usare:
SELECT NOME, INDIRIZZO FROM XYZ WHERE NOME IN(SELECT NOME FROM ZYX WHERE CITTA = 'Roma');
- Il
SELECT
tra parentesi seleziona tutti i campi NOME della tabella