lezione_db4

annuncio pubblicitario
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Il Linguaggio SQL - Aggiornamento di dati
La dichiarazione UPDATE modifica i valori di una o più colonne nelle righe selezionate di una
singola tabella.
La tabella da aggiornare viene indicata nella dichiarazione ed è necessario avere i permessi necessari
per aggiornare la tabella e ogni singola colonna che verrà modificata.
UPDATE < nome tabella >
SET < nome colonna = espressione | valore > [,<nome colonna = espressione | valore >,… ]
[WHERE condizione di ricerca]
La proposizione WHERE seleziona le righe da modificare. La proposizione SET specifica quali
colonne sono da aggiornare e calcola i nuovi valori per essa.
La dichiarazione UPDATE può aggiornare una sola riga o numerose righe contemporaneamente.
Di seguito una semplice dichiarazione UPDATE che modifica il limite di credito e il venditore per
un cliente:
Aumenta il limite di credito per Acme Manufactoring a $60.000 e riassegna il cliente a Mary
Jones (numero dipendente =109).
UPDATE CUSTOMERS
SET CREDIT_LIMIT =60000.00, CUST_REP =109
WHERE COMPANY =’Acme Mfg’
(1 riga aggiornata)
In questo esempio la proposizione WHERE indica una sola riga della tabella CUSTOMERS.
Trasferisce tutti i venditori dall’ufficio di Chicago (numero 12) all’ufficio di New York (numero 11)
e abbassa i loro obiettivi del 10%.
UPDATE SALESREPS
SET REP_OFFICE =11, QUOTA =.9 * QUOTA
WHERE REP_OFFICE =12
(3 righe aggiornate )
Concettualmente, SQL elabora la dichiarazione UPDATE scorrendo la tabella riga per riga,
aggiornando le righe per cui la condizione di ricerca ha un risultato TRUE e saltando quelle per cui
la condizione di ricerca ha un risultato FALSE o NULL.
Rassegna al dipendente numero 102 tutti i clienti serviti dai dipendenti numero 105, 106 o 107.
UPDATE CUSTOMERS
SET CUST_REP =102
WHERE CUST_REP IN (105, 106,107)
(5 righe aggiornate)
1
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
La proposizione SET nella dichiarazione UPDATE è un elenco di assegnazioni separate da virgole.
Ciascuna assegnazione identifica una colonna di destinazione da aggiornare e specifica come
calcolare il nuovo valore per tale colonna.
Ogni colonna di destinazione deve comparire una sola volta nell’elenco. Non dovrebbero esistere
due assegnazioni per la stessa colonna di destinazione.
Se un’espressione nell’elenco di assegnazione fa riferimento a una delle colonne della tabella di
destinazione, il valore utilizzato per calcolare l’espressione è il valore di tale colonna nella riga
corrente prima che siamo applicate le modifiche.
Lo stesso vale per il riferimento di colonna che si trova nella proposizione WHERE.
UPDATE OFFICES
SET QUOTA = 400000.00, SALES = QUOTA
WHERE QUOTA < 400000.00
Prima dell’aggiornamento, Bill Adams aveva un valore QUOTA di $350.000 e un valore SALES di
$367.911. Dopo l’aggiornamento, la sua riga ha un valore di SALES di $350.000, non di $400.000.
L’ordine della assegnazioni nella proposizione SET è quindi irrilevante; le assegnazioni possono
essere specificate in qualsiasi ordine.
Aggiornare tutte le righe
La proposizione WHERE è opzionale. Se viene omessa, vengono aggiornate tutte le righe della
tabella di destinazione
Aumenta tutti gli obiettivi del 5%.
UPDATE SALESREPS
SET QUOTA =1.05 * QUOTA
(10 righe aggiornate)
La dichiarazione UPDATE senza la proposizione WHERE ha una funzione utile: in sostanza esegue
un aggiornamento globale della tabella.
UPDATE con subquery
Le subquery consentono di selezionare righe da aggiornare basandosi sulle informazioni contenute in
altre tabelle.
Aumenta di $5000 il limite di credito di tutti i clienti che hanno emesso ordini superiori a $25000
UPDATE CUSTOMERS
SET CREDIT_LIMIT = CREDIT_LIMIT + 5000.00
WHERE CUST_NUM IN (SELECT DISTINCT CUST
FROM ORDERS
WHERE AMOUNT > 25000.00)
(4 righe aggiornate)
2
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
SQL2 specifica che un riferimento alla tabella di destinazione in una subquery viene calcolato come
se nessuna parte della tabella di destinazione fosse ancora stata aggiornata.
Il linguaggio di definizione dei dati (DDL)
Le dichiarazioni descritte finora (SELECT, INSERT, DELETE, UPDATE) riguardano la
manipolazione dei dati.
Le modifiche alla struttura di un database sono gestite da un insieme diverso di dichiarazioni SQL,
definito linguaggio SQL di definizione dei dati, o DDL (Data Definition Language).
Utilizzando dichiarazioni DDL è possibile:
 Definire e creare una nuova tabella
 Eliminare una tabella non più necessaria
 Modificare la definizione di una tabella esistente
 Definire una tabella ( o una vista) virtuale di dati
 Definire controlli di sicurezza per un database
 Creare un indice per accelerare l’accesso alle tabelle
 Controllare la memorizzazione fisica dei dati da parte del DBMS.
