Sql slide tratte in parte da da atzeni ceri paraboschi torlonee basi di dati mcgraw hill 2002
Download
1 / 58

SQL :S tructured Q uery L anguage: SELECT (III) - PowerPoint PPT Presentation


  • 148 Views
  • Uploaded on

SQL (Slide tratte in parte da da Atzeni, Ceri, Paraboschi, Torlonee, Basi di dati McGraw-Hill, 2002). SQL :S tructured Q uery L anguage: SELECT (III). Persone. Maternità. Madre. Figlio. Nome. Età. Reddito. Luisa. Maria. Andrea. 27. 21. Luisa. Luigi. Aldo. 25. 15. Anna. Olga.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' SQL :S tructured Q uery L anguage: SELECT (III)' - jenski


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Sql slide tratte in parte da da atzeni ceri paraboschi torlonee basi di dati mcgraw hill 2002

SQL (Slide tratte in parte da

da Atzeni, Ceri, Paraboschi, Torlonee, Basi di datiMcGraw-Hill, 2002)

SQL :Structured Query Language: SELECT (III)


Persone

Maternità

Madre

Figlio

Nome

Età

Reddito

Luisa

Maria

Andrea

27

21

Luisa

Luigi

Aldo

25

15

Anna

Olga

Maria

55

42

Anna

Filippo

Anna

50

35

Maria

Andrea

Filippo

26

30

Maria

Aldo

Luigi

50

40

Paternità

Padre

Figlio

Franco

60

20

Sergio

Franco

Olga

30

41

Luigi

Olga

Sergio

85

35

Luigi

Filippo

Luisa

75

87

Franco

Andrea

Franco

Aldo

Giugno-Pulvirenti AA 2005-2006


Attributi sintassi estesa
Attributi: sintassi estesa

  • Attributi ::= * | Espr [[AS] NuovoNome] {, Espr [[AS] NuovoNome] }

  • Espr ::= [Ide.]Attributo | Costante | “(“ Espr “)” | [-] Espr [ Espr] | (SUM | COUNT |AVG | MAX | MIN) “(“ [DISTINCT] [Ide.] Attributo “)” | COUNT “(“ * “)”

  •  ::= ( + | - | * | / )

Giugno-Pulvirenti AA 2005-2006


Esempio
Esempio

SELECT AVG(Voto) AS Media Rossi

FROM Esami, Studenti

WHERE Nome = ‘Paolo Rossi’ AND

Esami.Matricola = Studenti.Matricola

  • Media dei voti di Paolo Rossi

Giugno-Pulvirenti AA 2005-2006


Operatori aggregati
Operatori aggregati

  • Nelle espressioni della target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple

  • SQL-2 prevede 5 possibili operatori di aggregamento:

    • conteggio, minimo, massimo, media, somma

  • Gli operatori di aggregamento NON sono rappresentabili in Algebra Relazionale

Giugno-Pulvirenti AA 2005-2006


Cosa sono
Cosa sono?

  • Operano su insiemi di righe per dare un risultato per gruppo.

IMPIEGATI

DEPTNO SAL

--------- ---------

10 2450

10 5000

10 1300

20 800

20 1100

20 3000

20 3000

20 2975

30 1600

30 2850

30 1250

30 950

30 1500

30 1250

MAX(SAL)

---------

5000

“Salario

Massimo”

Giugno-Pulvirenti AA 2005-2006


Uso

SELECT [column,] group_function(column)

FROM table

[WHERE condition]

[GROUP BY column]

[ORDER BY column];

Giugno-Pulvirenti AA 2005-2006


Operatori aggregati count
Operatori aggregati: COUNT

  • COUNT restituisce il numero di righe o il numero di valori distinti di un particolare attributo

  • Esempio: Il numero di figli di Franco:

    • SELECT count(*) as NumFigliDiFranco

      FROM Paternita

      WHERE Padre = 'Franco'

    • l’operatore aggregato (count) viene applicato al risultato dell’interrogazione:

      SELECT *

      FROM Paternita

      WHERE Padre = 'Franco'

Giugno-Pulvirenti AA 2005-2006


Esempio1
Esempio

Sergio

Franco

Luigi

Olga

Luigi

Filippo

Franco

Franco

Andrea

Andrea

Franco

Franco

Aldo

Aldo

Paternità

Padre

Figlio

NumFigliDiFranco

2

Giugno-Pulvirenti AA 2005-2006


