SQL IL LINGUAGGIO DI INTERROGAZIONE



Похожие документы
SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

Capitolo 4. SQL: il linguaggio di interrogazione. Originato da SEQUEL-XRM e System-R ( ) dell IBM

Il linguaggio SQL: query innestate

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

Join in SQL (primo modo) Informatica. Tabella Dipartimento. Interrogazione 4a. Interrogazione 4b. Interrogazione 4a

Operazioni sui database

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

Informatica. Sintassi. Interrogazioni in SQL. Significato dell interrogazione. Tabella Impiegato. Basi di dati parte 4 SQL

SQL - Funzioni di gruppo

Uso delle variabili di alias. SQL slide aggiuntive. Interrogazione 25. Interrogazione 26

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Interrogazioni complesse. SQL avanzato 1

Istruzioni DML di SQL

SQL/OLAP. Estensioni OLAP in SQL

4 SQL : Interrogazioni nidificate

Interrogazioni nidificate, commenti

SQL: concetti base SQL. Definizione dei dati in SQL. SQL: "storia"

Capitolo 13. Interrogare una base di dati

DBMS (Data Base Management System)

Data Management Software. Il linguaggio SQL. Raggruppamenti. Paolo Avallone Sr Consulting IT Specialist DB2, Data Management Marzo 2004

Basi Di Dati, 09/12/2003

Ricorsione in SQL-99. Introduzione. Idea di base

Lezione 8. Metadati, Viste e Trigger

Definizione di domini

CONCETTO DI ANNIDAMENTO

Organizzazione degli archivi

SQL prima parte D O C E N T E P R O F. A L B E R T O B E L U S S I. Anno accademico 2011/12

Corso di Laboratorio di Basi di Dati

Dispensa di database Access

SQL (STRUCTURED QUERY LANGUAGE)

INFORMATICA. Applicazioni WEB a tre livelli con approfondimento della loro manutenzione e memorizzazione dati e del DATABASE.

(anno accademico )

I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due:

Lezione V. Aula Multimediale - sabato 29/03/2008

ALGEBRA RELAZIONALE RIEPILOGO

MAX, SUM, AVG, COUNT)

Elementi di Algebra Relazionale

OSSIF WEB. Manuale query builder

OR true null false true true true true null true null null false true null false NOT

Sistemi per la gestione di database: MySQL ( )

Basi di dati. L Algebra Relazionale. K. Donno - L Algebra Relazionale

Utilizzando Microsoft Access. Si crea la tabella Anagrafica degli alunni,le Materie e i voti si mettono alcuni campi

PROGRAMMA DI CLASSE 5AI

Query. Query (Interrogazioni) SQL SQL. Significato dell interrogazione. Sintassi

Introduzione all Algebra Relazionale

RISOLUTORE AUTOMATICO PER SUDOKU

Il linguaggio SQL: le basi

SQL SQL. Definizione dei dati. Domini. Esistono 6 domini elementari:

Structured Query Language parte 1

Si formulino le seguenti interrogazioni tramite il linguaggio SQL:

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Linguaggi per basi di dati

Progettazione di Basi di Dati

Basi di Dati: Corso di laboratorio

Introduzione ai database relazionali

Il linguaggio SQL: viste e tabelle derivate. Versione elettronica: SQLd-viste.pdf

Il seguente esempio ha lo scopo di illustrare i 3 tipi di relazione 1:1,1:N,N:N. Tabella Conto: Tabella Conto:

Basi di dati. Il Modello Relazionale dei Dati. K. Donno - Il Modello Relazionale dei Dati

TEORIA sulle BASI DI DATI

Algebra e calcolo relazionale. Ripasso. Le 7 Virtù del DBMS persistenza affidabilità volume condivisione riservatezza efficienza efficacia

Archivi e Basi di Dati

ECDL - Database. European Computer Driving Licence - Modulo 5 - Database LEZIONE 2

Il linguaggio SQL: viste e tabelle derivate

Basi di Dati Prof. L. Tanca e F. A. Schreiber APPELLO DEL 12 FEBBRAIO 2015 PARTE 1

Basi di Dati Corso di Laura in Informatica Umanistica

Lorenzo Braidi. Database design. Libro_datadesign.indb :06:17

SQL seconda parte D O C E N T E P R O F. A L B E R T O B E L U S S I. Anno accademico 2012/13

