Interrogazioni Le interrogazioni in SQL sono formulate in

  • Slides: 23
Download presentation
Interrogazioni Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si

Interrogazioni Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si vuole ottenere e non come lo si vuole ottenere. L’interrogazione viene passata all’ottimizzatore di interrogazioni (query optimizer) che fa parte del DBMS. Questo la analizza e la traduce nel linguaggio di interrogazione interno al DBMS. Per questo chi programma in SQL deve cercare di scrivere codice leggibile e facilmente modificabile, piuttosto che efficiente.

Interrogazioni L’istruzione base per le interrogazioni è select Lista. Attributi from Lista. Tabelle [

Interrogazioni L’istruzione base per le interrogazioni è select Lista. Attributi from Lista. Tabelle [ where Condizione ] (target list) (clausola from) (clausola where) Più in dettaglio: select Attr. Espr [[as] Alias]{, Attr. Espr [[as] Alias]} from Tabella [[as] Alias]{, Tabella [[as] Alias]} [ where Condizione ] Seleziona le righe che soddisfano la condizione where fra quelle appartenenti al prodotto cartesiano delle tabelle in Lista. Tabelle. Ogni colonna (tabella) può essere ridenominata con un alias.

Interrogazioni Es. Data una base di dati che contiene le tabelle: IMPIEGATO (Nome, Cognome,

Interrogazioni Es. Data una base di dati che contiene le tabelle: IMPIEGATO (Nome, Cognome, Dipart, Ufficio, Stipendio, Città) DIPARTIMENTO (Nome, Indirizzo, Città) select Stipendio/12 as Salario. Mensile from Impiegato where Cognome = `Rossi` Il risultato è una tabella con una colonna rinominata Salario. Mensile e tante righe quanti sono gli impiegati che si chiamano Rossi. Se si usa * dopo select si selezionano tutti gli attributi

Maternità Madre Figlio Luisa Maria Luisa Luigi Anna Olga Anna Filippo Maria Andrea Maria

Maternità Madre Figlio Luisa Maria Luisa Luigi Anna Olga Anna Filippo Maria Andrea Maria Aldo Paternità Padre Sergio Luigi Franco Figlio Franco Olga Filippo Andrea Aldo Persone Nome Età Reddito Andrea 27 21 Aldo 25 15 Maria 55 42 Anna 50 35 Filippo 26 30 Luigi 50 40 Franco 60 20 Olga 30 41 Sergio 85 35 Luisa 75 87

Selezione e proiezione Nome e reddito delle persone con meno di trenta anni PROJNome,

Selezione e proiezione Nome e reddito delle persone con meno di trenta anni PROJNome, Reddito(SELEta<30(Persone)) select nome, reddito from persone where eta < 30 select p. nome as nome, p. reddito as reddito from persone as p where p. eta < 30

Interrogazioni su più tabelle Se si vogliono estrarre informazioni da più tabelle, tutte le

Interrogazioni su più tabelle Se si vogliono estrarre informazioni da più tabelle, tutte le tabelle devono apparire come argomento della clausola from. Se si deve formulare un join, è possibile farlo in modo esplicito (from reggerà allora un join fra le tabelle) oppure inserendo la condizione di join nella clausola where. Infatti, specificare una lista di tabelle nella clausola from equivale ad eseguire la query sul prodotto cartesiano delle tabelle riportate nella lista, e un theta -join equivale a un prodotto cartesiano seguito da una selezione sulla condizione di join.

Interrogazioni su più tabelle Es. Estrarre i nomi degli impiegati e le città dove

Interrogazioni su più tabelle Es. Estrarre i nomi degli impiegati e le città dove lavorano. Select Impiegato. Nome, Impiegato. Cognome, Dipartimento. Città from Impiegato, Dipartimento where Impiegato. Dipart=Dipartimento. Nome

Interrogazioni su più tabelle E’ possibile omettere il nome della tabella per quegli attributi

Interrogazioni su più tabelle E’ possibile omettere il nome della tabella per quegli attributi che non presentano ambiguità. select Impiegato. Nome, Cognome, Dipartimento. Città from Impiegato, Dipartimento where Dipart = Dipartimento. Nome e abbreviare ulteriormente il codice utilizzando gli alias select I. Nome, Cognome, D. Città from Impiegato as I, Dipartimento as D where Dipart = D. Nome

Clausola where Ammette come argomento una condizione logica. Gli operatori ammessi per i predicati

Clausola where Ammette come argomento una condizione logica. Gli operatori ammessi per i predicati semplici (confronto attributocostante o attributo-espressione) sono =, <>, <, >, <=, >= I predicati semplici possono essere modificati tramite gli operatori logici and, or, not ha precedenza su and e or, ma non è definita la precedenza fra and e or. Quando si coordinano più predicati con and e or è bene esplicitare le precedenze con le parentesi. Es. select Nome from Impiegato where Cognome = ‘Rossi’ and (Dipart = ‘Amministraz’ or Dipart = ‘Produz’)

Operatore like Per i confronti fra stringhe è definito anche l’operatore like. Il confronto

Operatore like Per i confronti fra stringhe è definito anche l’operatore like. Il confronto è effettuato con una stringa che può contenere i caratteri speciali % e _. _ rappresenta un carattere arbitrario % rappresenta in numero arbitrario di caratteri (anche zero). Es. select * from Impiegato where Cognome like ‘_o%i’ La condizione è soddisfatta da Rossi Borroni Pollastri ecc.

Gestione dei valori nulli La gestione dei valori nulli, a seconda dell’implementazione, avviene attraverso

Gestione dei valori nulli La gestione dei valori nulli, a seconda dell’implementazione, avviene attraverso una logica a due valori come nell’SQL-89, o a tre valori (vero, falso, unknown) come nell’SQL-2. Le condizioni sui valori nulli possono essere definite attraverso i predicati is null o is not null.

Interpretazione algebrica delle interrogazioni E’ possibile mettere in corrispondenza interrogazioni SQL ed espressioni equivalenti

Interpretazione algebrica delle interrogazioni E’ possibile mettere in corrispondenza interrogazioni SQL ed espressioni equivalenti in algebra relazionale. select T 1. Attributo 11, …. Th. Attributohm from Tabella 1 as T 1, . . Tabellah as Th where Condizione equivale a PT 1. Attributo 11. . Th. Attributohm Tabellah) ) (s. Condizione (Tabella 1 x Tabella 2 x. . x Espressioni più complicate hanno comunque una traduzione, anche se non così diretta.

Duplicati L’algebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona

Duplicati L’algebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= ‘Rossi’ estrae una lista di città in cui una città può comparire più volte. Per evitare i duplicati SQL prevede la specifica distinct da inserire subito dopo select distinct Città from Persona where Cognome= ‘Rossi’

Join In SQL-2 è stata introdotta la seguente sintassi per esprimere il join ed

Join In SQL-2 è stata introdotta la seguente sintassi per esprimere il join ed estenderlo ai join esterni select Attr. Espr [[as] Alias]{, Attr. Espr [[as] Alias]} from Tabella [[as] Alias] {[Tipo. Join]join. Tabella [[as]Alias]on Condizione. Join} [ where Altra. Condizione ] Tipo. Join può assumere i valori inner, right[outer], left[outer], full[outer] inner è il default. C’è anche l’estensione natural che implica la condizione di uguaglianza sugli attributi con lo stesso nome.

Join implicito ed esplicito Padre e madre di ogni persona select from where paternita.

Join implicito ed esplicito Padre e madre di ogni persona select from where paternita. figlio, padre, madre maternita, paternita. figlio = maternita. figlio select from paternita. figlio, padre, madre maternita join paternita on paternita. figlio = maternita. figlio

Alias e variabili L’uso degli alias consente di: • compattare il codice • fare

Alias e variabili L’uso degli alias consente di: • compattare il codice • fare riferimento a più esemplari della stessa tabella • creare interrogazioni nidificate Se una tabella compare una sola volta non c’è differenza fra variabile ed alias. Se compare più volte si parla più propriamente di variabile. Es. (impiegati il cui nome è anche il cognome di un altro impiegato) select I 1. Cognome, I 1. Nome from Impiegato I 1, Impiegato I 2 where I 1. Nome = I 2. Cognome and I 1. Nome <> I 2. Nome and I 2. Dipart = ‘Produzione’

Ordinamento E’ possibile anche ordinare le righe del risultato di una interrogazione attraverso la

Ordinamento E’ possibile anche ordinare le righe del risultato di una interrogazione attraverso la clausola order by, a chiusura di una interrogazione. order by Attrdi. Ordinamento [asc | desc] {, Attrdi. Ordinamento [asc | desc]} asc (default) indica ordinamento ascendente, desc discendente. Il primo attributo ha priorità, a parità di valore il secondo ecc. select * from Persona order by Cognome, Nome

Operatori aggregati In algebra relazionale le espressioni vengono valutate sulle singole tuple in successione.

Operatori aggregati In algebra relazionale le espressioni vengono valutate sulle singole tuple in successione. Talvolta però possono essere necessarie informazioni derivabili dall’esame di tutte le tuple o di più tuple contemporaneamente. SQL prevede una serie di operatori aggregati: count, sum, max, min, avg con sintassi count ( < * | [distinct | all] Lista. Attributi >) < sum|max|min|avg >([distinct | all] Attr. Espr) Es. Determinare il numero degli impiegati che si chiamano Rossi select count(*) from Impiegato where nome= ‘Rossi’

Interrogazioni con raggruppamento Gli operatori aggregati vengono applicati a tutte le righe che vengono

Interrogazioni con raggruppamento Gli operatori aggregati vengono applicati a tutte le righe che vengono prodotte come risultato dell’interrogazione. Può essere necessario applicare l’operatore separatamente ad uno o più sottoinsiemi delle righe. SQL non ammette che nella stessa target list compaiano funzioni aggregate ed espressioni a livello di riga, come il nome di un attributo. Come si potrebbe associare un singolo risultato a un attributo che può assumere più valori ?

Interrogazioni con raggruppamento L’operatore group by specifica come suddividere le tabelle in sottoinsiemi omogenei

Interrogazioni con raggruppamento L’operatore group by specifica come suddividere le tabelle in sottoinsiemi omogenei per valore su cui valutare separatamente l’operatore aggregato. Es. select Dipart, sum(Stipendio) from Impiegato group by Dipart (calcola una somma per ogni valore assunto da Dipart)

Un’interrogazione scorretta: select nome, max(reddito) from persone Di chi sarebbe il nome? La target

Un’interrogazione scorretta: select nome, max(reddito) from persone Di chi sarebbe il nome? La target list deve essere omogenea select min(eta), avg(reddito) from persone

Operatori aggregati e raggruppamenti • Il numero di figli di ciascun padre select padre,

Operatori aggregati e raggruppamenti • Il numero di figli di ciascun padre select padre, count(*) from paternita group by Padre paternita Padre Sergio Luigi Franco Figlio Franco Olga Filippo Andrea Aldo AS Num. Figli Padre Sergio Luigi Franco Num. Figli 1 2 2

Interrogazioni con raggruppamento In ogni interrogazione che usa group by, argomento di select (escludendo

Interrogazioni con raggruppamento In ogni interrogazione che usa group by, argomento di select (escludendo l’operatore aggregato) può essere solo un sottoinsieme degli attributi usati nella clausola group by Es. di interrogazione scorretta select Ufficio from Impiegato group by Dipart Poiché deve venire prodotta una sola riga per ogni valore di Dipart, e, a parità di tale valore, possono aversi diversi valori di Ufficio, il risultato dell’interrogazione è indeterminato. In alcuni casi (es. se l’attributo non compreso nella clausola group by è chiave) la query potrebbe fornire un risultato corretto, ma per semplicità SQL lo vieta comunque.