C6 Sql2

454 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
454
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

C6 Sql2

  1. 1. Basi di Dati Interrogazioni complesse (II parte)
  2. 2. Basi di Dati – Dove ci troviamo? A) Introduzione 1 2 B) Prog. Concettuale (ER) C) Modello Relazionale,  Algebra relazionale, SQL 1 2 3 4 5 6 7 1 2 3 4 5 6 7 D) Prog. Logica e  E) Tecnologia di un DBMS Normalizzazione 1 2 3 4 1 2 3 4 5 6 F) Programmazione DB 1 2 2 Basi di Dati ‐ Interrogazioni complesse (II parte)
  3. 3. Classificazione delle interrogazioni complesse Query con ordinamento Query con aggregazioni Query con raggruppamento Query binarie Query nidificate 3 Basi di Dati ‐ Interrogazioni complesse (II parte)
  4. 4. 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 4 Basi di Dati ‐ Interrogazioni complesse (II parte)
  5. 5. Istanza di ordine  ordine COD‐ORD COD‐CLI DATA IMPORTO 1 3 2004‐06‐01 50.000 2 4 2004‐08‐03 8.000 3 3 2004‐09‐01 5.500 4 1 2004‐07‐01 12.000 5 1 2004‐08‐01 1.500 6 3 2004‐09‐03 27.000 5 Basi di Dati ‐ Interrogazioni complesse (II parte)
  6. 6. Query binarie Costruite concatenando due query SQL tramite operatori  insiemistici: UNION  unione INTERSECT  intersezione EXCEPT  differenza si eliminano i duplicati 6 Basi di Dati ‐ Interrogazioni complesse (II parte)
  7. 7. Unione Selezionare i codici degli ordini i cui importi superano 500  € oppure presenti in qualche dettaglio con quantità  superiore a 1000. SELECT COD‐ORD FROM ORDINE WHERE IMPORTO > 500 UNION SELECT COD‐ORD FROM DETTAGLIO WHERE QTA > 1000 7 Basi di Dati ‐ Interrogazioni complesse (II parte)
  8. 8. Differenza Selezionare i codici degli ordini i cui importi superano 500  € ma non presenti in nessun dettaglio con quantità  superiore a 1000. SELECT COD‐ORD FROM ORDINE WHERE IMPORTO > 500 EXCEPT SELECT COD‐ORD FROM DETTAGLIO WHERE QTA > 1000 8 Basi di Dati ‐ Interrogazioni complesse (II parte)
  9. 9. Intersezione Selezionare i codici degli ordini i cui importi superano 500  € e che sono presenti in qualche dettaglio con quantità  superiore a 1000. SELECT COD‐ORD FROM ORDINE WHERE IMPORTO > 500 INTERSECT SELECT COD‐ORD FROM DETTAGLIO WHERE QTA > 1000 9 Basi di Dati ‐ Interrogazioni complesse (II parte)
  10. 10. Query nidificate Costruite concatenando due query SQL nel predicato  where: [NOT] IN  appartenenza [NOT] EXISTS  esistenza ANY, ALL  quantificatori comparatore:   =, !=, <, <=, >, >= 10 Basi di Dati ‐ Interrogazioni complesse (II parte)
  11. 11. Query nidificate (nested) Selezionare nome e indirizzo dei clienti che hanno emesso  qualche ordine di importo superiore a 10.000 €. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD‐CLI IN  SELECT COD‐CLI FROM ORDINE WHERE IMPORTO > 10.000 11 Basi di Dati ‐ Interrogazioni complesse (II parte)
  12. 12. Equivalenza fra IN e query semplici SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD‐CLI IN  SELECT COD‐CLI FROM ORDINE WHERE IMPORTO > 10.000 equivale (a meno di duplicati) a: SELECT NOME, INDIRIZZO FROM CLIENTE JOIN ORDINE  ON CLIENTE.COD‐CLI = ORDINE.COD‐CLI WHERE IMPORTO > 10.000 12 Basi di Dati ‐ Interrogazioni complesse (II parte)
  13. 13. 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' 13 Basi di Dati ‐ Interrogazioni complesse (II parte)
  14. 14. 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' 14 Basi di Dati ‐ Interrogazioni complesse (II parte)
  15. 15. Esempio : gestione personale  impiegato MATR NOME DATA‐ASS SALARIO MATR‐MGR 1 Piero 1‐1‐02 1500 € 2 2 Giorgio 1‐1‐04 2000 € null 3 Giovanni 1‐7‐03 1000 € 2  assegnamento progetto MATR NUM‐PROG PERC NUM‐PROG TITOLO TIPO 1 3 50 3 Idea Esprit 1 4 50 4 Wide Esprit 2 3 100 3 4 100 15 Basi di Dati ‐ Interrogazioni complesse (II parte)
  16. 16. Nested query correlate (con variabile) Selezionare il nome degli impiegati il cui salario è  maggiore di quello del proprio manager. SELECT NOME FROM IMPIEGATI AS X,  WHERE SALARIO > ( SELECT SALARIO FROM IMPIEGATI WHERE MATR = X.MATR‐MGR ) 16 Basi di Dati ‐ Interrogazioni complesse (II parte)
  17. 17. Nested query correlate (con variabile) SELECT NOME FROM IMPIEGATI AS X,  WHERE SALARIO> ( SELECT SALARIO FROM IMPIEGATI WHERE MATR = X.MATR‐MGR ) 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.MATR = X.MATR‐MGR 17 Basi di Dati ‐ Interrogazioni complesse (II parte)
  18. 18. Uso di IN nelle modifiche aumentare di 5 € l’importo di tutti gli ordini che  comprendono  il prodotto 456 UPDATE ORDINE SET IMPORTO = IMPORTO + 5 WHERE COD‐ORD IN SELECT COD‐ORD FROM DETTAGLIO WHERE COD‐PROD = '456' 18 Basi di Dati ‐ Interrogazioni complesse (II parte)
  19. 19. Query con NOT IN Selezionare nome e indirizzo dei clienti che non hanno  emesso nessun ordine di importo superiore a 10.000 €. SELECT NOME, INDIRIZZO FROM CLIENTE WHERE COD‐CLI NOT IN SELECT COD‐CLI FROM ORDINE WHERE IMPORTO > 10.000 19 Basi di Dati ‐ Interrogazioni complesse (II parte)
  20. 20. Le query con ANY e ALL SELECT COD‐ORD  SELECT COD‐ORD FROM ORDINE  FROM ORDINE WHERE IMPORTO > ANY  WHERE IMPORTO >= ALL SELECT IMPORTO SELECT IMPORTO FROM ORDINE FROM ORDINE COD‐ORD IMPORTO ANY ALL 1 50 F F 2 300 V V 3 90 V F 20 Basi di Dati ‐ Interrogazioni complesse (II parte)
  21. 21. Riduzione di query innestate  Attenzione!  Come si è visto, è spesso possibile ridurre una query innestata a una query semplice. Tuttavia, le query innestate formulate con i seguenti  operatori non si possono ridurre: NOT IN ALL (con qualsiasi operatore di confronto) NOT EXISTS con subquery correlata 21 Basi di Dati ‐ Interrogazioni complesse (II parte)
  22. 22. Esempi 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‘ 22 Basi di Dati ‐ Interrogazioni complesse (II parte)
  23. 23. Esempi chi è il manager di Piero? SELECT NOME  FROM IMPIEGATO  WHERE MATR IN      SELECT MATR‐MGR FROM IMPIEGATO   WHERE NOME='Piero' 23 Basi di Dati ‐ Interrogazioni complesse (II parte)
  24. 24. 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/04? calcolare per ciascun cliente la somma degli importi di tutti gli  ordini estrarre l'ordine di importo più alto 24 Basi di Dati ‐ Interrogazioni complesse (II parte)

×