Interrogazioni complesse. SQL avanzato 1



Documenti analoghi
Interrogazioni complesse. SQL avanzato 1

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

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Istruzioni DML di SQL

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

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

SQL - Funzioni di gruppo

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

Data Management Software. Il linguaggio SQL. Raggruppamenti. Paolo Avallone Sr Consulting IT Specialist DB2, Data Management Marzo 2004

Corso di Laboratorio di Basi di Dati

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

Il linguaggio SQL: query innestate

Utilizzando Microsoft Access. Si crea la tabella Anagrafica degli alunni,le Materie e i voti si mettono alcuni campi

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

Basi di dati II prova intermedia 16 Marzo 2006 Compito 1

********************* MODIFICA STRUTTURA DI UNA TABELLA (inserimento di un nuovo campo) ALTER TABLE Personale ADD Nascita date;

Data management a.a Il linguaggio SQL

SQL IL LINGUAGGIO DI INTERROGAZIONE

Esercitazione su SQL

Basi di Dati. Esercitazione SQL. Ing. Paolo Cappellari

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

Operazioni sui database

4 SQL : Interrogazioni nidificate

OR true null false true true true true null true null null false true null false NOT

Interrogazioni nidificate, commenti

SQL: definizione schema

CONCETTO DI ANNIDAMENTO

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

SQL (STRUCTURED QUERY LANGUAGE)

Linguaggio SQL seconda parte

SQL/OLAP. Estensioni OLAP in SQL

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 2012/13

MAX, SUM, AVG, COUNT)

Data Warehousing (DW)

PROGRAMMA DI CLASSE 5AI

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Esercizi SQL. Dato il seguente schema di una base di dati dove gli attributi che compongono la chiave sono scritti in grassetto

Il linguaggio SQL. ing. Alfredo Cozzi 1

Documentazione SQL. Argomento Sintassi Note Definizione schema create schema [NomeSchema] [[authorization] Autorizzazione] {DefElementoSchema}

Prova Scritta di Basi di Dati

Esprimere in algebra (ottimizzata), calcolo relazionale la seguente query:

Utilizzando Microsoft Access. Si crea la tabella Anagrafica degli alunni,le Materie e i voti si mettono alcuni campi

Operatori aggregati: COUNT

CAPITOLO 4 ESERCIZI SU SQL

SQL. Basi di dati. Potere espressivo di standard e sistemi commerciali. Standardizzazione di SQL. Domini. Domini elementari, 1

Basi Di Dati, 09/12/2003

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

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Interrogazione della base di dati

Capitolo 4. Soluzione: Soluzione: Create domain STRING as character varying (256) default sconosciuto not null

Structured Query Language parte 1

Basi di Dati Corso di Laura in Informatica Umanistica

Elaborazione Automatica dei Dati. SQL come Query Language. Enrico Cavalli. Anno Accademico Il linguaggio SQL

Sistemi per la gestione di database: MySQL ( )

(anno accademico )

SQL. Structured Query Language

SQL e ACCESS. Modello relazionale PROBLEMA ENTITA STUDENTE

Storia. Corso di Basi di Dati Spaziali. Componente DDL. Funzionalità. Esempio. Creazione di schema. Linguaggi: SQL. Storia:

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

SQL prima 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 2011/12

Il linguaggio SQL: viste e tabelle derivate

SQL Server. SQL server e un RDBMS di tipo client/server che utilizza Transact-SQL per gestire la comunicazione fra un client e SQL Server

Esercitazione di riepilogo sulle Query MySQL Giugno 2011 Classe VB Informatica

Corso di Basi di Dati

Il Domino Character Il domino CHARACTER permette di definire attributi che contengono un singolo carattere o stringhe di caratteri di lunghezza

1. Per ogni film in cui appaiono solo attori nati prima del 1970 restituire il titolo del film.

SQL. Linguaggio di interrogazione per basi di dati relazionali. Relazione = tabella con attributi (a 1, a 2,, a n ): Funzionalità principali di SQL:

