Interrogazioni in SQL SQL. Interrogazioni in SQL. Sintassi. Significato dell interrogazione. Notazione

Documenti analoghi
Query. Query (Interrogazioni) SQL SQL. Sintassi. Interrogazioni in SQL

Query. Query (Interrogazioni) SQL SQL. Significato dell interrogazione. Sintassi

Informatica II Basi di Dati (07/08) Parte 2. 4 Accesso ai dati di un DB. Accesso ai dati di un DB. Accesso ai dati di un DB

Interrogazioni in SQL SQL. Interrogazioni in SQL. Cenni sull implementazione

Informatica. Sintassi. Interrogazioni in SQL. Significato dell interrogazione. Tabella Impiegato. Basi di dati parte 4 SQL

Queries su più tabelle

Operatori aggregati. Operatori aggregati. Interrogazioni con raggruppamento. Interrogazioni con raggruppamento

Interrogazioni su più tabelle. Interrogazioni su più tabelle. Clausola where. Interrogazioni su più tabelle

Interrogazioni di tipo insiemistico. Select. Interrogazioni di tipo insiemistico. Interrogazioni nidificate

SQL Matteo Magnani, Danilo Montesi Università di Bologna SQL. SQL come Data Manipulation Language - Funzioni Aggregate e GROUP BY

Gestione dei valori nulli

E possibile ordinare le righe del risultato di una interrogazione attraverso la clausola order by, a chiusura di una interrogazione.

SQL. SQL: "storia. Sviluppato nella metà degli anni settanta (1974) presso il laboratorio di ricerca IBM di S.Josè. Dal 1983 ca. "standard di fatto"

Join in SQL (primo modo) Informatica. Tabella Dipartimento. Interrogazione 4a. Interrogazione 4b. Interrogazione 4a

Tabelle esempio: Impiegato/Dipartimento

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno

Linguaggio SQL seconda parte

QL (Query Language) Alice Pavarani

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

SQL Matteo Magnani, Danilo Montesi Università di Bologna SQL. SQL come Data Manipulation Language - (SELECT FROM WHERE ORDER BY)

<Nome Tabella>.<attributo>

Join esplicito. SELECT con join esplicito, sintassi. Ulteriore estensione: join naturale (meno diffuso) Outer join. Join esterno: "outer join"

Basi di dati - Laboratorio

INFORMATICA GENERALE Prof. Alberto Postiglione. Scienze della Comunicazione Università di Salerno. INFORMATICA GENERALE Prof. Alberto Postiglione

SQl come DML. Angelo Chianese,, Vincenzo Moscato, Antonio Picariello,, Lucio Sansone

Query. Query (Interrogazioni) SQL SQL. Significato dell interrogazione. Sintassi

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

Il linguaggio SQL - Interrogazioni -

SQL e algebra relazionale

INFORMATICA GENERALE Prof. Alberto Postiglione. Scienze della Comunicazione Università di Salerno. Raggruppamento. Raggruppamento

Structured Query Language

Principi di Progettazione del Software a.a Il linguaggio SQL. Il Linguaggio SQL

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, SQL

Corso di Basi di Dati

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno

Operazioni su insiemi: unione, intersezione e differenza

Prof. Alberto Postiglione Dipartimento di Scienze della Comunicazione Università degli Studi di Salerno

Interrogazioni. L istruzione base per le interrogazioni è select

Uso delle variabili di alias. SQL slide aggiuntive. Interrogazione 25. Interrogazione 26

Linguaggio SQL. studenti matricola nome cognome citta anno 11 marco bini bologna laura sicuro rimini 1984 esami codice

SQL - Structured Query Language

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni

SQL - Sottointerrogazioni correlate

Operatori aggregati: COUNT

Vincoli interrelazionali

Interrogazioni semplici

Operatori aggregati: COUNT

SQL. SQL: una visione panoramica. SQL: "storia" Definizione dei dati

