SlideShare ist ein Scribd-Unternehmen logo
1 von 23
Downloaden Sie, um offline zu lesen
Corso di Basi di Dati e Laboratorio




             LINGUAGGIO SQL
             INTERROGAZIONI
                      Prof. Silvana Castano




 A.A. 2005/2006             Basi di Dati e Laboratorio       1




SQL

• Dichiarativo (non procedurale)
     Descrizione dell’obiettivo dell’operazione.
• Interprete SQL del DBMS che analizza
  l’istruzione e formula una interrogazione
  equivalente nel linguaggio procedurale interno
  (nascosto all’utente).
• Incorporabile in un programma in linguaggio
  ospite
       Compilazione di interrogazioni.


 A.A. 2005/2006             Basi di Dati e Laboratorio       2




SQL

• Traduzione ed ottimizzazione                           query
  optimizer.
• Diretto ad una vasta gamma di utenti :
   – utenti che interagiscono con l’interprete.
   – programmatori di applicazioni.




 A.A. 2005/2006             Basi di Dati e Laboratorio       3
ISTRUZIONE SELECT
  SELECT                      Lista Attributi
  FROM                        Lista Tabelle
  [WHERE                      Condizione]

• SELECT: nomi di attributo degli attributi target i
  cui valori devono essere reperiti con la query
• FROM: nomi di relazioni su cui la query deve
  essere valutata
• WHERE: espressione (booleana) di ricerca che
  identifica le ennuple che dovranno far parte del
  risultato della query

 A.A. 2005/2006                 Basi di Dati e Laboratorio                      4




ESEMPIO
Impiegato
       ID          Nome        Cognome           Ufficio     Stipendio   DipN

       10          John        Smith             20          45          Adm

       20          Franklin    Wong              20          36          Prod

       30          Alicia      Zelaya            10          70          Adm

       40          Jennifer    Wallace           15          45          HQ

       50          Ramesh      Smith             30          80          HQ

       60          Joyce       English           7           73          Prod

       70          James       Borg              5           40          Adm
       80          Ahmad       Ramesh            20          46          Prod




 A.A. 2005/2006                 Basi di Dati e Laboratorio                      5




ESEMPIO
 Dipartimento
       Nome       Indirizzo                    Direttore

       Adm        731 Fondre, Huston, TX       30

       HQ         980, Dallas, Huston, TX      50

       Prod       975, Berry, Bellaire, TX     60

       R&D        980, Dallas, Huston, TX      NULL




 A.A. 2005/2006                 Basi di Dati e Laboratorio                      6
CLAUSOLA WHERE

• Argomento: espressioni booleane costruite combinando
  predicati semplici mediante operatori logici AND, OR, NOT
• Uso di operatori di confronto (=, <>, <, >, <=, >=) fra
  espressione a sx costruita a partire dai valori degli attributi
  per la riga e un valore costante o un’altra espressione a dx
• AND: selezione delle righe che rendono veri tutti i predicati
• OR: selezione delle righe per cui almeno un predicato è
  vero
• NOT: unario, inverte il valore di verità del predicato




  A.A. 2005/2006           Basi di Dati e Laboratorio         7




CLAUSOLA WHERE
 Altri operatori in WHERE
 • [ not ] BETWEEN a AND b
 • [ not ] IN (lista valori)
 • IS [ not ] NULL
 • [ not ] LIKE ‘pattern’
 • [NOT] EXISTS




  A.A. 2005/2006           Basi di Dati e Laboratorio         8




ESEMPI
   Reperire ufficio e stipendio dell’ impiegato (o degli
   impegati) il cui nome è ‘John Smith’

  SELECT             Ufficio, Stipendio
  FROM               Impiegato
  WHERE              Cognome = ‘Smith’ AND Nome = ‘John’

           Ufficio          Stipendio

           20               45


  Π Ufficio, Stipendio(σ Cognome=‘Smith’AND Nome=‘John’(Impiegato))
  A.A. 2005/2006           Basi di Dati e Laboratorio         9
PATTERN MATCHING DI STRINGHE



                            [NOT] LIKE pattern

Nella specifica del pattern:
•      _       rappresenta un carattere arbitrario
•      %       rappresenta una stringa di lunghezza
arbitraria (anche 0 caratteri)




 A.A. 2005/2006                Basi di Dati e Laboratorio                    10




ESEMPIO
  Reperire tutti i dati dei dipartimenti il cui indirizzo è a
  Houston in Texas



                  SELECT             *
                  FROM               Dipartimento
                  WHERE              Indirizzo LIKE ‘%Houston%TX%’

                  Nome       Indirizzo                      Direttore

                  Amm.ne     731 Fondre, Houston,           30
                             TX
                  Sede       980, Dallas, Houston,          50
                             TX
                  Ricerca    980, Dallas, Houston,          NULL
                             TX

 A.A. 2005/2006                Basi di Dati e Laboratorio                    11




RIDENOMINAZIONE ATTRIBUTI
  Per gli impiegati del dipartimento Amministrazione,
  mostrare nome, cognome e stipendio risultante
  applicando un aumento del 10%

    SELECT                 Nome, Cognome,
                           Stipendio*1.1 AS NuovoStipendio
    FROM                   Impiegato
    WHERE                  DipN=‘Adm’
                  Nome         Cognome                      NuovoStipendio

                  John        Smith                         49,5

                  Alicia      Zelaya                        77

                  James       Borg                          44


 A.A. 2005/2006                Basi di Dati e Laboratorio                    12
JOIN
  Reperire nomi, cognomi e indirizzo di lavoro
  degli impiegati

          • Dati su Nome e Cognome degli impiegati si
            trovano nella tabella Impiegato.
          • L’indirizzo di lavoro si trova nella tabella
            Dipartimento.




 A.A. 2005/2006         Basi di Dati e Laboratorio         13




ESEMPIO
• Le tuple di Impiegato sono collegate alle tuple di
  Dipartimento mediante chiave esterna (attributo DipN)
• Per ricostruire l’informazione cercata, ogni tupla di
  impegato va concatenata con la tupla del corrispondente
  dipartimento
• La condizione da imporre è l’uguaglianza dei valori di
  chiave esterna di Dipartimento e corrispondente chiave
  primaria di Impiegato (equijoin)

  SELECT          Impiegato.Nome, Impiegato.Cognome,
                  Dipartimento.Indirizzo
  FROM            Impiegato, Dipartimento
  WHERE           Impiegato.DipN=Dipartimento.Nome

 A.A. 2005/2006         Basi di Dati e Laboratorio         14




JOIN

• Tutte le tabelle coinvolte nel JOIN sono
  esplicitate nella clausola FROM
• Sul prodotto cartesiano di tali tabelle si applicano
  le condizioni specificate in WHERE
• Le condizioni del JOIN sono scritte in modo
  esplicito nella WHERE (uso dei valori di chiave
  esterna per collegare tuple di tabelle diverse e
  combinare i loro dati nel risultato)


 A.A. 2005/2006         Basi di Dati e Laboratorio         15
INTERPRETAZIONE ALGEBRICA


 SELECT           Impiegato.Nome,Cognome,
                  Indirizzo
 FROM             Impiegato, Dipartimento
 WHERE            Impiegato.DipN=Dipartimento.Nome




   Π Impiegato.Nome,Cognome, Indirizzo
         (σDipN=Dipartimento.Nome(Impiegato X Dipartimento))




 A.A. 2005/2006         Basi di Dati e Laboratorio    16




ASSENZA CLAUSOLA WHERE
SELECT *
FROM Impiegato, Dipartimento

  Questa interrogazione specifica il prodotto
  cartesiano delle due relazioni




 A.A. 2005/2006         Basi di Dati e Laboratorio    17




JOIN
  Reperire nomi, cognomi e indirizzo di lavoro
  degli impiegati dell’amministrazione

   SELECT          Impiegato.Nome, Impiegato.Cognome,
                   Dipartimento.Indirizzo
   FROM            Impiegato, Dipartimento
   WHERE           Impiegato.DipN=Dipartimento.Nome
                   AND Dipartimento.Nome=‘Adm’

  Condizione di join
  Condizione di selezione

 A.A. 2005/2006         Basi di Dati e Laboratorio    18
USO DI ALIAS

  Trovare cognome, nome e ufficio degli impiegati che
  lavorano nello stesso ufficio di impiegati di nome
  Smith

 Al fine di stabilire se un impiegato appartiene o meno al
 risultato occorre poter confrontare tuple di Impiegato con se
 stesse




                      Uso di alias di relazione

 A.A. 2005/2006           Basi di Dati e Laboratorio   19




USO DI ALIAS

  Trovare cognome, nome e ufficio degli impiegati che
  lavorano nello stesso ufficio di impiegati di nome
  Smith