Attributi e domini. A per {A}; XY per X Y (pertanto A 1 A 2 A 3 denota

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

logica dei predicati


Il Modello Relazionale

Introduzione alla teoria dei database relazionali. Come progettare un database

1.Tutte 2.Spesso P.IVAe le CF volte che si visualizza i dati un fornitore si mostranoanche. La mensa. La mensa

MODELLO RELAZIONALE. Introduzione

Il linguaggio SQL: DDL di base

Gli operatori relazionali

Informatica Generale Andrea Corradini Sistemi di Gestione delle Basi di Dati

Alcune nozioni di base di Logica Matematica

Laboratorio di Basi di Dati e Web

Storia. Corso di Basi di Dati Spaziali. Componente DDL. Funzionalità. Esempio. Creazione di schema. Linguaggi: SQL. Storia:

Esercitazione Simulazione Compito

I comandi del linguaggio DDL (Data Definition Language): CREATE E ALTER

Interrogazione della base di dati

IL LINGUAGGIO SQL IDENTIFICATORI E TIPI DI DATI COMANDI E ISTRUZIONI

ALGEBRA DELLE PROPOSIZIONI

Dimensione di uno Spazio vettoriale

Транскрипт:

SQL IL LINGUAGGIO DI INTERROGAZIONE SQL! Originato da SEQUEL-XRM e System-R (1974-1977) dell IBM! Significato originario Structured Query Language! Standard de facto! Attuale standard ANSI/ISO è SQL:1999 Giorgio Giacinto 2010 Database 2

Componenti SQL! DML (Data Manipulation Language)! DDL (Data Definition Language)! Trigger e vincoli di integrità avanzati! SQL dinamico e embedded! Esecuzione client-server e accesso a basi di dati remote! Gestore di transazioni! Sicurezza! Funzioni avanzate Giorgio Giacinto 2010 Database 3 Schema base di dati di esempio Velisti(vid:integer,vnome:string, esperienza:integer,età:real) Barche(bid:integer,bnome:string, colore:string) Prenota(vid:integer,bid:integer, giorno:data) Giorgio Giacinto 2010 Database 4

P1 Istanze di esempio! Useremo nei nostri esempi queste istanze delle relazioni Velisti e Prenota! Se la chiave per la relazione Prenota contenesse solo gli attributi vid e bid, in che modo la semantica sarebbe diversa? V1 V2 vid bid giorno 22 101 10/10/96 58 103 11/12/96 vid vnome esperienza età 22 dustin 7 45.0 31 lubber 8 55.5 58 rusty 10 35.0 vid vnome esperienza età 28 yuppy 9 35.0 31 lubber 8 55.5 44 guppy 5 35.0 58 rusty 10 35.0 Giorgio Giacinto 2010 Database 5 Interrogazioni SQL di base SELECT DISTINCT FROM WHERE lista-attributi lista-relazioni qualificazioni! Lista-relazioni. Una lista di nomi di relazioni (eventualmente con una variabile di range dopo ciascun nome)! Lista-attributi. Una lista di attributi delle relazioni in listarelazioni! Qualificazioni. Confronti (attr op cost oppure attr1 op attr2, dove op è uno tra <, >, =, <=, >= <>) combinati usando AND, OR e NOT! DISTINCT è una parola chiave opzionale che indica che la risposta non dovrebbe contenere duplicati. Per impostazione predefinita i duplicati non sono eliminati!! Il risultato è un multinsieme Giorgio Giacinto 2010 Database 6

Strategia di valutazione concettuale! La semantica di una interrogazione SQL è definita in termini della seguente strategia di valutazione concettuale! calcolare il prodotto scalare di lista-relazioni! scartare le tuple risultanti se non passano le qualificazioni! cancellare gli attributi che non sono in lista-attributi! se è specificato DISTINCT, eliminare le righe duplicate! Questa strategia è probabilmente il modo meno efficiente di calcolare una interrogazione! Un ottimizzatore troverà strategie più efficienti per calcolare le stesse risposte. Giorgio Giacinto 2010 Database 7 Esempio di valutazione concettuale SELECT V.vnome, Prenota P WHERE V.vid = P.vid AND P.bid = 103 (vid) vnome esperienza età (vid) bid giorno 22 dustin 7 45.0 22 101 10/10/96 22 dustin 7 45.0 58 103 11/12/96 31 lubber 8 55.5 22 101 10/10/96 31 lubber 8 55.5 58 103 11/12/96 58 rusty 10 35.0 22 101 10/10/96 58 rusty 10 35.0 58 103 11/12/96 Giorgio Giacinto 2010 Database 8

Nota sulle variabili di range! Se ne ha veramente bisogno solo se la stessa relazione appare due volte nella clausola FROM. L interrogazione precedente può anche essere scritta come SELECT V.vnome, Prenota P WHERE V.vid = P.vid AND bid = 103 oppure SELECT vnome FROM Velisti, Prenota WHERE Velisti.vid = Prenota.vid AND bid = 103 È buono stile, comunque, usare sempre le variabili di range! Giorgio Giacinto 2010 Database 9 Trovare i nomi dei velisti che hanno prenotato almeno una barca SELECT FROM WHERE V.vnome Velisti V, Prenota P V.vid = P.vid! Farebbe differenza aggiungere DISTINCT a questa interrogazione? Giorgio Giacinto 2010 Database 10

Espressioni e stringhe SELECT FROM WHERE V.età, età1 = V.età -5, 2 * V.età AS eta2 Velisti V V.vnome LIKE 'B_%B'! Illustra l uso delle espressioni aritmetiche e del pattern matching di stringhe: trovare le triple (le età dei velisti e due campi definiti da espressioni) per quei velisti il cui nome inizia e termina con B e contiene almeno tre caratteri! AS e = sono due modi di dare un nome ai campi del risultato! LIKE è usato per il matching di stringhe! _ indica qualunque carattere singolo! % sta per 0 o più caratteri arbitrari Giorgio Giacinto 2010 Database 11 OPERATORI INSIEMISTICI

Trovare i vid dei velisti che hanno prenotato una barca rossa o una barca verde! UNION può essere usato per calcolare l unione di qualunque coppia di insiemi di tuple (essi stessi risultati di interrogazioni SQL) compatibili rispetto all unione! Se nella prima versione sostituiamo OR con AND, cosa otteniamo?! Disponibile anche EXCEPT (cosa otteniamo se sostituiamo UNION con EXCEPT?) SELECT P.vid FROM Barche B, Prenota P WHERE P.bid=B.bid AND (B.colore= rosso OR B.colore= verde ) SELECT P.vid FROM Barche B, Prenota P WHERE P.bid = B.bid AND B.colore = rossa UNION SELECT P2.vid FROM Barche B2, Prenota P2 WHERE P2.bid = B2.bid AND B2.colore = verde Giorgio Giacinto 2010 Database 13 Trovare i vid dei velisti che hanno prenotato una barca rossa e una barca verde! INTERSECT può essere usato per calcolare l intersezione di qualunque coppia di insiemi di tuple compatibili rispetto all unione! Incluso nello standard SQL/92, ma alcuni sistemi non lo supportano! Confrontate la simmetria delle interrogazioni con UNION e INTERSECT con la diversità delle altre versioni SELECT P1.vid FROM Barche B1, Prenota P1, Barche B2, Prenota P2 WHERE P1.vid = P2.vid AND P1.bid = B1.bid AND P2.bid = B2.bid AND (B1.colore = rosso AND B2.colore = verde ) SELECT P.vid FROM Barche B, Prenota P WHERE P.bid = B.bid AND B.colore = rosso INTERSECT SELECT P.vid FROM Barche B, Prenota P WHERE P.bid = B.bid AND B.colore = verde Giorgio Giacinto 2010 Database 14

INTERROGAZIONI ANNIDATE Interrogazioni annidate Trovare i nomi dei velisti che hanno prenotato la barca #103 SELECT V.vnome WHERE V.vid IN (SELECTP.vid FROM Prenota P WHERE P.bid = 103)! Una funzione molto potente di SQL: una clausola WHERE può essa stessa contenere una interrogazione SQL!! In realtà, lo stesso vale per le clausole FROM e HAVING! Per trovare i velisti che non hanno prenotato la barca #103, usare NOT IN! Per comprendere la semantica delle interrogazioni annidate, pensate alla valutazione dei cicli annidati: per ciascuna tupla di Velisti, controllare la qualificazione calcolando la sottointerrogazione. Giorgio Giacinto 2010 Database 16

Interrogazioni annidate Trovare i nomi dei velisti che hanno prenotato solo barche rosse SELECT V.vnome WHERE V.vid NOT IN (SELECT P.vid FROM Prenota P WHERE P.bid NOT IN (SELECT B.bid FROM Barche B WHERE B.colore = rosso ))) Dobbiamo esprimere il concetto unicamente con una doppia negazione Come il quantificatore universale tutti Giorgio Giacinto 2010 Database 17 Interrogazioni annidate con correlazione Trovare i nomi dei velisti che hanno prenotato la barca #103 SELECT V.vnome WHERE EXISTS (SELECT * FROM Prenota P WHERE P.bid = 103 AND V.vid = P.vid)! EXISTS è un altro operatore di confronto tra insiemi, come IN! Restituisce VERO se il risultato della sottointerrogazione non è vuoto! NOT EXISTS restituisce VERO se il risultato della sottointerrogazione è vuoto Giorgio Giacinto 2010 Database 18