Laboratorio di. Docenti: Alberto Belussi e Carlo Combi

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

Basi di Dati: Corso di laboratorio

Laboratorio di Basi di Dati e Web

IL LINGUAGGIO SQL LE BASI

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

4.SQL QUERY. Fare una query significa fare delle ricerche sul nostro database.

SQL: le funzioni di aggregazione

Corso di Informatica Linguaggio SQL seconda parte

Sistemi di Elaborazione delle Informazioni

SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative

Operazioni sui dati. Interrogazioni con operatori aggregati. Capitolo 4

Corso di Basi di Dati A.A. 2015/2016

Select From Where...

Corso di Basi di Dati

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/

Monday, January 24, 2011 SQL

Database parte 2. Database azienda

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Il formato di base di un interrogazione in SQL è: SELECT R i1.c 1, R i2.c 2,..., R in.c n FROM R 1, R 2,..., R k WHERE F;

SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA. 3. Panoramica su SQL Prof. Mauro Giacomini

Gestione di basi di dati relazionali con SQL (parte II) Valutazione delle condizioni su insiemi di tuple

Linguaggio SQL: fondamenti D B M G

Docente: Alberto Belussi e Carlo Combi. Lezione 4

Il linguaggio SQL: raggruppamenti

Il linguaggio SQL: raggruppamenti

SQL /10/2016 Basi di dati - SQL 1

Interrogazioni complesse. SQL avanzato 1

Laboratorio di Basi di dati/web/mm e Basi di dati per Bioinformatica

Linguaggi per Basi di Dati - 1. Algebra Relazionale. Algebra Relazionale. Linguaggi per Basi di Dati - 2. Operatori Insiemistici.

D B M G. Linguaggio SQL: fondamenti. Istruzione SELECT: fondamenti. Elena Baralis 2007 Politecnico di Torino 1. Struttura di base

SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

Parte III. L algebra relazionale

Modulo 2 Data Base 3

Trasparenze rielaborate da Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999 Capitolo 4: SQL-2, seconda parte.

Operazioni. Lezione 8. Operazioni Relazionali. Operazioni insiemistiche Intersezione: Operazioni insiemistiche Unione:

Basi di Dati: Corso di laboratorio

Corso di. Basi di Dati I. 8. Esercitazioni in SQL: Interrogazioni nidificate

Esempi di Query con Aggregazioni in SQL/1

Caratteristiche dei linguaggi per Database

Corso di. Basi di Dati I. 9. Esercitazioni in SQL: Check, asserzioni, viste

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

Linguaggi per basi di dati e SQL

Linguaggi per basi di dati. Linguaggi per basi di dati e SQL. Linguaggi di interrogazione per basi di dati relazionali. Linguaggi di interrogazione

Il linguaggio SQL: raggruppamenti. Versione elettronica: SQLb-gruppi.pdf

Manuale Comandi SQL SQL. Sito per esercitarsi (on line) SQL

SQL. Il nome sta per Structured Query Language Le interrogazioni SQL sono dichiarative

Idoneita Informatica. Sistemi per la gestione di basi di Dati

Laboratorio di Basi di dati

Il linguaggio SQL: raggruppamenti

Transcript:

SQL Anno accademico 2008/2009 Interrogazioni in SQL Originariamente Structured Query Language Non esiste un unico standard SQL standard Formulazione di interrogazioni (query) è parte del Data Manipulation Language, DML Anche usato nel Data Declaration Language, DDL (per esempio, per dichiarare vincoli di integrità) 2 Interrogazioni in SQL Paradigma dichiarativo: si specifica la descrizione dell obiettivo e non il modo con cui ottenerlo Sintassi Esistono, in generale, più modi per effettuare un interrogazione: scelta basata sulla leggibilità (più che sull efficienza ) Struttura essenziale (introdurremo le variazioni di volta in volta): select ListaAttributi (target list) from ListaTabelle (clausola from ) [ Condizione] (clausola ) 3 4 Notazione Le parentesi quadre [ ]: indicano che il termine all interno è opzionale Può non comparire o comparire una sola volta Significato dell interrogazione Si considerano la tabella/le tabelle della clausola from Si selezionano i record che soddisfano la condizione della clausola (opzionale) Si danno in ouput i valori degli attributi elencati nella target list ( select ) 5 6 1

