Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing...
-
Upload
gioacchino-tonelli -
Category
Documents
-
view
219 -
download
1
Transcript of Le query in SQL Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I Ing...
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
Sommario degli argomenti 1a parte
Query di interrogazioneProiezioneSelezioneRidenominazioneJoin
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 …
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
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
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:
Select: proiezione
Il cui risultato è il seguente:
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
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:
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
…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
…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:
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
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;
Select: Ridenominazione
Che restituisce:
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
…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”
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
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
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
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;
…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;
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
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
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;