Interrogazioni complesse. SQL avanzato 1

Documenti analoghi
Interrogazioni complesse. SQL avanzato 1

Linguaggi di interrogazione. linguaggi interrogazione 1

Monday, January 24, 2011 SQL

Linguaggio SQL seconda parte

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

IL LINGUAGGIO SQL LE BASI

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

Interrogazioni in SQL SQL1 1

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

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

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

SQL - Structured Query Language

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

Interrogazioni semplici

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

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

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

Laboratorio di Basi di Dati

Il modello relazionale dei dati. modello relazionale 1

Operazioni su insiemi: unione, intersezione e differenza

Operatori aggregati: COUNT

Consideriamo lo schema relazionale

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

QL (Query Language) Alice Pavarani

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

Operatori aggregati: COUNT

Il linguaggio SQL: raggruppamenti

SQL. Argomenti della lezione. Join esplicito. Interrogazioni complesse in SQL join esplicito outer join operatori aggregati interrogazioni nidificate

Il linguaggio SQL: raggruppamenti

SQL: le funzioni di aggregazione

Structured Query Language

Gestione dei valori nulli

Esempi SQL con Access. Orazio Battaglia

Esempi di Query con Aggregazioni in SQL/1

Basi di Dati: Corso di laboratorio

Argomenti della lezione. Interrogazioni complesse in SQL join esplicito outer join operatori aggregati interrogazioni nidificate

Lezioni di Laboratorio sui Data Base

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

Corso di Informatica Linguaggio SQL seconda parte

Alessandra Raffaetà. Esercizio: Cinema

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

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

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

SQL: RAGGRUPPAMENTI, QUANTIFICAZIONE, METODO. Patrizio Dazzi a.a

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

Select From Where...

Linguaggio SQL: fondamenti D B M G

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

Basi di Dati: Corso di laboratorio

Operatori aggregati. Gli operatori di aggregazione NON sono rappresentabili in Algebra Relazionale. conteggio, minimo, massimo, media, somma

Il linguaggio SQL: raggruppamenti

Archivi e basi di dati - ing. M. Cossentino. Settore. Traccia 1. Traccia 200. Settore non polarizzato

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

SQL - Structured Query Language

Operazioni sui dati. Interrogazioni con operatori aggregati. Capitolo 4

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

Corso di Basi di Dati

Il linguaggio SQL: query innestate

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

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

SQL terza 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 Soluzioni della V esercitazione - 23 aprile 2007

SQL /10/2016 Basi di dati - SQL 1

Corso di Laurea in Ingegneria Informatica Fondamenti di Informatica II Modulo Basi di dati a.a

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

Linguaggio SQL: fondamenti D B M G

Progettazione di Sistemi Informatici

SQL - Sottointerrogazioni correlate

SQL come linguaggio di interrogazione. Basi di dati. Interrogazioni SQL. Interpretazione algebrica delle query SQL

Interrogazioni nidificate

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

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

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

Caratteristiche dei linguaggi per Database

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

BASE DI DATI. Concetti trattati: Funzioni aggregate Raggruppamenti Nidificazione Viste. Informatica Umanistica Università di Pisa

Aspetti avanzati nella definizione degli schemi DDL2 1

Tabelle esempio: Impiegato/Dipartimento