Schema: Tabella Impiegato Impiegato(Matricola, Nome, Cognome, Dipart, Ufficio, Stipendio, Città) Tabella Impiegato Impiegato Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 46 Prod 20 12 Torino 47 Giuseppe Verdi Amministr 20 13 Roma 48 Franco Neri Distrib 16 15 Napoli 49 Direzione 14 27 Milano 50 Lorenzo Lanzi Direzione 7 21 Genova 51 Paola Burroni Amministr 75 13 Venezia 52 Marco Franco Prod 20 14 Roma 7 8 Interrogazione 1 select * Cognome = Interrogazione 1 select * tutti Cognome = Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 49 Direzione 14 27 Milano Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 49 Direzione 14 27 Milano 9 10 Interrogazione 2 select Stipendio Cognome = Interrogazione 2bis select Stipendio as Salario Cognome = Stipendio 15 27 Salario 15 27 11 12 2

Interrogazione 2bis Interrogazione 3 select Stipendio as Salario Cognome = alias select Stipendio/12 as StipendioMensile Cognome = Salario 15 27 StipendioMensile 1 13 14 Interrogazione 3 select Stipendio/12 as StipendioMensile Cognome = Join in SQL (primo modo) Per formulare interrogazioni che coinvolgono più tabelle occorre effettuare un join, cioè congiungere le tabelle StipendioMensile 1 espressioni 15 In SQL un modo è: elencare le tabelle di interesse nella clausola from mettere nella clausola le condizioni necessarie per mettere in relazione fra loro gli attributi di interesse 16 Tabella Dipartimento Interrogazione 4 Dipartimento(Nome, Indirizzo, Città) Nome Indirizzo Città Restituire nome e cognome degli impiegati e le città in cui lavorano Amministr Via Tito Livio 27 Milano Prod P.le Lavater 3 Torino Distrib Via Segre 9 Roma Direzione Via Tito Livio 27 Milano Ricerca Via Morone 6 Milano select Impiegato.Nome,Cognome, Dipartimento.Città from Impiegato,Dipartimento Dipart = Dipartimento.Nome 17 18 3

Interrogazione 4 Restituire nome e cognome degli impiegati e delle città in cui lavorano select La notazione punto ( ) Impiegato.Nome,Cognome, serve per disambiguare Dipartimento.Città from Impiegato,Dipartimento Dipart = Dipartimento.Nome Risultato interrogazione 4 Impiegato.Nome Cognome Dipartimento.Città Milano Torino Giuseppe Verdi Milano Franco Neri Roma Milano Lorenzo Lanzi Milano Paola Burroni Milano Marco Franco Torino 19 20 Interrogazione 5 select I.Nome, Cognome, D.Città from Impiegato as I, Dipartimento as D Dipart = D.Nome Impiegato as I : esempio di aliasing di una tabella L aliasing per le tabelle serve a abbreviare e disambiguare i riferimenti alle tabelle Sulla clausola Ammette come argomento un espressione booleana Predicati semplici combinati con not, and, or (not ha la precedenza, consigliato l uso di parentesi( )) Ciascun predicato usa operatori: =, <>, <, >, <=, >= Confronto tra valori di attributi, costanti, espressioni 21 22 Interrogazione 6 Interrogazioni 7 e 8,Cognome from Impiegato Ufficio = 20 and Dipart = Amministr Nome Giuseppe Verdi Cognome 7 8, Cognome Dipart= Prod or Dipart= Amministr Cognome= and (Dipart= Prod or Dipart= Amministr ) Nome Paola Marco Cognome Burroni Franco Giuseppe Verdi Nome 7 8 23 24 4

