ISTITUTO SCOLASTICO ISTRUZIONE SECONDARIA SUPERIORE “ G. SEGATO” Corso di INFORMATICA Modulo 2 : L’interrogazione di una Base di Dati1 Il Modulo è strutturato secondo le seguenti UNITA’ DIDATTICHE : ( UD1 ) L’Algebra Relazionale Definizione di algebra relazionale 1. Le principali operazioni elementari : unione , differenza , intersezione , proiezione , selezione , prodotto . 2. Le operazioni composte : la giunzione interna ed esterna. 3. Esempi di interrogazione usando l’algebra relazionale. ( UD2 ) Fondamenti di SQL 1. 2. 3. 4. 5. 6. 7. 1 Relazioni tra QBE , SQL ed algebra relazionale. Come creare e modificare una tabella in SQL. La selezione tramite l’istruzione select. Select semplice su singola tabella. Select con giunzione su più tabelle. Select nidificate. Come realizzare ordinamenti e raggruppamenti in SQL. AUTORE : Stefano Cecchin A. S. 2008 / 2009 CLASSE : 5 INF 1 Algebra Relazionale ( cenni ) E’ l’insieme di operatori e operazioni che consentono di scrivere una interrogazione tramite un FORMALISMO MATEMATICO. Si tratta in pratica di un linguaggio formale. L’ uso del formalismo è diffuso tra i matematici che per loro natura hanno una naturale capacità di astrazione. Vediamo le principali operazioni che questo formalismo consente : ⇐simbolo La SOMMA o UNIONE in ACCESS Si fondono due tabelle aventi la stessa struttura ( intensione ). ESEMPIO : SOCI = VECCHI-SOCI + NUOVI-SOCI Formalismo matematico : A+B≡{t|t∈A∨t∈B} t ⇒ tupla o riga o record ∨ ⇒ or logico ∧ ⇒ and logico La DIFFERENZA Si ottiene una tabella che è la differenza tra due tabelle. ESEMPIO : VECCHI-SOCI = SOCI – NUOVI-SOCI Formalismo matematico : A–B≡{tt∈A∧t∉B} La INTERSEZIONE Consente di ottenere gli elementi comuni a due tabelle. ESEMPIO : VECCHI-SOCI = SOCI ∩ VECCHI-SOCI STUDENTI ∩ SOCI-BIBLIOTECA = STUDENTI-LETTORI Formalismo matematico : A∩B≡A−(A–B) 2 Il PRODOTTO Operazione fondamentale alla base della maggior parte delle interrogazioni. Consente la concatenazione di due tabelle. ESEMPIO : Tabella A : 3 attributi , 4 tuple Tabella B : 2 attributi , 2 tuple Tabella ( A x B ) : 5 attributi , 8 tuple La Tabella ottenuta come concatenazione tra due tabelle è composta da un numero di attributi che è la somma degli attributi delle due tabelle e da un numero di tuple che il prodotto delle tuple delle due tabelle. TABELLA SCUOLA CLASSE SEZION E 3 C 5 A TABELLA PERSONA NOME Piero Maria Luca Toni ETA 23 12 18 34 SESSO M F M M TABELLA PERSONA X SCUOLA NOME Piero Piero Maria Maria Luca Luca Toni Toni ETA 23 23 12 12 18 18 34 34 SESSO M M F F M M M M 3 CLASSE 3 5 3 5 3 5 3 5 SEZIONE C A C A C A C A Formalismo matematico : A X B ≡ { t t = a conc b ∧ a∈A ∧ b∈B } Le tuple ottenute per combinazione di ogni tupla di B con ogni tupla di A. La PROIEZIONE Consente di selezionare una o più colonne ( campi , attributi ) di una tabella. ESEMPIO : Formalismo matematico : ΠNOME ( PERSONA ) Visualizza la sola colonna dei nomi della tabella PERSONA ΠNOME , ETA ( PERSONA ) Visualizza le colonne nome ed età ΠNOME , ETA , CLASSE ( PERSONA X SCUOLA ) Visualizza le colonne nome ,età ,classe della tabella prodotto 4 La SELEZIONE Consente di estrarre delle tuple ( record , righe ) da una tabella secondo definiti criteri di selezione. ESEMPIO : σNOME = ‘ LUCA ‘ ( PERSONA ) Visualizza le righe della tabella PERSONA dove NOME è uguale a LUCA σNOME = ‘ LUCA ‘ and ETA > 10 ( PERSONA ) Visualizza le righe che contengono il NOME = LUCA se ha una età superiore a 10 anni. σNOME = ‘ LUCA ‘ or ETA > 10 ( PERSONA ) Visualizza le righe che contengono il NOME = LUCA e le righe di chi ha una età superiore a 10 anni. ∏SESSO, CLASSE ( σNOME = ‘ LUCA ‘ or ETA > 10 ( PERSONA X SCUOLA )) Creo la tabella prodotto ( creazione virtuale ) , cerco al suo interno le righe che contengono il nome LUCA o l’attributo età superiore a 10 anni e visualizzo di queste righe i soli attributi sesso e classe. 5 LA GIUNZIONE ( JOIN ) E’ l’operazione più utilizzata perché consente di creare interrogazioni molto articolate che sfruttano le relazioni create tra le tabelle tramite le chiavi primarie ed esterne. CLASSIFICAZIONE : • • • • Giunzione Giunzione Giunzione Giunzione interna ( inner join ) esterna ( outer join ) ( Non c’è in ACCESS ) esterna sinistra ( left outer join ) esterna destra ( right outer join ) La giunzione consente la creazione di una tabella virtuale partendo da due tabelle che hanno in comune un attributo. L’ attributo in comune nella pratica delle cose è una chiave primaria ( o un campo che compone la chiave primaria ) in una tabella e la chiave esterna dell’altra tabella che la lega alla chiave primaria contenuta nella prima tabella. ESEMPIO : Tabella STUDENTE COGNOME NOME Roldo Gros Rossi Verdi Bianchi Toni Piero Mario Lucia Luca CLASSE (CE) null * 5B 5B 2C 2C * Privatista senza classe Tabella CLASSE CLASSE AULA 5B 11 3A 3 2C 21 4A 5 6 Tabella di Giunzione interna ( inner join ) COGNOME Gros Rossi Verdi Bianchi NOME Piero Mario Lucia Luca CLASSE 5B 5B 2C 2C AULA 11 11 21 21 Formalismo matematico : STUDENTE CLASSE ≡ σclasse (ce) = CLASSE ( STUDENTE X CLASSE ) classe(ce) = CLASSE Si visualizzano le righe della tabella prodotto ottenuta combinando le tuple delle due tabelle che hanno chiave esterna = chiave primaria . Tabella di Giunzione esterna sinistra ( left outer join ) COGNOME Roldo Gros Rossi Verdi Bianchi NOME Toni Piero Mario Lucia Luca CLASSE null 5B 5B 2C 2C AULA null 11 11 21 21 Come la giunzione interna con in più le righe della tabella di sinistra che non hanno alcuna relazione con la tabella di destra i cui campi nella tabella sono posti a null . 7 Formalismo matematico : STUDENTE CLASSE ≡ σclasse (ce) = CLASSE ( STUDENTE X CLASSE ) classe(ce) = CLASSE Tabella di Giunzione esterna destra ( right outer join ) COGNOME null null Gros Rossi Verdi Bianchi NOME null null Piero Mario Lucia Luca CLASSE 3A 4A 5B 5B 2C 2C AULA 3 5 11 11 21 21 Come la giunzione interna con in più le righe della tabella di destra che non hanno alcuna relazione con la tabella di sinistra i cui campi nella tabella sono posti a null . Formalismo matematico : STUDENTE CLASSE ≡ σclasse (ce) = CLASSE ( STUDENTE X CLASSE ) classe(ce) = CLASSE Tabella di Giunzione esterna ( outer join ) Non è previsto da ACCESS anche se è comunque ottenibile tramite le due giunzioni precedenti . Infatti risulta la unione delle due precedenti giunzioni esterne ( destra e sinistra ). Giunzione esterna = Giunzione destra + Giunzione sinistra 8 COGNOME null null Roldo Gros Rossi Verdi Bianchi NOME null null Toni Piero Mario Lucia Luca CLASSE 4A 3A null 5B 5B 2C 2C AULA 5 3 null 11 11 21 21 Formalismo matematico : STUDENTE CLASSE ≡ σclasse (ce) = CLASSE ( STUDENTE X CLASSE ) ESEMPI di Interrogazioni con l’ Algebra Relazionale : classe(ce) = CLASSE Quali sono gli alunni della 5B ? ∏cognome , nome( STUDENTI ( σCLASSE = 5B( CLASSE ))) classe(ce) = CLASSE Quali sono gli alunni privatisti ? Πcognome , nome ( σCLASSE = null ( STUDENTI CLASSE classe(ce) = CLASSE classe(ce) = CLASSE 9 )) Fondamenti di SQL Sostanzialmente esistono due modi per formulare una interrogazione di un DATABASE , usare le QBE messe a disposizione dall’applicativo in uso ( ACCESS ) o scrivere delle SELECT in SQL . QBE ( query by example ) sono più facili e veloci da realizzare ,le interrogazioni si ottengono impostando un esempio , ovvero costruendo la tabella che l’interrogazione deve restituire. SQL ( linguaggio di interrogazione ) richiede una maggiore attenzione ( la sintassi del linguaggio ) , per contro consente interrogazioni molto più articolate e complesse. Rappresentazione Grafica delle Relazioni tra le forme di Interrogazione* SQL QBE ALGEBRA RELAZIONALE interrogazioni SQL ⊃ interrogazioni QBE ⊃ interrogazioni Algebra Rel. *Nota : Lo schema delle relazioni si presta ad eventuali critiche perché generalizza il concetto appoggiandosi sul DBMS ACCESS. Lo sviluppo di SQL ( ad esempio SQL3 o SQL-OO ) rende difficile definire una relazione tra le varie forme di interrogazione. 10 Come creare e aggiornare una TABELLA in SQL Le seguenti istruzioni non sono utilizzabili in ACCESS , e riguardano il DDL di un database. ACCESS mette a disposizione altri strumenti per creare una tabelle e per aggiornarne il contenuto. ESEMPIO di creazione : create table STUDENTI ( Nome char (20) not null , Cognome char (20) not null , Classe_app char ( 5 ), primary key ( Nome , Cognome ), foreign key ( Classe_app ) references CLASSE ); In grassetto le parole della sintassi SQL da utilizzare. Gli attributi che formano la chiave primaria vanno definiti non nulli e le chiavi esterne vanno referenziate ( link ) con la tabella a cui si legano. Aggiornamento di una tabella per inserimento di nuovi dati , ovvero di nuove righe . insert into STUDENTI values ( ‘Stefano’, ‘Cecchin’, ‘3A’) Aggiornamento di una tabella per modifiche dei dati in essa contenuti. La classe 5B viene rinominata 5BLI , ecco come fare in SQL . update STUDENTI set Classe_app = ‘5BLI’ where Classe_app = ‘5B’ Al vero l’istruzione update consente operazioni molto più complesse di quella in esempio , ma questo esula dal corso di informatica previsto per il Liceo Tecnologico , inoltre è un tecnicismo che di volta in volta può variare a seconda della versione di SQL in uso. 11 La Selezione E’ l’istruzione con cui si ottengono i risultati di tutte le possibili interrogazioni , SQL realizza la selezione usando l’istruzione SELECT. Tipi di Select Select su una sola tabella , ovvero selezione semplice • Select su più tabelle , ovvero selezione con giunzione ( join ) • Select nidificate , ovvero select di select ( di select …) Struttura della istruzione select Logica della select select from attributi o campi tabella o tabelle where condizione di selezione Sintassi richiesta da SQL select [ distinct ] from espr1,espr2,……,esprn tab1 , tab2 ,…….., tabn [ where condizione ] Traduzione di select in algebra relazionale Πespr1,…,esprn( σcondizione( tab1 X tab2 …X tabn )) 12 L’uso della select sarà trattato tramite degli esempi che utilizzano il seguente MODELLO ER e l’equivalente modello relazionale ( tabelle ). compenso partecipa ARTISTI SPETTACOLO avviene composto LUOGO MANIFESTAZIONE MODELLO ER ( privo di attributi per semplicità grafica ) Tabelle del Modello Relazionale ( con attributi e chiavi ) Tartisti ( COD_SIAE , NomeCognome , Caratteristiche ) Tspettacolo ( TITOLOSpett , TitoloMan , NomeLuogo) Tmanifestazione ( TITOLOMan , Organizzatore ) Tluogo ( NOMELuogo , Posti ) Tpartecipa ( COD_SIAE , TITOLOSpett , Compenso ) 13 La select semplice Visualizza il titolo degli spettacoli select TITOLOSpett from Tspettacolo 1. Visualizza l’intera tabella delle manifestazioni select * from Tmanifestazione 2. Visualizza il numero di posti di cui dispone il Teatro Regio select Posti from Tluogo where NOMELuogo = “TeatroRegio” 3. Visualizza quanti sono i luoghi in cui si svolgono spettacoli select COUNT(*) [ COUNT (distinct NOMELuogo ) ] from Tluogo 4. Visualizza la somma dei compensi percepiti dall’artista con codice siae uguale a VVFR23 select SUM( Compenso) from Tpartecipa where COD_SIAE = “VVFR23” 5. Visualizza I luoghi che dispongono di più di 300 posti select NOMELuogo from Tluogo where Posti > 300 6. Visualizza il NomeCognome e le Caratteristiche di ogni artista select NomeCognome , Caratteristiche from Tartista 14 7. Visualizza quale è il compenso massimo corrisposto ad un artista select from MAX( Compenso ) Tpartecipa 8. Visualizza quale è il compenso Massimo percepito dall’artista con codice siae uguale a VV45Y select MAX( Compenso ) from Tpartecipa where COD_SIAE = “VV45Y” 9. Visualizza quale è il compenso medio percepito dall’artista con codice siae uguale a CC28 select AVG( Compenso ) from Tpartecipa where COD_SIAE = “CC28” 10.Visualizza I codici siae degli artisti che hanno percepito un compenso compreso tra 100 e 300 euro. select COD_SIAE from Tpartecipa where Compenso between 100 and 300 [ Compenso > 100 and Compenso < 300 ] 11.Visualizza il titolo degli spettacoli che non afferiscono ad una manifestazione select TITOLOSpett from Tspettacolo where TitoloMan = null [ TitoloMan is null ] Questi sono degli esempi di interrogazione utilizzando la select su una singola tabella , sia essa riferita ad una entità o generata tramite una relazione molti a molti. Tra parentesi quadre è riportata una opzione equivalente , ovvero prevista da alcuni SQL. 15 La select con giunzione ( join ) Più complessa della precedente , sfrutta l’algebra relazionale vista nelle precedenti lezioni. Prendiamo in considerazione la parte del MODELLO ER relativa ad artista-partecipa-spettacolo. COD_SIAE Compenso TITOLOSpett TITOLOSpett NomeLuogo NomeCognome Caratteristich e Tartista COD_SIAE Tpartecipa Tpartecipa COD_SIAE Tspettacolo TITOLOSpett ( Tartista ( Tpartecipa COD_SIAE TITOLOSpett 16 Tspettacolo ) ) In questo modo ottengo una giunzione tra artista e spettacolo passando attraverso partecipa. select NomeCognome , TITOLOSpett from Tartista inner join ( Tpartecipa inner join Tspettacolo on Tpartecipa.TITOLOSpett = Tspettacolo.TITOLOSpett ) on Tartista.COD_SIAE = Tpartecipa.COD_SIAE where NomeCognome = “ Mario Rossi “; a cui partecipa l’artista La select precedente visualizza gli spettacoli Mario Rossi , la selezione espressa in termini di algebra relazionale risulta : ΠNomeCognome , TitoloSpett ( σNomeCognome=”Mario Rossi”( Tartista ( Tpartecipa COD_SIAE Tspettacolo ) TitoloSpett Criterio con cui operare le select con giunzione A B C D Si vuole porre in relazione qualcosa di A con D , anche se non sono legati da nessuna relazione diretta. A inner join ( B inner join ( C inner join D on attributo comune tra C e D) on attributo comune tra B e C) on attributo comune tra A e C 17 La nidificazione degli inner join segue la logica dal più lontano al più vicino e il DBMS svolge la selezione partendo dall’inner join più interno ( ovvero quello più lontano ) , come nelle espressioni algebriche. ESEMPI 12.Visualizzare gli Spettacoli che compongono la manifestazione avente come titolo “ Cinema Italiano “ select TITOLOSpett from ( Tspettacolo inner join Tmanifestazione on Tspettacolo.TitoloMan = Tmanifestazione.TITOLOMan Where Tmanifestazione.TITOLOMan =” Cinema Italiano “ ) ; 13.Visualizzare gli spettacoli a cui partecipa l’artista Luca Verdi ed ordinali alfabeticamente. select TITOLOSpett from ( Tspettacolo inner join ( Tartista inner join Tpartecipa on Tartista.COD_SIAE = Tpartecipa.COD_SIAE where Tartista.NomeCognome =”Luca Verdi”) on Tspettacolo.TITOLOSpett=Tpartecipa.TITOLOSpett) order by asc ; 14.Visualizza quali luoghi ospitano la manifestazione “ Cinema Italiano ”. select NOMELuogo from Tluogo inner join ( Tmanifestazione inner join Tspettacolo on Tmanifestazione.TitoloSpett=Tspettacolo:TITOLOSpett where Tmanifestazione.TitoloSpett = “Cinema Italiano”) on Tluogo.NOMELuogo=Tspettacolo.NomeLuogo ; 18 15.Visualizza il NomeCognome degli artisti che partecipano alla manifestazione “ Cinema Italiano “. select NomeCognome from Tartista inner join ( Tpartecipa inner join ( Tmanifestazione inner join Tspettacolo on Tmanifestazione.TitoloSpett=Tspettacolo:TITOLOSpett where Tmanifestazione.TitoloSpett = “Cinema Italiano”) on Tpartecipa.TITOLOSpett=Tspettacolo:TITOLOSpett ) on Tartista.COD_SIAE=Tpartecipa.COD_SIAE ; La select nidificata ( o select di select ) Si creano delle sottointerrogazioni che vengono utilizzate all’interno di una select , ovviamente la sottointerrogazione è una select da cui la struttura a select annidate una nell’altra. ESEMPI 16.Visualizzare NomeCognome degli artisti in ordine alfabetico e l’ammontare dei compensi percepiti, denominando la colonna . select distinct NomeCognome , select ( SUM ( Compenso )) as Ammontare from Tartista inner join Tpartecipa On Tartista.COD_SIAE=Tpartecipa.COD_SIAE order by NomeCognome 17.Visualizzare NomeCognome degli artisti che hanno ricevuto compensi maggiori al compenso medio. select distinct NomeCognome from Tartista inner join Tpartecipa On Tartista.COD_SIAE=Tpartecipa.COD_SIAE Where Compenso > ( select AVG ( Compenso ) from Tpartecipa ) order by Compenso 19 18.Visualizzare il titolo degli spettacoli che si svolgono in luoghi la cui disponibilità di posti è maggiore di 200. select TITOLOSpett from Tpsettacolo inner join Tluogo On Tspettacolo.NomeLuogo=Tluogo.NOMELuogo where NOMELuogo in ( select NOMELuogo from Tluogo where Posti> 200 ) 19.Visualizzare il NomeCognome degli artisti che hanno partecipato ad almeno uno spettacolo. select distinct NomeCognome from Tartista where exists ( select NomeCognome from Tartista inner join Tpartecipa on Tartista.COD.SIAE=Tpartecipa.COD_SIAE ) 20.Visualizzare il titolo delle manifestazioni che non utilizzano luoghi usati dalla manifestazione “ Cinema Italiano” select TITOLOMan from Tluogo inner join ( Tmanifestazione inner join Tspettacolo on Tmanifestazione.TitoloSpett=Tspettacolo:TITOLOSpett ) on Tluogo.NOMELuogo=Tspettacolo.NomeLuogo where NOMELuogo not in ( select NOMELuogo from Tluogo inner join ( Tmanifestazione inner join Tspettacolo on Tmanifestazione.TitoloSpett=Tspettacolo:TITOLOSpett where Tmanifestazione.TitoloSpett = “Cinema Italiano” ) on Tluogo.NOMELuogo=Tspettacolo.NomeLuogo ); 20 Come realizzare ORDINAMENTI e RAGRUPPAMENTI in SQL L’ordinamento si realizza con l’istruzione order by , e può essere crescente ( asc ) o decrescente ( desc ) , per default l’ordinamento è crescente. select NOMELuogo from Tluogo where Posti > 200 order by Posti desc , NOMELuogo asc I luoghi devono avere più di 200 posti e sono visualizzati dal luogo con più posti , in caso di luoghi con pari numero di posti la visualizzazione segue l’ordinamento alfabetico. I raggruppamenti si realizzano con l’istruzione group by attr1 , … , attrn [having condizione del gruppo ] La tabella risultante è un insieme di gruppi , le righe che compongono ogni gruppo soddisfano alla seguente logica : “ Le righe stanno nello stesso gruppo se hanno gli stessi valori sugli attributi attr1 , … , attrn e se rispettano la eventuale clausola presente in having “ Esempi 21.Quali manifestazioni prevedono almeno due spettacoli. select TitoloMan , COUNT(*) from Tspettacolo group by TitoloMan having COUNT(*) >= 2 22.Quanti spettacoli ospita ogni luogo. select NomeLuogo , COUNT(*) from Tspettacolo group by NomeLuogo 21 23.Fare una graduatoria degli artisti , per compensi ricevuti ,aggiungendo la loro caratteristica. select NomeCognome , Caratteristiche , SUM( Compenso ) as Guadagno from Tartista inner join Tpartecipa on Tartista.COD_SIAE=Tpartecipa.COD_SIAE group by NomeCognome , Caratteristiche order by SUM(Compenso) desc 24.Fare una graduatoria degli artisti per partecipazioni agli spettacoli. select NomeCognome , COUNT(*) from Tartista inner join Tpartecipa on Tartista.COD_SIAE=Tpartecipa.COD_SIAE group by NomeCognome order by COUNT(*) desc NOTA1 : Gli attributi presenti nella riga select devono essere gli stessi presenti nella riga group by. Ammesso l’uso di COUNT(*) e le operazioni di aggregazione sugli attributi. NOTA2 : In alcuni SQL è previsto un ordinamento tramite l’istruzione Top , che consente di estrarre i migliori , ad esempio top 10 consente di visualizzare i migliori dieci. Si lascia al lettore consultare il manuale in linea di ACCESS per avere maggiori ragguagli. Gli appunti possono contenere degli errori ortografici , spero non ci siano orrori di sintassi. Gli esempi presenti negli appunti non sono stati testati e potrebbero richiedere degli aggiustamenti alla sintassi ( ad esempio l’uso del punto e virgola finale o racchiudere tra parentesi quadre [] il nome delle tabelle ). La struttura logica degli esempi è corretta (spero). L’apprendimento dei fondamenti del linguaggio SQL richiede esercizio ed “ una organizzazione mentale logica “ nella formulazione delle interrogazioni. 22