SQL Linguaggio per l’interrogazione di una base dati
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 2 Interrogazione di una base dati L’interrogazione di una base di dati è uno degli aspetti piu importanti del linguaggio SQL. I comandi di interrogazione, o QUERY, permettono di effettuare una ricerca dei dati presenti nel database che soddisfano particolari condizioni, richieste dall’utente
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 3 Istruzione SELECT per l’interrogazione SELECT ListaAttributi FROM ListaTabelle [ WHERE Condizione ] Bisogna specificare: La "target list“ cioè la lista degli attributi interessati. clausola FROM per stabilire in quale/quali tabella/e sono contenuti i dati che ci occorrono. clausola WHERE per esprimere le condizioni che i dati cercati devono soddisfare. Le query vengono effettuate mediante il comando SELECT. Sintassi:
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 4 Target List Specificare la target list corrisponde a scegliere alcuni degli attributi della tabella o delle tabelle considerate. Implementa l’operazione di proiezione dell’algebra relazionale MatrCognomeNome tel Select Cognome, nome, tel FROM Rubrica Rubrica
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 5 Where La clausola WHERE serve a scegliere le righe della tabella che soddisfano una certa condizione. In questo modo la clausola where implementa la selezione dell’algebra relazionale MatrCognNome tel ……Pippo…… …...Mario…… ……Silvia……...…Mario…… ……Marco…… ……Mario…… SELECT * FROM Rubrica WHERE nome=‘Mario’ Rubrica
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 6 From La clausola FROM ha lo scopo di scegliere quali sono le tabelle del database da cui vogliamo estrarre le nostre informazioni. Nel caso in cui le tabelle elencate sono due, la clausola FROM, insieme con la clausola WHERE, che stabilisce quali righe delle due tabelle bisogna accoppiare, implementa il join naturale MatricolaNomeCognomeIndirizzo cod.MateriaNomeDocentestudente StudentiEsami SELECT * FROM Studenti, Esami Where Studenti.Matricola=Esami.Studente
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 7 SELECT SELECT ListaAttributi FROM ListaTabelle [ WHERE Condizione ] La query considera il prodotto cartesiano tra le tabelle in ListaTabelle (JOIN). Fra queste seleziona solo le righe che soddisfano la Condizione (SELEZIONE) e infine valuta le espressioni specificate nella target list ListaAttributi (PROIEZIONE). La SELECT implementa quindi gli operatori di Proiezione, Selezione e Join dell’algebra Relazionale, piu’ altro, che vedremo piu’ avanti.
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 8 MADREFIGLIO LuisaMaria LuisaLuigi AnnaOlga AnnaFilippo MariaAndrea MariaAldo PADREFIGLIO SergioFranco LuigiOlga LuigiFilippo FrancoAndrea FrancoAldo NOMEETAREDDITO Andrea2721 Aldo2515 Maria5542 Anna5035 Filippo2629 Luigi5040 Franco6020 Olga3041 Sergio8535 Luisa7587 Maternità Paternità Persone
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 9 Esempio query Nome e reddito delle persone con meno di trenta anni π Nome, Reddito ( σ Eta<30 (Persone)) SELECT nome, reddito FROM persone WHERE eta < 30 NomeReddito Andrea21 Aldo15 Filippo29
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 10 La target list La target list ha lo scopo di determinare quali attributi (o colonne) della/delle tabella/e si vogliono evidenziare. Corrisponde all’operazione di proiezione dell’algebra relazionale. Data una tabella e un insieme di attributi, la proiezione restituisce una tabella con tutte le righe di quella di partenza, ma con solo le colonne identificate dagli attributi
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 11 NomeEta ANDREA27 ALDO25 MARIA55 ANNA50 FILIPPO26 LUIGI50 FRANCO60 OLGA30 SERGIO85 LUISA75 Esempio: Visualizzare il nome e l’età dei dati presenti nella tabella Persone SELECT nome, eta FROM Persone
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 12 Esempio 2: Visualizzare tutte le colonne della tabella Maternita. SELECT * From Maternita MadreFiglio LuisaLuigi LuisaMaria AnnaOlga AnnaFilippo MariaAndrea MariaAldo Maternita Se si desidera visualizzare tutti gli attributi della tabella, si può semplificare la target list indicando la lista con un semplice asterisco *
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 13 Alias delle colonne L’alias serve a dare a una colonna un nome diverso rispetto a quello che è utilizzato nella definizione della tabella. Implementa l’operatore (Ridenominazione) dell’algebra relazionale
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 14 Alias Sintassi: L’alias deve seguire immediatamente il nome di una colonna, scritto semplicemente o con le virgolette. Può essere usata opzionalmente la parola chiave AS tra il nome della colonna e l’alias richiede necessariamente le virgolette se l’alias ha degli spazi. Esempio: Select Figlio as Figlio_M From Maternita Select Figlio “Figlio madre” From Maternita
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 15 Esercizi Esercizio 1: Reperire tutti i nomi dei negozi e denominare la corrispondente colonna con “negozio”. SELECT neg_nome negozio FROM Negozi Esercizio 2: Elencare i codici dei negozi che hanno inviato ordini. Denominare la corrispondente colonna con “codice negozio”. SELECT neg_cod “codice negozio” FROM Ordini Select neg_nome as negozio FROM Negozi
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 16 Esercizi Esercizio 3: Elencare tutte le città che sono sedi di negozi SELECT neg_citta FROM negozi Esercizio 4: Elencare i nomi diversi di città che sono sede di negozi SELECT DISTINCT neg_citta FROM Negozi In tal caso si usa la clausola DISTINCT
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 17 Esercizi Esercizio 5: ottenere le informazioni relative a tutti i negozi dando alle colonne i seguenti nomi: Codice, Denominazione, Indirizzo, Citta’, Telefono SELECT neg_cod Codice, neg_nome Denominazione, neg_indirizzo Indirizzo, neg_citta Città, neg_telefono Telefono FROM Negozi
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 18 Selezione, la clausola where Con SQL è anche possibile effettuare la selezione dell‘algebra relazionale mediante la clausola WHERE. La clausola WHERE permette infatti di specificare le condizioni che devono soddisfare le righe cercate. Ovviamente la clausola WHERE è opzionale, e se si omette, si selezionano tutte le righe della tabella specificata Esempio: Nome, età e reddito delle persone con meno di trent’anni SELECT nome, eta, reddito FROM persone WHERE eta < 30
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 19 Condizioni La condizione che segue il costrutto where è una condizione Booleana. Fa quindi uso di Operatori di confronto =,, <> (!=), = Connettori logici AND, OR, NOT Operatori BETWEEN, IN, LIKE, IS NULL
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 20 Operatori di confronto, esempi Selezionare le persone che si chiamano Mario SELECT * FROM Persone Where nome=‘Mario’ Selezionare gli impiegati che guadagnano più di 1200 euro SELECT * FROM Impiegato WHERE Stip>1200
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 21 Operatori di confronto, esempi Selezionare il nome e cognome delle persone che non hanno età superiore a 30 anni SELECT Nome, Cognome FROM Persone WHERE eta<=30 Selezionare tutti gli impiegati tranne quelli che lavorano nel dipartimento di Produzione. SELECT * FROM Impiegato WHERE dipartimento <> ‘Produzione’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 22 Connettori logici, Esempi Selezionare le persone che hanno più di 30 anni e che non abitano a Palermo SELECT * FROM Persone WHERE (eta>30) AND NOT(citta=‘Palermo’) Selezionare gli impiegati che lavorano nel dipartimento di produzione e quelli che lavorano in segreteria SELECT * FROM Persone WHERE Dipart=‘Produzione’ OR Dipart=‘Segreteria’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 23 CognomeFilialeEtàMatricola NeriMilano RossiRoma BruniMilano NULL 9553 Impiegati NeriMilano BruniMilano NULL 9553 σ Età > 40 OR Età IS NULL (Impiegati) NeriMilano BruniMilano NULL 9553 Gestione dei valori nulli Select * FROM Impiegati WHERE Eta>40 or Eta=null
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 24 Esercizi Esercizio 6: Quali sono i componenti con costo inferiore a 100,00 euro? SELECT com_descrizione FROM Componenti WHERE com_costo< Esercizio 7: Visualizzare indirizzo, città e telefono del negozio MobilMarket SELECT neg_indirizzo Indirizzo, neg_citta città, neg_telefono telefono FROM Negozi WHERE neg_nome=‘MobilMarket’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 25 Esercizio 8: selezionare i negozi con sede a Firenze SELECT neg_nome negozio FROM Negozi WHERE neg_citta=‘Firenze’ Esercizio 9: selezionare gli articoli il cui costo lordo (con IVA) sia inferiore a 500 euro SELECT art_cod, art_descrizione FROM Articoli WHERE art_prezzo *(1+art_IVA/100)<
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 26 Esercizio 10: selezionare gli articoli il cui prezzo lordo sia inferiore a 500 euro, e le cui spese di trasporto siano superiori a 20 euro SELECT * FROM Articoli WHERE art_prezzo*(1+ art_IVA/100)<500 AND (art_spese_trasporto)>20 Esercizio 11: Selezionare i negozi la cui sede sia a Roma o a Firenze SELECT Neg_nome FROM Negozi WHERE neg_citta=‘Roma’ OR neg_citta=‘Firenze’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 27 Uso dell’operatore BETWEEN BETWEEN consente la selezione di righe con attributi in un particolare range. Esempio: cercare gli impiegati che guadagnano tra 1000 e 1500 euro SELECT nome,cognome FROM Impiegato Where Salario between 1000 and 1500
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 28 Uso dell’operatore IN E’ usato per selezionare righe che hanno un attributo che assume valori contenuti in una lista. ESEMPIO Selezionare i nomi dei professori che tengono i corsi. di BD1, BD2, Algoritmi e Sistemi SELECT * FROM Insegnanti WHERE corso IN (‘BD1’, ‘BD2’, ‘Algoritmi’, ‘Sistemi’)
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 29 Esercizi Esercizio 12: Selezionare i componenti il cui costo sia compreso tra 50 e 100 euro SELECT * FROM Componenti WHERE com_costo BETWEEN AND Esercizio 13: Selezionare gli ordini in cui la quantità di articoli richiesti sia compresa tra 15 e30 SELECT ord_cod FROM OrdArt WHERE ordart_qta BETWEEN 15 and 30
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 30 Esercizi Esercizio 14: Selezionare tutti i negozi la cui sede sia a Firenze o Roma usando l’operatore IN SELECT neg_nome FROM Negozi WHERE neg_citta in (‘Firenze’, ‘Roma’) Esercizio 15: Selezionare i componenti con costo uguale a 100 euro o a 120 euro SELECT * FROM Componenti Where Com_costo IN (100, 120)
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 31 Uso dell’operatore LIKE LIKE è usato per effettuare ricerche “wildcard” (ossia con un simbolo jolly) di una stringa di valori. Le condizioni di ricerca possono contenere letterali, caratteri o numeri. Esistono due tipi di wildcard: % denota zero o più caratteri. _ denota un carattere.
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 32 Uso dell’operatore LIKE Esempio: Fra le persone elencate nella tabella Persone, determinare quelle il cui nome termina per ‘a’ SELECT * FROM Persone Where Cognome LIKE ‘%a’ Esempio: Selezionare le sequenze di DNA in cui ci sono almeno due simboli ‘G’ che distano 3 caratteri SELECT * FROM DNA WHERE Sequenza LIKE ‘%G___G%’ NOMEETAREDDITO Andrea2721 Maria5542 Anna5035 Olga3041 Luisa7587
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 33 Simbolo escape A volte può succedere che uno dei simboli coinvolti nel pattern matching sia proprio _ oppure %. In questo caso, si sceglie un simbolo che non è ammesso fra i simboli della stringa (supponiamo ‘#’) detto simbolo escape, nell’espressione per la ricerca si fa precedere il simbolo _ o % cercato dal simbolo escape, e poi si specifica che ‘#’ e’ il simbolo di escape. Esempio: Modelli il cui nome inizia per C_F SELECT * FROM Modelli WHERE nome_modello LIKE ‘C#_F%’ ESCAPE ‘#’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 34 Esercizi Esercizio 16: Selezionare tutti i componenti il cui codice termina per 10 SELECT Com_denominazione FROM Componenti WHERE Com_cod LIKE ‘%10’ Esercizio 17: Selezionare tutti i negozi il cui nome inizia per M. SELECT * FROM Negozi WHERE neg_nome LIKE ‘M%’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 35 Esercizi Esercizio 18: Selezionare tutti i componenti la cui descrizione contiene la parola ‘Tavolo’ SELECT * FROM Componenti WHERE com_descrizione LIKE ‘%Tavolo%’
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 36 Is Null L’operatore IS NULL verifica se il contenuto di un operando è null Esempio SELECT * FROM Veicoli WHERE Cilindrata IS NULL
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 37 Esercizi Esercizio: Quali sono i negozi di cui non si conosce il numero di telefono? SELECT neg_nome FROM Negozi WHERE neg_telefono IS NULL Esercizio: quali sono i componenti di cui non si conosce il laboratorio? SELECT com_descrizione FROM componenti WHERE lab_cod IS NULL
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 38 Forma negativa Tutti gli operatori descritti sono presenti anche in forma Negativa, con ovvio significato. NOT BETWEEN NOT IN NOT LIKE NOT NULL
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 39 Espressioni aritmetiche nella target list E’ possibile anche ottenere delle colonne che non sono in nessuna tabella del database, ma che sono ottenute mediante espressioni aritmetiche. Si ottengono mediante l’uso dei soliti operatori aritmetici: +, -, *, /, e funzioni aritmetiche predefinite. Le priorità sono quelle standard, ma possono essere alterate con l’uso delle parentesi
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 40 Esempio: Evidenziare i cognomi degli impiegati e il loro stipendio aumentato del 20% CognomeStip * 120/100 Rossi1440 Verdi1356 Bianchi1740 Gialli1560 NomeCognomeStip MarioRossi1200 LuigiVerdi1130 MariaBianchi1450 LuisaGialli1300 IMPIEGATO Select cognome, stip *120/100 FROM Impiegato
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 41 Esempio: Evidenziare i cognomi degli impiegati e il loro stipendio aumentato del 20%. Rinominare la colonna corrispondente al salario aumentato con la denominazione “Aumento”. CognomeAumento Rossi1440 Verdi1356 Bianchi1740 Gialli1560 NomeCognomeStip MarioRossi1200 LuigiVerdi1130 MariaBianchi1450 LuisaGialli1300 IMPIEGATO Select cognome, stip *120/100 Aumento FROM Impiegato
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 42 Esempio: Evidenziare i cognomi degli impiegati e il loro stipendio annuale, considerando che la tredicesima è il 70% dello stipendio mensile. Ridenominare la colonna corrispondente con la denominazione “Reddito annuo”. CognomeReddito Annuo Rossi15240 Verdi14351 Bianchi18415 Gialli16510 NomeCognomeStip MarioRossi1200 LuigiVerdi1130 MariaBianchi1450 LuisaGialli1300 IMPIEGATO Select cognome, stip*(12.7) as “Reddito Annuo” FROM Impiegato
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 43 Esercizi Esercizio 20: Visualizzare la tabella dei componenti con il prezzo aumentato del 10%. Esercizio 21: Calcolare il costo lordo, ovvero comprensivo di IVA del tavolo tondo (codice T100). Ridenominare la corrispondente colonna con “Prezzo lordo” SELECT com_cod codice, com_descrizione descrizione, com_costo *1.1 aumentato, lab_cod laboratorio FROM Componenti SELECT art_prezzo*(1+art_iva/100) “prezzo lordo” FROM Articoli WHERE Art_descrizione=‘Tavolo Tondo’ (o where art_cod=‘T100’)
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 44 Concatenazione di stringhe Nei comandi SQL è possibile concatenare due stringhe mediante il simbolo || Esempio: Utilizzando la tabella Paternità, visualizzare le righe: ‘Sergio padre di Franco’ ‘Luigi padre di Olga’ etc… PADREFIGLIO SergioFranco LuigiOlga LuigiFilippo FrancoAndrea FrancoAldo Paternità Select padre ||’, padre di ’|| figlio FROM paternità
30/05/2016SQL, Linguaggio per l'interrogazione di una base dati 45 Esercizi Esercizio: Per ciascun negozio visualizzare una riga del tipo Micheli: Via Landi, 189 – Roma – tel 06/ SELECT neg_nome ||’:’||neg_indirizzo||’ – ’||Neg_Citta|| ‘ – tel ’ neg_telefono Negozio FROM Negozi