Operatore like Usato per i confronti con stringhe _ = carattere arbitrario; es. p_ denota una qualunque stringa di due caratteri il cui primo carattere è p (come, po, pu, pr, ) % = stringa di lunghezza arbitraria (anche 0) di caratteri arbitrari; es p% denota una qualunque stringa che inizia per p (come p, po, politica, pino, ) Operatore like Esempi: ab%ba_ denota tutte le stringhe che cominciano con ab e che hanno ba come coppia di caratteri prima dell ultima posizione (es. abjjhhdhdbak,abbap) %mari_ denota mario, maria, piermario, piermaria, %mari% denota mari, mario, maria, piermario, piermaria, marino, marina, mariuolo, 25 26 Interrogazione 9 select * Cognome like _o%i or Cognome like _u%i Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 49 Direzione 14 27 Milano 51 Paola Burroni Ammistr 75 13 Venezia Nota: c è distinzione tra maiuscole e minuscole 27 Interrogazione 9bis select * Nome like %o Matricola Nome Cognome Dipart Ufficio Stipendio Città 45 Amministr 10 15 Milano 46 Prod 20 12 Torino 48 Franco Neri Distrib 16 15 Napoli 49 Direzione 14 27 Milano 50 Lorenzo Lanzi Direzione 7 21 Genova 52 Marco Franco Prod 20 14 Roma 28 Gestione dei valori i Gestione dei valori i Campo con valore o significa: non applicabile a una certa tupla, o valore sconosciuto, o non si sa a SQL offre il predicato is : Attributo is [not] È sbagliato, invece, scrivere Attributo = : è un valore che non fa parte del dominio di nessun attributo 29 Quando specifichiamo in una clausola Stipendio>13 cosa succede se l attributo Stipendio è o? La tupla non viene selezionata Per selezionarla, occorre specificarlo espicitamente. Per esempio: Stipendio > 13 or Stipendio is 30 5

Uso delle variabili di alias Non solo per disambiguare la notazione Ci sono casi in cui una stessa tabella serve più di una volta Caso speciale: quando si deve confrontare una tabella con se stessa Interrogazione 10 Estrarre nome e cognome degli impiegati che hanno lo stesso cognome (ma nome diverso) di impiegati che lavorano nel dipartimento Produzione 31 32 Interrogazione 10 Estrarre nome e cognome degli impiegati che hanno lo stesso cognome (ma nome diverso) di impiegati che lavorano nel dipartimento Produzione select I1.Cognome, I1.Nome I1, Impiegato I2 I1.Cognome = I2.Cognome and I1.Nome <> I2.Nome and I2.Dipart = Prod Interrogazione 10 Estrarre nome e cognome degli impiegati I2 usata per che hanno lo stesso cognome (ma nome trovare tuple diverso) assoc. di impiegati a che lavorano nel dipartimento Prod Produzione select I1.Cognome, I1.Nome I1, Impiegato I2 I1.Cognome = I2.Cognome and I1.Nome <> I2.Nome and I2.Dipart = Prod 33 34 Interrogazione 11 Estrarre il nome e lo stipendio dei capi che guadagnano meno dei loro impiegati, date: Impiegato(Matricola, Nome, Età, Stipendio) Supervisione(Sottoposto, Capo) dove Sottoposto e Capo sono chiavi esterne di Impiegato (nell esempio, sono dei numeri di matricola) 35 Tabella Supervisione Supervisione Sottoposto Capo 45 46 46 48 47 46 48 NULL 49 51 50 51 51 48 52 51 36 6

