Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing...

26
Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II” Novembre 2005

Transcript of Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing...

Page 1: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Le query in SQL

Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I

Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Novembre 2005

Page 2: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Sommario degli argomenti 1a parte

Query di interrogazioneProiezioneSelezioneRidenominazioneJoin

Page 3: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Query di selezione

Come avevamo già anticipato, le istruzioni di interrogazione permettono di estrarre da una o più tabelle le informazioni a cui si è interessati, organizzando la risposta in una tabella ideale (dynaset)

Ambientedi esecuzione

SQL

capcap

cittàcittà

provprov

nomenome

CognCogn

teltel

indirindir

capcap

nomenome

cogncogn

cittàcittà

Select Nome,Cognome cittàFrom …Where …

Page 4: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

L’istruzione SELECT

Seleziona, tra le tuple appartenenti alle tabelle specificate, soltanto quelle che soddisfano il criterio indicato, visualizzandone i valori degli attributi esiderati.

SELECT TabellaN.attributoP,.. TabellaM.attributoR

FROM TabellaN,..TabellaMWHERE <condizione booleana>;

Elenco attributi di cui è richiesta lavisualizzazione

Nomi tabellecui appartengono

gli attributiCondizione vero/falso che

determina l’appartenenza o meno alla tabella risultato

delle righe coinvolte nell’ interrogazione

Page 5: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Operatori algebrici relazionali con SELECT: la Proiezione

Attraverso questa istruzione, è possibile manipolare le

relazioni applicando su di esse gli operatori tipici dell’al-

gebra relazionale.

SELECT attributoX,.. attributoW

FROM Tabella;

Il seguente impiego dell’istruzione SELECT:

Permette di applicare alla relazione Tabella, l’operatore

Algebrico di PROIEZIONE

Page 6: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select: proiezione

Consideriamo ad esempio la tabella viaggi, e supponiamo di voler eseguire una proiezione sugli attributi Destinazione,Data, Costo Tabella Origine:

viaggi

SELECT Destinazione, Data, Costo

FROM Viaggi;

Forniremo un’istruzione specifica:

Page 7: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select: proiezione

Il cui risultato è il seguente:

Page 8: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Operatori algebrici relazionali con SELECT: la Selezione

Analogamente, è possibile realizzare l’operazione algebrica relazionale di Selezione.

La sintassi cui faremo riferimento è la seguente:

SELECT *FROM Tabella

WHERE <condizione booleana>;

SelezionaTutti gli attributi

Applica perCiascuna tuplaLa condizione

booleana

Questa istruzione permette di applicare alla relazione Tabella, l’operatore algebrico di SELEZIONE

Page 9: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select: Selezione

Supponiamo di ‘selezionare’ dalla tabella viaggi, tutte le

Tuple per le quali il costo del viaggio è <= 400 Euro

SELECT *FROM Viaggi

WHERE Costo <=400;

Che restituisce:

Page 10: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

L’istruzione SELECT: esempio

Naturalmente è possibile comporre nell’ordine la Selezione e la Proiezione:

SELECT Destinazione, Costo, DurataGG, Data

FROM Viaggi

WHERE Costo <= 500;

Tabella Origine: viaggi

Page 11: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

…in sintesi

L’istruzione applica la condizione booleana (clausola WHERE) a ciascuna riga della tabella viaggi, e laddove il risultato sia vero preleva gli attributi richiesti e li scrive nella tabella risultato:

La condizione dunque, rappresenta il criterio in base alla quale vengono filtrate le informazioni che non sono di

interesse

Page 12: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

…segue clausola WHERE

Il criterio di selezione, quantunque possa essere complesso, avrà sempre 2 valori risultanti, cioè VERO/FALSO

SELECT Destinazione, Costo, DurataGG, Data

FROM Viaggi

WHERE (Costo <= 500) and (Data > Now());

Funzione cheRitorna la data

odierna (25/11/2005)Il recordset risultante diventa:

Page 13: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Ancora sulla clausola ‘Where’

SQL mette a disposizione un operatore like per il confronto

di stringhe. Sono forniti inoltre due caratteri speciali:

_ : rappresenta un carattere arbitrario (? In Access)

%: stringa di un numero arbitrario di caratteri (* in Access)

SELECT Destinazione, Data

FROM Viaggi

WHERE Destinazione like ‘_a%’;

che restituisce:

L’op. Like può Essere preceduto

dall’operatoreNot che complementa,

Nega, l’insieme restituito da like

Page 14: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select: Ridenominazione

Anche l’operazione di ridenominazione degli attributi

Previsto dall’algebra relazionale è realizzato dalla istruzione

SELECT:

SELECT Attributo1, AttributoN AS MIOAttributo, Attributo M

FROM Tabella;

Specifichiamo ad esempio, la durata dei viaggi come

Numero di settimana e giorni residui:

SELECT Destinazione, Data, int(durataGG/7) AS Settimane, (durataGG mod 7) AS giorni

FROM Viaggi;

Page 15: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select: Ridenominazione

Che restituisce:

Page 16: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Alcune caratteristiche

Supponiamo di specificare la seguente interrogazione:

SELECT Destinazione

FROM Viaggi;

Il cui risultato è:

Compaiono dei duplicati.Una tabella relazionale è un

