Comments
Description
Transcript
sql_query_1a - In Contatto da casa
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 nome cogn città Ambiente di esecuzione SQL 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>; Condizione vero/falso che determina l’appartenenza o meno alla tabella risultato delle righe coinvolte nell’ interrogazione Elenco attributi di cui è richiesta la visualizzazione Nomi tabelle cui appartengono gli attributi Operatori algebrici relazionali con SELECT: la Proiezione Attraverso questa istruzione, è possibile manipolare le relazioni applicando su di esse gli operatori tipici dell’algebra relazionale. Il seguente impiego dell’istruzione SELECT: SELECT attributoX,.. attributoW FROM Tabella; 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 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: SELECT * FROM Tabella WHERE <condizione booleana>; Seleziona Tutti gli attributi 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: 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()); Il recordset risultante diventa: Funzione che Ritorna la data odierna (25/11/2005) 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 1 Cod_viaggio Destinazione Durata_giorni Data_partenza Partenza Mezzo Nro_posti Costo Prenotazioni Cod_viaggio Nro-prenotazione Nro_posti-prenotati Cliente Indirizzo_cliente Anticipo 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 codViaggio Destinazione Data Partenza Prenotazioni Mezzo NumPosti Costo codViaggio Nro-Prenot Nro_psti-Ptr Cliente Indirizzo Anticipo A1B0 Parigi 1505/1999 Roma Aereo 30 300 A1B0 432312 1 Caio Rossi Via Verdi 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: 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 ** SELECT FROMINNER Viaggi, Prenotazioni FROM Viaggi JOIN Prenotazioni ON WHERE Viaggi.CodViaggio=Prenotazioni.codViaggio; 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 WHERE Prenotazioni, Viaggi 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;