Basi di dati (4) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. Argomento: select (1.

Basi di Dati: Corso di laboratorio

<Nome Tabella>.<attributo>

Modello relazionale. ì Tabella e relazione. ì Schema di una relazione

Basi di dati I Prova di autovalutazione 1 novembre 2016 Soluzioni

Il linguaggio SQL: query innestate

Basi di Dati prof. Letizia Tanca

SQL e algebra relazionale

Sistemi di Elaborazione delle Informazioni

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

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

Il linguaggio SQL: query innestate

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. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

Basi di Dati. Esercitazione SQL. Paolo Papotti. 19 maggio 2005

Queries su più tabelle

Elena Baralis, Claudio Demartini

Basi di Dati: Corso di laboratorio

Transcript:

Interrogazioni complesse SQL avanzato

Classificazione delle interrogazioni complesse Query con ordinamento Query con aggregazione Query con raggruppamento Query binarie Query annidate SQL avanzato 2

Esempio : gestione ordini cliente COD-CLI NOME INDIRIZZO P-IVA ordine COD-ORD COD-CLI DATA IMPORTO dettaglio COD-ORD COD-PROD QTA prodotto COD-PROD NOME PREZZO SQL avanzato

Istanza di ordine ordine COD-ORD COD-CLI DATA IMPORTO 997-06-0 50.000 2 4 997-08-0 8.000 997-09-0 5.500 4 997-07-0 2.000 5 997-08-0.500 6 997-09-0 27.000 SQL avanzato 4

Query con ordinamento SELECT * FROM ORDINE WHERE IMPORTO > 00 ORDER BY DATA COD-ORD COD-CLI DATA IMPORTO 997-06-0 50.000 4 997-07-0 2.000 5 997-08-0.500 2 4 997-08-0 8.000 997-09-0 5.500 6 997-09-0 27.000 SQL avanzato 5

Order by SELECT * FROM ORDINE WHERE IMPORTO > 00 ORDER BY COD-CLI COD-ORD COD-CLI DATA IMPORTO 4 997-07-0 2.000 5 997-08-0.500 997-06-0 50.000 6 997-09-0 5.500 997-09-0 27.000 2 4 997-08-0 8.000 SQL avanzato 6

Order by Nel caso si voglia ordinare sui valori di una colonna risultato di una espressione si usa una notazione posizionale SELECT COD-CLI, IMPORTO/.000 FROM ORDINE WHERE IMPORTO > 0.000 ORDER BY 2 (ordina sulla SECONDA colonna) SQL avanzato 7

Order by... ORDER BY COD-CLI ASC, DATA DESC COD-ORD COD-CLI DATA IMPORTO 5 997-08-0.500 4 997-07-0 2.000 6 997-09-0 27.000 997-09-0 5.500 997-06-0 50.000 2 4 997-08-0 8.000 SQL avanzato 8

Query aggregate Utilizzano le funzioni aggregate: SUM sommatoria AVG media MIN minimo MAX massimo COUNT cardinalità (I NULL sono esclusi) SQL avanzato 9

Query con massimo Selezionare l importo massimo degli ordini. SELECT MAX(IMPORTO) AS MAX-IMP FROM ORDINE MAX-IMP 50.000 SQL avanzato 0

Query con sommatoria Selezionare la somma degli importi degli ordini relativi al cliente numero. SELECT SUM(IMPORTO) AS SOMMA-IMP FROM ORDINE WHERE COD-CLIENTE = SOMMA-IMP.500 SQL avanzato

Query con raggruppamento si aggiungono le clausole GROUP-BY (raggruppamento) HAVING (selezione dei gruppi) SELECT.. FROM.. WHERE.. GROUP BY.. HAVING.. SQL avanzato 2

Query con raggruppamento Selezionare la somma degli importi degli ordini successivi al 0-6-97 per quei clienti che hanno emesso almeno 2 ordini. SELECT COD-CLI, SUM (IMPORTO) FROM ORDINE WHERE DATA > '997-06-0' GROUP BY COD-CLI HAVING COUNT (IMPORTO) >= 2 SQL avanzato

Passo : Valutazione WHERE COD-ORD COD-CLI DATA IMPORTO 2 4 997-08-0 8.000 997-09-0 5.500 4 997-07-0 2.000 5 997-08-0.500 6 997-09-0 27.000 ( WHERE DATA > '997-06-0 ) SQL avanzato 4

Passo 2 : Raggruppamento si valuta la clausola GROUP-BY COD-ORD 4 5 6 2 COD-CLI 4 DATA 997-07-0 997-08-0 997-09-0 997-09-0 997-08-0 IMPORTO 2.000.500 5.500 27.000 8.000 (GROUP BY COD-CLI) SQL avanzato 5

Passo : Calcolo degli aggregati per ciascun gruppo si calcolano SUM (IMPORTO) e COUNT (IMPORTO) COD-CLI 4 SUM (IMPORTO).500 2.500 8.000 COUNT (IMPORTO) 2 2 SQL avanzato 6

Passo 4 : Selezione dei gruppi si valuta il predicato COUNT (IMPORTO) >=2 COD-CLI 4 SUM (IMPORTO).500 2.500 8.000 COUNT (IMPORTO) 2 2 SQL avanzato 7

Passo 5 : Produzione del risultato COD-CLI SUM (IMPORTO).500 2.500 SQL avanzato 8

Doppio raggruppamento Selezionare la somma delle quantità dei dettagli degli ordini emessi da ciascun cliente per ciascun prodotto, purché la somma superi 50. SELECT COD-CLI, COD-PROD, SUM(QTA) FROM ORDINE AS O, DETTAGLIO AS D WHERE O.COD-ORD = D.COD-ORD GROUP BY COD-CLI, COD-PROD HAVING SUM(QTA) > 50 SQL avanzato 9

Situazione dopo il join e il raggruppamento ordine dettaglio COD-CLI ORDINE. COD-ORD DETTAGLIO. COD-ORD COD-PROD QTA 4 4 0 20 gruppo, 5 5 2 2 0 0 gruppo,2 2 60 gruppo 2, 40 2 2 0 gruppo, 6 6 25 SQL avanzato 20

Estrazione del risultato si valuta la funzione aggregata SUM(QTA) e il predicato HAVING COD-CLI COD-PROD SUM(QTA) 2 2 50 40 60 95 SQL avanzato 2

Query con raggruppamento e ordinamento E possibile ordinare il risultato anche delle query con raggruppamento SELECT.. FROM.. [ WHERE.. ] GROUP BY.. [ HAVING.. ] ORDER BY. SQL avanzato 22

Raggruppamento e ordinamento Selezionare la somma degli importi degli ordini successivi al 0/6/97 per quei clienti che hanno emesso almeno 2 ordini dopo quella data, in ordine di cliente. SELECT COD-CLI, SUM (IMPORTO) FROM ORDINE WHERE DATA > '997-06-0' GROUP BY COD-CLI HAVING COUNT (IMPORTO) >= 2 ORDER BY COD-CLI SQL avanzato 2

ESERCIZI SUL GROUP BY SELECT SUM(NUM) FROM SPEDIZIONI GROUP BY ART-NO OPPURE 2 SELECT SUM(NUM) FROM SPEDIZIONI GROUP BY ART-NO, SPED-NO SQL avanzato 24

ESERCIZI SUL GROUP BY SU: ART-NO SPED-NO NUM (SPEDIZIONI) 2 00 2 25 75 2 2 00 2 4 00 2 4 75 4 25 SQL avanzato 25

ESERCIZI SUL GROUP BY.GROUP BY ART-NO ART-NO SPED-NO NUM 2,2,,4 00,25,75,25 2 2,4,4 00,00,75.GROUP BY ART-NO, SPED-NO ART-NO SPED-NO NUM 2 00,25 75 4 25 2 2 00 2 4 00,75 SQL avanzato 26

ESERCIZI SUL GROUP BY SELECT ARTICOLO FROM VENDITE GROUP BY ARTICOLO HAVING COUNT(DISTINCT DATA) > SU ARTICOLO DATA NUM PENNA 997-2- 2 MATITA 997-2-08 GOMMA 997-2-0 MATITA 997-2-08 2 PENNA 997-2-08 SQL avanzato 27

ESERCIZI SUL GROUP BY GROUP BY ARTICOLO SU ARTICOLO DATA PENNA 997-2-, 997-2-08 MATITA 997-2-08, 997-2-08 GOMMA 997-2-0 HAVING COUNT(DISTINCT DATA) > ARTICOLO PENNA SQL avanzato 28

Query binarie Costruite concatenando due query SQL tramite operatori insiemistici: UNION unione INTERSECT intersezione EXCEPT (MINUS) differenza (si eliminano i duplicati) SQL avanzato 29

Unione Selezionare i codici degli ordini i cui importi superano 5.000 oppure presenti in qualche dettaglio con quantità superiore a 000. SELECT COD-ORD FROM ORDINE WHERE IMPORTO > 5.000 UNION SELECT COD-ORD FROM DETTAGLIO WHERE QTA > 000 SQL avanzato 0

Differenza Selezionare i codici degli ordini i cui importi superano 5.000 ma non presenti in nessun dettaglio con quantità superiore a 000. SELECT COD-ORD FROM ORDINE WHERE IMPORTO > 5.000 EXCEPT SELECT COD-ORD FROM DETTAGLIO WHERE QTA > 000 SQL avanzato

Intersezione Selezionare i codici degli ordini i cui importi superano 5.000 e che sono presenti in qualche dettaglio con quantità superiore a 000. SELECT COD-ORD FROM ORDINE WHERE IMPORTO > 5.000 INTERSECT SELECT COD-ORD FROM DETTAGLIO WHERE QTA > 000 SQL avanzato 2

Query annidate Costruite concatenando due query SQL nel predicato where: [NOT] IN [DOES NOT] EXISTS ANY, ALL appartenenza esistenza quantificatori comparatore: =,!=, <, <=, >, >= SQL avanzato

Query annidate (nested) Selezionare nome e indirizzo dei clienti che hanno emesso qualche ordine di importo superiore a 0.000. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD-CLI IN ( SELECT COD-CLI FROM ORDINE WHERE IMPORTO > 0.000 ) SQL avanzato 4

Equivalenza fra IN e query semplici SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD-CLI IN ( SELECT COD-CLI FROM ORDINE WHERE IMPORTO > 0.000 ) equivale (a meno di duplicati) a: SELECT NOME, INDIRIZZO FROM CLIENTE JOIN ORDINE ON CLIENTE.COD-CLI = ORDINE.COD-CLI WHERE IMPORTO > 0.000 SQL avanzato 5

Nested Query complesse (fino a 8 livelli) Selezionare nome e indirizzo dei clienti che hanno emesso qualche ordine i cui dettagli comprendono il prodotto Pneumatico. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD-CLI IN ( SELECT COD-CLI FROM ORDINE WHERE COD-ORD IN ( SELECT COD-ORD FROM DETTAGLIO WHERE COD-PROD IN ( SELECT COD-PROD FROM PRODOTTO WHERE NOME = 'Pneumatico' ) ) ) SQL avanzato 6

La query equivalente equivale (a meno di duplicati) a: SELECT NOME, INDIRIZZO FROM CLIENTE AS C, ORDINE AS O, DETTAGLIO AS D, PRODOTTO AS P WHERE C.COD-CLI = O.COD-CLI AND O.COD-ORD = D.COD-ORD AND D.COD-PROD = P.COD-PROD AND NOME= 'Pneumatico' SQL avanzato 7

Nested query correlate (con variabile) SELECT NOME FROM IMPIEGATI AS X, WHERE SALARIO> ( SELECT SALARIO FROM IMPIEGATI WHERE MATRICOLA= X.MANAGER ) sulla relazione IMPIEGATI (matricola, nome, manager ) equivale al JOIN SELECT X.NOME FROM IMPIEGATI AS X, IMPIEGATI AS Y WHERE X.SALARIO > Y.SALARIO AND Y.MATRICOLA= X.MANAGER SQL avanzato 8

Uso di IN nelle modifiche aumentare di 50 l importo di tutti gli ordini che comprendono il prodotto 456 UPDATE ORDINE SET IMPORTO = IMPORTO + 50 WHERE COD-ORD IN ( SELECT COD-ORD FROM DETTAGLIO WHERE COD-PROD = '456 ) SQL avanzato 9

Query con NOT IN Selezionare nome e indirizzo dei clienti che non hanno emesso nessun ordine di importo superiore a 0.000. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD-CLI NOT IN ( SELECT COD-CLI FROM ORDINE WHERE IMPORTO > 0.000 ) SQL avanzato 40

La query con ANY e ALL SELECT COD-ORD FROM ORDINE WHERE IMPORTO > ANY ( SELECT IMPORTO FROM ORDINE ) SELECT COD-ORD FROM ORDINE WHERE IMPORTO >= ALL ( SELECT IMPORTO FROM ORDINE ) COD-ORD 2 IMPORTO 5.000 0.000 9.000 ANY F V V ALL F V F SQL avanzato 4

Esercizi Riprendere le basi di dati per la gestione del personale e degli ordini ed esprimere in SQL le interrogazioni : - quale impiegati lavorano in un progetto in cui non lavora il loro manager? - quanti ordini ha emesso Paolo? - quante candele sono state ordinate il 5/7/97? - calcolare per ciascun cliente la somma degli importi di tutti gli ordini - estrarre l'ordine di importo più alto SQL avanzato 42

Esercizi (lezione precedente) in quali tipi di progetti lavora Giovanni? SELECT TIPO FROM PROGETTO WHERE NUM-PROG IN ( SELECT NUM-PROG FROM ASSEGNAMENTO WHERE MATR IN ( SELECT MATR FROM IMPIEGATO WHERE NOME='Giovanni ) ) chi è il manager di Piero? SELECT NOME FROM IMPIEGATO WHERE MATR IN ( SELECT MATR-MGR FROM IMPIEGATO WHERE NOME='Piero ) SQL avanzato 4

Query annidate (nested) Selezionare nome e indirizzo dei clienti che hanno emesso qualche [o non hanno emesso nessun] ordine di importo superiore a 0.000 SELECT NOME, INDIRIZZO FROM CLIENTE C WHERE [NOT] EXISTS ( SELECT * FROM ORDINE WHERE IMPORTO > 0.000 AND COD_CLI=C.COD_CLI ) SQL avanzato 44

Query universali Esempio: Trovare gli ordini che contengono tutti i prodotti In Algebra relazionale queste interrogazioni si possono esprimere tramite l operatore di divisione Ma in SQL?? Non c è un quantificatore universale (per ogni) ma solo un quantificatore esistenziale (EXISTS) SQL avanzato 45

Query universali In generale va ribaltata la logica della query, per esprimere la quantificazione universale per mezzo dell operatore EXISTS e una doppia negazione Anche in logica solo uno dei due quantificatori è in realtà necessario e l altro può essere espresso per mezzo del primo: x P(x) x P(x) Per ogni x vale la proprietà P equivale a dire: Non esiste alcun x per cui non vale la proprietà P SQL avanzato 46

Query universali Selezionare gli ordini che contengono tutti i prodotti (= Selezionare gli ordini per cui non esiste alcun prodotto che non sia compreso nelle loro righe di dettaglio) SELECT * FROM ORDINE ORD WHERE NOT EXISTS (SELECT * FROM PRODOTTO WHERE COD-PROD NOT IN (SELECT COD-PROD FROM DETTAGLIO DET WHERE DET.COD-ORD=ORD.COD-ORD ) ) SQL avanzato 47

Query universali Selezionare gli ordini che contengono tutti i prodotti (= Selezionare gli ordini per cui non esiste alcun prodotto per cui non esiste alcuna loro riga di dettaglio che lo contiene) SELECT * FROM ORDINE ORD WHERE NOT EXISTS (SELECT * FROM PRODOTTO PRO WHERE NOT EXISTS (SELECT * FROM DETTAGLIO DET WHERE DET.COD-ORD=ORD.COD-ORD AND DET.COD-PROD=PRO.COD-PROD ) ) SQL avanzato 48