Interrogazioni annidate con correlazione Trovare i nomi dei velisti che hanno prenotato la barca #103 solo una volta SELECT V.vnome WHERE UNIQUE (SELECT P.bid FROM Prenota P WHERE P.bid = 103 AND V.vid = P.vid) UNIQUE è un altro operatore di confronto tra insiemi restituisce VERO se nessuna riga del risultato della sottointerrogazione appare due volte quindi restituisce VERO se il risultato è vuoto! Perché nella SELECT della sottointerrogazione occorre P.bid? Giorgio Giacinto 2010 Database 19 Ancora sugli operatori di confronto tra insiemi! Abbiamo già visto IN, EXISTS e UNIQUE. Possiamo anche usare NOT IN, NOT EXISTS e NOT UNIQUE! Disponibili anche: op ANY, op ALL, >, <, =, >=, <=, <>! IN equivale a = ANY e NOT IN equivale a <>ALL Trovare i velisti la cui esperienza è maggiore di quella di qualche velista chiamato Horatio SELECT * WHERE V.esperienza > ANY (SELECT V2.esperienza 2 WHERE V2.vnome = Horatio ) Se non ci sono velisti chiamati Horatio il confronto restituisce FALSE Giorgio Giacinto 2010 Database 20

Riscrittura delle interrogazioni INTERSECT usando IN Trovare i vid dei velisti che hanno prenotato sia una barca rossa che una barca verde SELECT V.vid, Barche B, Prenota P WHERE V.vid = P.vid AND P.bid = B.bid AND B.colore = rosso AND V.vid IN (SELECT V2.vid 2, Barche B2, Prenota P2 WHERE V2.vid = P2.vid AND P2.bid = B2.bid AND B2.colore = verde )! Analogamente, le interrogazioni EXCEPT si riscrivono usando NOT IN! Per trovare i nomi (non i vid) dei velisti che hanno prenotato sia barche rosse che barche verdi, basta sostituire V.vid con V.vnome nella clausola SELECT (che si può dire dell interrogazione con INTERSECT?) Giorgio Giacinto 2010 Database 21 Divisioni in SQL Trovare i velisti che hanno prenotato tutte le barche Prima soluzione, con EXCEPT SELECT V.vnome FROM Velisti WHERE NOT EXISTS ((SELECT B.bid FROM Barche B) EXCEPT (SELECT P.bid FROM Prenota P WHERE P.vid = V.vid)) Velisti V tali che Seconda soluzione, più complicata, senza EXCEPT SELECT V.vnome WHERE NOT EXISTS (SELECT B.bid FROM Barche B WHERE NOT EXITS (SELECT P.bid FROM Prenota P WHERE P.bid = B.bid AND P.vid = V.vid)) non ci sia una barca B senza una tupla di Prenota la quale mostra che V ha prenotato B Giorgio Giacinto 2010 Database 22