Interrogazione 11 (sol.) select I1.Nome, I1.Stipendio from Impiegato as I1, Impiegato as I2, Supervisione I1.Matricola = Capo and I2.Matricola = Sottoposto and I2.Stipendio > I1.Stipendio Interrogazione 11 (sol.) select I1.Nome, I1.Stipendio from Impiegato as I1, Impiegato as I2, Supervisione I1.Matricola = Capo and I2.Matricola = Sottoposto and I2.Stipendio > I1.Stipendio I1 per i capi, I2 per gli impiegati 37 38 Duplicati Duplicati Per motivi di efficienza, SQL conserva eventuali duplicati risultanti da un interrogazione Es. select Dipart Dipart Amministr Prod Amministr Distrib Direzione Per eliminare i duplicati, occore specificare la parola chiave distinct Es. select distinct Dipart Dipart Amministr Prod Direzione Distrib Direzione Amministr Prod 39 40 Ordinamento Per ordinare le righe del risultato di un interrogazione, si può usare la clausola order by Es. select * order by Matricola asc select * order by Matricola desc ordine crescente ordine decrescente Ordinamento Si possono combinare più criteri di ordinamento Es. select * order by Cognome, Nome a parità di cognome, ordina per nome (ordine crescente sottinteso) asc può essere lasciato sottointeso 41 42 7

Operatori aggregati SQL offre degli operatori che lavorano su più di una tupla alla volta: count, sum, max, min, avg Restituiscono un unico valore a partire da più tuple Interrogazione 12 select count(*) Dipart = Prod Viene prima eseguita l interrogazione, poi l operatore aggregato count(*) conta le tuple risultato dell interrogazione Quindi, gli operatori aggregati si applicano sulle tuple selezionate dalla clausola (se c è) 43 44 Interrogazioni 13, 14 count(<* [distinct]elencoattributi>) indica un alternativa, [] opzionalità I possibili usi sono, quindi: count(*) count(elencoattributi) count(distinct ElencoAttributi) Interrogazioni 13, 14 count(<* [distinct]elencoattributi>) indica un alternativa, [] opzionalità I possibili usi sono, quindi: count(*) count(elencoattributi) count(distinct ElencoAttributi) conta le tuple conta i valori di ElencoAttributi diversi tra loro (e non i) conta i valori di ElencoAttributi non i 45 46 Interrogazioni 13, 14 Numero di stipendi diversi select count(distinct Stipendio) Numero di righe che hanno nome non o select count(nome) Fuzioni di aggregazione Accettano solo espressioni rappresentanti valori numerici o intervalli di tempo sum, max, min, avg (somma, massimo, minimo, media) distinct ha lo stesso significato di prima Altri operatori a seconda del DBMS (solitamente operatori statistici) 47 48 8

Interrogazioni 15, 16 Somma stipendi di Amministrazione select sum(stipendio) Dipart = Amministr Stipendio minimo, massimo, medio degli Impiegati select min(stipendio), max(stipendio), avg(stipendio) Interrogazione 17 Massimo stipendio tra impiegati che lavorano in dip a Milano select max(stipendio), Dipartimento Dipart = Dipartimento.Nome and Dipartimento.Citta = Milano 49 50 Interrogazione non corretta Cognome, nome e stipendio dell impiegato/degli impiegati che hanno stipendio più alto select Cognome, Impiegato.Nome, max(stipendio), Dipartimento Dipart = Dipartimento.Nome and Dipartimento.Citta = Milano Perché è scorretta? max(stipendio) dà luogo a una sola tupla nella tabella risultato, mentre gli altri attributi (potenzialmente) danno più tuple 51 Group by Può servire applicare gli operatori aggregati non alla tabella risultato di una interrogazione nel suo complesso, ma contemporaneamente a diversi sottoinsiemi di tuple di tale tabella Es. Estrarre la somma degli stipendi degli impiegati per ogni dipartimento select sum(stipendio) non è adatta perché somma complessivamente tutti gli stipendi 52 Interrogazione 18 Estrarre la somma degli stipendi degli impiegati per ogni dipartimento select Dipart, sum(stipendio) group by Dipart Interrogazione 18 (cont.) È come se prima si eseguisse la query select Dipart, Stipendio ottenendo la tabella attributi che compaiono nella group by e negli operatori aggregati 53 54 9