SELECT            Imp.Cognome, Imp.Nome, Imp.Ufficio
FROM              Impiegato AS Imp, Impiegato AS Smith
WHERE             Imp.Ufficio = Smith.Ufficio
                  AND Smith.Cognome = ‘Smith’
                  AND Imp.ID <> Smith.ID

Alias di relazione:
    • Imp rappresenta gli impiegati
    • Smith rappresenta gli impiegati di nome Smith

 A.A. 2005/2006           Basi di Dati e Laboratorio   20




VALORI NULLI
• Introduzione di condizioni atomiche per verificare
  se un valore è specificato oppure è nullo
• Predicato is null: selezione delle righe con valori
  nulli
                Attributo is [not] null
• Il predicato risulta vero se l’attributo ha valore
  nullo (is not null è la sua negazione)




 A.A. 2005/2006           Basi di Dati e Laboratorio   21
ELIMINAZIONE DUPLICATI

Possibile presenza di righe uguali all’interno di una
tabella risultato di una interrogazione.

Eliminazione dei duplicati a carico dell’utente:

                    SELECT DISTINCT




 A.A. 2005/2006            Basi di Dati e Laboratorio   22




ELIMINAZIONE DUPLICATI

Reperire gli indirizzi dei dipartimenti di Houston in
Texas

SELECT            Indirizzo
FROM              Dipartimento
WHERE             Indirizzo LIKE ‘%Houston%TX%’

                       Indirizzo
                       731 Fondre, Houston, TX

                       980, Dallas, Houston, TX
                       980, Dallas, Houston, TX




 A.A. 2005/2006            Basi di Dati e Laboratorio   23




ELIMINAZIONE DUPLICATI

Reperire gli indirizzi dei dipartimenti di Houston in
Texas (senza duplicati)

SELECT DISTINCT Indirizzo
FROM      Dipartimento
WHERE     Indirizzo LIKE ‘%Houston%TX%’

                      Indirizzo
                      731 Fondre, Houston, TX

                      980, Dallas, Houston, TX




 A.A. 2005/2006            Basi di Dati e Laboratorio   24
ORDINAMENTO DEL RISULTATO

 • Ordinamento delle ennuple risultato secondo uno
   o più attributi specificati

   ORDER BY Attributo [ASC | DESC]
           {, Attributo [ASC | DESC]}

 (default ASC)




  A.A. 2005/2006              Basi di Dati e Laboratorio                  25




ESEMPIO
               SELECT   *
               FROM     Impiegato
               ORDER BY Cognome, Stipendio DESC
          ID       Nome       Cognome             Ufficio   Stipendio   DipN
          70       James      Borg                75        40          Adm

          60       Joyce      English             7         73          Prod

          80       Ahmad      Ramesh              20        46          Prod

          50       Ramesh     Smith               14        80          HQ

          10       John       Smith               10        45          Adm

          40       Jennifer   Wallace             16        45          HQ

          20       Franklin   Wong                20        36          Prod

          30       Alicia     Zelaya              20        70          Adm


  A.A. 2005/2006              Basi di Dati e Laboratorio                  26




JOIN INTERNI ED ESTERNI
• Sintassi per la specifica di join introdotta in SQL-2 che
  permette di distinguere le condizioni di join dalle altre
  condizioni
• Le condizioni di join appaiono nella clausola FROM
  associate alle tabelle che partecipano al join
• Tipi di join
       • (INNER) JOIN (interno, default coincide con il
         theta-join)
       • NATURAL JOIN (join naturale)

        • RIGHT, LEFT, FULL OUTER JOIN (join esterni)



  A.A. 2005/2006              Basi di Dati e Laboratorio                  27
INNER JOIN


    SELECT        Impiegato.Nome, Impiegato.Cognome
                  Dipartimento.Indirizzo
    FROM          Impiegato, Dipartimento
    WHERE         Impiegato.DipN = Dipartimento.Nome




  SELECT          Impiegato.Nome, Impiegato.Cognome
                  Dipartimento.Indirizzo
  FROM            Impiegato INNER JOIN Dipartimento ON
                  Impiegato.DipN = Dipartimento.Nome

 A.A. 2005/2006        Basi di Dati e Laboratorio   28




JOIN
  Reperire nomi, cognomi e indirizzo di lavoro
  degli impiegati dell’amministrazione

   SELECT         Impiegato.Nome, Impiegato.Cognome,
                  Dipartimento.Indirizzo
   FROM           Impiegato INNER JOIN Dipartimento ON
                  Impiegato.DipN = Dipartimento.Nome
   WHERE          Dipartimento.Nome=‘Adm’




 A.A. 2005/2006        Basi di Dati e Laboratorio   29




NATURAL JOIN
• Nell’operazione NATURAL JOIN di due relazioni
  non viene specificata alcuna condizione di join.
• Viene applicata una condizione implicita di
  equijoin per ciascuna coppia di attributi con lo
  stesso nome nelle due relazioni.
• Ogni coppia di attributi di questo tipo è inclusa
  una sola volta nel risultato
• Se i nomi degli attributi non sono gli stessi nelle
  due relazioni, si possono ridenominare per farli
  corrispondere e poi applicare NATURAL JOIN

 A.A. 2005/2006        Basi di Dati e Laboratorio   30
JOIN ESTERNI
• JOIN ESTERNO (OUTER JOIN)
  Esegue un join mantenendo nel risultato tutte le
  righe che fanno parte di una o di entrambe le
  relazioni coinvolte

• LEFT (OUTER) JOIN
  Fornisce come risultato il join interno esteso con
  le tuple della relazione che compare a sinistra
  del join per le quali non esiste una
  corrispondente tupla nella relazione di destra

  A.A. 2005/2006                 Basi di Dati e Laboratorio                31




JOIN ESTERNI


RIGHT (OUTER) JOIN
Fornisce come risultato il join interno esteso con le
tuple della relazione che compare a destra del join
per le quali non esiste una corrispondente tupla
nella relazione di sinistra

FULL (OUTER) JOIN
Fornisce come risultato il join interno esteso con le
tuple di ciascuna relazione per le quali non esiste
una corrispondente tupla dall’altra parte

  A.A. 2005/2006                 Basi di Dati e Laboratorio                32




ESEMPIO

SELECT D.Nome,Indirizzo, I.Nome AS NomeDir,
       I.Cognome AS CognomeDir,
FROM Dipartimento AS D LEFT JOIN Impiegato AS I ON
       D.Direttore = I.ID
        D.Nome       Indirizzo                   NomeDir      CognomeDir

        Adm        731 Fondre, Huston, TX        Alicia       Zelaya

        HQ         980, Dallas, Huston, TX       Ramesh       Smith

        Prod       975, Berry, Bellaire, TX      Joyce        English

        R&D        980, Dallas, Huston, TX       NULL         NULL




  A.A. 2005/2006                 Basi di Dati e Laboratorio                33
OPERATORI AGGREGATI
• SQL mette a disposizione un insieme di
  operatori aggregati per derivare valori
  aggregati a partire da insiemi di tuple di relazioni.

  Ad esempio, il numero totale di impiegati del
  dipartimento Produzione non è una proprietà di
  una singola tupla ma può essere calcolato
  attraverso il conteggio del nr. di tuple di
  Impiegato relative agli impiegati di produzione



 A.A. 2005/2006       Basi di Dati e Laboratorio       34




OPERATORI AGGREGATI
• Principali operatori aggregati built-in dell’SQL
      • COUNT
      • SUM
      • MAX
      • MIN
      • AVG
• Prima si esegue l’interrogazione considerando le
  clausole FROM e WHERE della query
• L’operatore aggregato viene applicato al risultato
  ottenuto



 A.A. 2005/2006       Basi di Dati e Laboratorio       35




OPERATORI AGGREGATI
• COUNT(*): restituisce il numero di righe di una
  relazione
• COUNT ALL ListaAttributi: restituisce il numero
  di righe della relazione che possiedono valori
  diversi da NULL per gli attributi specificati
• COUNT DISTINCT ListaAttributi: restituisce il
  numero di valori diversi all’interno della relazione
  per gli attributi specificati




 A.A. 2005/2006       Basi di Dati e Laboratorio       36
OPERATORI AGGREGATI

        SELECT          COUNT ( DISTINCT Stipendio )
        FROM            Impiegato

• Restituisce il nr. di valori diversi dell’attributo
  Stipendio nella tabella Impiegato

        SELECT          COUNT (*)
        FROM            Impiegato
        WHERE           DipN = ‘Prod’

• Restituisce il Nr. di impiegati del dipartimento
  Produzione

 A.A. 2005/2006           Basi di Dati e Laboratorio   37




OPERATORI AGGREGATI
Determinare il massimo, il minimo e la media degli
stipendi degli impiegati

SELECT            MAX(Stipendio), MIN(Stipendio), AVG(Stipendio)
FROM              Impiegato



