Il linguaggio SQL: query innestate



Documenti analoghi
Il linguaggio SQL: query innestate

Il linguaggio SQL: query innestate

Data Management Software. Il linguaggio SQL. Query Innestate. Paolo Avallone Sr Consulting IT Specialist DB2, Data Management 10 Settembre 2003

Progettazione di Sistemi Informatici

Il linguaggio SQL: query innestate

Basi di Dati: Corso di laboratorio

Il linguaggio SQL: raggruppamenti

Il linguaggio SQL: raggruppamenti

Esempi di Query con Aggregazioni in SQL/1

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

Il linguaggio SQL: raggruppamenti

Il linguaggio SQL: viste e tabelle derivate. DB di riferimento per gli esempi

SQL - Sottointerrogazioni

Progettazione di Sistemi Informatici

SQL - Sottointerrogazioni correlate

SQL - Structured Query Language

Basi di dati - Laboratorio

Interrogazioni complesse. SQL avanzato 1

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

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

SELECT s.nome, e.data Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

SELECT s.nome, e.data FROM Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Tabelle esempio: Impiegato/Dipartimento

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

Il linguaggio SQL: viste e tabelle derivate. Versione elettronica: SQLd-viste.pdf

Il linguaggio SQL: viste e tabelle derivate

SQL è stato definito nel 1973 ed è oggi il linguaggio universale dei sistemi relazionali

Consideriamo lo schema relazionale

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

SQL seconda parte D O C E N T E P R O F. A L B E R T O B E L U S S I. Anno accademico 2010/11

Laboratorio di Basi di Dati e Web

Basi di Dati. Concetti Avanzati

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

Lezione 7 SQL (II) Basi di dati bis Docente Mauro Minenna Pag.1

Interpretazione delle query nidificate

Alessandra Raffaetà. Esercizio: Cinema

S.I.T. PER LA VALUTAZIONE E GESTIONE DEL TERRITORIO Corso di Laurea Magistrale in Scienze Ambientali. Alessandra Raffaetà

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

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

Algebra relazionale (versione formale )

Operatori aggregati: COUNT

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

Operatori aggregati: COUNT

L algebra relazionale

Il linguaggio SQL: viste e tabelle derivate

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

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

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

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

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

Esercitazione 1. ogni tupla contribuisce al risultato: Impiegato Reparto Rossi. Bruni. Bianchi

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

SQL Esempi. 24/10-7/11/2016 Basi di dati - SQL 1

D B M G. Linguaggio SQL: fondamenti. Operatori insiemistici. Operatore UNION Operatore INTERSECT Operatore EXCEPT

Linguaggi per basi di dati e SQL

Interrogazioni nidificate

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

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

Interrogazioni in SQL

L algebra relazionale

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

Linguaggio SQL: fondamenti D B M G

IL LINGUAGGIO SQL LE BASI

SQL: "storia" 31/05/2006 2

Interrogazioni in SQL SQL1 1

SQL e algebra relazionale

SQL Esempi /10/2017 Basi di dati - SQL 1

Esercitazione 3 SQL 2

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

Il linguaggio SQL: le basi

Interrogazioni con Raggruppamenti

Corso di Basi di Dati

Interrogazioni nidificate

Interrogazioni Interrogazioni in SQL } L'istruzione base dell'sql per costruire interrogazioni di complessita arbitraria e lo statement SELECT } Sinta

L algebra relazionale

Il linguaggio SQL: le basi. Versione elettronica: SQLa-basi.pdf

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

Corso di Basi di Dati

Corso sul linguaggio SQL

Gestione dei valori nulli

Il linguaggio SQL: DML di base. Versione elettronica: 04.2.SQL.DMLbase.pdf

Il linguaggio SQL: DML di base

Il linguaggio SQL: viste e tabelle derivate

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

Basi di Dati. Esercitazione 1: Interrogazioni in SQL. K. Donno - Interrogazioni in SQL

Docente: Alberto Belussi e Carlo Combi. Lezione 4

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

SQL - Interrogazioni. SQL - Interrogazioni. SQL - Interrogazioni. SQL - Interrogazioni. SQL - Interrogazioni. SQL - Interrogazioni