Interrogazione 18 (cont.) Interrogazione 18 (cont.) Dipart Stipendio Amministrazione 22.500 Produzione 18.000 Amministrazione 20.000 Distribuzione 22.500 Direzione 40.000 Direzione 36.500 Amministrazione 20.000 Produzione 23.000 55 Poi le tuple vengono raggruppate in sottoinsiemi aventi lo stesso valore dell attributo Dipart Dipart Stipendio Amministrazione 22.500 Amministrazione 20.000 Amministrazione 20.000 Produzione 18.000 Produzione 23.000 Distribuzione 22.500 Direzione 40.000 Direzione 36.500 56 Interrogazione 18 (cont.) Infine l operatore sum viene applicato separatamente a ogni sottoinsieme Dipart Amministrazione 62.500 Produzione 41.000 Distribuzione 22.500 Direzione 76.500 sum(stipendio) La tabella finale contiene una sola riga per ogni gruppo 57 Sintassi select: Group by qui possono comparire solo operatori aggregati o attributi che compaiono in group by select ListaAttributiOEspressioni from ListaTabelle [ CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] 58 Interrogazione non corretta Interrogazione non corretta select Ufficio group by Dipart Perché? 59 select Ufficio group by Dipart A ogni valore dell attributo Dipart corrisponderanno diversi valori dell attributo Ufficio Dopo l esecuzione del raggruppamento, invece, ogni sottoinsieme di righe deve corrispondere a una sola riga nella tabella risultato dell interrogazione 60 10

Interrogazione 19 Interrogazione 19 Dipartimenti, il numero di impiegati di ciascun dipart e la città sede del dipart select Dipart, count(*), D.citta I, Dipartimento D I.Dipart=D.Nome group by Dipart select Dipart, count(*), D.Citta I, Dipartimento D I.Dipart=D.Nome group by Dipart, D.Citta corretta! scorretta! 61 62 Predicati sui gruppi group by: le tuple vengono raggruppate in sottoinsiemi Si potrebbe volere considerare solo sottoinsiemi che soddisfano una certa condizione clausola : applicata alle singole righe clausola having: applicata al risultato della group by ogni sottoinsieme di tuple della group by viene selezionato se il predicato having è soddisfatto 63 Interrogazione 20 Dipartimenti che spendono più di 50 talleri in stipendi select Dipart, sum(stipendio) group by Dipart having sum(stipendio) > 50 64 Predicati sui gruppi Consigli di buon uso having è da usare con group by Senza group by: l intero insieme di righe è trattato come un unico raggruppamento Se la condizione non è soddisfatta il risultato sarà vuoto Usare solo predicati in cui ci sono operatori aggregati nella clausola having Interrogazione 21 Dipartimenti per cui la media degli stipendi degli impiegati che lavorano nell ufficio 20 è > di 12.500 talleri select Dipart Ufficio = 20 group by Dipart having avg(stipendio) > 12.500 65 66 11

Interrogazioni in SQL La forma sintetica generale di un interrogazione SQL diventa: select ListaAttributiOEspressioni from ListaTabelle [ CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ] Interrogazioni di tipo insiemistico union (unione), intersect (intersezione) ed except (differenza) Assumono come default di eseguire l eliminazione dei duplicati L eliminazione dei duplicati rispetta più fedelmente il significato degli operatori insiemistici Per preservare i duplicati: usare l operatore con la parola chiave all 67 68 Interrogazioni di tipo insiemistico Sintassi per l uso degli operatori insiemistici: SelectSQL {<union intersect except> [all] SelectSQL } Interrogazioni di tipo insiemistico SQL non richiede che gli schemi su cui vengono effettuate le operazioni insiemistiche siano identici Richiede solo che gli attributi siano in pari numero e che abbiano domini compatibili La corrispondenza tra gli attributi non si basa sul nome ma sulla posizione degli attributi Se gli attributi hanno nome diverso, il risultato normalmente usa i nomi del primo operando 69 70 Interrogazione 22 (insiemistiche) Nomi e cognomi degli impiegati (notare: non è necessario che gli attributi abbiano lo stesso nome, ma solo lo stesso tipo, per esempio stringa) union select Cognome Interrogazione 22 (insiemistiche) union select Cognome Nome Giuseppe Franco Lorenzo Paola Marco Verdi Neri Lanzi Borroni 71 72 12