OPERATORI DI AGGREGAZIONE Operatori di aggregazione Importante estensione dell algebra relazionale COUNT (*) COUNT ([DISTINCT] A) SUM ([DISTINCT] A) AVG ([DISTINCT] A) MAX (A) MIN (A) Giorgio Giacinto 2010 Database 24

Esempi con operatori di aggregazione SELECT COUNT(*) SELECT COUNT(DISTINCT V.esperienza) WHERE V.vnome = Bob SELECT AVG(V.età) WHERE V.esperienza=10 SELECT AVG(DISTINCT V.età) WHERE V.esperienza = 10 Giorgio Giacinto 2010 Database 25 Trovare nome ed età del/i velista/i più anziano/i! La prima interrogazione è illegale! (Ne vedremo le ragioni un po più tardi, quando discuteremo GROUP BY)! La terza interrogazione è equivalente alla seconda, ed è permessa nello standard SQL/92, ma non è supportata in alcuni sistemi SELECT V.vnome, MAX(V.età) SELECT V.vnome, V.età WHERE V.età = (SELECT MAX(V2.età) 2) SELECT V.vnome, V.età WHERE (SELECT MAX(V2.età) 2) = V.età Giorgio Giacinto 2010 Database 26

GROUP BY e HAVING! Finora abbiamo applicato operatori di aggregazione a tutte le tuple (qualificanti). A volte vogliamo applicarli a ciascuno tra diversi gruppi di tuple! Consideriamo: Trovare l età del velista più giovane per ciascun grado di esperienza! In generale, non sappiamo quanti gradi di esperienza esistano, e quali siano i loro valori!! Supponiamo di sapere che i valori di esperienza variano da 1 a 10: possiamo scrivere 10 interrogazioni che somigliano a queste (!) for i = 1, 2,..., 10 SELECT MIN(V.età) WHERE V.esperienza = i Giorgio Giacinto 2010 Database 27 Interrogazioni con GROUP BY e HAVING SELECT FROM WHERE GROUP BY HAVING [DISTINCT] lista-target lista-relazioni qualificazioni lista-gruppi qualificazione-gruppi! La lista-target contiene (i) nomi di attributi (ii) termini con operazioni di aggregazione (ad esempio, MIN(V.età))! La lista di attributi (i) deve essere un sottoinsieme della lista-gruppi. Intuitivamente, ciascuna tupla nella risposta corrisponde a un gruppo, e questi attributi devono avere un singolo valore per gruppo (un gruppo è un insieme di tuple con lo stesso valore per tutti gli attributi in lista-attributi) Giorgio Giacinto 2010 Database 28

