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 interrogazione Proiezione Selezione Ridenominazione Join
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) cap città prov Ambiente di esecuzione SQL nome cogn città nome Cogn tel indir cap 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,..TabellaM WHERE <condizione booleana>; Elenco attributi di cui è richiesta la visualizzazione Nomi tabelle cui appartengono gli attributi Condizione 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. Il seguente impiego dell’istruzione SELECT: SELECT attributoX,.. attributoW FROM Tabella; Permette di applicare alla relazione Tabella, l’operatore Algebrico di PROIEZIONE
SELECT Destinazione, Data, Costo Select: proiezione Consideriamo ad esempio la tabella viaggi, e supponiamo di voler eseguire una proiezione sugli attributi Destinazione,Data, Costo Tabella Origine: viaggi Forniremo un’istruzione specifica: SELECT Destinazione, Data, Costo FROM Viaggi;
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: Seleziona Tutti gli attributi SELECT * FROM Tabella WHERE <condizione booleana>; Applica per Ciascuna tupla La 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: Tabella Origine: viaggi SELECT Destinazione, Costo, DurataGG, Data FROM Viaggi WHERE Costo <= 500;
…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 che Ritorna 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) L’op. Like può Essere preceduto dall’operatore Not che complementa, Nega, l’insieme restituito da like SELECT Destinazione, Data FROM Viaggi WHERE Destinazione like ‘_a%’; che restituisce:
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 unico
…segue Per restituire alla tabella il suo significato insiemistico, esiste in SQL la parola chiave “distinct”: SELECT distinct Destinazione FROM Viaggi; Se è richiesta esplicitamente la presenza dei duplicati, si usa nella query la parola chiave “all”
Select tra più tabelle Supponiamo che esista un’altra tabella, Prenotazioni, e che tra esse vi sia una relazione 1 a molti, ovvero 1 Viaggio -> più Prenotazioni Viaggi Prenotazioni 1 ¥ Cod_viaggio Destinazione Nro-prenotazione Durata_giorni Nro_posti-prenotati Data_partenza Cliente Partenza Indirizzo_cliente Mezzo Anticipo Nro_posti Costo
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
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 codViaggio A1B0 Destinazione Parigi Data 1505/1999 Partenza Roma Mezzo Aereo NumPosti 30 Costo 300 Nro-Prenot 432312 Nro_psti-Ptr 1 Cliente Caio Rossi Indirizzo Via Verdi Anticipo 100 432313 4 Adele Nari Via Font AMP2 Amsterdam 17/05/2005 Napoli 18 500 334311 Giusp Esp Cso Italia 150 334312 Vito Fonta Via C.Cort … .. ...
Select: Inner Join 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 INNER JOIN Prenotazioni ON Viaggi.CodViaggio=Prenotazioni.codViaggio; SELECT * FROM Viaggi, Prenotazioni WHERE Viaggi.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; Valori NULL
Varianti join: LEFT JOIN Su questo esempio allora ci si potrebbe chiedere quali siano i pacchetti Viaggio che siano rimasti invenduti: Ordine crescente Del dynaset 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;
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;
Fine 1a parte