Determinare la somma degli stipendi del dipartimento
Amministrazione

                   SELECT           SUM (Stipendio)
                   FROM             Impiegato
                   WHERE            DipN = ‘Adm’

 A.A. 2005/2006           Basi di Dati e Laboratorio   38




OPERATORI AGGREGATI

Determinare lo stipendio massimo tra quelli degli
impiegati che lavorano in un dipartimento di Houston in
Texas

      SELECT          MAX ( Stipendio )
      FROM            Impiegato, Dipartimento
      WHERE           Impiegato.DipN = Dipartimento.Nome
                      AND Indirizzo LIKE ‘%Houston%TX%’




 A.A. 2005/2006           Basi di Dati e Laboratorio   39
RAGGRUPPAMENTI

• Necessità di applicare operatori aggregati a
  sottogruppi di tuple di una relazione in base al
  valore di uno o più attributi


• Clausola GROUP BY ListaAttributi per
  eseguire il raggruppamento


• Prima si effettua il raggruppamento e poi si
  applica l’operatore aggregato a ciascun
  sottogruppo individuato
 A.A. 2005/2006          Basi di Dati e Laboratorio   40




RAGGRUPPAMENTI

Determinare, per ciascun dipartimento, il numero di
impiegati e la somma dei loro stipendi.

 SELECT   DipN, COUNT(*) AS TOTImpiegati,
          SUM (Stipendio) AS TOTStipendio
 FROM     Impiegato
 GROUP BY DipN

                  DipN   TOTImpiegati TOTStipendio
                  Adm    3                    155

                  Prod   3                    155

                  HQ     2                    125



 A.A. 2005/2006          Basi di Dati e Laboratorio   41




RAGGRUPPAMENTI
• Esigenza di applicare gli operatori aggregati solo
  su raggruppamenti che verificano a condizioni
  date

• Clausola HAVING che specifica una condizione
  su un gruppo di tuple associata al valore degli
  attributi di raggruppamento

• Solo i raggruppamenti che soddisfano la
  condizione specificata nella clausola HAVING
  sono inclusi nel risultato dell’interrogazione

 A.A. 2005/2006          Basi di Dati e Laboratorio   42
PREDICATI SUI RAGGRUPPAMENTI

Determinare i dipartimenti che spendono più di 130 KE
in stipendi.


  SELECT             DipN, SUM (Stipendio)
  FROM               Impiegato
  GROUP BY           DipN
  HAVING             SUM (Stipendio) > 130




  A.A. 2005/2006           Basi di Dati e Laboratorio   43




PREDICATI SUI RAGGRUPPAMENTI

Per i dipartimenti in cui lavorano almeno 2 impiegati
con stipendio superiore a 40 KE, mostrare il nome del
dipartimento e il nr. totale di impiegati.


                   SELECT      DipN, COUNT(*)
                   FROM        Impiegato
                   WHERE       Stipendio > 40
                   GROUP BY    DipN
                   HAVING      COUNT(*) >= 2




  A.A. 2005/2006           Basi di Dati e Laboratorio   44




INTERROGAZIONI DI TIPO INSIEMISTICO

• Le operazioni insiemistiche UNION,
  INTERSECT, EXCEPT sono state incorporate
  direttamente in SQL


• Default: eliminazione dei duplicati

• ALL: mantenimento dei duplicati nel risultato




  A.A. 2005/2006           Basi di Dati e Laboratorio   45
INTERROGAZIONI DI TIPO INSIEMISTICO

 • UNION: arricchisce la potenza espressiva
   di SQL e permette di scrivere
   interrogazioni altrimenti non formulabili.

 • Interrogazioni con INTERSECT e EXCEPT
   possono essere espresse utilizzando altri
   costrutti del linguaggio (v. interrogazioni
   nidificate).


  A.A. 2005/2006       Basi di Dati e Laboratorio            46




INTERROGAZIONI DI TIPO INSIEMISTICO

Determinare l’insieme dei nomi e dei cognomi degli
impiegati


                   SELECT    Nome
                   FROM      Impiegato
                        UNION
                   SELECT    Cognome
                   FROM      Impiegato


UNION ALL preserva i duplicati (quindi la stringa Ramesh
Appare 2 volte in quanto sia nome che cognome)


  A.A. 2005/2006       Basi di Dati e Laboratorio            47




INTERROGAZIONI DI TIPO INSIEMISTICO



Trovare i cognomi degli impiegati che sono anche nomi.

     SELECT    Nome
     FROM      Impiegato
                                                    Nome
          INTERSECT
                                                    Ramesh
     SELECT    Cognome
     FROM      Impiegato




  A.A. 2005/2006       Basi di Dati e Laboratorio            48
INTERROGAZIONI DI TIPO INSIEMISTICO



Trovare i codici degli impiegati che non sono direttori



                     SELECT   ID
                     FROM     Impiegato
                          EXCEPT
                     SELECT   Direttore
                     FROM     Dipartimento




  A.A. 2005/2006         Basi di Dati e Laboratorio   49




INTERROGAZIONI NIDIFICATE
   Argomento della WHERE è un predicato in cui si
   confronta un valore (risultato di una espressione
   valutata su una singola riga) con il risultato
   dell’esecuzione di una query SQL interna
• Operatori ALL, ANY
   Per estendere i normali operatori di confronto
   (=,<>,>,<,>=,<=) al problema di confrontare un
   singolo valore con l’insieme dei valori risultato
   della query interna.


  A.A. 2005/2006         Basi di Dati e Laboratorio   50




INTERROGAZIONI NIDIFICATE


Trovare i nomi e cognomi degli impiegati che lavorano
a Houston in Texas

 SELECT            Impiegato.Nome, Impiegato.Cognome
 FROM              Impiegato, Dipartimento
 WHERE             Impiegato.DipN = Dipartimento.Nome
                   AND Indirizzo LIKE ‘%Houston%TX%’




  A.A. 2005/2006         Basi di Dati e Laboratorio   51
INTERROGAZIONI NIDIFICATE

La stessa interrogazione si può esprimere in forma
nidificata

 SELECT Nome, Cognome
 FROM Impiegato
 WHERE DipN = ANY (SELECT Nome
                   FROM Dipartimento
                   WHERE Indirizzo LIKE
                          ‘%Houston%TX%’ )

N.B. Operatori IN e NOT IN per testare l’appartenenza ad e
l’esclusione da un insieme (identici a ‘= ANY’ e ‘<> ALL’)

  A.A. 2005/2006       Basi di Dati e Laboratorio    52




INTERROGAZIONI NIDIFICATE

Trovare nomi e cognomi degli impiegati che lavorano
nello stesso ufficio di qualche impiegato del
dipartimento Produzione

SELECT Nome, Cognome
FROM   Impiegato
WHERE Ufficio IN ( SELECT Ufficio
                   FROM Impiegato
                   WHERE DipN = ‘Prod’)




  A.A. 2005/2006       Basi di Dati e Laboratorio    53




INTERROGAZIONI NIDIFICATE

Si può esprimere anche attraverso le variabili.



          SELECT DISTINCT Imp.Nome, Imp.Cognome
          FROM      Impiegato AS Imp, Impiegato AS Prod
          WHERE     Imp.Ufficio = Prod.Ufficio
                    AND Prod.DipN = ‘Prod’




  A.A. 2005/2006       Basi di Dati e Laboratorio    54
INTERROGAZIONI NIDIFICATE

 Trovare i dipartimenti dove non lavorano persone di
 nome Smith

 SELECT             Nome
 FROM               Dipartimento
 WHERE              Nome NOT IN ( SELECT                  DipN
                                  FROM                    Impiegato
                                  WHERE                   Cognome = ‘Smith’)




   A.A. 2005/2006            Basi di Dati e Laboratorio            55




INTERROGAZIONI NIDIFICATE

 Non si può esprimere mediante join; uso dell’operatore
 insiemistico differenza.
                          SELECT        Nome
                          FROM          Dipartimento
                                 EXCEPT
                          SELECT        DipN
                          FROM          Impiegato
                          WHERE         Cognome = ‘Smith’
 In algebra relazionale:

 Π Nome(Dipartimento) -
 Π DipN (σCognome=‘Smith’(Impiegato))
   A.A. 2005/2006            Basi di Dati e Laboratorio            56




INTERROGAZIONI NIDIFICATE
Interrogazioni con MIN e MAX possono essere espresse
mediante query nidificate.

Trovare i dipartimenti con gli stipendi più elevati

SELECT              DipN AS NomeDipartimento
FROM                Impiegato
WHERE               Stipendio = ( SELECT MAX ( Stipendio )
                                  FROM   Impiegato)

SELECT              DipN AS NomeDipartimento
FROM                Impiegato
WHERE               Stipendio >= ALL ( SELECT DISTINCT Stipendio
                                       FROM Impiegato)

   A.A. 2005/2006            Basi di Dati e Laboratorio            57
