Il linguaggio SQL: le basi
Versione elettronica: SQLa-basi.pdf
SQL: caratteristiche generali
n SQL (Structured Query Language) è il linguaggio standard de facto per
DBMS relazionali, che riunisce in sé funzionalità di DDL, DML e DCL
n SQL è un linguaggio dichiarativo (non-procedurale), ovvero non specifica
la sequenza di operazioni da compiere per ottenere il risultato
n SQL è “relazionalmente completo”, nel senso che ogni espressione
dell’algebra relazionale può essere tradotta in SQL
n …inoltre SQL fa molte altre cose…
n Il modello dei dati di SQL è basato su tabelle anziché relazioni:
n Possono essere presenti righe (tuple) duplicate
n In alcuni casi l’ordine delle colonne (attributi) ha rilevanza
n …il motivo è pragmatico (ossia legato a considerazioni sull’efficienza)
n SQL adotta la logica a 3 valori introdotta con l’Algebra Relazionale
SQL - Basi 2
SQL: standard e dialetti
n Il processo di standardizzazione di SQL è iniziato nel 1986
n Nel 1992 è stato definito lo standard SQL-2 (o SQL-92) da parte dell’ISO
(International Standards Organization), e dell’ANSI (American National
Standards Institute), rispettivamente descritti nei documenti ISO/IEC
9075:1992 e ANSI X3.135-1992 (identici!)
n Del 1999 è lo standard SQL:1999, che rende SQL un linguaggio
computazionalmente completo (e quindi con istruzioni di controllo!) per il
supporto di oggetti persistenti…
n Allo stato attuale ogni sistema ha ancora un suo dialetto:
n supporta (in larga parte) SQL-2
n ha già elementi di SQL:1999
n ha anche costrutti non standard
n Quello che vediamo è la parte più “diffusa”
SQL - Basi 3
Organizzazione del materiale
n La trattazione di SQL viene suddivisa in più parti come segue:
n DDL di base e DML “per gli operatori dell’algebra” e per le operazioni
di modifica dei dati
n Per fare “quello che si fa anche in algebra”
n DML per il raggruppamento dei dati
n Per derivare informazioni di sintesi dai dati
n DML con blocchi innestati
n Per scrivere richieste complesse
n DDL per la definizione di viste e vincoli generici
n Per migliorare la qualità dei dati
n Utilizzo di SQL da linguaggio ospite
n Per scrivere applicazioni
SQL - Basi 4
Data Definition Language (DDL)
n Il DDL di SQL permette di definire schemi di relazioni (o “table”, tabelle),
modificarli ed eliminarli
n Permette di inoltre di specificare vincoli, sia a livello di tupla (o “riga”) che
a livello di tabella
n Permette di definire nuovi domini, oltre a quelli predefiniti
n Per vincoli e domini si può anche fare uso del DML (quindi
inizialmente non si trattano completamente)
n Inoltre si possono definire viste (“view”), ovvero tabelle virtuali, e indici,
per accedere efficientemente ai dati.
SQL - Basi 5
Creazione ed eliminazione di tabelle
n Mediante l’istruzione CREATE TABLE si definisce lo schema di una tabella
e se ne crea un’istanza vuota
n Per ogni attributo va specificato il dominio, un eventuale valore di default e
eventuali vincoli
n Infine possono essere espressi altri vincoli a livello di tabella
n Mediante l’istruzione DROP TABLE è possibile eliminare lo schema di una
tabella (e conseguentemente la corrispondente istanza)
DROP TABLE Imp
SQL - Basi 6
Definizione di tabelle: esempio
CREATE TABLE Imp (
CodImp char(4) PRIMARY KEY,
CF char(16) NOT NULL UNIQUE, -- chiave
Cognome varchar(60) NOT NULL,
Nome varchar(30) NOT NULL,
Sede char(3) REFERENCES Sedi(Sede), -- FK
Ruolo char(20) DEFAULT ‘Programmatore’,
Stipendio int CHECK (Stipendio > 0),
UNIQUE (Cognome, Nome) -- chiave
)
CREATE TABLE Prog (
CodProg char(3),
Citta varchar(40),
PRIMARY KEY (CodProg,Citta) )
SQL - Basi 7
Valori nulli e valori di default
n Per vietare la presenza di valori nulli, è sufficiente imporre il vincolo NOT
NULL
CF char(16) NOT NULL,
n Per ogni attributo è inoltre possibile specificare un valore di default, che
verrà usato se all’atto dell’inserimento di una tupla non viene fornito
esplicitamente un valore per l’attributo relativo
Ruolo char(20) DEFAULT ‘Programmatore’
SQL - Basi 8
Chiavi
n La definizione di una chiave avviene esprimendo un vincolo UNIQUE, che
si può specificare in linea, se la chiave consiste di un singolo attributo
CF char(16) UNIQUE,
o dopo aver dichiarato tutti gli attributi, se la chiave consiste di uno o più
attributi:
UNIQUE(Cognome,Nome)
n Ovviamente, specificare
UNIQUE(Cognome),
UNIQUE(Nome)
sarebbe molto più restrittivo
SQL - Basi 9
Chiavi primarie
n La definizione della chiave primaria di una tabella avviene specificando un
vincolo PRIMARY KEY, o in linea o come vincolo di tabella
CodImp char(4) PRIMARY KEY
PRIMARY KEY (CodProg,Citta)
n Va osservato che:
n La specifica di una chiave primaria non è obbligatoria
n Si può specificare al massimo una chiave primaria per tabella
n Non è necessario specificare NOT NULL per gli attributi della primary
key
SQL - Basi 10
Chiavi straniere (“foreign key”)
n La definizione di una foreign key avviene specificando un vincolo
FOREIGN KEY, e indicando quale chiave viene referenziata
Sede char(3) REFERENCES Sedi(Sede)
n Ovvero
FOREIGN KEY (Sede) REFERENCES Sedi(Sede)
n Nell’esempio, Imp è detta tabella di riferimento e Sedi tabella di
destinazione (analoga terminologia per gli attributi coinvolti)
n Le colonne di destinazione devono essere una chiave della tabella
destinazione (non necessariamente la chiave primaria)
n Se si omettono gli attributi destinazione, vengono assunti quelli della
chiave primaria
Sede char(3) REFERENCES Sedi
SQL - Basi 11
Vincoli generici (“check constraint”)
n Mediante la clausola CHECK è possibile esprimere vincoli di tupla arbitrari,
sfruttando tutto il potere espressivo di SQL
n La sintassi è: CHECK (<condizione>)
n Il vincolo è violato se esiste almeno una tupla che rende falsa la
<condizione>. Pertanto
Stipendio int CHECK (Stipendio > 0),
non permette tuple con stipendio negativo, ma ammette valori nulli per
l’attributo Stipendio
n Se CHECK viene espresso a livello di tabella (anziché nella definizione
dell’attributo) è possibile fare riferimento a più attributi della tabella stessa
CHECK (ImportoLordo = Netto + Ritenute)
SQL - Basi 12
Vincoli con nomi
n A fini diagnostici (e di documentazione) è spesso utile sapere quale vincolo
è stato violato a seguito di un’azione sul DB
n A tale scopo è possibile associare dei nomi ai vincoli, ad esempio:
Stipendio int CONSTRAINT StipendioPositivo
CHECK (Stipendio > 0),
CONSTRAINT ForeignKeySedi
FOREIGN KEY (Sede) REFERENCES Sedi
SQL - Basi 13
Modifica di tabelle
n Mediante l’istruzione ALTER TABLE è possibile modificare lo schema di
una tabella, in particolare:
n Aggiungendo attributi
n Aggiungendo o rimuovendo vincoli
ALTER TABLE Imp
ADD COLUMN Sesso char(1) CHECK (Sesso in (‘M’,‘F’))
ADD CONSTRAINT StipendioMax CHECK (Stipendio < 4000)
DROP CONSTRAINT StipendioPositivo
DROP UNIQUE(Cognome,Nome);
n Se si aggiunge un attributo con vincolo NOT NULL, bisogna prevedere un
valore di default, che il sistema assegnerà automaticamente a tutte le tuple
già presenti
ADD COLUMN Istruzione char(10) NOT NULL DEFAULT ‘Laurea’
SQL - Basi 14
Data Manipulation Language (DML)
n Le istruzioni principali del DML di SQL sono
SELECT esegue interrogazioni (query) sul DB
INSERT inserisce nuove tuple nel DB
DELETE cancella tuple dal DB
UPDATE modifica tuple del DB
n INSERT può usare il risultato di una query per eseguire inserimenti
multipli
n DELETE e UPDATE possono fare uso di condizioni per specificare le
tuple da cancellare o modificare
SQL - Basi 15
DB di riferimento per gli esempi
Imp Sedi
CodImp Nome Sede Ruolo Stipendio Sede Responsabile Citta
E001 Rossi S01 Analista 2000 S01 Biondi Milano
E002 Verdi S02 Sistemista 1500 S02 Mori Bologna
E003 Bianchi S01 Programmatore 1000 S03 Fulvi Milano
E004 Gialli S03 Programmatore 1000
E005 Neri S02 Analista 2500
Prog
E006 Grigi S01 Sistemista 1100
CodProg Citta
E007 Violetti S01 Programmatore 1000
P01 Milano
E008 Aranci S02 Programmatore 1200
P01 Bologna
P02 Bologna
SQL - Basi 16
L’istruzione SELECT
n È l’istruzione che permette di eseguire interrogazioni (query) sul DB
n La forma di base è:
SELECT A1,A2,..,Am
FROM R1,R2,..,Rn
WHERE <condizione>
ovvero:
n SELECT (o TARGET) list (cosa si vuole come risultato)
n clausola FROM (da dove si prende)
n clausola WHERE (che condizioni deve soddisfare)
SQL - Basi 17
SELECT su singola tabella
Codice, nome e ruolo dei dipendenti della sede S01
CodImp Nome Ruolo
E001 Rossi Analista
SELECT CodImp, Nome, Ruolo E003 Bianchi Programmatore
FROM Imp E006 Grigi Sistemista
WHERE Sede = ‘S01’ E007 Violetti Programmatore
n Si ottiene in questo modo:
n La clausola FROM dice di prendere la tabella IMP
n La clausola WHERE dice di prendere solo le tuple per cui Sede=‘S01’
n Infine, si estraggono i valori degli attributi (o “colonne”) nella SELECT
list
SQL - Basi 18
SELECT senza proiezione
n Se si vogliono tutti gli attributi:
SELECT CodImp, Nome, Sede, Ruolo, Stipendio
FROM Imp
WHERE Sede = ‘S01’
si può abbreviare con:
SELECT *
FROM Imp
WHERE Sede = ‘S01’
SQL - Basi 19
SELECT senza condizione
n Se si vogliono tutte le tuple:
SELECT CodImp, Nome, Ruolo
FROM Imp
n Quindi
SELECT *
FROM Imp
restituisce tutta l’istanza di Imp
SQL - Basi 20
Tabelle vs Relazioni
n Il risultato di una query SQL può contenere righe duplicate:
Ruolo
SELECT Ruolo Analista
FROM Imp Programmatore
WHERE Sede = ‘S01’ Sistemista
Programmatore
n Per eliminarle si usa l’opzione DISTINCT nella SELECT list
SELECT DISTINCT Ruolo Ruolo
FROM Imp Analista
Programmatore
WHERE Sede = ‘S01’
Sistemista
SQL - Basi 21
Espressioni nella clausola SELECT
n La SELECT list può contenere non solo attributi, ma anche espressioni:
SELECT CodImp, Stipendio*12 CodImp
FROM Imp E001 24000
E003 12000
WHERE Sede = ‘S01’
E006 13200
E007 12000
n Si noti che in questo caso la seconda colonna non ha un nome
SQL - Basi 22
Ridenominazione delle colonne
n Ad ogni elemento della SELECT list è possibile associare un nome a
piacere:
SELECT CodImp AS Codice, Stipendio*12 AS StipendioAnnuo
FROM Imp
Codice StipendioAnnuo
WHERE Sede = ‘S01’ E001 24000
E003 12000
E006 13200
E007 12000
n La parola chiave AS può anche essere omessa:
SELECT CodImp Codice,...
SQL - Basi 23
Pseudonimi
n Per chiarezza, ogni nome di colonna può essere scritto prefissandolo con
il nome della tabella:
SELECT Imp.CodImp AS Codice,
Imp.Stipendio*12 AS StipendioAnnuo
FROM Imp
WHERE Imp.Sede = ‘S01’
…e si può anche usare uno pseudonimo (alias) in luogo del nome della
tabella
SELECT I.CodImp AS Codice,
I.Stipendio*12 AS StipendioAnnuo
FROM Imp I -- oppure Imp AS I
WHERE I.Sede = ‘S01’
SQL - Basi 24
Operatore LIKE
n L’operatore LIKE, mediante le “wildcard” _ (un carattere arbitrario) e %
(una stringa arbitraria), permette di esprimere dei “pattern” su stringhe
Nomi degli impiegati che finiscono con una ‘i’ e hanno una ‘i’ in seconda
posizione
SELECT Nome Nome
Bianchi
FROM Imp
Gialli
WHERE Nome LIKE ‘_i%i’
Violetti
SQL - Basi 25
Operatore BETWEEN
n L’operatore BETWEEN permette di esprimere condizioni di appartenenza
a un intervallo
Nome e stipendio degli impiegati che hanno uno stipendio compreso tra
1300 e 2000 Euro (estremi inclusi)
SELECT Nome, Stipendio
FROM Imp
WHERE Stipendio BETWEEN 1300 AND 2000
Nome Stipendio
Rossi 2000
Verdi 1500
SQL - Basi 26
Operatore IN
n L’operatore IN permette di esprimere condizioni di appartenenza a un
insieme
Codici e sedi degli impiegati delle sedi S02 e S03
CodImp Sede
E002 S02
SELECT CodImp, Sede
E004 S03
FROM Imp
E005 S02
WHERE Sede IN (‘S02’,‘S03’)
E008 S02
n Lo stesso risultato si ottiene scrivendo:
SELECT CodImp, Sede
FROM Imp
WHERE Sede = ‘S02’ OR Sede = ‘S03’
SQL - Basi 27
Valori nulli
n Il trattamento dei valori nulli si basa su quanto già visto
Imp
SELECT CodImp CodImp Sede … Stipendio
FROM Imp E001 S01 2000
WHERE Stipendio > 1500 E002 S02 1500
OR Stipendio <= 1500 E003 S01 1000
E004 S03 NULL
CodImp
E005 S02 2500
restituisce solo E001
E006 S01 NULL
E002
E007 S01 1000
E003
E008 S02 1200
E005
E007
E008
SQL - Basi 28
Logica a 3 valori in SQL
n Nel caso di espressioni complesse, SQL ricorre alla logica a 3 valori: vero
(V), falso (F) e “sconosciuto” (?)
SELECT CodImp, Sede, Stipendio CodImp Sede Stipendio
FROM Imp E001 S01 2000
E004 S03 NULL
WHERE (Sede = ‘S03’)
E005 S02 2500
OR (Stipendio > 1500)
n Per verificare se un valore è NULL SELECT CodImp
si usa l’operatore IS FROM Imp
WHERE Stipendio IS NULL
n NOT (A IS NULL) si scrive anche
CodImp
A IS NOT NULL
E004
E006
SQL - Basi 29
Ordinamento del risultato
n Per ordinare il risultato di una query secondo i valori di una o più colonne
si introduce la clausola ORDER BY, e per ogni colonna si specifica se
l’ordinamento è per valori “ascendenti” (ASC, il default) o “discendenti”
(DESC)
Nome Stipendio
Neri 2500
SELECT Nome, Stipendio Rossi 2000
FROM Imp Verdi 1500
ORDER BY Stipendio DESC, Nome Aranci 1200
Grigi 1100
Bianchi 1000
Gialli 1000
Violetti 1000
SQL - Basi 30
Interrogazioni su più tabelle
n L’interrogazione
SELECT I.Nome, I.Sede, S.Citta
FROM Imp I, Sedi S
WHERE I.Sede = S.Sede
AND I.Ruolo = ‘Programmatore’
si interpreta come segue:
n Si esegue il prodotto Cartesiano di Imp e Sedi
n Si applicano i predicati della clausola WHERE
n Si estraggono le colonne della SELECT list
n Il predicato I.Sede = S.Sede è detto predicato di join, in quanto
stabilisce il criterio con cui le tuple di Imp e di Sedi devono essere
combinate
SQL - Basi 31
Interrogazioni su più tabelle: risultato
n Dopo avere applicato il predicato I.Sede = S.Sede:
I.CodImp I.Nome I.Sede I.Ruolo I.Stipendio S.Sede S.Responsabile S.Citta
E001 Rossi S01 Analista 2000 S01 Biondi Milano
E002 Verdi S02 Sistemista 1500 S02 Mori Bologna
E003 Bianchi S01 Programmatore 1000 S01 Biondi Milano
E004 Gialli S03 Programmatore 1000 S03 Fulvi Milano
E005 Neri S02 Analista 2500 S02 Mori Bologna
E006 Grigi S01 Sistemista 1100 S01 Biondi Milano
E007 Violetti S01 Programmatore 1000 S01 Biondi Milano
E008 Aranci S02 Programmatore 1200 S02 Mori Bologna
SQL - Basi 32
Ridenominazione del risultato
n Se la SELECT list contiene 2 o più colonne con lo stesso nome, è
necessario operare una ridenominazione per ottenere un output con tutte
le colonne intestate
SELECT I.Sede AS SedeE001, S.Sede AS AltraSede
FROM Imp I, Sedi S
WHERE I.Sede <> S.Sede
AND I.CodImp = ‘E001’
SedeE001 AltraSede
S01 S02
S01 S03
SQL - Basi 33
Self Join
n L’uso di alias è forzato quando si deve eseguire un self-join
Genitori G1 Genitori G2
Chi sono i nonni di Anna?
Genitore Figlio Genitore Figlio
Luca Anna Luca Anna
Maria Anna Maria Anna
Giorgio Luca Giorgio Luca
Silvia Maria Silvia Maria
Enzo Maria Enzo Maria
SELECT G1.Genitore AS Nonno
FROM Genitori G1, Genitori G2
WHERE G1.Figlio = G2.Genitore
AND G2.Figlio = ‘Anna’
SQL - Basi 34
Join espliciti
n Anziché scrivere i predicati di join nella clausola WHERE, è possibile
“costruire” una joined table direttamente nella clausola FROM
SELECT I.Nome, I.Sede, S.Citta
FROM Imp I JOIN Sedi S ON (I.Sede = S.Sede)
WHERE I.Ruolo = ‘Programmatore’
in cui JOIN si può anche scrivere INNER JOIN
n Altri tipi di join espliciti sono:
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
NATURAL JOIN
SQL - Basi 35
Left join
Guidatore
Nome Cognome Patente
Mario Rossi VR 2030020Y
Carlo Bianchi PZ 1012436B
Marco Neri AP 4544442R
Automobile
Targa Marca Modello NoPatente
AB 574 ww FIAT PUNTO VR 2030020Y
AA 652 FF FIAT BRAVA VR 2030020Y
BJ 747 XX LANCIA DELTA PZ 1012436B
BB 421 JJ FIAT UNO AP 2020030U
Left join
Estrarre i guidatori con le automobili loro associate, mantenendo
nel risultato anche i guidatori senza automobile
Select Nome, Cognome, GnoPatente, Targa, Marca Modello
From Guidatore G left join automobile A on (G.noPatente =
A.noPatente)
Nome Cognome G.NoPatente Targa Marca Modello
Mario Rossi VR 2030020Y AB 574 ww Fiat Punto
Mario Rossi VR 2030020Y AA 652 FF Fiat BRAVA
Carlo Bianchi PZ 1012436B BJ 747 XX Lancia DELTA
Marco Neri AP 4544442R NULL NULL NULL
Operatori insiemistici
n L’istruzione SELECT non permette di eseguire unione, intersezione e
differenza di tabelle
n Ciò che si può fare è combinare in modo opportuno i risultati di due
istruzioni SELECT, mediante gli operatori
UNION, INTERSECT, EXCEPT
n In tutti i casi gli elementi delle SELECT list devono avere tipi compatibili e
gli stessi nomi se si vogliono colonne con un’intestazione definita
n L’ordine degli elementi è importante (notazione posizionale)
n Il risultato è in ogni caso privo di duplicati, per mantenerli occorre
aggiungere l’opzione ALL:
UNION ALL, INTERSECT ALL, EXCEPT ALL
SQL - Basi 36
Operatori insiemistici: esempi (1)
R A B S C B
SELECT A B
1 a 1 a SELECT B
FROM R 1
1 a 1 b FROM R a
UNION 2
2 a 2 a UNION ALL a
SELECT C 3
SELECT B a
2 b 2 c FROM S 4
2 c 3 c FROM S b
c
3 b 4 d
b
SELECT A,B a
FROM R b
SELECT A A
UNION a
FROM R 1
SELECT B,C AS A c
UNION 2
FROM S c
SELECT C AS A 3
d
FROM S 4 Non corretta!
SQL - Basi 37
Operatori insiemistici: esempi (2)
R A B
1 a SELECT B B SELECT B B
1 a FROM R a FROM S d
2 a INTERSECT b EXCEPT
2 b SELECT B c SELECT B
2 c FROM S FROM R
3 b
S C B B B
SELECT B SELECT B
1 a FROM R a FROM R a
1 b
INTERSECT ALL a EXCEPT ALL b
2 a b
SELECT B SELECT B
2 c FROM S c FROM S
3 c
4 d
SQL - Basi 38
Istruzioni di aggiornamento dei dati
n Le istruzioni che permettono di aggiornare il DB sono
INSERT inserisce nuove tuple nel DB
DELETE cancella tuple dal DB
UPDATE modifica tuple del DB
n INSERT può usare il risultato di una query per eseguire inserimenti multipli
n DELETE e UPDATE possono fare uso di condizioni per specificare le tuple
da cancellare o modificare
n In ogni caso gli aggiornamenti riguardano una sola relazione
SQL - Basi 39
Inserimento di tuple: caso singolo
n È possibile inserire una nuova tupla specificandone i valori
INSERT INTO Sedi(Sede,Responsabile,Citta)
VALUES (‘S04’,‘Bruni’,‘Firenze’)
n Ci deve essere corrispondenza tra attributi e valori
n La lista degli attributi si può omettere, nel qual caso vale l’ordine con cui
sono stati definiti
n Se la lista non include tutti gli attributi, i restanti assumono valore NULL (se
ammesso) o il valore di default (se specificato)
INSERT INTO Sedi(Sede,Citta) -- sede senza responsabile
VALUES (‘S04’,‘Firenze’)
SQL - Basi 40
Inserimento di tuple: caso multiplo
n È possibile anche inserire le tuple che risultano da una query
INSERT INTO SediBologna(SedeBO,Resp)
SELECT Sede,Responsabile
FROM Sedi
WHERE Citta = ‘Bologna’
n Valgono ancora le regole viste per il caso singolo
n Gli schemi del risultato e della tabella in cui si inseriscono le tuple possono
essere diversi, l’importante è che i tipi delle colonne siano compatibili
SQL - Basi 41
Cancellazione di tuple
n L’istruzione DELETE può fare uso di una condizione per specificare le
tuple da cancellare
DELETE FROM Sedi -- elimina le sedi di Bologna
WHERE Citta = ‘Bologna’
n Che succede se la cancellazione porta a violare il vincolo di integrità
referenziale? (ad es.: che accade agli impiegati delle sedi di Bologna?)
n …lo vediamo tra 2 minuti
SQL - Basi 42
Modifica di tuple
n Anche l’istruzione UPDATE può fare uso di una condizione per specificare
le tuple da modificare e di espressioni per determinare i nuovi valori
UPDATE Sedi
SET Responsabile = ‘Bruni’,
Citta = ‘Firenze’
WHERE Sede = ‘S01’
UPDATE Imp
SET Stipendio = 1.1*Stipendio
WHERE Ruolo = ‘Programmatore’
n Anche l’UPDATE può portare a violare il vincolo di integrità referenziale
SQL - Basi 43
Politiche di “reazione”
n Anziché lasciare al programmatore il compito di garantire che a fronte di
cancellazioni e modifiche i vincoli di integrità referenziale siano rispettati, si
possono specificare opportune politiche di reazione in fase di definizione
degli schemi
CREATE TABLE Imp (
CodImp char(4) PRIMARY KEY,
Sede char(3),
...
FOREIGN KEY Sede REFERENCES Sedi
ON DELETE CASCADE -- cancellazione in cascata
ON UPDATE NO ACTION -- modifiche non permesse
n Altre politiche: SET NULL e SET DEFAULT
SQL - Basi 44
Riassumiamo:
n Il linguaggio SQL è lo standard de facto per interagire con DB relazionali
n Si discosta dal modello relazionale in quanto permette la presenza di
tuple duplicate (tabelle anziché relazioni)
n La definizione delle tabelle permette di esprimere vincoli e anche di
specificare politiche di reazione a fronte di violazioni dell’integrità
referenziale
n L’istruzione SELECT consiste nella sua forma base di 3 parti: SELECT,
FROM e WHERE
n A queste si aggiunge ORDER BY, per ordinare il risultato (e altre che
vedremo)
n Per trattare i valori nulli, SQL ricorre a una logica a 3 valori (vero, falso e
sconosciuto)
SQL - Basi 45