Valutazione concettuale! Viene calcolato il prodotto cartesiano della lista-relazioni, vengono scartate le tuple che non passano la qualificazione, i campi non necessari vengono cancellati, e le tuple rimanenti sono partizionate in gruppi dai valori degli attributi in lista-gruppi.! La qualificazione-gruppi viene poi applicata per eliminare alcuni gruppi. Le espressioni in qualificazione-gruppi devono avere un singolo valore per gruppo!! In effetti, un attributo in qualificazione-gruppi che non è un argomento di un operatore di aggregazione appare anche in lista-gruppi (SQL qui non sfrutta la semantica delle chiavi primarie!)! Viene generata una tupla di risposta per ogni gruppo qualificante Giorgio Giacinto 2010 Database 29 Trovare l età del velista più giovane con età!18, per ciascun livello di esperienza con almeno 2 velisti. SELECT V.esperienza, MIN(V.età) WHERE V.età >= 18 GROUP BY V.esperienza HAVING COUNT(*) > 1! Solo V.esperienza e V.età sono menzionati nelle clausole SELECT, GROUP BY e HAVING; altri attributi sono non necessari! La seconda colonna del risultato non ha un nome (usare AS per darle un nome) esperienza età 1 33.0 7 35.0 7 45.0 8 55.5 10 35.0 esperienza età 7 35.0 Relazione risultato Giorgio Giacinto 2010 Database 30 vid vnome esperienza età 22 dustin 7 45.0 31 lubber 8 55.5 71 zorba 10 16.0 64 horatio 7 35.0 29 brutus 1 33.0 58 rusty 10 35.0

Estensioni SQL:1999! Nella clausola HAVING possono essere usate due nuove funzioni su insiemi EVERY! Ogni riga di un gruppo deve soddisfare la condizione di qualificazione del gruppo ANY! Almeno una riga di un gruppo deve soddisfare la condizione di qualificazione Giorgio Giacinto 2010 Database 31 Esempio con EVERY SELECT V.esperienza, MIN(V.età) WHERE V.età >= 18 GROUP BY V.esperienza HAVING COUNT(*) > 1 AND EVERY(V.età<=60) equivale a SELECT V.esperienza, MIN(V.età) WHERE V.età >= 18 AND NOT EXISTS (SELECT * 1 WHERE V1.età > 60 AND V1.esperienza = V.esperienza) GROUP BY V.esperienza HAVING COUNT(*) > 1 Giorgio Giacinto 2010 Database 32