insieme di elementi righe (tuple), per cui ogni elemento distinto

deve essere unicoessere unico

Page 17: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

…segue

Per restituire alla tabella il suo significato insiemistico, esiste in SQL la parola chiave “distinct”:

SELECT distinct Destinazione

FROM Viaggi;

Se è richiesta esplicitamentela presenza dei duplicati,

si usa nella query la parola chiave “all”

Page 18: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select tra più tabelle

Viaggi Prenotazioni 1 Cod_viaggio Cod_viaggio Destinazione Nro-prenotazione Durata_giorni Nro_posti-prenotati Data_partenza Cliente Partenza Indirizzo_cliente Mezzo Anticipo Nro_posti Costo

Supponiamo che esista un’altra tabella, Prenotazioni, e che tra esse vi sia una relazione 1 a molti, ovvero 1 Viaggio -> più Prenotazioni

Page 19: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select tra più tabelle

La tabella delle Prenotazioni potrebbe essere la seguente:

Potremmo chiederci ad esempio, quali sono le mete dei

Clienti prenotati

In questo caso però, le mete (‘Destinazioni’) compaiono nella tabella Viaggi, mentre i ‘Clienti’ figurano nella tabella Prenotazioni: cioè due tabelle distinte

Page 20: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

codViaggio

A1B0

Destinazione

Parigi

Data

1505/1999

Partenza

Roma

Mezzo

Aereo

NumPosti

30

Costo

300

codViaggio

A1B0

Nro-Prenot

432312

Nro_psti-Ptr

1

Cliente

Caio Rossi

Indirizzo

Via Verdi

Anticipo

100

A1B0 Parigi 1505/1999 Roma Aereo 30 300 A1B0 432313 4 Adele Nari Via Font 100

AMP2 Amsterdam 17/05/2005 Napoli Aereo 18 500 AMP2 334311 1 Giusp Esp Cso Italia 150

AMP2 Amsterdam 17/05/2005 Napoli Aereo 18 500 AMP2 334312 4 Vito Fonta Via C.Cort 300

… … … … … … .. .. … ... … … …

Select: Tabelle correlate

L’ideale sarebbe disporre di un’unica tabella in grado di contenere

entrambe le informazioni, e sulla quale svolgere l’interrogazione.

Dobbiamo cioè correlare dati in tabelle diverse identificando un attributo che abbia valori uguali sulle due tabelle.

Qual è questo attributo con valori uguali?Viaggi Prenotazioni

Page 21: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Select: Inner Join

SELECT *FROM Viaggi INNER JOIN Prenotazioni ON

Viaggi.CodViaggio=Prenotazioni.codViaggio;

Abbiamo cioè costruito il prodotto cartesiano Viaggi X Prenotazioni,

con il vincolo di considerare solo le righe che presentano l’uguaglianza

nell’attributo comune codViaggio.

L’SQL è in grado di generare una tale relazione; l’operatore binario corrispondente è noto come INNER JOIN

SELECT *FROM Viaggi, Prenotazioni

WHEREViaggi.CodViaggio=Prenotazioni.codViaggio;

Page 22: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

…segue

Da questa tabella, restringendo l’insieme degli attributi osservati,

otteniamo la risposta al quesito da cui eravamo partiti: Le mete dei clienti

SELECT Prenotazioni.Cliente,

Prenotazioni.Indirizzo, Viaggi.Destinazione,

FROM Prenotazioni, Viaggi

WHERE viaggi.codViaggio=prenotazioni.CodViaggio;

Page 23: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Varianti join: LEFT JOIN

Un’alternativa all’INNER JOIN è quella di costruire una tabella che ne ampli il risultato, estendendolo cioè con le righe della tabella di sinistra per le quali non esiste una corrispondente riga nella tabella di destra

SELECT *FROM Viaggi LEFT JOIN Prenotazioni ON

Viaggi.CodViaggio=Prenotazioni.codViaggio;

ValoriNULL

Page 24: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Varianti join: LEFT JOIN

Su questo esempio allora ci si potrebbe chiedere quali siano i pacchetti

Viaggio che siano rimasti invenduti:

SELECT Viaggi.CodViaggio,Viaggi.Destinazione,Viaggi.Data

FROM Viaggi LEFT JOIN Prenotazioni ON Viaggi.CodViaggio=Prenotazioni.codViaggio

WHERE (Prenotazioni.codViaggio IS NULL) AND (Viaggi.Data < Date())

ORDER BY Viaggi.Data;

Ordine crescenteDel dynaset

Page 25: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”

Varianti join: RIGHT JOIN

Il RIGHT JOIN ha un comportamento anologo al LEFT JOIN: aggiunge

alla tabella restituita dall’INNER JOIN le righe della tabella di destra

per le quali non esiste una corrispondente riga nella tabella di sinistra

Il risultato coincide con l’inner Join perché per ogni record della tabella

di destra (Prenotazioni) esiste un record corrispondente nella tabella di

sinistra (Viaggi). La sintassi è:

SELECT *FROM Viaggi RIGHT JOIN Prenotazioni ON

Viaggi.CodViaggio=Prenotazioni.codViaggio;

Page 26: Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing Domenico Liguori - Università degli studi di Napoli “Federico II”