SUBQUERY CORRELATE
• Negli esempi visti ogni subquery viene eseguita
  una sola volta l’ insieme dei valori risultante è
  usato per la valutazione della clausola WHERE
  della query esterna.
• E’ possibile definire subquery che sono eseguite
  ripetutamente per ogni tupla candidata
  considerata nella valutazione della query
  esterna.




 A.A. 2005/2006        Basi di Dati e Laboratorio     58




SUBQUERY CORRELATE
  Determinare gli impiegati che guadagnano più dello
  stipendio medio del proprio dipartimento

• E’ necessaria una query esterna per la selezione degli
  impiegati dalla relazione Impiegati in base ad un
  predicato su stipendio; tale query avrà la forma:


SELECT               Nome, Cognome
FROM                 Impiegato
WHERE                Stipendio > (media degli stipendi nel
                     dipartimento dell’impiegato candidato)



 A.A. 2005/2006        Basi di Dati e Laboratorio     59




SUBQUERY CORRELATE

La subquery dovrà calcolare la media degli stipendi del
dipartimento relativo a ogni tupla candidata della relazione
Impiegati; tale subquery avrà la forma:



SELECT              AVG(Stipendio)
FROM                Impiegato
WHERE               DipN = (valore di DipN nella tupla
                    dell’impiegato candidato)




 A.A. 2005/2006        Basi di Dati e Laboratorio     60
SUBQUERY CORRELATE

Ogni volta che la query esterna considera una tupla
candidata, viene invocata la subquery e viene ‘passato’ il
nome del dipartimento dell’impiegato in esame

La subquery calcola quindi la media degli stipendi nel
dipartimento che e’ stato passato e restituisce tale valore
alla query esterna

La query esterna può quindi confrontare lo stipendio
dell’impiegato in esame con il valore restituito dalla
subquery


 A.A. 2005/2006         Basi di Dati e Laboratorio       61




SUBQUERY CORRELATE

Questo tipo di query è chiamato correlato, perché ogni
esecuzione della subquery è correlata al valore di uno o
più attributi delle tuple candidate nella query esterna

Per poter riferire le colonne delle tuple candidate nella
query esterna si fa uso degli alias di relazione

L’alias di relazione è definito nella query esterna e riferito
nella query interna




 A.A. 2005/2006         Basi di Dati e Laboratorio       62




SUBQUERY CORRELATE

Determinare gli impiegati che guadagnano più dello
stipendio medio del proprio dipartimento con ordinamento
del risultato per dipartimento.
 SELECT   Cognome, Nome, Stipendio, DipN
 FROM     Impiegato X
 WHERE    Stipendio > ( SELECT   AVG(Stipendio)
                        FROM     Impiegato
                        WHERE    X.DipN=DipN)
 ORDER BY DipN




 A.A. 2005/2006         Basi di Dati e Laboratorio       63
SUBQUERY CORRELATE - EXISTS


 Il predicato EXISTS(sq) restituisce il valore booleano TRUE
 se la subquery restituisce almeno un tupla; restituisce il
 valore booleano FALSE altrimenti

 Il predicato NOT EXISTS(sq) restituisce il valore booleano
 TRUE se la subquery non restituisce alcuna tupla;
 restituisce il valore booleano FALSE altrimenti




   A.A. 2005/2006      Basi di Dati e Laboratorio    64




 INTERROGAZIONI NIDIFICATE



 Trovare gli impiegati che hanno omonimi

SELECT              ID, Cognome, Nome
FROM                Impiegato I1
WHERE EXISTS        (SELECT      *
                     FROM        Impiegato I2
                     WHERE       I1.Nome = I2.Nome
                                 AND
                                 I1.Cognome = I2.Cognome
                                 AND
                                 I1.ID <> I2.ID)




   A.A. 2005/2006      Basi di Dati e Laboratorio    65




 DIVISIONE
• Le subquery correlate e l’operatore di NOT EXISTS
  sono particolarmente utili per implementare
  l’operazione di divisione in SQL
