5° Anno TEORIA 4. Introduzione al linguaggio SQL | Page 52

16 . Il linguaggio SQL Vers . 9.3 – Marzo 2024
SOTTOINTERROGAZIONI ( SUBQUERY ) che producono valori appartenenti ad un insieme
Nella costruzione delle sottointerrogazione ( o sottoquery o subquery ) è possibile utilizzare i seguenti predicati per effettuare ricerche sui valori di attributi che soddisfano proprietà di appartenenza a insiemi di valori .
I possibili predicati che possiamo utilizzare sono : ( 1 ) ANY e ALL ; ( 2 ) IN e NOT IN ; ( 3 ) EXISTS e NOT EXISTS
( 1 ) ANY e ALL vengono utilizzati nelle condizioni delle query del tipo
SELECT < Lista Attributi > FROM < ListaTabelle > WHERE < Attributo > < OperatoreDiConfronto > ANY | ALL (< SubQuery >);
dove < OperatoreDiConfronto > è uno tra <, >, ≤ , ≥ , =, <>, ed
- ANY indica che la condizione della clausola WHERE è vera se il valore dell ’ attributo < Attributo > compare in almeno uno dei valori restituiti dalla sottoquery < SubQuery >
- ALL indica che la condizione della clausola WHERE è vera se il valore dell ’ attributo < Attributo > compare in tutti quelli restituiti dalla sottoquery < SubQuery >
N . B . Ovviamente la sottoquery < SubQuery > prevede la selezione su un unico attributo Esempio : Consideriamo le seguenti relazioni Regista ( CodRegista , Cognome , Nome ) Attore ( CodAttore , Cognome , Nome ) Per ottenere i registi che sono anche attori scriveremo ( quindi Regista ∩ Attore )
Nel caso non funzioni l ’ operatore INTERSECT ( caso MySql ) non resta che intraprendere la strada di una query annidata ( subquery ) in grado di fornire gli stessi risultati ( logicamente equivalente ):
( SELECT Cognome , Nome FROM Regista ) INTERSECT ( SELECT Cognome , Nome FROM Attore );
# alternativa con SUBQUERY ( Occhio questa query controlla solo il Cognome , non il Nome )
SELECT Cognome , Nome FROM Regista WHERE Cognome = ANY ( SELECT Cognome
FROM Attore );
Per ottenere i registi che NON sono anche attori scriveremo ( quindi Regista - Attore )
Nel caso non funzioni l ’ operatore MINUS ( caso MySql ) non resta che intraprendere la strada di una query annidata ( subquery ) in grado di fornire gli stessi risultati ( logicamente equivalente ):
( SELECT Cognome , Nome FROM Regista ) MINUS ( SELECT Cognome , Nome FROM Attore );
# alternativa con SUBQUERY ( Occhio questa query controlla solo il Cognome , non il Nome )
SELECT Cognome , Nome FROM Regista WHERE Cognome <> ALL ( SELECT Cognome
FROM Attore );
Autore : Rio Chierego ( email : riochierego @ libero . it - sito web : www . riochierego . it ) Pag . 52