Laboratorio di Basi di dati

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

SQL - Structured Query Language

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;

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

Linguaggio SQL seconda parte

Transcript:

Il linguaggio SQL: query innestate Sistemi Informativi L-A Home Page del corso: http://www-db.deis.unibo.it/courses/sil-a/ Versione elettronica: SQLc-subquery.pdf Sistemi Informativi L-A DB di riferimento per gli esempi Imp Sedi CodImp Nome Sede Ruolo Stipendio Sede Responsabile Citta E001 Rossi Analista 2000 Biondi Milano E002 Verdi Sistemista 1500 Mori Bologna E003 Bianchi 1000 S03 Fulvi Milano E004 Gialli S03 1000 E005 E006 E007 E008 Neri Grigi Violetti Aranci Analista Sistemista 2500 1100 1000 1200 Prog CodProg P01 P01 Citta Milano Bologna P02 Bologna SQL - Subquery Sistemi Informativi L-A 2 1

Subquery Oltre alla forma flat vista sinora, in SQL è anche possibile esprimere delle condizioni che si basano sul risultato di altre interrogazioni (subquery, o query innestate o query nidificate) SELECT CodImp -- impiegati delle sedi di Milano Sede S03 WHERE Citta = Milano ) La subquery restituisce l insieme di sedi (, S03 ), e quindi il predicato nella clausola WHERE esterna equivale a WHERE Sede IN (, S03 ) SQL - Subquery Sistemi Informativi L-A 3 Subquery scalari Gli operatori di confronto =, <, si possono usare solo se la subquery restituisce non più di una tupla (subquery scalare ) SELECT CodImp -- impiegati con stipendio minimo WHERE Stipendio = (SELECT MIN(Stipendio) ) La presenza di vincoli può essere sfruttata a tale scopo SELECT Responsabile WHERE Sede = (SELECT Sede -- al massimo una sede WHERE CodImp = E001 ) SQL - Subquery Sistemi Informativi L-A 4 2

Subquery: caso generale Se la subquery può restituire più di un valore si devono usare le forme <op> ANY: la relazione <op> vale per almeno uno dei valori <op> ALL : la relazione <op> vale per tutti i valori SELECT Responsabile WHERE Sede = ANY (SELECT Sede WHERE Stipendio > 1500) SELECT CodImp -- impiegati con stipendio minimo WHERE Stipendio <= ALL (SELECT Stipendio ) La forma = ANY equivale a IN SQL - Subquery Sistemi Informativi L-A 5 Subquery: livelli multipli di innestamento Una subquery può fare uso a sua volta di altre subquery. Il risultato si può ottenere risolvendo a partire dal blocco più interno SELECT CodImp WHERE Citta NOT IN (SELECT Citta FROM Prog WHERE CodProg = P02 )) Attenzione a non sbagliare quando ci sono negazioni! Nell esempio, i due blocchi interni non sono equivalenti a:, Prog WHERE Sedi.Citta <> Prog.Citta AND Prog.CodProg = P02 ) SQL - Subquery Sistemi Informativi L-A 6 3

Subquery: quantificatore esistenziale Mediante EXISTS (SELECT * ) è possibile verificare se il risultato di una subquery restituisce almeno una tupla SELECT Sede S WHERE EXISTS (SELECT * WHERE Ruolo = ) Facendo uso di NOT EXISTS il predicato è vero se la subquery non restituisce alcuna tupla In entrambi i casi la cosa non è molto interessante in quanto il risultato della subquery è sempre lo stesso, ovvero non dipende dalla specifica tupla del blocco esterno SQL - Subquery Sistemi Informativi L-A 7 Subquery correlate Se la subquery fa riferimento a variabili definite in un blocco esterno, allora si dice che è correlata SELECT Sede -- sedi con almeno un programmatore S WHERE EXISTS (SELECT * WHERE Ruolo = AND Sede = S.Sede) Adesso il risultato della query innestata dipende dalla sede specifica, e la semantica quindi diventa: Per ogni tupla del blocco esterno, considera il valore di S.Sede e risolvi la query innestata SQL - Subquery Sistemi Informativi L-A 8 4