• Consideriamo le relazioni:
              Impiegato(ID, Nome, Cognome)
              Progetto(Prog#, Pnome, Budget)
              Partecipazione(ID, Prog#)
• Determinare i codici degli impiegati che partecipano a
  tutti i progetti con un budget maggiore di 50000
Partecipazione ÷ (ΠProg#σBudget>50000(Progetto)))

   A.A. 2005/2006      Basi di Dati e Laboratorio    66
DIVISIONE - ESEMPIO

La specifica della divisione in SQL fa uso dell’operatore
NOT EXISTS e richiede di ragionare in base al concetto di
controesempio.

Un impiegato I verifica l’interrogazione se non esiste un
progetto che ha un budget maggiore di 50000, ed a cui
l’impiegato I non partecipa.




  A.A. 2005/2006           Basi di Dati e Laboratorio   67




DIVISIONE - ESEMPIO
 SELECT            ID
 FROM              Impiegato I
 WHERE             NOT EXISTS
                     (SELECT *
                      FROM     Progetto Y
                      WHERE Budget > 50000
                               AND
                               NOT EXISTS
                                (SELECT *
                                 FROM     Partecipazione P
                                 WHERE I.ID = P.ID
                                          AND
                                          Y.Prog# = P.Prog#))

  A.A. 2005/2006           Basi di Dati e Laboratorio   68

Weitere ähnliche Inhalte

Mehr von guestbe916c

Laboratorio Di Basi Di Dati 10 P H P Cookie E Sessioni
Laboratorio Di  Basi Di  Dati 10  P H P    Cookie E SessioniLaboratorio Di  Basi Di  Dati 10  P H P    Cookie E Sessioni
Laboratorio Di Basi Di Dati 10 P H P Cookie E Sessioniguestbe916c
 
Corso Di Basi Di Dati 09 Modelli Controllo
Corso Di  Basi Di  Dati 09  Modelli ControlloCorso Di  Basi Di  Dati 09  Modelli Controllo
Corso Di Basi Di Dati 09 Modelli Controlloguestbe916c
 
Esercitazioni 02 S Q L
Esercitazioni 02  S Q LEsercitazioni 02  S Q L
Esercitazioni 02 S Q Lguestbe916c
 
Laboratorio Di Basi Di Dati 07 Programmazione Web Lato Server
Laboratorio Di  Basi Di  Dati 07  Programmazione  Web Lato ServerLaboratorio Di  Basi Di  Dati 07  Programmazione  Web Lato Server
Laboratorio Di Basi Di Dati 07 Programmazione Web Lato Serverguestbe916c
 
Laboratorio Di Basi Di Dati 06 Programmazione Web Lato Client
Laboratorio Di  Basi Di  Dati 06  Programmazione  Web Lato ClientLaboratorio Di  Basi Di  Dati 06  Programmazione  Web Lato Client
Laboratorio Di Basi Di Dati 06 Programmazione Web Lato Clientguestbe916c
 
Esercitazioni 01 Algebra Relazionale
Esercitazioni 01  Algebra RelazionaleEsercitazioni 01  Algebra Relazionale
Esercitazioni 01 Algebra Relazionaleguestbe916c
 
Laboratorio Di Basi Di Dati 04 P L S Q L E P Lpg S Q L
Laboratorio Di  Basi Di  Dati 04  P L  S Q L E  P Lpg S Q LLaboratorio Di  Basi Di  Dati 04  P L  S Q L E  P Lpg S Q L
Laboratorio Di Basi Di Dati 04 P L S Q L E P Lpg S Q Lguestbe916c
 
Corso Di Basi Di Dati 06 Esercizi Di Progettazione Concettuale
Corso Di  Basi Di  Dati 06  Esercizi Di Progettazione ConcettualeCorso Di  Basi Di  Dati 06  Esercizi Di Progettazione Concettuale
Corso Di Basi Di Dati 06 Esercizi Di Progettazione Concettualeguestbe916c
 
Corso Di Basi Di Dati 03 Progettazione Concettuale
Corso Di  Basi Di  Dati 03  Progettazione ConcettualeCorso Di  Basi Di  Dati 03  Progettazione Concettuale
Corso Di Basi Di Dati 03 Progettazione Concettualeguestbe916c
 
Corso Di Basi Di Dati 05 Normalizzazione
Corso Di  Basi Di  Dati 05  NormalizzazioneCorso Di  Basi Di  Dati 05  Normalizzazione
Corso Di Basi Di Dati 05 Normalizzazioneguestbe916c
 
Corso Di Basi Di Dati 04 Progettazione Logica
Corso Di  Basi Di  Dati 04  Progettazione LogicaCorso Di  Basi Di  Dati 04  Progettazione Logica
Corso Di Basi Di Dati 04 Progettazione Logicaguestbe916c
 
Corso Di Basi Di Dati 02 S Q L Query
Corso Di  Basi Di  Dati 02  S Q L   QueryCorso Di  Basi Di  Dati 02  S Q L   Query
Corso Di Basi Di Dati 02 S Q L Queryguestbe916c
 
Esercitazioni 03 Algebra + S Q L
Esercitazioni 03  Algebra +  S Q LEsercitazioni 03  Algebra +  S Q L
Esercitazioni 03 Algebra + S Q Lguestbe916c
 
Corso Di Basi Di Dati 01 Algebra Relazionale Ottimizzazioni
Corso Di  Basi Di  Dati 01  Algebra Relazionale   OttimizzazioniCorso Di  Basi Di  Dati 01  Algebra Relazionale   Ottimizzazioni
Corso Di Basi Di Dati 01 Algebra Relazionale Ottimizzazioniguestbe916c
 
Esercitazioni 04 Progettazione Concettuale E Logica
Esercitazioni 04  Progettazione Concettuale E LogicaEsercitazioni 04  Progettazione Concettuale E Logica
Esercitazioni 04 Progettazione Concettuale E Logicaguestbe916c
 
Laboratorio Di Basi Di Dati 05 Architettura Del Web
Laboratorio Di  Basi Di  Dati 05  Architettura Del  WebLaboratorio Di  Basi Di  Dati 05  Architettura Del  Web
Laboratorio Di Basi Di Dati 05 Architettura Del Webguestbe916c
 
Corso Di Basi Di Dati 08 Protezione Dei Dati
Corso Di  Basi Di  Dati 08  Protezione Dei DatiCorso Di  Basi Di  Dati 08  Protezione Dei Dati
Corso Di Basi Di Dati 08 Protezione Dei Datiguestbe916c
 
Laboratorio Di Basi Di Dati 02 Il D B M S My S Q L
Laboratorio Di  Basi Di  Dati 02  Il  D B M S  My S Q LLaboratorio Di  Basi Di  Dati 02  Il  D B M S  My S Q L
Laboratorio Di Basi Di Dati 02 Il D B M S My S Q Lguestbe916c
 

Mehr von guestbe916c (20)

Laboratorio Di Basi Di Dati 10 P H P Cookie E Sessioni
Laboratorio Di  Basi Di  Dati 10  P H P    Cookie E SessioniLaboratorio Di  Basi Di  Dati 10  P H P    Cookie E Sessioni
Laboratorio Di Basi Di Dati 10 P H P Cookie E Sessioni
 
Corso Di Basi Di Dati 09 Modelli Controllo
Corso Di  Basi Di  Dati 09  Modelli ControlloCorso Di  Basi Di  Dati 09  Modelli Controllo
Corso Di Basi Di Dati 09 Modelli Controllo
 
Esercitazioni 02 S Q L
Esercitazioni 02  S Q LEsercitazioni 02  S Q L
Esercitazioni 02 S Q L
 
Laboratorio Di Basi Di Dati 07 Programmazione Web Lato Server
Laboratorio Di  Basi Di  Dati 07  Programmazione  Web Lato ServerLaboratorio Di  Basi Di  Dati 07  Programmazione  Web Lato Server
Laboratorio Di Basi Di Dati 07 Programmazione Web Lato Server
 
Laboratorio Di Basi Di Dati 06 Programmazione Web Lato Client
Laboratorio Di  Basi Di  Dati 06  Programmazione  Web Lato ClientLaboratorio Di  Basi Di  Dati 06  Programmazione  Web Lato Client
Laboratorio Di Basi Di Dati 06 Programmazione Web Lato Client
 
Esercitazioni 01 Algebra Relazionale
Esercitazioni 01  Algebra RelazionaleEsercitazioni 01  Algebra Relazionale
Esercitazioni 01 Algebra Relazionale
 
Laboratorio Di Basi Di Dati 04 P L S Q L E P Lpg S Q L
Laboratorio Di  Basi Di  Dati 04  P L  S Q L E  P Lpg S Q LLaboratorio Di  Basi Di  Dati 04  P L  S Q L E  P Lpg S Q L
Laboratorio Di Basi Di Dati 04 P L S Q L E P Lpg S Q L
 
Corso Di Basi Di Dati 06 Esercizi Di Progettazione Concettuale
Corso Di  Basi Di  Dati 06  Esercizi Di Progettazione ConcettualeCorso Di  Basi Di  Dati 06  Esercizi Di Progettazione Concettuale
Corso Di Basi Di Dati 06 Esercizi Di Progettazione Concettuale
 
Corso Di Basi Di Dati 03 Progettazione Concettuale
Corso Di  Basi Di  Dati 03  Progettazione ConcettualeCorso Di  Basi Di  Dati 03  Progettazione Concettuale
Corso Di Basi Di Dati 03 Progettazione Concettuale
 
Corso Di Basi Di Dati 05 Normalizzazione
Corso Di  Basi Di  Dati 05  NormalizzazioneCorso Di  Basi Di  Dati 05  Normalizzazione
Corso Di Basi Di Dati 05 Normalizzazione
 
Corso Di Basi Di Dati 04 Progettazione Logica
Corso Di  Basi Di  Dati 04  Progettazione LogicaCorso Di  Basi Di  Dati 04  Progettazione Logica
Corso Di Basi Di Dati 04 Progettazione Logica
 
Corso Di Basi Di Dati 02 S Q L Query
Corso Di  Basi Di  Dati 02  S Q L   QueryCorso Di  Basi Di  Dati 02  S Q L   Query
Corso Di Basi Di Dati 02 S Q L Query
 
Algebra
AlgebraAlgebra
Algebra
 
Esercitazioni 03 Algebra + S Q L
Esercitazioni 03  Algebra +  S Q LEsercitazioni 03  Algebra +  S Q L
Esercitazioni 03 Algebra + S Q L
 
Corso Di Basi Di Dati 01 Algebra Relazionale Ottimizzazioni
Corso Di  Basi Di  Dati 01  Algebra Relazionale   OttimizzazioniCorso Di  Basi Di  Dati 01  Algebra Relazionale   Ottimizzazioni
Corso Di Basi Di Dati 01 Algebra Relazionale Ottimizzazioni
 
S Q L
S Q LS Q L
S Q L
 
Esercitazioni 04 Progettazione Concettuale E Logica
Esercitazioni 04  Progettazione Concettuale E LogicaEsercitazioni 04  Progettazione Concettuale E Logica
Esercitazioni 04 Progettazione Concettuale E Logica
 
Laboratorio Di Basi Di Dati 05 Architettura Del Web
Laboratorio Di  Basi Di  Dati 05  Architettura Del  WebLaboratorio Di  Basi Di  Dati 05  Architettura Del  Web
Laboratorio Di Basi Di Dati 05 Architettura Del Web
 
Corso Di Basi Di Dati 08 Protezione Dei Dati
Corso Di  Basi Di  Dati 08  Protezione Dei DatiCorso Di  Basi Di  Dati 08  Protezione Dei Dati
Corso Di Basi Di Dati 08 Protezione Dei Dati
 
Laboratorio Di Basi Di Dati 02 Il D B M S My S Q L
Laboratorio Di  Basi Di  Dati 02  Il  D B M S  My S Q LLaboratorio Di  Basi Di  Dati 02  Il  D B M S  My S Q L
Laboratorio Di Basi Di Dati 02 Il D B M S My S Q L
 

Corso Di Basi Di Dati 02 S Q L D M L

  • 1. Corso di Basi di Dati e Laboratorio LINGUAGGIO SQL INTERROGAZIONI Prof. Silvana Castano A.A. 2005/2006 Basi di Dati e Laboratorio 1 SQL • Dichiarativo (non procedurale) Descrizione dell’obiettivo dell’operazione. • Interprete SQL del DBMS che analizza l’istruzione e formula una interrogazione equivalente nel linguaggio procedurale interno (nascosto all’utente). • Incorporabile in un programma in linguaggio ospite Compilazione di interrogazioni. A.A. 2005/2006 Basi di Dati e Laboratorio 2 SQL • Traduzione ed ottimizzazione query optimizer. • Diretto ad una vasta gamma di utenti : – utenti che interagiscono con l’interprete. – programmatori di applicazioni. A.A. 2005/2006 Basi di Dati e Laboratorio 3
  • 2. ISTRUZIONE SELECT SELECT Lista Attributi FROM Lista Tabelle [WHERE Condizione] • SELECT: nomi di attributo degli attributi target i cui valori devono essere reperiti con la query • FROM: nomi di relazioni su cui la query deve essere valutata • WHERE: espressione (booleana) di ricerca che identifica le ennuple che dovranno far parte del risultato della query A.A. 2005/2006 Basi di Dati e Laboratorio 4 ESEMPIO Impiegato ID Nome Cognome Ufficio Stipendio DipN 10 John Smith 20 45 Adm 20 Franklin Wong 20 36 Prod 30 Alicia Zelaya 10 70 Adm 40 Jennifer Wallace 15 45 HQ 50 Ramesh Smith 30 80 HQ 60 Joyce English 7 73 Prod 70 James Borg 5 40 Adm 80 Ahmad Ramesh 20 46 Prod A.A. 2005/2006 Basi di Dati e Laboratorio 5 ESEMPIO Dipartimento Nome Indirizzo Direttore Adm 731 Fondre, Huston, TX 30 HQ 980, Dallas, Huston, TX 50 Prod 975, Berry, Bellaire, TX 60 R&D 980, Dallas, Huston, TX NULL A.A. 2005/2006 Basi di Dati e Laboratorio 6
  • 3. CLAUSOLA WHERE • Argomento: espressioni booleane costruite combinando predicati semplici mediante operatori logici AND, OR, NOT • Uso di operatori di confronto (=, <>, <, >, <=, >=) fra espressione a sx costruita a partire dai valori degli attributi per la riga e un valore costante o un’altra espressione a dx • AND: selezione delle righe che rendono veri tutti i predicati • OR: selezione delle righe per cui almeno un predicato è vero • NOT: unario, inverte il valore di verità del predicato A.A. 2005/2006 Basi di Dati e Laboratorio 7 CLAUSOLA WHERE Altri operatori in WHERE • [ not ] BETWEEN a AND b • [ not ] IN (lista valori) • IS [ not ] NULL • [ not ] LIKE ‘pattern’ • [NOT] EXISTS A.A. 2005/2006 Basi di Dati e Laboratorio 8 ESEMPI Reperire ufficio e stipendio dell’ impiegato (o degli impegati) il cui nome è ‘John Smith’ SELECT Ufficio, Stipendio FROM Impiegato WHERE Cognome = ‘Smith’ AND Nome = ‘John’ Ufficio Stipendio 20 45 Π Ufficio, Stipendio(σ Cognome=‘Smith’AND Nome=‘John’(Impiegato)) A.A. 2005/2006 Basi di Dati e Laboratorio 9
  • 4. PATTERN MATCHING DI STRINGHE [NOT] LIKE pattern Nella specifica del pattern: • _ rappresenta un carattere arbitrario • % rappresenta una stringa di lunghezza arbitraria (anche 0 caratteri) A.A. 2005/2006 Basi di Dati e Laboratorio 10 ESEMPIO Reperire tutti i dati dei dipartimenti il cui indirizzo è a Houston in Texas SELECT * FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ Nome Indirizzo Direttore Amm.ne 731 Fondre, Houston, 30 TX Sede 980, Dallas, Houston, 50 TX Ricerca 980, Dallas, Houston, NULL TX A.A. 2005/2006 Basi di Dati e Laboratorio 11 RIDENOMINAZIONE ATTRIBUTI Per gli impiegati del dipartimento Amministrazione, mostrare nome, cognome e stipendio risultante applicando un aumento del 10% SELECT Nome, Cognome, Stipendio*1.1 AS NuovoStipendio FROM Impiegato WHERE DipN=‘Adm’ Nome Cognome NuovoStipendio John Smith 49,5 Alicia Zelaya 77 James Borg 44 A.A. 2005/2006 Basi di Dati e Laboratorio 12
  • 5. JOIN Reperire nomi, cognomi e indirizzo di lavoro degli impiegati • Dati su Nome e Cognome degli impiegati si trovano nella tabella Impiegato. • L’indirizzo di lavoro si trova nella tabella Dipartimento. A.A. 2005/2006 Basi di Dati e Laboratorio 13 ESEMPIO • Le tuple di Impiegato sono collegate alle tuple di Dipartimento mediante chiave esterna (attributo DipN) • Per ricostruire l’informazione cercata, ogni tupla di impegato va concatenata con la tupla del corrispondente dipartimento • La condizione da imporre è l’uguaglianza dei valori di chiave esterna di Dipartimento e corrispondente chiave primaria di Impiegato (equijoin) SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN=Dipartimento.Nome A.A. 2005/2006 Basi di Dati e Laboratorio 14 JOIN • Tutte le tabelle coinvolte nel JOIN sono esplicitate nella clausola FROM • Sul prodotto cartesiano di tali tabelle si applicano le condizioni specificate in WHERE • Le condizioni del JOIN sono scritte in modo esplicito nella WHERE (uso dei valori di chiave esterna per collegare tuple di tabelle diverse e combinare i loro dati nel risultato) A.A. 2005/2006 Basi di Dati e Laboratorio 15
  • 6. INTERPRETAZIONE ALGEBRICA SELECT Impiegato.Nome,Cognome, Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN=Dipartimento.Nome Π Impiegato.Nome,Cognome, Indirizzo (σDipN=Dipartimento.Nome(Impiegato X Dipartimento)) A.A. 2005/2006 Basi di Dati e Laboratorio 16 ASSENZA CLAUSOLA WHERE SELECT * FROM Impiegato, Dipartimento Questa interrogazione specifica il prodotto cartesiano delle due relazioni A.A. 2005/2006 Basi di Dati e Laboratorio 17 JOIN Reperire nomi, cognomi e indirizzo di lavoro degli impiegati dell’amministrazione SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN=Dipartimento.Nome AND Dipartimento.Nome=‘Adm’ Condizione di join Condizione di selezione A.A. 2005/2006 Basi di Dati e Laboratorio 18
  • 7. USO DI ALIAS Trovare cognome, nome e ufficio degli impiegati che lavorano nello stesso ufficio di impiegati di nome Smith Al fine di stabilire se un impiegato appartiene o meno al risultato occorre poter confrontare tuple di Impiegato con se stesse Uso di alias di relazione A.A. 2005/2006 Basi di Dati e Laboratorio 19 USO DI ALIAS Trovare cognome, nome e ufficio degli impiegati che lavorano nello stesso ufficio di impiegati di nome Smith SELECT Imp.Cognome, Imp.Nome, Imp.Ufficio FROM Impiegato AS Imp, Impiegato AS Smith WHERE Imp.Ufficio = Smith.Ufficio AND Smith.Cognome = ‘Smith’ AND Imp.ID <> Smith.ID Alias di relazione: • Imp rappresenta gli impiegati • Smith rappresenta gli impiegati di nome Smith A.A. 2005/2006 Basi di Dati e Laboratorio 20 VALORI NULLI • Introduzione di condizioni atomiche per verificare se un valore è specificato oppure è nullo • Predicato is null: selezione delle righe con valori nulli Attributo is [not] null • Il predicato risulta vero se l’attributo ha valore nullo (is not null è la sua negazione) A.A. 2005/2006 Basi di Dati e Laboratorio 21
  • 8. ELIMINAZIONE DUPLICATI Possibile presenza di righe uguali all’interno di una tabella risultato di una interrogazione. Eliminazione dei duplicati a carico dell’utente: SELECT DISTINCT A.A. 2005/2006 Basi di Dati e Laboratorio 22 ELIMINAZIONE DUPLICATI Reperire gli indirizzi dei dipartimenti di Houston in Texas SELECT Indirizzo FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ Indirizzo 731 Fondre, Houston, TX 980, Dallas, Houston, TX 980, Dallas, Houston, TX A.A. 2005/2006 Basi di Dati e Laboratorio 23 ELIMINAZIONE DUPLICATI Reperire gli indirizzi dei dipartimenti di Houston in Texas (senza duplicati) SELECT DISTINCT Indirizzo FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ Indirizzo 731 Fondre, Houston, TX 980, Dallas, Houston, TX A.A. 2005/2006 Basi di Dati e Laboratorio 24
  • 9. ORDINAMENTO DEL RISULTATO • Ordinamento delle ennuple risultato secondo uno o più attributi specificati ORDER BY Attributo [ASC | DESC] {, Attributo [ASC | DESC]} (default ASC) A.A. 2005/2006 Basi di Dati e Laboratorio 25 ESEMPIO SELECT * FROM Impiegato ORDER BY Cognome, Stipendio DESC ID Nome Cognome Ufficio Stipendio DipN 70 James Borg 75 40 Adm 60 Joyce English 7 73 Prod 80 Ahmad Ramesh 20 46 Prod 50 Ramesh Smith 14 80 HQ 10 John Smith 10 45 Adm 40 Jennifer Wallace 16 45 HQ 20 Franklin Wong 20 36 Prod 30 Alicia Zelaya 20 70 Adm A.A. 2005/2006 Basi di Dati e Laboratorio 26 JOIN INTERNI ED ESTERNI • Sintassi per la specifica di join introdotta in SQL-2 che permette di distinguere le condizioni di join dalle altre condizioni • Le condizioni di join appaiono nella clausola FROM associate alle tabelle che partecipano al join • Tipi di join • (INNER) JOIN (interno, default coincide con il theta-join) • NATURAL JOIN (join naturale) • RIGHT, LEFT, FULL OUTER JOIN (join esterni) A.A. 2005/2006 Basi di Dati e Laboratorio 27
  • 10. INNER JOIN SELECT Impiegato.Nome, Impiegato.Cognome Dipartimento.Indirizzo FROM Impiegato, Dipartimento WHERE Impiegato.DipN = Dipartimento.Nome SELECT Impiegato.Nome, Impiegato.Cognome Dipartimento.Indirizzo FROM Impiegato INNER JOIN Dipartimento ON Impiegato.DipN = Dipartimento.Nome A.A. 2005/2006 Basi di Dati e Laboratorio 28 JOIN Reperire nomi, cognomi e indirizzo di lavoro degli impiegati dell’amministrazione SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Indirizzo FROM Impiegato INNER JOIN Dipartimento ON Impiegato.DipN = Dipartimento.Nome WHERE Dipartimento.Nome=‘Adm’ A.A. 2005/2006 Basi di Dati e Laboratorio 29 NATURAL JOIN • Nell’operazione NATURAL JOIN di due relazioni non viene specificata alcuna condizione di join. • Viene applicata una condizione implicita di equijoin per ciascuna coppia di attributi con lo stesso nome nelle due relazioni. • Ogni coppia di attributi di questo tipo è inclusa una sola volta nel risultato • Se i nomi degli attributi non sono gli stessi nelle due relazioni, si possono ridenominare per farli corrispondere e poi applicare NATURAL JOIN A.A. 2005/2006 Basi di Dati e Laboratorio 30
  • 11. JOIN ESTERNI • JOIN ESTERNO (OUTER JOIN) Esegue un join mantenendo nel risultato tutte le righe che fanno parte di una o di entrambe le relazioni coinvolte • LEFT (OUTER) JOIN Fornisce come risultato il join interno esteso con le tuple della relazione che compare a sinistra del join per le quali non esiste una corrispondente tupla nella relazione di destra A.A. 2005/2006 Basi di Dati e Laboratorio 31 JOIN ESTERNI RIGHT (OUTER) JOIN Fornisce come risultato il join interno esteso con le tuple della relazione che compare a destra del join per le quali non esiste una corrispondente tupla nella relazione di sinistra FULL (OUTER) JOIN Fornisce come risultato il join interno esteso con le tuple di ciascuna relazione per le quali non esiste una corrispondente tupla dall’altra parte A.A. 2005/2006 Basi di Dati e Laboratorio 32 ESEMPIO SELECT D.Nome,Indirizzo, I.Nome AS NomeDir, I.Cognome AS CognomeDir, FROM Dipartimento AS D LEFT JOIN Impiegato AS I ON D.Direttore = I.ID D.Nome Indirizzo NomeDir CognomeDir Adm 731 Fondre, Huston, TX Alicia Zelaya HQ 980, Dallas, Huston, TX Ramesh Smith Prod 975, Berry, Bellaire, TX Joyce English R&D 980, Dallas, Huston, TX NULL NULL A.A. 2005/2006 Basi di Dati e Laboratorio 33
  • 12. OPERATORI AGGREGATI • SQL mette a disposizione un insieme di operatori aggregati per derivare valori aggregati a partire da insiemi di tuple di relazioni. Ad esempio, il numero totale di impiegati del dipartimento Produzione non è una proprietà di una singola tupla ma può essere calcolato attraverso il conteggio del nr. di tuple di Impiegato relative agli impiegati di produzione A.A. 2005/2006 Basi di Dati e Laboratorio 34 OPERATORI AGGREGATI • Principali operatori aggregati built-in dell’SQL • COUNT • SUM • MAX • MIN • AVG • Prima si esegue l’interrogazione considerando le clausole FROM e WHERE della query • L’operatore aggregato viene applicato al risultato ottenuto A.A. 2005/2006 Basi di Dati e Laboratorio 35 OPERATORI AGGREGATI • COUNT(*): restituisce il numero di righe di una relazione • COUNT ALL ListaAttributi: restituisce il numero di righe della relazione che possiedono valori diversi da NULL per gli attributi specificati • COUNT DISTINCT ListaAttributi: restituisce il numero di valori diversi all’interno della relazione per gli attributi specificati A.A. 2005/2006 Basi di Dati e Laboratorio 36
  • 13. OPERATORI AGGREGATI SELECT COUNT ( DISTINCT Stipendio ) FROM Impiegato • Restituisce il nr. di valori diversi dell’attributo Stipendio nella tabella Impiegato SELECT COUNT (*) FROM Impiegato WHERE DipN = ‘Prod’ • Restituisce il Nr. di impiegati del dipartimento Produzione A.A. 2005/2006 Basi di Dati e Laboratorio 37 OPERATORI AGGREGATI Determinare il massimo, il minimo e la media degli stipendi degli impiegati SELECT MAX(Stipendio), MIN(Stipendio), AVG(Stipendio) FROM Impiegato Determinare la somma degli stipendi del dipartimento Amministrazione SELECT SUM (Stipendio) FROM Impiegato WHERE DipN = ‘Adm’ A.A. 2005/2006 Basi di Dati e Laboratorio 38 OPERATORI AGGREGATI Determinare lo stipendio massimo tra quelli degli impiegati che lavorano in un dipartimento di Houston in Texas SELECT MAX ( Stipendio ) FROM Impiegato, Dipartimento WHERE Impiegato.DipN = Dipartimento.Nome AND Indirizzo LIKE ‘%Houston%TX%’ A.A. 2005/2006 Basi di Dati e Laboratorio 39
  • 14. RAGGRUPPAMENTI • Necessità di applicare operatori aggregati a sottogruppi di tuple di una relazione in base al valore di uno o più attributi • Clausola GROUP BY ListaAttributi per eseguire il raggruppamento • Prima si effettua il raggruppamento e poi si applica l’operatore aggregato a ciascun sottogruppo individuato A.A. 2005/2006 Basi di Dati e Laboratorio 40 RAGGRUPPAMENTI Determinare, per ciascun dipartimento, il numero di impiegati e la somma dei loro stipendi. SELECT DipN, COUNT(*) AS TOTImpiegati, SUM (Stipendio) AS TOTStipendio FROM Impiegato GROUP BY DipN DipN TOTImpiegati TOTStipendio Adm 3 155 Prod 3 155 HQ 2 125 A.A. 2005/2006 Basi di Dati e Laboratorio 41 RAGGRUPPAMENTI • Esigenza di applicare gli operatori aggregati solo su raggruppamenti che verificano a condizioni date • Clausola HAVING che specifica una condizione su un gruppo di tuple associata al valore degli attributi di raggruppamento • Solo i raggruppamenti che soddisfano la condizione specificata nella clausola HAVING sono inclusi nel risultato dell’interrogazione A.A. 2005/2006 Basi di Dati e Laboratorio 42
  • 15. PREDICATI SUI RAGGRUPPAMENTI Determinare i dipartimenti che spendono più di 130 KE in stipendi. SELECT DipN, SUM (Stipendio) FROM Impiegato GROUP BY DipN HAVING SUM (Stipendio) > 130 A.A. 2005/2006 Basi di Dati e Laboratorio 43 PREDICATI SUI RAGGRUPPAMENTI Per i dipartimenti in cui lavorano almeno 2 impiegati con stipendio superiore a 40 KE, mostrare il nome del dipartimento e il nr. totale di impiegati. SELECT DipN, COUNT(*) FROM Impiegato WHERE Stipendio > 40 GROUP BY DipN HAVING COUNT(*) >= 2 A.A. 2005/2006 Basi di Dati e Laboratorio 44 INTERROGAZIONI DI TIPO INSIEMISTICO • Le operazioni insiemistiche UNION, INTERSECT, EXCEPT sono state incorporate direttamente in SQL • Default: eliminazione dei duplicati • ALL: mantenimento dei duplicati nel risultato A.A. 2005/2006 Basi di Dati e Laboratorio 45
  • 16. INTERROGAZIONI DI TIPO INSIEMISTICO • UNION: arricchisce la potenza espressiva di SQL e permette di scrivere interrogazioni altrimenti non formulabili. • Interrogazioni con INTERSECT e EXCEPT possono essere espresse utilizzando altri costrutti del linguaggio (v. interrogazioni nidificate). A.A. 2005/2006 Basi di Dati e Laboratorio 46 INTERROGAZIONI DI TIPO INSIEMISTICO Determinare l’insieme dei nomi e dei cognomi degli impiegati SELECT Nome FROM Impiegato UNION SELECT Cognome FROM Impiegato UNION ALL preserva i duplicati (quindi la stringa Ramesh Appare 2 volte in quanto sia nome che cognome) A.A. 2005/2006 Basi di Dati e Laboratorio 47 INTERROGAZIONI DI TIPO INSIEMISTICO Trovare i cognomi degli impiegati che sono anche nomi. SELECT Nome FROM Impiegato Nome INTERSECT Ramesh SELECT Cognome FROM Impiegato A.A. 2005/2006 Basi di Dati e Laboratorio 48
  • 17. INTERROGAZIONI DI TIPO INSIEMISTICO Trovare i codici degli impiegati che non sono direttori SELECT ID FROM Impiegato EXCEPT SELECT Direttore FROM Dipartimento A.A. 2005/2006 Basi di Dati e Laboratorio 49 INTERROGAZIONI NIDIFICATE Argomento della WHERE è un predicato in cui si confronta un valore (risultato di una espressione valutata su una singola riga) con il risultato dell’esecuzione di una query SQL interna • Operatori ALL, ANY Per estendere i normali operatori di confronto (=,<>,>,<,>=,<=) al problema di confrontare un singolo valore con l’insieme dei valori risultato della query interna. A.A. 2005/2006 Basi di Dati e Laboratorio 50 INTERROGAZIONI NIDIFICATE Trovare i nomi e cognomi degli impiegati che lavorano a Houston in Texas SELECT Impiegato.Nome, Impiegato.Cognome FROM Impiegato, Dipartimento WHERE Impiegato.DipN = Dipartimento.Nome AND Indirizzo LIKE ‘%Houston%TX%’ A.A. 2005/2006 Basi di Dati e Laboratorio 51
  • 18. INTERROGAZIONI NIDIFICATE La stessa interrogazione si può esprimere in forma nidificata SELECT Nome, Cognome FROM Impiegato WHERE DipN = ANY (SELECT Nome FROM Dipartimento WHERE Indirizzo LIKE ‘%Houston%TX%’ ) N.B. Operatori IN e NOT IN per testare l’appartenenza ad e l’esclusione da un insieme (identici a ‘= ANY’ e ‘<> ALL’) A.A. 2005/2006 Basi di Dati e Laboratorio 52 INTERROGAZIONI NIDIFICATE Trovare nomi e cognomi degli impiegati che lavorano nello stesso ufficio di qualche impiegato del dipartimento Produzione SELECT Nome, Cognome FROM Impiegato WHERE Ufficio IN ( SELECT Ufficio FROM Impiegato WHERE DipN = ‘Prod’) A.A. 2005/2006 Basi di Dati e Laboratorio 53 INTERROGAZIONI NIDIFICATE Si può esprimere anche attraverso le variabili. SELECT DISTINCT Imp.Nome, Imp.Cognome FROM Impiegato AS Imp, Impiegato AS Prod WHERE Imp.Ufficio = Prod.Ufficio AND Prod.DipN = ‘Prod’ A.A. 2005/2006 Basi di Dati e Laboratorio 54
  • 19. INTERROGAZIONI NIDIFICATE Trovare i dipartimenti dove non lavorano persone di nome Smith SELECT Nome FROM Dipartimento WHERE Nome NOT IN ( SELECT DipN FROM Impiegato WHERE Cognome = ‘Smith’) A.A. 2005/2006 Basi di Dati e Laboratorio 55 INTERROGAZIONI NIDIFICATE Non si può esprimere mediante join; uso dell’operatore insiemistico differenza. SELECT Nome FROM Dipartimento EXCEPT SELECT DipN FROM Impiegato WHERE Cognome = ‘Smith’ In algebra relazionale: Π Nome(Dipartimento) - Π DipN (σCognome=‘Smith’(Impiegato)) A.A. 2005/2006 Basi di Dati e Laboratorio 56 INTERROGAZIONI NIDIFICATE Interrogazioni con MIN e MAX possono essere espresse mediante query nidificate. Trovare i dipartimenti con gli stipendi più elevati SELECT DipN AS NomeDipartimento FROM Impiegato WHERE Stipendio = ( SELECT MAX ( Stipendio ) FROM Impiegato) SELECT DipN AS NomeDipartimento FROM Impiegato WHERE Stipendio >= ALL ( SELECT DISTINCT Stipendio FROM Impiegato) A.A. 2005/2006 Basi di Dati e Laboratorio 57
  • 20. SUBQUERY CORRELATE • Negli esempi visti ogni subquery viene eseguita una sola volta l’ insieme dei valori risultante è usato per la valutazione della clausola WHERE della query esterna. • E’ possibile definire subquery che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione della query esterna. A.A. 2005/2006 Basi di Dati e Laboratorio 58 SUBQUERY CORRELATE Determinare gli impiegati che guadagnano più dello stipendio medio del proprio dipartimento • E’ necessaria una query esterna per la selezione degli impiegati dalla relazione Impiegati in base ad un predicato su stipendio; tale query avrà la forma: SELECT Nome, Cognome FROM Impiegato WHERE Stipendio > (media degli stipendi nel dipartimento dell’impiegato candidato) A.A. 2005/2006 Basi di Dati e Laboratorio 59 SUBQUERY CORRELATE La subquery dovrà calcolare la media degli stipendi del dipartimento relativo a ogni tupla candidata della relazione Impiegati; tale subquery avrà la forma: SELECT AVG(Stipendio) FROM Impiegato WHERE DipN = (valore di DipN nella tupla dell’impiegato candidato) A.A. 2005/2006 Basi di Dati e Laboratorio 60
  • 21. SUBQUERY CORRELATE Ogni volta che la query esterna considera una tupla candidata, viene invocata la subquery e viene ‘passato’ il nome del dipartimento dell’impiegato in esame La subquery calcola quindi la media degli stipendi nel dipartimento che e’ stato passato e restituisce tale valore alla query esterna La query esterna può quindi confrontare lo stipendio dell’impiegato in esame con il valore restituito dalla subquery A.A. 2005/2006 Basi di Dati e Laboratorio 61 SUBQUERY CORRELATE Questo tipo di query è chiamato correlato, perché ogni esecuzione della subquery è correlata al valore di uno o più attributi delle tuple candidate nella query esterna Per poter riferire le colonne delle tuple candidate nella query esterna si fa uso degli alias di relazione L’alias di relazione è definito nella query esterna e riferito nella query interna A.A. 2005/2006 Basi di Dati e Laboratorio 62 SUBQUERY CORRELATE Determinare gli impiegati che guadagnano più dello stipendio medio del proprio dipartimento con ordinamento del risultato per dipartimento. SELECT Cognome, Nome, Stipendio, DipN FROM Impiegato X WHERE Stipendio > ( SELECT AVG(Stipendio) FROM Impiegato WHERE X.DipN=DipN) ORDER BY DipN A.A. 2005/2006 Basi di Dati e Laboratorio 63
  • 22. SUBQUERY CORRELATE - EXISTS Il predicato EXISTS(sq) restituisce il valore booleano TRUE se la subquery restituisce almeno un tupla; restituisce il valore booleano FALSE altrimenti Il predicato NOT EXISTS(sq) restituisce il valore booleano TRUE se la subquery non restituisce alcuna tupla; restituisce il valore booleano FALSE altrimenti A.A. 2005/2006 Basi di Dati e Laboratorio 64 INTERROGAZIONI NIDIFICATE Trovare gli impiegati che hanno omonimi SELECT ID, Cognome, Nome FROM Impiegato I1 WHERE EXISTS (SELECT * FROM Impiegato I2 WHERE I1.Nome = I2.Nome AND I1.Cognome = I2.Cognome AND I1.ID <> I2.ID) A.A. 2005/2006 Basi di Dati e Laboratorio 65 DIVISIONE • Le subquery correlate e l’operatore di NOT EXISTS sono particolarmente utili per implementare l’operazione di divisione in SQL • Consideriamo le relazioni: Impiegato(ID, Nome, Cognome) Progetto(Prog#, Pnome, Budget) Partecipazione(ID, Prog#) • Determinare i codici degli impiegati che partecipano a tutti i progetti con un budget maggiore di 50000 Partecipazione ÷ (ΠProg#σBudget>50000(Progetto))) A.A. 2005/2006 Basi di Dati e Laboratorio 66
  • 23. DIVISIONE - ESEMPIO La specifica della divisione in SQL fa uso dell’operatore NOT EXISTS e richiede di ragionare in base al concetto di controesempio. Un impiegato I verifica l’interrogazione se non esiste un progetto che ha un budget maggiore di 50000, ed a cui l’impiegato I non partecipa. A.A. 2005/2006 Basi di Dati e Laboratorio 67 DIVISIONE - ESEMPIO SELECT ID FROM Impiegato I WHERE NOT EXISTS (SELECT * FROM Progetto Y WHERE Budget > 50000 AND NOT EXISTS (SELECT * FROM Partecipazione P WHERE I.ID = P.ID AND Y.Prog# = P.Prog#)) A.A. 2005/2006 Basi di Dati e Laboratorio 68