Interrogazione 23 (insiemistiche) Nomi e cognomi degli impiegati che non lavorano nel dipartimento Amministr mantenendo i duplicati Nome Dipart<> Amministr union all select Cognome Dipart<> Amministr Franco Lorenzo Marco Neri Lanzi Franco 73 Interrogazione 24 (insiemistiche) Cognomi che sono anche nomi intersect select Cognome Nome Franco 74 Interrogazione 25 (insiemistiche) Nomi che non sono cognomi except select Cognome Nome Giuseppe Lorenzo Paola Marco Join esplicito Abbiamo visto un modo di effettuare il join mettendo le condizioni di join nella clausola Si può utilizzare esplicitamente un operatore di join 75 76 Interrogazione 26 (join esplicito) select Impiegato.Nome, Cognome, Dipartimento.Città,Dipartimento Dipart = Dipartimento.Nome si può scrivere con un join esplicito: select Impiegato.Nome, Cognome, Dipartimento.Città join Dipartimento on (Dipart = Dipartimento.Nome) 77 Interrogazione 27 (join esplicito, riprende la 11) Estrarre il nome e lo stipendio degli impiegati che guadagnano più dei loro capi select I1.Nome, I1.Stipendio I1, Impiegato I2, Supervisione I1.Matricola = Capo and I2.Matricola = Sottoposto and I2.Stipendio > I1.Stipendio select I1.Nome, I1.Stipendio from (Impiegato I1 join Supervisione on (I1.Matricola = Capo)) join Impiegato I2 on (I2.Matricola = Sottoposto) I2.Stipendio > I1.Stipendio 78 13

Outer join Fino ad adesso ci siamo riferiti implicitamente a un tipo di join chiamato inner join (o join interno) Parliamo adesso di outer join (o join esterno) Si distingue in: left join right join full join Outer join L inner join richiede che ogni tupla nelle tabelle messe in join abbia una tupla corrispondente, altrimenti non entrerà a fare parte del risultato cioè: dato R1 join R2 on ( ), per ciascuna tupla di R1 esiste almeno una tupla di R2 che si combina con essa, e viceversa per R2 Gli outer join permettono di mantenere l informazione anche per quelle tuple che non partecipano all inner join 79 80 Tabelle Guidatore e Automobile Guidatore Nome Cognome NumPatente Marco Automobile Neri PZ 1012436B AP 4544442R Targa Marca Modello NumPatente AB 574 WW AA 652 FF BJ 747 XX BB 421 JJ Lancia Punto Brava Delta Uno PZ 1012436B MI 2020030U 81 Inner join,cognome,guidatore.numpatente, Targa, Marca, Modello from Guidatore join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) Nome Cognome Guidatore. Targa NumPatente PZ 1012436B AB 574 WW AA 652 FF BJ 747 XX Marca Modello Lancia Punto Brava Delta Marco Neri non ha automobili associate, quindi non compare nel risultato; l automobile con targa BB 421 JJ non ha guidatori associati, quindi anch essa non compare nel risultato 82 Outer left join (interrogazione 28) Con una left join, la tabella risultato contiene tutte le tuple della tabella di sinistra, comprese quelle senza tuple corrispondenti nella tabella di destra Situazione speculare per l operazione di right join Full join permette di avere nella tabella risultato tutte le tuple sia della tabella di sinistra che di destra I dati mancanti sono rimpiazzati da 83 Outer left join (interrogazione 28),Cognome,Guidatore.NumPatente, Targa, Marca, Modello from Guidatore left join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) Nome Cognome Guidatore. NumPatente Marco Neri PZ 1012436B AP 4544442R Targa AB 574 WW AA 652 FF BJ 747 XX Marca Modello Lancia Punto Brava Delta 84 14

