ESEMPI DI QUERY SQL Dati di esempio... 2 Query su una sola tabella... 2 Esempio 1 (Ordinamento)... 2 Esempio 2 (Scelta di alcune colonne)... 3 Esempio 3 (Condizioni sui dati)... 3 Esempio 4 (Condizioni sui dati 2)... 3 Query su più tabelle... 4 Esempio 5 (INNER JOIN)... 4 Esempio 6 (LEFT JOIN)... 4 Esempio 7 (LEFT JOIN 2)... 5 Funzioni di aggregazione... 5 Esempio 8 (funzione AVG)... 6 Esempio 9 (funzione COUNT)... 6 Raggruppamenti... 6 ESEMPIO 10 (GROUP BY)... 7 Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7
Dati di esempio Consideriamo il seguente database, formato dalle tabelle Soci, Prenotazioni e Campi che è utilizzato da un Tennis Club per memorizzare la prenotazioni dei propri campi da tennis da parte dei soci. Di seguito il dettaglio dei dati memorizzati nelle varie tabelle. Vediamo alcuni esempi di query SQL. Query su una sola tabella In questo caso le query vengono effettuate su una sola tabella (quindi la clausola FROM è seguita da un solo elemento tabella). Vengono effettuate o per ordinare i dati (clausola ORDER BY) o per estrarre solamente alcune righe in base ad alcune condizioni (clausola WHERE). Esempio 1 (Ordinamento) Visualizzare l elenco dei soci in ordine alfabetico: SELECT * FROM Soci ORDER BY Cognome, Nome; In questa query dopo la clausola SELECT inseriamo * che indica di prendere tutte le colonne, l unica tabella coinvolta è la tabella Soci, i dati vengono presentati in ordine alfabetico di Cognome e in caso di cognomi uguali in ordine alfabetico di Nome. Se avessi voluto un ordinamento decrescente avrei dovuto aggiungere in coda la clausola DESC. Ecco il risultato della query: Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 2 di 7
Esempio 2 (Scelta di alcune colonne) Visualizzare Cognome, Nome e Cellulare dei soci: SELECT Cognome, Nome, Cellulare FROM Soci; Esempio 3 (Condizioni sui dati) Visualizzare i dati dei campi con Costo orario maggiore di 12,00 : SELECT * FROM Campi WHERE Costo > 12; La condizione che seleziona le righe da visualizzare deve essere inserita nella clausola WHERE. Ecco il risultato: Esempio 4 (Condizioni sui dati 2) Visualizzare i dati dei soci maschi nati negli anni 70: SELECT * FROM Soci WHERE Sesso = M AND DataN BETWEEN #01/01/1970# AND #12/31/1979# Le condizioni sui dati che si devono impostare possono essere anche più di una, in questo caso devono essere legate dalle parole chiave AND oppure OR. Le parole chiave BETWEEN AND servono per indicare che un certo campo è compreso tra due valori, in questo caso 1 gennaio 1970 e 31 dicembre 1979. Quando si impostano le condizioni i testi vanno indicati tra virgolette, le date tra i caratteri # ed i numeri senza nessun carattere particolare. Le date vanno indicate in formato americano e cioè #MM/GG/AAAA# (mesi, giorni, anni: 31 dicembre 1979 = #12/31/1979#). Ecco di seguito il risultato della query: Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 3 di 7
Query su più tabelle Quando si devono estrarre dati da più tabelle (collegate tra loro tramite chiavi primarie ed esterne) le tabelle interessate vanno unite. Ci sono vari modi per unire le tabelle e più precisamente: INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN. Esempio 5 (INNER JOIN) Visualizzare dalla tabella Soci il Cognome, il Nome ed il Cellulare e dalla tabella Prenotazioni FKCampo, Data, Ora e Durata: SELECT Cognome, Nome, Cellulare, FKCampo, Data, Ora, Durata FROM Soci, Prenotazioni WHERE IdSocio = FKSocio; La condizione per unire due tabelle in INNER JOIN viene specificata nella clausola WHERE impostando l uguaglianza tra la chiave esterna e quella primaria. Ricordiamo che la INNER JOIN riporta tutte e sole le righe per le quali c è corrispondenza tra le chiavi. La query può essere alternativamente scritta nella maniera seguente: SELECT Cognome, Nome, Cellulare, FKCampo, Data, Ora, Durata FROM Soci INNER JOIN Prenotazioni ON Soci.IdSocio = Prenotazioni.FKSocio; Esempio 6 (LEFT JOIN) Come nell esempio precedente vogliamo visualizzare dalla tabella Soci il Cognome, il Nome ed il Cellulare e dalla tabella Prenotazioni FKCampo, Data, Ora e Durata ma in più vogliamo visualizzare anche i dati di soci che eventualmente non hanno mai effettuato prenotazioni (se non hanno mai effettuato prenotazioni non hanno corrispondenza nella tabella prenotazioni) SELECT Cognome, Nome, Cellulare, FKCampo, Data, Ora, Durata FROM Soci LEFT JOIN Prenotazioni ON Soci.IdSocio = Prenotazioni.FKSocio; Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 4 di 7
In questo caso oltre alle righe che erano state visualizzate nell esempio precedente (quelle che hanno corrispondenza nelle due tabelle) vengono visualizzate anche le righe della tabella di sinistra (LEFT) in questo caso Soci che non hanno corrispondenza nella tabella di destra. Non avendo corrispondenza a destra, i campi presi dalla tabella Prenotazioni saranno vuoti (NULL). Vediamo il risultato Come si può notare l utente Pluti Pluto non ha mai effettuato alcuna prenotazione ed infatti i campi della tabella Prenotazioni (FKCampo, Data, Ora, Durata) sono vuoti. Esempio 7 (LEFT JOIN 2) Vogliamo visualizzare i dati dei soci (Cognome, Nome e Cellulare) che non hanno mai effettuato prenotazioni: SELECT Cognome, Nome, Cellulare FROM Soci LEFT JOIN Prenotazioni ON Soci.IdSocio = Prenotazioni.FKSocio WHERE IdPrenotazione IS NULL; In questo caso la LEFT JOIN fa in modo che unendo le due tabelle siano presenti sia i soci che hanno corrispondenza nelle due tabelle (che cioè hanno effettuato prenotazioni) sia i soci che questa corrispondenza non l hanno (i soci che non hanno mai prenotato). La clausola WHERE inoltre specifica che deve essere vuoto il campo IdPrenotazione e questo fa in modo che le righe che contengono la corrispondenza Soci Prenotazioni vengano escluse. Rimangono quindi solamente le righe in cui non è presente IdPrenotazione (quindi i soli soci che non hanno mai prenotato) Funzioni di aggregazione Le funzioni di aggregazione sono: MIN, MAX, SUM, AVG, COUNT. In particolare MIN restituisce il valore minimo presente in una data colonna, MAX il valore massimo, SUM restituisce la somma dei dati contenuti in una data colonna, AVG la media e COUNT serve per contare il numero di righe. Vediamo alcuni esempi. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 5 di 7
Esempio 8 (funzione AVG) Visualizzare il costo medio orario dei campi SELECT AVG(Costo) AS CostoMedioCampi FROM Campi; In questa query non è necessario unire tabelle in quanto i dati dei costi sono presenti nella sola tabella Campi. La clausola AS serve per dare un nome alla colonna risultato della query. Esempio 9 (funzione COUNT) Visualizzare il numero di Soci SELECT COUNT(*) AS NumeroSoci FROM Soci; La funzione COUNT quando tra parentesi viene indicato * serve per contare il numero di righe di una tabella o di un raggruppamento. Raggruppamenti La clausola GROUP BY è usata per raggruppare righe che hanno valori uguali nei campi specificati. Quando un comando presenta la clausola GROUP BY, nella riga della clausola SELECT può essere presente una funzione di aggregazione; in questo caso il comando restituisce un valore calcolato dalla funzione per ogni gruppo di righe. Vediamo un esempio. Unendo in INNER JOIN le tabelle Soci e Prenotazioni e selezionando le colonne IdSocio, Cognome, Nome otterremmo: IdSocio Cognome Nome 000C Rossi Laura 000D Neri Maria 000D Neri Maria I soci vengono riportati tante volte quante sono le prenotazioni da loro effettuate. Se noi andiamo ora a raggruppare per IdSocio, Cognome, Nome (tramite GROUP BY IdSocio, Cognome, Nome) avremo una nuova tabella nella quale le righe che hanno gli stessi valori nelle colonne vengono riportate una sola volta: Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 6 di 7
IdSocio Cognome Nome 000C Rossi Laura 000D Neri Maria I raggruppamenti sono spesso utilizzati in combinazione con le funzioni di aggregazione per effettuare calcoli all interno di gruppi di dati. Va ricordato che nella clausola GROUP BY sono sempre riportati gli stessi campi che sono presenti nella clausola SELECT ad eccezione eventualmente delle funzioni di aggregazione. ESEMPIO 10 (GROUP BY) Visualizzare il numero di prenotazioni effettuate da ogni socio (IdSocio, Cognome, Nome). SELECT IdSocio, Cognome, Nome, COUNT(*) AS NumeroPrenota FROM Soci, Prenotazioni WHERE IdSocio = FKSocio GROUP BY IdSocio, Cognome, Nome; Per prima cosa bisogna notare che si devono unire (INNER JOIN) le tabelle Soci e Prenotazioni. In questo modo vengono considerate le righe che hanno corrispondenza nelle due tabelle. Siccome è presente la clausola GROUP BY IdSocio, Cognome, Nome (da notare che i campi della clausola sono gli stessi presenti dopo SELECT ad eccezione di COUNT(*) che è una funzione di aggregazione) tutte le righe che presentano stessi valori su IdSocio, Cognome e Nome vengono raggruppate tra loro (e visualizzate una sola volta). All interno di questi raggruppamenti la funzione di aggregazione COUNT(*) conta il numero delle righe. Ecco il risultato della query: Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 7 di 7