SQL Parte 2

Database_1

Query su più tabelle 

La JOIN è un’operazione che unisce il contenuto di una o più tabelle. E si può realizzare in tre modi diversi:

• Inner join

• Left outer join

• Right outer join

INNER JOIN 

L’inner join, detto anche JOIN, è l’operazione di unione più utilizzata e conosciuta. L’inner join unisce le due tabelle specificate, unendo i soli record che corrispondono al criterio specificato per la relazione; vengono quindi escluse tutte le righe che non soddisfano il criterio di relazione.

Esempi:
Considerando le tabelle sotto riportate, scriviamo una query che estragga i dati dei clienti che abbiano almeno una fattura

Schermata 2014-03-14 alle 19.57.56

SELECT c.nome, c.cognome FROM Clienti c INNER JOIN Fatture f   ON f.idCliente=f.idCliente

L’inner join si può anche scrivere in forma abbreviata, indicando la sola relazione senza utilizzare la parola chiave Inner join:

SELECT c.nome, c.cognome FROM Clienti c, Fatture f WHERE f.idCliente=f.idCliente

LEFT OUTER JOIN 

Il left outer join, detto anche left join, relaziona due tabelle estraendo tutte le righe presenti nella tabella specificata a sinistra del join e riempiendo con NULL i campi il cui valore non esiste nella seconda tabella.

Le righe presenti unicamente nella tabella di destra non saranno affatto estratte.

SELECT c.nome, c.cognome, f.Importo FROM Clienti c LEFT JOIN Fatture f ON f.idCliente=f.idCliente

La query di esempio estrarrà quindi i seguenti valori:

Schermata 2014-03-14 alle 20.01.32

Si può notare come il cliente Antonio Bianchi venga comunque estratto anche senza avere una corrispondenza nella tabella delle fatture.Non accade invece il contrario: la fattura numero 102 non viene estratta, perché non ha nessuna corrispondenza con la tabella dei clienti.

RIGHT OUTER JOIN 

Il right outer join, detto anche right join, agisce in modo opposto al left join. Estrae, quindi, tutte le righe presenti nella tabella specificata a destra del join e riempie con NULL i campi il cui valore non esiste nella prima tabella. Le righe presenti unicamente nella tabella di sinistra non saranno affatto estratte.

SELECT f.idFattura, f.Importo, c.nome, c.cognome FROM Clienti c RIGHT JOIN Fatture f ON f.idCliente=f.idCliente 

La clausola WHERE 

La clausola where è probabilmente la più utilizzata nelle query: questa infatti ha come scopo quello di limitare le selezioni, includendo nelle estrazioni i soli record i cui valori corrispondono ai criteri specificati. La where può essere quindi considerata come un filtro da applicare alle nostre interrogazioni per estrarre i soli valori che ci interessano, e non tutti i record inseriti nelle tabelle.

La sua sintassi generale, all’interno di una query, è:

WHERE <campo> <predicato> <valori>

Per “campo” si intende un campo della tabella, mentre il “predicato” stabilisce la regola da verificare, e “valori” indica i valori indicati per verificare la regola.

Il predicato può assumere i seguenti valori:

Schermata 2014-03-14 alle 20.05.24

Prendiamo come esempio per le nostre query, la tabella di seguito riportata:

Schermata 2014-03-14 alle 20.07.06

Nelle query a seguire vedremo come si costruisce la clausola e l’utilizzo dei predicati elencati in precedenza:

Estrarre tutte le persone con il campo citta uguale a roma 

SELECT *FROM Persone p WHERE p.citta=’Roma’ 

Estrarre tutte le persone con il campo idPersona minore a 3 

SELECT *FROM Persone p WHERE p.idPersona < 3 

Prima di riportare degli esempi per il predicato like è necessario fare una piccola introduzione: Il like serve per verificare che un campo contenga il valore specificato.

Con il like posso verificare se il campo deve contenere esattamente il valore specificato o una parte di esso. Questo si ottiene grazie a due simboli:

• Il simbolo _ che indica un solo carattere qualsiasi;
• Il simbolo % che indica qualsiasi combinazione di qualsiasi carattere.

Estrarre tutte le persone con il campo nome che inizia per daniel e finisce un un carattere qualsiasi

SELECT * FROM Persone p WHERE p.nome like ‘daniel_’ 

Estrarre tutte le persone con il campo nome che finisce per “io”

SELECT  * FROM Persone p WHERE p.nome like ‘%io’ 

Il predicato between viene utilizzato per mettere nelle condizioni un range di valori. Serve quindi per estrarre i record con il campo avente un valore compreso tra quelli specificati.

Estrarre tutte le persone con il campo anno di nascita compreso tra il 1960 e il 1970

SELECT * FROM Persone p WHERE p.dataNasc between 1960 and 1970 

La clausola GROUP BY 

La clausola group by viene utilizzata per raggruppare i risultati di una select in base al campo indicato. Il group by si può utilizzare solo insieme ad un operatore di conteggio come ad esempio l’operatore count o sum.

Contare le persone raggruppandole per città

SELECT citta, count(*) as tot from Persone p GROUP BY citta

La clausola HAVING 

La clausola having viene utilizzata per filtrare i risultati delle operazioni di raggruppamento, e si può paragonare ad una where, anche se il suo utilizzo è limitato alle aggregazioni.

La having può operare sia sui campi utilizzati per le funzioni di aggregazione (sum, count) che su quelli specificati nella clausola group by.

Contare le persone raggruppandole per città dove per ogni raggruppamento ci siano almeno 2 città

SELECT citta, count(citta) as tot FROM Persone p GROUP BY citta HAVING count(citta) >1 

La clausola ORDER BY 

La clausola order by viene utilizzata per ordinare i risultati delle operazioni di estrazione.

Estrarre tutti i record della tabella ordinati in modo crescente per nome

SELECT * FROM Persone p ORDER BY nome 

Si prega di attivare i Javascript! / Please turn on Javascript!

Javaskripta ko calu karem! / Bitte schalten Sie Javascript!

S'il vous plaît activer Javascript! / Por favor, active Javascript!

Qing dakai JavaScript! / Qing dakai JavaScript!

Пожалуйста включите JavaScript! / Silakan aktifkan Javascript!