Data warehouse in Oracle

Modello concettuale dei dati. Paolo Brunasti - UniMiB 1 / 12

Structured Query Language. Informatica Generale - SQL Versione 1.0, aa p.1/172

Basi di Dati. Esercizi di SQL (2) - Soluzioni

Ricorsione in SQL-99. Introduzione. Idea di base

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

M733 ESAME DI STATO DI ISTITUTO TECNICO COMMERCIALE CORSO DI ORDINAMENTO

UTENTE (Codice, Nome, Cognome, Indirizzo, Telefono) PRESTITO (Collocazione, CodUtente, DataPrestito, DataRest)

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 2 4 5 6 COD-CLI 4 DATA 997-06-0 997-08-0 997-09-0 997-07-0 997-08-0 997-09-0 IMPORTO 50.000.000 8.000.000 5.500.000 2.000.000.500.000 27.000.000 SQL avanzato 4

Query con ordinamento SELECT * FROM ORDINE WHERE IMPORTO > 00.000 ORDER BY DATA COD-ORD COD-CLI DATA IMPORTO 997-06-0 50.000.000 4 997-07-0 2.000.000 5 997-08-0.500.000 2 4 997-08-0 8.000.000 997-09-0 5.500.000 6 997-09-0 27.000.000 SQL avanzato 5

Order by SELECT * FROM ORDINE WHERE IMPORTO > 00.000 ORDER BY COD-CLI COD-ORD COD-CLI DATA IMPORTO 4 997-07-0 2.000.000 5 997-08-0.500.000 997-06-0 50.000.000 6 997-09-0 5.500.000 997-09-0 27.000.000 2 4 997-08-0 8.000.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.000 FROM ORDINE WHERE IMPORTO > 00.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.000 4 997-07-0 2.000.000 6 997-09-0 27.000.000 997-09-0 5.500.000 997-06-0 50.000.000 2 4 997-08-0 8.000.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.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.000 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.000 997-09-0 5.500.000 4 997-07-0 2.000.000 5 997-08-0.500.000 6 997-09-0 27.000.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.000.500.000 5.500.000 27.000.000 8.000.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.000 2.500.000 8.000.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.000 2.500.000 8.000.000 COUNT (IMPORTO) 2 2 SQL avanzato 7

Passo 5 : Produzione del risultato COD-CLI SUM (IMPORTO).500.000 2.500.000 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, 2 5 5 2 2 0 0 60 gruppo,2 gruppo 2, 2 2 40 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 ART-NO, SPED-NO, NUM FROM SPEDIZIONI GROUP BY ART-NO OPPURE 2 SELECT ART-NO, SPED-NO, 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 500.000 lire oppure presenti in qualche dettaglio con quantità superiore a 000. SELECT COD-ORD FROM ORDINE WHERE IMPORTO > 500.000 UNION SELECT COD-ORD FROM DETTAGLIO WHERE QTA > 000 SQL avanzato 0

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

Intersezione Selezionare i codici degli ordini i cui importi superano 500.000 lire e che sono presenti in qualche dettaglio con quantità superiore a 000. SELECT COD-ORD FROM ORDINE WHERE IMPORTO > 500.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 nidificate (nested) Selezionare nome e indirizzo dei clienti che hanno emesso qualche ordine di importo superiore a 0.000.000. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD-CLI IN ( SELECT COD-CLI FROM ORDINE WHERE IMPORTO > 0.000.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.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.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 L. 5000 l importo di tutti gli ordini che comprendono il prodotto 456 UPDATE ORDINE SET IMPORTO = IMPORTO + 5000 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.000. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD-CLI NOT IN ( SELECT COD-CLI FROM ORDINE WHERE IMPORTO > 0.000.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 50.000 00.000 90.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.000. SELECT NOME, INDIRIZZO FROM CLIENTE C WHERE [NOT] EXISTS ( SELECT * FROM ORDINE WHERE IMPORTO > 0.000.000 AND COD_CLI=C.COD_CLI ) SQL avanzato 44