Outer right join (interrogazione 29) Outer full join (interrogazione 30),Cognome,Guidatore.NumPatente, Targa, Marca, Modello from Guidatore right join Automobile on (Guidatore.NumPatente=Automobile.NumPatente),Cognome,Guidatore.NumPatente, Targa, Marca, Modello from Guidatore full join Automobile on (Guidatore.NumPatente=Automobile.NumPatente) Nome Cognome Guidatore. Targa NumPatente PZ 1012436B AB 574 WW AA 652 FF BJ 747 XX BB 421 JJ Marca Modello Lancia Punto Brava Delta Uno 85 Nome Cognome Guidatore. NumPatente Marco Neri PZ 1012436B AP 4544442R Targa AB 574 WW AA 652 FF BJ 747 XX BB 421 JJ Marca Modello Lancia Punto Brava Delta Uno 86 Natural join,cognome,numpatente, Targa, Marca, Modello from Guidatore natural join Automobile Nome Cognome NumPatente Targa PZ 1012436B AB 574 WW AA 652 FF BJ 747 XX Marca Modello Lancia Punto Brava Delta Natural join La natural join è un tipo particolare di inner join Mette in corrispondenza gli attributi delle due tabelle che hanno lo stesso nome Nella tabella risultante compare un solo attributo per ogni coppia di attributi con lo stesso nome Attributo comune: NumPatente 87 88 Natural join (interrogazione 31) Interrogazioni nidificate,cognome,numpatente, Targa, Marca, Modello from Guidatore natural join Automobile Nome Cognome NumPatente Targa PZ 1012436B AB 574 WW AA 652 FF BJ 747 XX Marca Modello Lancia Punto Brava Delta Attributo comune: NumPatente 89 Clausola su predicati logici in cui le componenti sono confronti tra valori Possibile anche confrontare valori con il risultato di una query (query annidata) Di solito prima si esegue la query più interna, ma ci sono eccezioni (per esempio, passaggio di binding) 90 15

Interrogazioni nidificate Parole chiave all e any: any: specifica che la riga soddisfa la condizione se risulta vero il confronto tra il valore dell attributo per la riga e almeno uno degli elementi restituiti dall interrogazione all: specifica che la riga soddisfa la condizione solo se tutti gli elementi restituiti dall interrogazione nidificata rendono vero il confronto Interrogazione 32 Tutti i dati degli impiegati che lavorano in dipartimenti in Firenze select * Dipart = any ( from Dipartimento Citta = Firenze ) any corrisponde a almeno uno 91 92 Interrogazione 33 (simile alla 10) Interrogazione 34 Impiegati che hanno lo stesso nome di impiegati del dip di Produzione select I1.Nome I1, Impiegato I2 I1.Nome = I2.Nome and I2.Dipart = Prod si può scrivere anche Nome = any ( Dipart = Prod ) 93 Dipartimenti in cui non lavorano persone con cognome diverso da from Dipartimento Nome <> all (select Dipart Cognome = ) from Dipartimento except all corrisponde a tutti select Dipart Cognome = 94 Interrogazione 35 Dipartimento dell impiegato che guadagna lo stipendio massimo select Dipart Stipendio = (select max(stipendio) ) Un solo valore da confrontare select Dipart Stipendio >= all (select Stipendio ) Le due interrogazioni sono equivalenti 95 16