esempi query sql - altervista

of 26 /26
07/12/2017 1 a cura del Prof. Claudio Traini Linguaggio SQL: Linguaggio SQL: esempi di esempi di query query Modello logico utilizzato

Author: others

Post on 19-Oct-2021

8 views

Category:

Documents


0 download

Embed Size (px)

TRANSCRIPT

ESEMPI_QUERY_SQLModello logico utilizzato
FROM
WHERE
07/12/2017
5
RICORDATI!!!
Il nome di un campo nella forma completa si scrive come
NOME TABELLA . NOME CAMPO
È identificabile come:
“ALIAS” DEL CAMPO
“ALIAS” DELLA TABELLA
Gli alias hanno lo scopo di rendere più agevole la scrittura delle query
07/12/2017
6
SELECT nominativo AS DIPENDENTE, qualifica FROM PERSONALE';
Query: L’ELENCO DELLE QUALIFICHE PRESENTI
SELECT DISTINCT qualifica FROM PERSONALE
“ALIAS”
Query: NOME E QUALIFICA DEI DIPENDENTI IN ORDINE ALFABETIC O
SELECT nominativo AS DIPENDENTE, qualifica FROM PERSONALE‘ ORDER BY nominativo;
“ALIAS”
07/12/2017
7
Query: IL NOME ED IL PREZZO DEI PRODOTTI REALIZZATI DAL DIPARTIMENTO D2
SELECT nome_prodotto, prezzo FROM PRODOTTI WHERE id_dip = 'D2';
Query: IL NOMINATIVO DI TUTTI I DIPENDENTI LA CUI QUALIFICA E' TECNICO
SELECT nominativo FROM PERSONALE WHERE qualifica = 'tecnico';
07/12/2017
8
SELECT nominativo AS DIPENDENTE, qualifica AS MANSIONE FROM PERSONALE WHERE qualifica = 'tecnico' OR qualifica ='impiegato';
Query: L’ELENCO DEI DIPENDENTI CHE SI CHIAMANO PAOLO
SELECT nominativo FROM PERSONALE WHERE nominativo LIKE 'Paolo*';
Query: IL NOMINATIVO E IL RELATIVO NOME DEL DIPARTIMENTO DI TUTTI I DIPENDENTI LA CUI QUALIFICA E' TECNICO
SELECT P.nominativo, D.nome_dipartimento FROM PERSONALE P, DIPARTIMENTI D WHERE P.qualifica = 'tecnico'AND P.id_dip = D.id_di p;
07/12/2017
9
Query: IL NOMINATIVO ED IL NOME DEL DIPARTIMENTO DI TUTTI I DIRIGENTI
SELECT P.nominativo AS DIRIGENTE, D.nome_dipartimento AS DIPARTIMENTO FROM PERSONALE P, DIPARTIMENTI D WHERE P.qualifica = ‘dirigente'AND P.id_dip = D.id_ dip;
“ALIAS”
Query: IL IL NOMINATIVO, LA QUALIFICA DEI DIPENDENTI CHE LAVORANO NEI DIPARTIMENTI D2, D4 e D5
SELECT id_dip, nominativo, qualifica FROM PERSONALE WHERE id_dip IN ('D2','D4','D5');
07/12/2017
10
Query: L'ELENCO DEI DIPENDENTI CHE SI CHIAMANO MARIO INDICANDO DIPARTIMENTO E SEDE DOVE LAVORANO
SELECT P.matricola AS MATRICOLA, P.nominativo AS DIPENDENTE, D.nome_dipartimento AS DIPARTIMENTO, D.localita AS SEDE, D.provincia AS PROVINCIA FROM PERSONALE P, DIPARTIMENTI D WHERE P.nominativo LIKE 'Mario*' AND P.id_dip = D.id_dip;
Query: L'ELENCO DEI DIPENDENTI ORDINATI IN BASE ALLO STIPENDIO DAL PIU' BASSO AL PIU' ALTO
SELECT nominativo, stipendio FROM PERSONALE ORDER BY stipendio;
07/12/2017
11
Query: L'ELENCO DEI DIPENDENTI ORDINATI IN BASE ALLO STIPENDIO COMPRESO TRA € 1.500 e € 2.200
SELECT nominativo AS DIPENDENTE, stipendio FROM PERSONALE WHERE stipendio BETWEEN 1500 AND 2200 ORDER BY stipendio;
Query: L'ELENCO DEI DIPENDENTI COMPRENSIVO DI NOME DEL DIPARTIMENTO ORDINATI IN BASE ALLO STIPENDIO COMPRESO TRA € 1.500 e € 2.200
SELECT P.nominativo, P.stipendio, D.nome_dipartimento AS DIPARTIMENTO FROM PERSONALE P, DIPARTIMENTI D WHERE P.id_dip = D.id_dip AND P.stipendio >= 1500 AND P.stipendio <=2200 ORDER BY P.stipendio;
07/12/2017
12
Query: L'ELENCO DEI DIPENDENTI COMPRENSIVO DI NOME DEL DIPARTIMENTO ORDINATI IN BASE ALLO STIPENDIO COMPRESO TRA € 1.500 e € 2.200
SELECT P.nominativo, P.stipendio, D.nome_dipartimento AS DIPARTIMENTO FROM PERSONALE P, DIPARTIMENTI D WHERE P.id_dip = D.id_dip AND P.stipendio BETWEEN 1500 AND 2200 ORDER BY P.stipendio;
Query: LO STIPENDIO MASSIMO, LO STIPENDIO MINIMO, LO STIPENDIO MEDIO
SELECT MAX(stipendio) AS STIPENDIO_MASSIMO, MIN(stipendio) AS STIPENDIO_MINIMO, AVG(stipendio) AS STIPENDIO_MEDIO FROM PERSONALE
07/12/2017
13
Query: IL NOME DEL DIPENDENTE CHE PERCEPISCE LO STIPENDIO MASSIMO
SELECT nominativo, stipendio FROM PERSONALE WHERE stipendio IN (SELECT MAX(stipendio) FROM PERS ONALE);
Query: IL NOME DEL DIPARTIMENTO DOVE SI TROVA IL DIPENDENTE CHE PERCEPISCE LO STIPENDIO MASSIMO
SELECT D.nome_dipartimento, P.stipendio FROM DIPARTIMENTI D, PERSONALE P WHERE P.id_dip = D.id_dip AND P.stipendio IN (SELECT MAX(stipendio) FROM PERSONAL E);
07/12/2017
14
Query: NOME DEI DIPENDENTI CHE SONO NATI NEGLI ANNI NOVANTA
SELECT nominativo, nascita FROM PERSONALE WHERE nascita BETWEEN #01/01/1990# AND #31/12/1999# ;
Query: NOME DEI PRODOTTI CHE USANO 2 UNITA‘ DEL COMPONENTE C005
SELECT PRO.nome_prodotto FROM PRODOTTI PRO, COMPOSIZIONE COM WHERE COM.unita_comp = 2 AND COM.id_comp = 'C005' AND PRO.id_prod = COM.id_prod;
07/12/2017
15
Query: NOME, CODICE E NOME DIPARTIMENTO DEI PRODOTTI CHE USANO 2 UNITA' DEL COMPONENTE C005
SELECT PRO.id_prod AS CODICE, PRO.nome_prodotto AS PRODOTTO, DIP.nome_dipartimento AS DIPARTIMENTO FROM PRODOTTI PRO, COMPOSIZIONE COM, DIPARTIMENTI DIP WHERE COM.unita_comp = 2 AND COM.id_comp = 'C005' AND PRO.id_prod = COM.id_prod AND PRO.id_dip = DIP.id_dip;
Query: NOME DEI DIPARTIMENTI CHE USANO IL COMPONENTE C003
SELECT DIP.nome_dipartimento AS UTILIZZATORI FROM DIPARTIMENTI DIP, COMPOSIZIONE COM, PRODOTTI PRO WHERE COM.id_comp = 'C003' AND PRO.id_prod = COM.id_prod AND DIP.id_dip = PRO.id_dip;
07/12/2017
16
Query: LA LISTA DEI PRODOTTI CHE UTILIZZANO LA MASSIMA QUANTITA' DI COMPONENTE C004
SELECT PRO.nome_prodotto AS UTILIZZATORI FROM PRODOTTI PRO, COMPOSIZIONE COM WHERE COM.id_comp = 'C004' AND PRO.id_prod = COM.id_prod AND COM.unita_comp = (SELECT MAX(unita_comp)
FROM COMPOSIZIONE WHERE id_comp = 'C004');
Query: IL NUMERO DI DIPENDENTI DEL DIPARTIMENTO D4
SELECT COUNT(*) AS NUM_DIP_D4 FROM PERSONALE WHERE id_dip = 'D4';
07/12/2017
17
Query: IL NUMERO DI DIPENDENTI PER OGNI DIPARTIMENTO
SELECT id_dip AS CODICE, count(*) AS NUMERO FROM PERSONALE GROUP BY id_dip;
Query: LO STIPENDIO MEDIO PER OGNI DIPARTIMENTO
SELECT id_dip AS DIPARTIMENTO, avg(stipendio) AS STIPENDIO_MEDIO FROM PERSONALE GROUP BY id_dip;
07/12/2017
18
Query: LA QUANTITA’ TOTALE UTILIZZATA DI OGNI COMPONENTE PER LA PRODUZIONE DEI PRODOTTI
SELECT id_comp AS COMPONENTE, SUM(unita_comp) AS Q_TOTALE FROM COMPOSIZIONE GROUP BY id_comp;
Query: L'IMPORTO TOTALE DEGLI STIPENDI CON QUALIFICA DI DIRETTORE
SELECT SUM(stipendio) AS COSTO_DIRIGENTI FROM PERSONALE WHERE qualifica = 'dirigente';
07/12/2017
19
Query: IL NUMERO DEI TECNICI ED IL LORO COSTO COMPLESSIVO
SELECT COUNT(*) AS NUM_TECNICI, SUM(stipendio) AS COSTO_TECNICI FROM PERSONALE WHERE qualifica = 'tecnico';
Query: CODICE DEI PRODOTTI CHE IMPIEGANO ALMENO 3 COMPONENTI
SELECT id_prod AS CODICE_PRODOTTO FROM COMPOSIZIONE GROUP BY id_prod HAVING COUNT(*)>=3;
07/12/2017
20
Query: NOME DEI DIPARTIMENTI (ED IL RELATIVO PRODOTTO) I CUI PRODOTTI IMPIEGANO ALMENO 3 COMPONENTI
SELECT D.nome_dipartimento AS DIPARTIMENTO, P.nome_prodotto AS PRODOTTO FROM DIPARTIMENTI D, PRODOTTI P WHERE P.id_dip = D.id_dip AND P.id_prod IN (SELECT id_prod
FROM COMPOSIZIONE GROUP BY id_prod HAVING COUNT(*)>=3);
Query: IL COSTO DI PRODUZIONE DEL PRODOTTO P01 DATO IL COSTO UNITARIO DELLE SINGOLE COMPONENTI PER LA QUANTITA’ IMPIEGATA
SELECT SUM(COMPOS.unita_comp * COM.costo_unitario) AS COST O_P01 FROM COMPOSIZIONE COMPOS, COMPONENTI COM WHERE COMPOS.id_comp = COM.id_comp AND id_prod='P01'
E se lo volessi per tutti i prodotti?
07/12/2017
21
SELECT
WHERE COMPOS.id_comp = COM.id_comp
GROUP BY COMPOS.id_prod;
07/12/2017
22
E’ in sostanza una sintassi alternativa che permette di differenziare le condizioni che compaiono nelle Interrogazioni da quelle che sono oggetto del prodotto cartesiano sulle tabelle
SELECT lista attributi FROM Tabella_1 ….. JOIN Tabella_2 ON condizioni del join WHERE eventuali altre condizioni
In genere sono così strutturate:
Query: NOME DEI PRODOTTI CHE USANO 2 UNITA‘ DEL COMPONENTE C005
SELECT nome_prodotto AS PRODOTTO FROM PRODOTTI INNER JOIN COMPOSIZIONE ON PRODOTTI.id_prod = COMPOSIZIONE.id_prod WHERE unita_comp = 2 AND id_comp = 'C005';
Tramite l’utilizzo dell’operatore INNER JOIN
07/12/2017
23
Query: L’ELENCO DEI DIPARTIMENTI CON I PROPRI IMPIEGATI, L A LORO DATA DI NASCITA E LA MANSIONE
SELECT nome_dipartimento, nominativo, nascita, qual ifica FROM DIPARTIMENTI INNER JOIN PERSONALE ON DIPARTIMENTI.id_dip = PERSONALE.id_dip
Supponiamo di aver aggiunto un Settimo Dipartimento che al momento non ha impiegati e eseguiamo la stessa query
SELECT nome_dipartimento, nominativo, nascita, qual ifica FROM DIPARTIMENTI INNER JOIN PERSONALE ON DIPARTIMENTI.id_dip = PERSONALE.id_dip
RISULTATO IDENTICO!
SELECT nome_dipartimento, nominativo, nascita, qual ifica FROM DIPARTIMENTI LEFT JOIN PERSONALE ON DIPARTIMENTI.id_dip = PERSONALE.id_dip
Compare in elenco anche il Settimo Dipartimento
Supponiamo di aver aggiunto un ulteriore tecnico, B runo Bruni nato il 5 maggio del 2000 che al momento non è asse gnato ad alcun dipartimento e riproviamo………
SELECT nome_dipartimento, nominativo, nascita, qual ifica FROM DIPARTIMENTI LEFT JOIN PERSONALE ON DIPARTIMENTI.id_dip = PERSONALE.id_dip
Il nuovo dipendente non compare in elenco………
07/12/2017
25
Compare in elenco il nuovo dipendente…..senza dipart imento
E se di nuovo riusassimo l’operatore INNER JOIN ?
SELECT nome_dipartimento, nominativo, nascita, qual ifica FROM DIPARTIMENTI INNER JOIN PERSONALE ON DIPARTIMENTI.id_dip = PERSONALE.id_dip
Non compare il nuovo dipartimento e neppure il nuov o dipendente……….
07/12/2017
26
In poche parole……………….
Con l’operatore INNER JOIN abbiamo l’elenco di tutti i dipartimenti ed i relativi dipendenti a patto che non esistano dipartimenti senza dipendenti oppure dipendenti senza diprtimenti
Con l’operatore LEFT JOIN abbiamo l’elenco di tutti i dipartimenti ed i relativi dipendenti compresi i dipartimenti senza dipendenti
Con l’operatore RIGHT JOIN abbiamo l’elenco dei dipartimenti che abbiano almeno un dipendente compresi i dipendenti sprovvisti di dipartimento
DIPARTIMENTI JOIN PERSONALE Left Right