Count e valori nulli
COUNT e valori nulli

Persone

Nome

Età

Reddito

Andrea

27

21

Aldo

25

NULL

Maria

55

21

Anna

50

35

  • Numero di tuple SELECT count(*) FROM persone

  • Numero di volte il campo ‘reddito’ non e’ NULL

    SELECT count(reddito) FROM persone

  • Numero di valori distinti del campo ‘reddito’ (senza i NULL)

    SELECT count(distinct reddito) FROM persone

Giugno-Pulvirenti AA 2005-2006


Altri operatori aggregati
Altri operatori aggregati

SUM, AVG, MAX, MIN

Media dei redditi di coloro che hanno meno di 30 anni:

SELECT avg(reddito)

FROM persone

WHERE eta < 30

Uso del JOIN: media dei redditi dei figli di Franco:

SELECT avg(reddito)

FROM persone JOIN paternita ON nome=figlio

WHERE padre='Franco‘

Uso di piu’ operatori di aggregamento nella target list:

SELECT avg(reddito), min(reddito), max(reddito)

FROM persone

WHERE eta < 30

Giugno-Pulvirenti AA 2005-2006


Uso di avg e sum
Uso di AVG e SUM

  • Possono essere usati su dati numerici.

SQL> SELECT AVG(sal), MAX(sal),

2 MIN(sal), SUM(sal)

3 FROM emp

4 WHERE job LIKE 'SALES%';

AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)

-------- --------- --------- ---------

1400 1600 1250 5600

Giugno-Pulvirenti AA 2005-2006


Uso di min e max
Uso di MIN e MAX

  • Possono essere usati su qualsiasi tipo.

SQL> SELECT MIN(hiredate), MAX(hiredate)

2 FROM emp;