Per ciascuna barca rossa, trovare il numero di prenotazioni per tale barca SELECT FROM WHERE GROUP BY B.bid, COUNT(*) AS vconta Barche B, Prenota P P.bid = B.bid AND B.colore = rosso B.bid! Raggruppamento su un join di due relazioni! Cosa otteniamo se rimuoviamo B.colore = rosso dalla clausola WHERE e aggiungiamo una clausola HAVING con tale condizione? Giorgio Giacinto 2010 Database 33 Trovare l età del velista più giovane con età >18 per ciascun livello di esperienza con almeno 2 velisti (di qualunque età) SELECT V.esperienza, MIN(V.età) WHERE V.età > 18 GROUP BY V.esperienza HAVING 1 < (SELECT COUNT(*) 2 WHERE V.esperienza = V2.esperienza)! Confrontare questa interrogazione con quella in cui consideravamo solo i livelli di esperienza con due velisti con più di 18 anni!! Che succede se la clausola HAVING viene sostituita con! HAVING COUNT(*) > 1 Giorgio Giacinto 2010 Database 34

Trovare quei livelli di esperienza per cui l età media è minima rispetto a tutti i livelli! Gli operatori di aggregazione non possono essere annidati! Soluzione errata: SELECT V.esperienza Velisti V FROM WHERE V.età = (SELECT MIN(AVG(V2.età)) 2) Soluzione corretta (in SQL/92): SELECT Temp.esperienza. Temp.etamedia FROM (SELECTV.esperienza, AVG(V.età)AS etamedia GROUP BY V.esperienza) AS Temp WHERE Temp.etamedia = (SELECT MIN(Temp.etamedia) FROM Temp) Giorgio Giacinto 2010 Database 35 Valori NULL! I valori dei campi di una tupla sono a volte sconosciuti! ad esempio, non è ancora stato stabilito un livello di esperienza oppure inapplicabili! ad esempio, nessuna moglie! SQL fornisce uno speciale valore NULL Giorgio Giacinto 2010 Database 36

Valori NULL! La presenza di NULL complica parecchie cose. Ad esempio:! operatori speciali per controllare se un valore è/non è NULL (IS NULL e IS NOT NULL)! esperienza > 8 è vera o falsa quando esperienza è NULL?! Abbiamo bisogno di una logica a 3 valori (vero, falso e NULL) True True True False False NULL True False NULL False NULL NULL AND True False NULL False False NULL OR True True True False NULL NULL Giorgio Giacinto 2010 Database 37 Valori NULL Impatto sui costrutti SQL! Il significato dei costrutti deve essere attentamente definito! ad esempio la clausola WHERE elimina le righe che non vengono valutate come vero! Impatto significativo nelle interrogazioni annidate che usano EXISTS e UNIQUE! Nel conteggio dei duplicati, due valori NULL sono considerati uguali! SUM, MAX, MIN, AVG scartano i valori NULL Giorgio Giacinto 2010 Database 38

Join esterni Velisti!" c Prenota! La relazione risultato del join può non contenere tutte le tuple di Velisti e di Prenota! (outer) right join contiene tutte le tuple di Prenota! valori NULL per gli attributi di Velisti per le tuple di Prenota non combinabili con tuple di Velisti! (outer) left join contiene tutte le tuple di Velisti! (outer) full join contiene tutte le tuple di Velisti e di Prenota Giorgio Giacinto 2010 Database 39 Impedire l uso di valori NULL! Nella definizione degli attributi di una colonna per i quali valori NULL non sono ammessi, vincolo NOT NULL VNOME CHAR(20) NOT NULL! Vincolo di NOT NULL implicito nel vincolo di PRIMARY KEY Giorgio Giacinto 2010 Database 40

Sommario! Un fattore importante nel rapido sviluppo del modello relazionale; più naturale che in precedenza, linguaggi di interrogazione procedurali! Relazionalmente completo; di fatto, potere espressivo significativamente superiore all algebra relazionale! Persino le interrogazioni che possono essere espresse in AR possono spesso essere espresse in maniera più naturale con SQL! Molti modi alternativi di scrivere una interrogazione; l ottimizzatore dovrebbe cercare il piano di valutazione più efficiente! Nella pratica, gli utenti devono essere consci di come le interrogazioni sono ottimizzate e valutate per ottenere risultati migliori Giorgio Giacinto 2010 Database 41