Il cuore del DDL è basato su tre verbi SQL:
 CREATE. Definisce e crea un oggetto di database
 DROP. Elimina un oggetto di database esistente
 ALTER. Modifica la definizione di un oggetto di database
Nella maggior parte dei prodotti DBMS basati su SQL, i tre verbi DDL possono essere utilizzati
mentre il DBMS è in esecuzione. La struttura del database è quindi dinamica: il DBMS può creare,
eliminare o modificare la definizione delle tabelle del database, per esempio, mentre
contemporaneamente fornisce accesso al database per i suoi utenti. Questo è un grande vantaggio dei
database SQL e relazionali rispetto ai sistemi precedenti, dove il DBMS doveva essere formato
prima che fosse possibile modificare la struttura del database. Un database relazionale, quindi, può
crescere e cambiare nel tempo.
Creazione di una tabella (CREATE TABLE)
Abbiamo visto che la struttura più importante in un database è la tabella.
La dichiarazione CREATE TABLE definisce una nuova tabella nel database e la prepara ad
accettare i dati. Le diverse proposizioni della dichiarazione specificano gli elementi della definizione
di tabella.
Quando si esegue una dichiarazione CREATE TABLE, si diventa proprietari della tabella appena
creata, a cui viene dato il nome indicato nella dichiarazione. Il nome della tabella deve essere un
3
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
nome SQL legale e non deve entrare in conflitto con i nomi di tabelle esistenti. La tabella appena
creata è vuota, ma il DBMS la prepara ad accettare dati inseriti con la dichiarazione INSERT.
CREATE TABLE < nome tabella > (definizione di colonna [,definizione di colonna,…])
definizione colonna: nome colonna tipo di dati [DEFAULT valore ] [NOT NULL]
CONSTRAINT <nome-contraint>- limitazioni chiave primaria
- limitazioni chiave esterna
- limitazioni di unicità
- limitazioni di controllo
PRIMARY KEY (nome colonna [, nome colonna, …])
FOREIGN KEY (nome colonna [, nome colonna, …])
REFERENCES <nome tabella > (nome colonna [, nome colonna, …])
Le definizioni di colonna si trovano in un elenco con elementi separati da virgole e racchiusi da
parentesi. L’ordine di definizione di colonna determina l’ordina da sinistra verso destra delle colonne
della tabella. Le colonne di una tabella appena creata sono definite nel corpo della dichiarazione
CREATE TABLE. Nelle dichiarazioni CREATE TABLE supportate dai principali DBMS, ciascuna
definizione di colonna specifica quanto segue:
- nome di colonna. Ciascuna colonna deve avere un nome unico anche se lo stesso nome può
esistere in un’altra colonna
- tipo di dati . Identifica il tipo di dati memorizzati nella colonna
- dati necessari. Determina se la colonna contiene dati necessari e impedisce la comparsa di
valori NULL nella colonna; altrimenti sono ammessi valori NULL.
- Valore predefinito. SQL utilizza un valore predefinito opzionale per la colonna quando una
dichiarazione INSERT per la tabella non specifica un valore per la colonna.
Vediamo un esempio di dichiarazione CREATE TABLE:
Definisce la tabella OFFICES e le sue colonne
CREATE TABLE OFFICES ( OFFICE INTEGER NOT NULL,
CITY VARCHAR(15) NOT NULL,
REGION VARCHAR(10) NOT NULL,
MGR INTEGER,
TARGET MONEY,
SALES MONEY NOT NULL)
Alcuni tipi di dati quali VARCHAR
e DECIMAL richiedono ulteriori
informazioni, quali la lunghezza o il
numero di cifre decimali dei dati.
NOT NULL: la colonna deve contenere valori legali per ciascuna riga della tabella.
Se una colonna ha un valore predefinito, viene specificato nella definizione di colonna:
Per esempio, di seguito si trova una dichiarazione CREATE TABLE per la tabella OFFICES che
specifica valori predefiniti:
4
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Definisce la tabella OFFICES con valori predefiniti (sintassi ANSI/ISO)
CREATE TABLE OFFICES ( OFFICE INTEGER NOT NULL,
CITY VARCHAR(15) NOT NULL,
REGION VARCHAR(10) NOT NULL DEFAULT ‘Eastern’,
MGR INTEGER DEFAULT 106,
TARGET MONEY DEFAULT NULL,
SALES MONEY NOT NULL DEFAULT 0.00)
Oltre a definire le colonne di una tabella, la dichiarazione CREATE TABLE identifica la chiave
primaria della tabella e le relazioni della tabella con le altre tabelle presenti nel database.
La proposizione PRIMARY KEY specifica la colonna o le colonne che costituiscono la chiave
primaria della tabella. Tale colonna (o colonne) serve da identificatore unico per ciascuna riga della
tabella. Il DBMS richiede automaticamente che il valore di chiave primaria in ciascuna riga della
tabella sia unico. Inoltre la definizione di colonna per ciascuna colonna nella chiave primaria deve
specificare che la colonna è NOT NULL.
La proposizione FOREIGN KEY specifica una chiave esterna nella tabella e la relazione che crea
con un’altra tabella (genitore) nel database. La proposizione specifica (e non solo):
-
la colonna o le colonne che formano la chiave esterna (tutte sono colonne in fase di
creazione)
la tabella a cui fa riferimento la chiave esterna. Questa è la tabella genitore nella relazione: la
tabella in fase di definizione è sua figlia.
un nome opzionale per la relazione che non viene utilizzato in alcuna dichiarazione SQL per
la manipolazione dei dati, ma può comparire in messaggi di errore ed è necessario se si
desidera essere in grado di eliminare la chiave esterna in un secondo momento.
Di seguito si trova una dichiarazione CREATE TABLE estesa per la tabella OFFICES che
comprende una definizione della chiave primaria e di una chiave esterna contenute in essa:
Definisce la tabella OFFICES con chiavi primarie ed esterne.
CREATE TABLE OFFICES ( OFFICE INTEGER NOT NULL,
CITY VARCHAR(15) NOT NULL,
REGION VARCHAR(10) NOT NULL DEFAULT ‘Eastern’,
MGR INTEGER DEFAULT 106,
TARGET MONEY DEFAULT NULL,
SALES MONEY NOT NULL DEFAULT 0.00,
PRIMARY KEY (OFFICE),
FOREIGN KEY (MGR) REFERENCES SALESREPS )
Lo standard SQL2 specifica che anche le limitazioni di unicità sono definite nella dichiarazione
CREATE TABLE utilizzando la parola chiave UNIQUE. Modifichiamola dichiarazione CREATE
TABLE per la tabella OFFICES, modificata in modo da richiedere valori CITY unici.
Definisce la tabella OFFICES con una limitazione di unicità.
CREATE TABLE OFFICES ( OFFICE INTEGER NOT NULL,
CITY VARCHAR(15) NOT NULL,
5
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
REGION VARCHAR(10) NOT NULL DEFAULT ‘Eastern’,
MGR INTEGER DEFAULT 106,
TARGET MONEY DEFAULT NULL,
SALES MONEY NOT NULL DEFAULT 0.00,
PRIMARY KEY (OFFICE),
FOREIGN KEY (MGR) REFERENCES SALESREPS,
UNIQUE (CITY) )
Eliminazione di una tabella (DROP TABLE)
E’ possibile eliminare una tabella dal database con la dichiarazione DROP TABLE.
DROP TABLE < nome tabella > [CASCADE | RESTRICT]
Identifica la tabella da eliminare
specificano l’impatto dell’eliminazione di una
tabella su altri oggetti del database che dipendono
dalla tabella
Supponiamo che la tabella CUSTOMERS non sia più necessaria; per eliminarla dal database:
DROP TABLE CUSTOMERS
Con i permessi necessari è possibile eliminare tabelle possedute da altri utenti specificando un nome
di tabella qualificato.
Sam concede il permesso di eliminare la sua tabella chiamata BIRTHDAYS.
DROP TABLE SAM.BIRTHDAYS
Quando una tabella viene eliminata da database, la sua definizione e tutto il suo contenuto vanno
persi; non esiste modo di recuperare i dati e si deve utilizzare una nuova dichiarazione CREATE
TABLE. A causa di tali gravi conseguenze, la dichiarazione DROP TABLE deve essere utilizzata
con cautela.
La dichiarazione DROP TABLE può contenere CASCADE o RESTRICT.
Se si specifica CASCADE, la dichiarazione DROP TABLE fallisce se altri oggetti del database
fanno riferimento alla tabella. Con l’espressione RESTRICT la tabella verrebbe cancellata se non
referenziata in alcun vincolo (ad esempio da una chiave esterna in un’altra relazione).
6
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Modifica di una tabella (ALTER TABLE)
Se si vuole modificare la definizione di una tabella si può usare la dichiarazione ALTER TABLE.
Essa può:
- aggiungere una definizione di colonna ad una tabella
ALTER TABLE <nome tabella >
ADD <definizione di colonna > <tipo > [,<definizione di colonna > <tipo > ,… ]
- eliminare una colonna da una tabella
ALTER TABLE <nome tabella >
DROP <nome colonna > CASCADE | RESTRICT
- modificare il valore predefinito per una colonna
ALTER TABLE <nome tabella >
ALTER <nome colonna > SET DEFAULT <valore >
- aggiungere o eliminare una chiave primaria
ALTER TABLE <nome tabella >
ADD <definizione chiave primaria >
- aggiungere o eliminare una chiave esterna
ALTER TABLE <nome tabella >
ADD <definizione chiave esterna >
- aggiungere o eliminare una limitazione di unicità per una tabella
ALTER TABLE <nome tabella >
ADD <limitazione di unicità >
- aggiungere o eliminare una limitazione di controllo per una tabella
ALTER TABLE <nome tabella >
ADD <limitazione di controllo >
Alcune dichiarazioni ALTER TABLE di esempio che aggiungono nuove colonne sono mostrate di
seguito:
Aggiunge nome di contatto e numero di telefono alla tabella CUSTOMERS.
ALTER TABLE CUSTOMERS
ADD CONTACT_NAME VARCHAR(30)
ALTER TABLE CUSTOMERS
ADD CONTACT_PHONE VARCHAR(10)
La nuova colonna viene aggiunta alla fine delle definizioni di colonna per la tabella e compare come
colonna più a destra nelle query successive.Normalmente il DBMS presuppone un NULL per una
nuova colonna aggiunta in tutte le righe esistenti della tabella. Se la colonna è dichiarata come NOT
NULL con un valore predefinito, il DBMS presuppone invece il valore predefinito.
La dichiarazione ALTER TABLE può essere utilizzata per eliminare una o più colonne da una
tabella esistente.
Elimina la colonna data di assunzione dalla tabella SALESREPS
ALTER TABLE SALESREPS
DROP HIRE_DATE
Lo standard SQL2 costringe a eseguire una dichiarazione ALTER TABLE separata se si desidera
eliminare più di una colonna.
7
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Si noti che l’eliminazione di una colonna può comportare problemi di integrità; per esempio, se si
elimina una colonna che rappresenta una chiave primaria in qualche relazione, la chiave esterna che
fa riferimento alla colonna eliminata diventa invalida. Lo standard SQL2 gestisce questo con una
regola di eliminazione.
E’ possibile specificare una delle due regole di eliminazione:
- RESTRICT. Se gli altri oggetti nel database (chiavi esterne, limitazioni) dipendono dalla
colonna da eliminare, la dichiarazione ALTER TABLE non va a buon fine, viene generato un
errore e la colonna non viene eliminata.
- CASCADE. Anche tutti gli altri oggetti nel database (chiavi primarie, limitazioni) che
dipendono dalla colonna vengono eliminati, come effetto a cascata della dichiarazione
ALTER TABLE.
L’effetto CASCADE può causare modifiche radicali al database; è necessario utilizzarlo con cautela.
In genere è meglio utilizzare la modalità RESTRICT (eliminare esplicitamente le chiavi esterne e le
limitazioni esistenti, utilizzando la dichiarazione ALTER o DROP) prima di eliminare la colonna.
Creazione di viste (CREATE VIEW)
Una vista è una tabella virtuale nel database, i cui contenuti sono definiti da una query.
Per l’utente del database, la vista appare come una vera tabella, con un set di colonne e di righe di
dati. Ma a differenza di una vera tabella, una vista non esiste nel database come set di valori
memorizzati: le righe e le colonne di dati visibili attraverso la vista sono invece i risultati di query
generati dalla query che definisce la vista.
CREATE VIEW <nome vista > AS <query >
Vantaggi delle viste:
- Sicurezza. A ciascun utente possono essere dati i permessi di accesso al database solo
attraverso un piccolo set di viste che contengono i dati specifici che l’utente è autorizzato a
vedere, limitando quindi l’accesso dell’utente ai dati memorizzati.
- Semplicità di query. Una vista può estrarre i dati da numerose tabelle diverse e presentarli
come una tabella singola.
- Semplicità strutturale. Le viste possono dare a un utente una vista “personalizzata” , più
semplice della struttura del database
- Isolamento dalle modifiche. Una vista può presentare un’immagine coerente e immutabile
della struttura del database, anche se le tabelle sorgente sottostanti vengono suddivise,
ristrutturate o rinominate.
- Integrità dei dati. Se si accede ai dati e si inseriscono dati attraverso una vista, il DBMS può
controllare automaticamente i dati per garantire che rispettino le limitazioni di integrità
specificate.
8
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
L’uso di una vista invece che di una vera tabella presenta anche alcuni svantaggi:
- Prestazioni. Anche se le viste hanno l’aspetto di una tabella, il DBMS deve tradurre le query
su una vista in query sulle tabelle sorgente sottostanti e questo richiede molto più tempo per
il completamento di query complesse.
- Limitazioni di aggiornamento. Se un utente cerca di aggiornare righe di una vista, il
DBMS deve tradurre la richiesta in un aggiornamento delle righe della tabelle sorgente
sottostanti. Questo è possibile per viste semplici, ma viste più complesse non possono essere
aggiornate e saranno di sola lettura.
Questo ci fa comprendere come non sia possibile definire viste in modo indiscriminato e utilizzarle
al posto delle tabelle sorgente; è necessario considerare in ogni caso i vantaggi e gli svantaggi forniti
dall’uso di una vista e confrontarli con gli svantaggi.
Viste orizzontali
Un uso comune delle viste è la limitazione di accesso di un utente solo a certe righe di una tabella.
Una tale vista viene chiamata vista orizzontale. Tutte le colonne della tabella sorgente partecipano
alla vista, ma solo alcune delle sue righe sono visibili nella vista.
Di seguito è mostrato un esempio di vista orizzontale:
Definisce una vista contenente solo uffici della regione orientale.
CREATE VIEW EASTOFFICES AS
SELECT *
FROM OFFICES
WHERE REGION = ‘Eastern’
La vista è definita da una query SELECT * e quindi ha esattamente le stesse colonne della tabella
sorgente. La proposizione WHERE determina quali righe della tabella sorgente sono visibili nella
vista.
Viste verticali
Un altro uso comune delle viste è la limitazione di accesso di un utente solo a certe colonne di una
tabella. Una tale vista viene chiamata vista verticale.
Di seguito è mostrato un esempio di vista verticale:
Definisce una vista della tabella CUSTOMERS che contiene solo i nomi dei clienti e le
assegnazioni dei venditori.
CREATE VIEW CUST_INFO AS
SELECT COMPANY, CUST_REP
FROM CUSTOMERS
Una vista verticale suddivide la tabella sorgente in modo verticale per creare la vista. Poiché sono
viste verticali, nella vista sono rappresentate tutte le righe della tabella sorgente.
9
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Le viste verticali si trovano solitamente dove i dati memorizzati in una tabella vengono utilizzati da
diversi utenti o gruppi di utenti. Forniscono una tabella privata per ciascun utente, composta solo
dalle colonne necessarie all’utente.
Query di sommario
SQL supporta richieste di una piccola quantità di valori che riassumono il database (dati riassunti)
attraverso funzioni di colonna (SUM, MIN, MAX, etc.) e le proposizioni GROUP BY e HAVING
della dichiarazione SELECT.
GROUP BY
Una query che contiene la proposizione GROUP BY viene chiamata query raggruppata perché
raggruppa i dati delle tabelle sorgente e genera una singola riga di sommario per ciascun gruppo di
righe. Le colonne indicate nella proposizione GROUP BY sono chiamate colonne di
raggruppamento della query, perché determinano come sono divise in gruppi le righe.
Si consideri la seguente query:
Quale è l’intervallo di obiettivi assegnati a ciascun ufficio?
SELECT REP_OFFICE, MIN (QUOTA), MAX (QUOTA)
FROM SALESREPS
GROUP BY REP_OFFICE
REP_OFFICE
MIN(QUOTA)
MAX (QUOTA)
--------------------------------------------------------------------NULL
NULL
NULL
11
$275,000.00
$300,000.00
12
$200,000.00
$300,000.00
13
$350,000.00
$350,000.00
21
$350,000.00
$350,000.00
22
$300,000.00
$300,000.00
Essa genera numerose righe di sommario, una riga per ciascun gruppo, che riassumono gli ordini
presi da un singolo venditore.
Concettualmente, SQL elabora la query come segue:
1. SQL divide gli ordini in gruppi di ordini, un gruppo per ciascun venditore. All’interno di ciascun
gruppo, tutti gli ordini hanno lo stesso valore nella colonna REP.
2. Per ciascun gruppo, SQL calcola il valore medio della colonna AMOUNT per tutte le righe nel
gruppo e genera una singola riga di sommario di risultati di query. La riga contiene il valore della
colonna REP per il gruppo e l’ammontare medio di ordine calcolato.
10
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Raggruppamento di condizione di ricerca (proposizione HAVING)
La proposizione HAVING può essere utilizzata per selezionare e rifiutare gruppi di righe. Il formato
della proposizione HAVING è parallelo a quello della proposizione WHERE:
HAVING <condizione di ricerca >
Tale proposizione specifica una condizione di ricerca per gruppi; le condizioni che si possono
specificare sono quelle utilizzate nella proposizione WHERE.
Vediamo un ulteriore esempio di query raggruppata:
Quale è l’ammontare medio di ordine per ciascun venditore per cui il totale di ordini supera
$30.000?
SELECT REP, AVG (AMOUNT)
FROM ORDERS
GROUP BY REP
HAVING SUM(AMOUNT) > 30000.00
REP
AVG (AMOUNT)
----------------------------------105
$7,865.40
106
$16,479.00
107
$11,477.33
108
$8,376.14
Vediamo come SQL elabora la query.
La proposizione GROUP BY in primo luogo sistema gli ordini in gruppi per venditore.
La proposizione HAVING quindi elimina i gruppi in cui il totale degli ordini non supera $30.000.
Infine la proposizione SELECT calcola l’ammontare medio degli ordini per ciascun gruppo restante
e genera i risultati di query.
Tabella ORDERS
… … … …
TRUE
GROUP BY
Tabella raggruppata
ORDER_NUM … REP …
… 106 …
106
… 103 …
103
…
…
REP AVG (AMOUNT)
106 $16,479.00
…
…
…
…
SUM(AMOUNT)
TRUE
> $30000?
AMOUNT
$31500
$1458
$2100
$600
Tabella dei risultati di query
FALSE
SUM(AMOUNT)
> $30000?
11
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
QUERY MULTITABELLA
Molte query richiedono i dati da due o più tabelle. In questo caso si parla di query multitabella che
uniscono i dati presi da due o più tabelle.
Consideriamo una semplice richiesta che unisce i dati provenienti da due tabelle diverse:
“Elencare tutti gli ordini, mostrando il numero di ordine e l’importo totale di ciascuno, il nome e il
credito del cliente che lo ha effettuato.”
Le quattro voci richieste sono memorizzate in tabelle diverse: le prime due (numero di ordine e
importo totale) nella tabella ORDERS, le altre due (nome e credito del cliente), invece, sono
memorizzate nella tabella CUSTOMERS.
Esiste un collegamento tra queste due tabelle: in ciascuna riga della tabella ORDERS, la colonna
CUST contiene il numero di cliente che ha effettuato l’ordine, che corrisponde al valore della
colonna CUST_NUM in una delle righe della tabella CUSTOMERS.
La dichiarazione SELECT deve utilizzare questo collegamento per generare i risultati di query.
Nel nostro esempio, per generare tali risultati:
- ciascuna riga dei risultati di query prende i suoi dati da una specifica coppia di righe, una
dalla tabella ORDERS e una dalla tabella CUSTOMERS.
- La coppia di righe si trova confrontando i contenuti delle colonne corrispondenti delle tabelle
(CUST e CUST_NUM)
Elenca tutti gli ordini, mostrando il numero di ordine e l’importo totale di ciascuno, il nome del
cliente e il suo.
SELECT ORDER_NUM, AMOUNT, COMPANY, CREDIT_LIMIT
FROM ORDERS, CUSTOMERS
WHERE CUST = CUST_NUM
ORDER_NUM
AMOUNT
COMPANY
CREDIT_LIMIT
----------------------------------------------------------------------------------------112989
$1,458.00
Jones Mfg.
$65,000.00
112968
$3,978.00
First Corp.
$65,000.00
112963
$3,276.00
Acme Mfg.
$50,000.00
.
.
.
La condizione di ricerca che specifica le colonne corrispondenti in una query multitabella in una
query multitabella può essere unita con altre condizioni di ricerca per restringere ulteriormente i
contenuti dei risultati di query.
Query genitore/figlio
Le query multitabella più comuni riguardano due tabelle che hanno una relazione naturale
genitore/figlio. Le query degli ordini e dei clienti ne é un esempio. Ciascun ordine (figlio) ha un
cliente associato (genitore) e ciascun cliente (genitore) può avere diversi ordini associati (figli). Le
coppie di righe che generano i risultati della query sono combinazioni di righe genitore/figlio.
12
Lezione del 14 Aprile 2003 - Docente : Elisabetta Splendori
Si é già detto che le chiavi esterne e primarie creano una relazione genitore/figlio in un database
SQL. Nella relazione, la tabella contenente la chiave esterna é il figlio, mentre la tabella con la
chiave primaria é il genitore. Per esercitare la relazione genitore/figlio in una query, occorre
specificare una condizione di ricerca che confronta la chiave esterna e la chiave primaria.
Di seguito è mostrato un esempio di query che esercita la relazione genitore/figlio:
Elenca gli uffici, nome e mansione con obiettivo > $600000.
SELECT CITY, NAME, TITLE
FROM OFFICES, SALESREPS
WHERE MGR = EMPL_NUM
AND TARGET> 600000.00
Il primo test (MGR=EMPL_NUM) seleziona solo le coppie
di righe di OFFICES e SALESREPS che hanno una
relazione genitore/figlio adatta.
Il secondo test seleziona ulteriormente solo quelle coppie di
righe dove l’ufficio ha superato l’obiettivo di vendite.
La tabella OFFICES (figlio) contiene MGR, una chiave esterna per la tabella SALESREPS
(genitore). Usiamo questa relazione per trovare la riga corretta di SALESREPS per ciascun
venditore.
CITY
NAME
TITLE
--------------------------------------------------Chicago
Bob Smith
Sales Mgr
Los Angeles Larry Fitch
Sales Mgr
13
Scarica