Sql slide tratte in parte da da atzeni ceri paraboschi torlonee basi di dati mcgraw hill 2002
This presentation is the property of its rightful owner.
Sponsored Links
1 / 58

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


  • 102 Views
  • Uploaded on
  • Presentation posted in: General

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.

Download Presentation

SQL :S tructured Q uery L anguage: SELECT (III)

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)


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

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


Sql s tructured q uery l anguage select iii

Uso

SELECT[column,] group_function(column)

FROMtable

[WHEREcondition]

[GROUP BYcolumn]

[ORDER BYcolumn];

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> SELECTAVG(sal), MAX(sal),

2MIN(sal), SUM(sal)

3FROMemp

4WHEREjob 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> SELECTMIN(hiredate), MAX(hiredate)

2 FROMemp;

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 JOINpersone 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.

  • 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

  • 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!

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


Sql s tructured q uery l anguage select iii

Figlio

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

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

  • 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

SELECT NomeFROM ImpiegatoEXCEPTSELECT Cognome as NomeFROM Impiegato

vedremo che si può esprimere con SELECT nidificate

Giugno-Pulvirenti AA 2005-2006


Intersezione

Intersezione

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

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

  • La clausola WHERE segue la clausola FROM.

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

FROM tabella

[WHEREcondizione(i)];

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate

Interrogazioni nidificate

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

FROM tabella

[WHEREcondizione(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

  • 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

  • nome e reddito del padre di Franco

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

    SELECT Nome, RedditoFROM PersoneWHERE Nome = (SELECT PadreFROM Paternita

    WHERE Figlio = 'Franco')

  • La query nella clausola WHERE e’ la query nidificata

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate commenti

Interrogazioni nidificate, commenti

  • 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


Sql s tructured q uery l anguage select iii

  • 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 PadreFROM PaternitaWHERE Figlio = any (SELECT NomeFROM PersoneWHERE Reddito > 20))

Giugno-Pulvirenti AA 2005-2006


Sql s tructured q uery l anguage select iii

  • 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 PadreFROM Paternita, Persone WHERE Figlio = NomeAND Reddito > 20)

Giugno-Pulvirenti AA 2005-2006


Negazione con le query nidificate

Negazione con le query nidificate

  • 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

  • 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

  • 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

  • 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


Sql s tructured q uery l anguage select iii

  • 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 PadreFROM PaternitaWHERE Figlio = any (SELECT NomeFROM PersoneWHERE Reddito > 20))

Giugno-Pulvirenti AA 2005-2006


Interrogazioni nidificate commenti 3

Interrogazioni nidificate, commenti, 3

  • 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


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

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

  • Ulteriore tipo di condizione

    • EXISTS ( Sottoespressione )

  • Le persone che hanno almeno un figlio

    SELECT *FROM PersoneWHERE EXISTS (SELECT * FROM PaternitaWHERE Padre = Nome) OR EXISTS (SELECT *FROM MaternitaWHERE Madre = Nome)

Giugno-Pulvirenti AA 2005-2006


Quantificazione esistenziale 2

Quantificazione esistenziale, 2

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

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

Giugno-Pulvirenti AA 2005-2006


Semantica delle espressioni correlate

Semantica delle espressioni “correlate”

  • 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

  • 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

  • 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à

  • 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

  • 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


  • Login