Subquery: unnesting (1) È spesso possibile ricondursi a una forma piatta, ma la cosa non è sempre così ovvia. Ad esempio, nell esempio precedente si può anche scrivere SELECT DISTINCT Sede S, Imp I WHERE S.Sede = I.Sede AND I.Ruolo = Si noti la presenza del DISTINCT La forma innestata è più procedurale di quella piatta e, a seconda dei casi, può risultare più semplice da derivare Si ricordi comunque che in una subquery non si possono usare operatori insiemistici (UNION, INTERSECT e EXCEPT) e che una subquery può comparire solo come operando destro in un predicato SQL - Subquery Sistemi Informativi L-A 9 Subquery: unnesting (2) Con la negazione le cose tendono a complicarsi. Ad esempio, per trovare le sedi senza programmatori, nella forma innestata basta sostituire NOT EXISTS a EXISTS, ma nella forma piatta: SELECT DISTINCT Sede S LEFT OUTER JOIN Imp I ON (S.Sede = I.Sede) AND (I.Ruolo = ) WHERE I.CodImp IS NULL È facile sbagliare, ad esempio la seguente query non è corretta SELECT DISTINCT Sede S LEFT OUTER JOIN Imp I ON (S.Sede = I.Sede) WHERE I.Ruolo = AND I.CodImp IS NULL perché la clausola WHERE non è mai soddisfatta! SQL - Subquery Sistemi Informativi L-A 10 5

Subquery: come eseguire la divisione Con le subquery è possibile eseguire la divisione relazionale Sedi in cui sono presenti tutti i ruoli equivale a Sedi in cui non esiste un ruolo non presente SELECT Sede S WHERE NOT EXISTS (SELECT * I1 WHERE NOT EXISTS (SELECT * I2 WHERE S.Sede = I2.Sede AND I1.Ruolo = I2.Ruolo)) Il blocco più interno viene valutato per ogni combinazione di S e I1 Il blocco intermedio funge da divisore (interessa I1.Ruolo) Data una sede S, se in S manca un ruolo: la subquery più interna non restituisce nulla quindi la subquery intermedia restituisce almeno una tupla quindi la clausola WHERE non è soddisfatta per S SQL - Subquery Sistemi Informativi L-A 11 Subquery: aggiornamento dei dati Le subquery si possono efficacemente usare per aggiornare i dati di una tabella sulla base di criteri che dipendono dal contenuto di altre tabelle DELETE -- elimina gli impiegati di Bologna WHERE Citta = Bologna ) UPDATE Imp SET Stipendio = 1.1*Stipendio WHERE Sede IN (SELECT S.Sede FROM Sede S, Prog P WHERE S.Citta = P.Citta AND P.CodProg = P02 ) SQL - Subquery Sistemi Informativi L-A 12 6

Subquery e CHECK Facendo uso di subquery nella clausola CHECK è possibile esprimere vincoli arbitrariamente complessi Ogni sede deve avere almeno due programmatori... -- quando si crea la TABLE Sedi CHECK (2 <= (SELECT COUNT(*) I WHERE I.Sede = Sede -- correlazione AND I.Ruolo = )) Supponendo di avere due tabelle ImpBO e ImpMI e di volere che uno stesso codice (CodImp) non sia presente in entrambe le tabelle:... -- quando si crea la TABLE ImpBO CHECK (NOT EXISTS (SELECT * MI WHERE ImpMI.CodImp = CodImp)) SQL - Subquery Sistemi Informativi L-A 13 Riassumiamo: Oltre alla forma flat, in SQL è possibile fare uso di subquery Una subquery che restituisca al massimo un valore è detta scalare, e per essa si possono usare i soliti operatori di confronto Le forme <op> ANY e <op> ALL si rendono necessarie quando la subquery può restituire più valori Il quantificatore esistenziale EXISTS è soddisfatto quando il risultato della subquery non è vuoto (e NOT EXISTS quando è vuoto) Una subquery si dice correlata se referenzia variabili definite in un blocco ad essa più esterno In molti casi è possibile scrivere una query sia in forma piatta che in forma innestata SQL - Subquery Sistemi Informativi L-A 14 7