MIN(HIRED MAX(HIRED

--------- ---------

17-DEC-80 12-JAN-83

Giugno-Pulvirenti AA 2005-2006


Operatori aggregati e valori nulli
Operatori aggregati e valori nulli

Persone

Nome

Età

Reddito

Andrea

27

30

Aldo

25

NULL

Maria

55

36

Anna

50

36

SELECT avg(reddito) AS redditomedio

FROM persone

Giugno-Pulvirenti AA 2005-2006


Operatori aggregati e target list
Operatori aggregati e target list

  • un’interrogazione scorretta:

    SELECT nome, max(reddito)

    FROM persone

  • di chi sarebbe il nome? La target list deve essere omogenea

    SELECT min(eta), avg(reddito)

    FROM persone

Giugno-Pulvirenti AA 2005-2006


Operatori aggregati e raggruppamenti
Operatori aggregati e raggruppamenti

Le funzioni possono essere applicate a partizioni delle relazioni

Clausola GROUP BY

Syntax: GROUP BY listaAttributi

Il numero di figli di ciascun padre

SELECT padre, count(*) AS NumFigli

FROM paternita

GROUP BY Padre

Sergio

Franco

Luigi

Olga

Luigi

Filippo

Franco

Andrea

Franco

Aldo

paternita

Padre

Figlio

Padre

NumFigli

Sergio

1

Luigi

2

Franco

2

Giugno-Pulvirenti AA 2005-2006


Raggruppare piu di una colonna
Raggruppare piu’ di una colonna

IMPIEGATI

DEPTNO JOB SAL

--------- --------- ---------

10 MANAGER 2450

10 PRESIDENT 5000

10 CLERK 1300

20 CLERK 800

20 CLERK 1100

20 ANALYST 3000

20 ANALYST 3000

20 MANAGER 2975

30 SALESMAN 1600

30 MANAGER 2850

30 SALESMAN 1250

30 CLERK 950

30 SALESMAN 1500

30 SALESMAN 1250

DEPTNO

--------

10

10

10

20

20

20

30

30

30

JOB SUM(SAL)

--------- ---------

CLERK 1300

MANAGER 2450

PRESIDENT 5000

ANALYST 6000

CLERK 1900

MANAGER 2975

CLERK 950

MANAGER 2850

SALESMAN 5600

“sommare I salari

in IMPIEGATIper ongi lavoro,

Ragruppati

per dipartimeno”

Giugno-Pulvirenti AA 2005-2006


Uso di group by
Uso di GROUP BY

  • Tutte le colonne della SELECT che non sono in funzioni di gruppo devono essere nella GROUP BY.

SQL> SELECT deptno, AVG(sal)

2 FROM emp

3 GROUP BY deptno;

DEPTNO AVG(SAL)

--------- ---------

10 2916.6667

20 2175

30 1566.6667

Giugno-Pulvirenti AA 2005-2006


Esempio group by
Esempio GROUP BY

  • Per ogni dipartimento, restituire la somma degli stipendi di tutti gli impiegati (di quel dipartimento)

  • Relazione: Employee(Name,Dept,Office,Salary,City)

Giugno-Pulvirenti AA 2005-2006


Semantica degli operatori di raggruppamento 1
Semantica degli operatori di raggruppamento (1)

  • La query e’ innanzitutto eseguita senza operatori aggregati e senza GROUP BY:

Giugno-Pulvirenti AA 2005-2006


Semantica degli operatori di raggruppamento 2
Semantica degli operatori di raggruppamento (2)

  • Quindi il risultato e’ diviso in sottoinsiemi aventi gli stessi valori per gli attributi indicati nel GROUP BY (Dept nel nostro caso)

  • Quindi l’operatore di aggregamento e’ calcolato su ogni sottoinsieme:

Giugno-Pulvirenti AA 2005-2006


Raggruppamenti e target list
Raggruppamenti e target list

scorretta

SELECT padre, avg(f.reddito), p.reddito FROM persone f JOIN paternita ON figlio = nome JOIN persone p ON padre =p.nomeGROUP BY padre

corretta

SELECT padre, avg(f.reddito) FROM persone f JOIN paternita ON figlio = nome JOIN persone p ON padre =p.nomeGROUP BY padre

Giugno-Pulvirenti AA 2005-2006


Condizioni sui gruppi clausola having
Condizioni sui gruppi, clausola HAVING

  • Si possono applicare condizioni sul valore aggregato per ogni gruppo

  • Esempio: I dipartimenti la cui somma dei salari e’ maggiore di 100

Giugno-Pulvirenti AA 2005-2006


Where o having
WHERE o HAVING?

  • I padri i cui figli sotto i 30 anni hanno un reddito medio maggiore di 25:

    SELECT padre, avg(f.reddito)

    FROM persone f JOIN paternita ON figlio = nome

    WHERE eta < 30

    GROUP BY padre

    HAVING avg(f.reddito) > 25

Giugno-Pulvirenti AA 2005-2006


Sintassi riassumiamo
Sintassi, riassumiamo

SelectSQL ::=

select ListaAttributiOEspressioni

from ListaTabelle

[ where CondizioniSemplici ]

[ group by ListaAttributiDiRaggruppamento ]

[ having CondizioniAggregate ]

[ order by ListaAttributiDiOrdinamento ]

Giugno-Pulvirenti AA 2005-2006


Esercitazione
Esercitazione

  • Considera il seguente schema relazionale:

    • Quadri( Pittore, Titolo, DataCreazione, NomeMuseo)

    • Musei( NomeMuseo, Citta, Curatore)

    • Costo( Titolo, Prezzo)

  • Scrivere le seguenti query in SQL:

    • Elenco dei musei e del valore medio dei quadri posseduti.

    • Il numero di quadri per ogni pittore fra tutti i musei parigini.

    • Il museo con il maggior numero di quadri esposti.

Giugno-Pulvirenti AA 2005-2006


Elenco dei musei e del valore medio dei quadri posseduti
Elenco dei musei e del valore medio dei quadri posseduti.

  • Quadri( Pittore, Titolo, DataCreazione, NomeMuseo)

  • Musei( NomeMuseo, Citta, Curatore)

  • Costo( Titolo, Prezzo)

    SELECT avg(c.prezzo) ‘prezzo medio’, m.nomeMuseo

    FROM quadri q, musei m, costo c

    WHERE q.nomeMuseo = m.nomeMuseo

    AND q.Titolo = c.Titolo

    GROUP BY m.nomeMuseo

Giugno-Pulvirenti AA 2005-2006


Elenco dei musei e del valore medio dei quadri posseduti1
Elenco dei musei e del valore medio dei quadri posseduti.

  • Quadri( Pittore, Titolo, DataCreazione, NomeMuseo)

  • Musei( NomeMuseo, Citta, Curatore)

  • Costo( Titolo, Prezzo)

    SELECT avg(c.prezzo) ‘prezzo medio’, m.nomeMuseo

    FROM

    (musei JOIN quadri ON musei.nomeMuseo = quadri.nomeMuseo)

    JOIN costo ON quadri.Titolo = costo.Titolo

    GROUP BY m.nomeMuseo

Giugno-Pulvirenti AA 2005-2006


Il numero di quadri per ogni pittore fra tutti i musei parigini
Il numero di quadri per ogni pittore fra tutti i musei parigini.

  • Quadri( Pittore, Titolo, DataCreazione, NomeMuseo)

  • Musei( NomeMuseo, Citta, Curatore)

  • Costo( Titolo, Prezzo)

    SELECT count(*) ‘numero quadri’, pittore

    FROM musei m, quadri q, costo c

    WHERE m.Citta = ‘Parigi’

    AND m.nomeMuseo = q.nomeMuseo

    AND q.titolo = c.Titolo

    GROUP BY pittore

Giugno-Pulvirenti AA 2005-2006


Il museo con il maggior numero di quadri esposti
Il museo con il maggior numero di quadri esposti. parigini.

  • Quadri( Pittore, Titolo, DataCreazione, NomeMuseo)

  • Musei( NomeMuseo, Citta, Curatore)

  • Costo( Titolo, Prezzo)

Giugno-Pulvirenti AA 2005-2006


Unione intersezione e differenza
Unione, intersezione e differenza parigini.

  • La SELECT da sola non permette di fare unioni; serve un costrutto esplicito:

    SELECT …

    UNION [all]

    SELECT ...

  • i duplicati vengono eliminati (a meno che si usi all)

    • anche dalle proiezioni!

Giugno-Pulvirenti AA 2005-2006


Notazione posizionale
Notazione posizionale! parigini.

SELECT padre

FROM paternita

UNION

SELECT madre

FROM maternita

  • quali nomi per gli attributi del risultato?

    • nessuno

    • quelli del primo operando

Giugno-Pulvirenti AA 2005-2006


Figlio parigini.

Padre

Figlio

Luisa

Luisa

Maria

Maria

Luisa

Luisa

Luigi

Luigi

Anna

Anna

Olga

Olga

Anna

Anna

Filippo

Filippo

Maria

Maria

Andrea

Andrea

Maria

Maria

Aldo

Aldo

Sergio

Sergio

Franco

Franco

Luigi

Luigi

Olga

Olga

Luigi

Luigi

Filippo

Filippo

Franco

Franco

Andrea

Andrea

Franco

Franco

Aldo

Aldo

Giugno-Pulvirenti AA 2005-2006


Notazione posizionale 2
Notazione posizionale, 2 parigini.

SELECT padre, figlio

FROM paternita

UNION

SELECT figlio, madre

FROM maternita

SELECT padre, figlio

FROM paternita

UNION

SELECT madre, figlio

FROM maternita

Giugno-Pulvirenti AA 2005-2006


Notazione posizionale 3
Notazione posizionale, 3 parigini.

  • Anche con le ridenominazioni non cambia niente:

    SELECT padre as genitore, figlioFROM paternitaUNIONSELECT figlio, madre as genitoreFROM maternita

  • Corretta:

    SELECT padre as genitore, figlioFROM paternitaUNIONSELECT madre as genitore, figlio FROM maternita

Giugno-Pulvirenti AA 2005-2006


Differenza
Differenza parigini.

SELECT NomeFROM ImpiegatoEXCEPTSELECT Cognome as NomeFROM Impiegato

vedremo che si può esprimere con SELECT nidificate

Giugno-Pulvirenti AA 2005-2006


Intersezione
Intersezione parigini.

SELECT NomeFROM ImpiegatoINTERSECTSELECT Cognome as NomeFROM Impiegato

equivale a

SELECT I.NomeFROM Impiegato I, Impiegato JWHERE I.Nome = J.Cognome

Giugno-Pulvirenti AA 2005-2006


Limitare le righe selezionate
Limitare le righe selezionate parigini.

  • Limitare le righe tramite l’uso della clausola WHERE.

  • La clausola WHERE segue la clausola FROM.

SELECT [DISTINCT] {*| colonna [alias], ...}

FROM tabella

[WHERE condizione(i)];

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate
Interrogazioni nidificate parigini.

SELECT [DISTINCT] {*| colonna [alias], ...}

FROM tabella

[WHERE condizione(i)];

  • Condizione : :=Predicato | “(“Condizione”)” | NOT Condizione | Condizione (AND | OR) Condizione

  • Predicato

    • Espr op (Espr | “(“ Sottoselect “)” )

    • op  {=, <>, >, >=, <, <=}

    • SottoSelect deve dare come risultato una tabella con un solo elemento o vuota (vedremo alcuni esempi)

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate1
Interrogazioni nidificate parigini.

  • le condizioni in SQL permettono anche il confronto fra un attributo e il risultato di una sottoquery

    • Syntax:

      • Scalare Operatore (ANY | ALL) SelectQuery

      • ANY: il predicato e’ vero se almeno uno dei valori restituiti da Query soddisfano la condizione

      • ALL: il predicato e’ vero se tutti i valori restituiti dalla Query soddisfano la condizione

    • quantificatore esistenziale

      • EXISTS SelectQuery

      • Il predicato e’ vero se la SelectQuery restituisce almeno una tupla

Giugno-Pulvirenti AA 2005-2006


Esempio di select nidificate
Esempio di SELECT nidificate parigini.

  • nome e reddito del padre di Franco

    SELECT Nome, RedditoFROM Persone, PaternitaWHERE Nome = Padre AND Figlio = 'Franco'

    SELECT Nome, RedditoFROM PersoneWHERE Nome = ( SELECT Padre FROM Paternita

    WHERE Figlio = 'Franco')

  • La query nella clausola WHERE e’ la query nidificata

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate commenti
Interrogazioni nidificate, commenti parigini.

  • La forma nidificata è “meno dichiarativa”, ma talvolta più leggibile (richiede meno variabili)

  • La forma piana e quella nidificata possono essere combinate

  • Le sottointerrogazioni non possono contenere operatori insiemistici (“l’unione si fa solo al livello esterno”); la limitazione non è significativa

Giugno-Pulvirenti AA 2005-2006


  • Nome e reddito dei padri di persone che guadagnano più di 20 milioni

    SELECT distinct P.Nome, P.RedditoFROM Persone P, Paternita, Persone FWHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20

    SELECT Nome, RedditoFROM PersoneWHERE Nome in (SELECT Padre FROM Paternita WHERE Figlio = any (SELECT Nome FROM Persone WHERE Reddito > 20))

Giugno-Pulvirenti AA 2005-2006


  • Nome e reddito dei padri di persone che guadagnano più di 20 milioni

    SELECT distinct P.Nome, P.RedditoFROM Persone P, Paternita, Persone FWHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20

    SELECT Nome, RedditoFROM PersoneWHERE Nome in (SELECT Padre FROM Paternita, Persone WHERE Figlio = Nome AND Reddito > 20)

Giugno-Pulvirenti AA 2005-2006


Negazione con le query nidificate
Negazione con le query nidificate 20 milioni

  • Trovare quei dipartimenti dove non c’e’ nessuno che si chiama ‘Brown’:

  • Oppure:

Giugno-Pulvirenti AA 2005-2006


Operatori in e not in
Operatori IN e NOT IN 20 milioni

  • IN e’ sinonimo di: =ANY

  • NOT IN e’ sinonimo di: <>ALL

Giugno-Pulvirenti AA 2005-2006


Max e min con le query nidificate
MAX e MIN con le query nidificate 20 milioni

  • Esempio: Il dipartimento(i) dove lavora colui con lo stipendio piu’ alto di tutta l’azienda:

  • Oppure:

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate commenti 2
Interrogazioni nidificate, commenti, 2 20 milioni

  • La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente:

    • la dichiaratività è limitata

    • non si possono includere nella target list attributi di relazioni nei blocchi interni

Giugno-Pulvirenti AA 2005-2006


  • Nome e reddito dei padri di persone che guadagnano più di 20 milioni, con indicazione del reddito del figlio

    SELECT distinct P.Nome, P.Reddito, F.RedditoFROM Persone P, Paternita, Persone FWHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20

    SELECT Nome, Reddito, ????FROM PersoneWHERE Nome in (SELECT Padre FROM Paternita WHERE Figlio = any (SELECT Nome FROM Persone WHERE Reddito > 20))

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate commenti 3
Interrogazioni nidificate, commenti, 3 20 milioni,

  • regole di visibilità:

    • non è possibile fare riferimenti a variabili definite in blocchi più interni

    • se un nome di variabile è omesso, si assume riferimento alla variabile più “vicina”

  • in un blocco si può fare riferimento a variabili definite in blocchi più esterni

Giugno-Pulvirenti AA 2005-2006


Persone 20 milioni,

Maternità

Madre

Figlio

Nome

Età

Reddito

Luisa

Maria

Andrea

27

21

Luisa

Luigi

Aldo

25

15

Anna

Olga

Maria

55

42

Anna

Filippo

Anna

50

35

Maria

Andrea

Filippo

26

30

Maria

Aldo

Luigi

50

40

Paternità

Padre

Figlio

Franco

60

20

Sergio

Franco

Olga

30

41

Luigi

Olga

Sergio

85

35

Luigi

Filippo

Luisa

75

87

Franco

Andrea

Franco

Aldo

Giugno-Pulvirenti AA 2005-2006


Quantificazione esistenziale
Quantificazione esistenziale 20 milioni,

  • Ulteriore tipo di condizione

    • EXISTS ( Sottoespressione )

  • Le persone che hanno almeno un figlio

    SELECT *FROM PersoneWHERE EXISTS ( SELECT * FROM Paternita WHERE Padre = Nome) OR EXISTS ( SELECT * FROM Maternita WHERE Madre = Nome)

Giugno-Pulvirenti AA 2005-2006


Quantificazione esistenziale 2
Quantificazione esistenziale, 2 20 milioni,

  • I padri i cui figli guadagnano tutti più di venti milioni

    SELECT distinct PadreFROM Paternita ZWHERE NOT EXISTS ( SELECT * FROM Paternita W, Persone WHERE W.Padre = Z.Padre AND W.Figlio = Nome AND Reddito <= 20)

Giugno-Pulvirenti AA 2005-2006


Semantica delle espressioni correlate
Semantica delle espressioni “correlate” 20 milioni,

  • La query piu’ interna puo’ usare variabili della query esterna

  • L’interrogazione interna viene eseguita una volta per ciascuna ennupla dell’interrogazione esterna

  • Esempio, trovare tutti gli studenti che hanno un omonimo:

    • SELECT * FROM Student S WHERE EXISTS (SELECT * FROM Student S2 WHERE S2.Nome = S.Nome AND S2.Cognome = S.Cognome AND S2.Matricola <> S.Matricola)

Giugno-Pulvirenti AA 2005-2006


Semantica delle espressioni correlate 2
Semantica delle espressioni “correlate”, 2 20 milioni,

  • Esempio, trovare tutti gli studenti che NON hanno un omonimo:

    • SELECT * FROM Student S WHERE NOT EXISTS (SELECT * FROM Student S2 WHERE S2.Nome = S.Nome AND S2.Cognome = S.Cognome AND S2.Matricola <> S.Matricola)

Giugno-Pulvirenti AA 2005-2006


Confronto su piu attributi
Confronto su piu’ attributi 20 milioni,

  • Il confronto con il risultato di una query nidificata puo’ essere basato su piu’ attributi

  • Stessa query di prima, trovare tutti gli studenti che hanno un omonimo:

    • SELECT * FROM Student S WHERE (Nome, Cognome) IN (SELECT Nome, Cognome FROM Student S2 WHERE S2.Matricola <> S.Matricola)

Giugno-Pulvirenti AA 2005-2006


Visibilit
Visibilità 20 milioni,

  • scorretta:

    SELECT *

    FROM Impiegato

    WHERE Dipart in (SELECT Nome

    FROM Dipartimento D1

    WHERE Nome = 'Produzione') OR

    Dipart in (SELECT Nome

    FROM Dipartimento D2

    WHERE D2.Citta = D1.Citta)

    • D1 non e’ visibile nella seconda query nidificata in quanto le due sottoquery sono allo stesso livello

Giugno-Pulvirenti AA 2005-2006


Commenti finali sulle query nidificate
Commenti finali sulle query nidificate 20 milioni,

  • Query nidificate possono essere “meno dichiarative” in un certo senso ma spesso sono piu’ facilmente interpretabili

    • Suddivisibili in blocchi piu’ semplici da interpretare

  • L’utilizzo di variabili deve rispettare le regole di visibilita’

    • Cioe’, una variabile puo’ essere usata solo all’interno dello stesso blocco e in un blocco piu’ interno

  • Comunque, query nidificate complesse possono essere di difficile comprensione

    • Soprattutto quando si usano molte variabili comuni tra blocchi diversi

Giugno-Pulvirenti AA 2005-2006


ad