...

sql_query_1a - In Contatto da casa

by user

on
Category: Documents
7

views

Report

Comments

Transcript

sql_query_1a - In Contatto da casa
Le query in SQL
Unità didattica sviluppata per l’ITIS “A. Volta” – Classe 5 sez. I
Ing Domenico Liguori - Università degli studi di Napoli “Federico II”
Novembre 2005
Sommario degli argomenti 1a parte
 Query
di interrogazione
 Proiezione
 Selezione
 Ridenominazione
 Join
Query di selezione

Come avevamo già anticipato, le istruzioni di
interrogazione permettono di estrarre da una o più
tabelle le informazioni a cui si è interessati,
organizzando la risposta in una tabella ideale
(dynaset)
cap città prov
nome cogn città
Ambiente
di esecuzione
SQL
nome Cogn tel
indir
cap
Select Nome,
Cognome città
From …
Where …
L’istruzione SELECT

Seleziona, tra le tuple appartenenti alle tabelle
specificate, soltanto quelle che soddisfano il criterio
indicato, visualizzandone i valori degli attributi esiderati.
SELECT TabellaN.attributoP,.. TabellaM.attributoR
FROM TabellaN,..TabellaM
WHERE <condizione booleana>;
Condizione vero/falso che
determina l’appartenenza o
meno alla tabella risultato
delle righe coinvolte
nell’ interrogazione
Elenco attributi di
cui è richiesta la
visualizzazione
Nomi tabelle
cui appartengono
gli attributi
Operatori algebrici relazionali con
SELECT: la Proiezione
Attraverso questa istruzione, è possibile manipolare le
relazioni applicando su di esse gli operatori tipici dell’algebra relazionale.
Il seguente impiego dell’istruzione SELECT:
SELECT attributoX,.. attributoW
FROM Tabella;
Permette di applicare alla relazione Tabella, l’operatore
Algebrico di PROIEZIONE
Select: proiezione
Consideriamo ad esempio la tabella viaggi, e
supponiamo di voler eseguire una proiezione sugli
attributi Destinazione,Data, Costo
Tabella Origine:
viaggi
Forniremo un’istruzione specifica:
SELECT
Destinazione, Data, Costo
FROM
Viaggi;
Select: proiezione
Il cui risultato è il seguente:
Operatori algebrici relazionali con
SELECT: la Selezione
Analogamente, è possibile realizzare l’operazione
algebrica relazionale di Selezione.
La sintassi cui faremo riferimento è la seguente:
SELECT *
FROM Tabella
WHERE <condizione booleana>;
Seleziona
Tutti gli
attributi
Applica per
Ciascuna tupla
La condizione
booleana
Questa istruzione permette di applicare alla relazione
Tabella, l’operatore algebrico di SELEZIONE
Select: Selezione
Supponiamo di ‘selezionare’ dalla tabella viaggi, tutte le
Tuple per le quali il costo del viaggio è <= 400 Euro
SELECT *
FROM Viaggi
WHERE Costo <=400;
Che restituisce:
L’istruzione SELECT: esempio
Naturalmente è possibile comporre nell’ordine la
Selezione e la Proiezione:
SELECT
Destinazione, Costo, DurataGG, Data
FROM Viaggi
WHERE Costo <= 500;
Tabella Origine:
viaggi
…in sintesi
L’istruzione applica la condizione booleana (clausola
WHERE) a ciascuna riga della tabella viaggi, e
laddove il risultato sia vero preleva gli attributi richiesti
e li scrive nella tabella risultato:
La condizione dunque, rappresenta il criterio in base alla
quale vengono filtrate le informazioni che non sono di
interesse
…segue clausola WHERE
Il criterio di selezione, quantunque possa essere
complesso, avrà sempre 2 valori risultanti, cioè
VERO/FALSO
SELECT
Destinazione, Costo, DurataGG, Data
FROM
Viaggi
WHERE (Costo <= 500) and (Data > Now());
Il recordset risultante diventa:
Funzione che
Ritorna la data
odierna
(25/11/2005)
Ancora sulla clausola ‘Where’
SQL mette a disposizione un operatore like per il confronto
di stringhe. Sono forniti inoltre due caratteri speciali:
_ : rappresenta un carattere arbitrario (? In Access)
%: stringa di un numero arbitrario di caratteri (* in Access)
L’op. Like può
Essere preceduto
dall’operatore
Not che complementa,
Nega, l’insieme
restituito da like
SELECT Destinazione, Data
FROM Viaggi
WHERE Destinazione like ‘_a%’;
che restituisce:
Select: Ridenominazione
Anche l’operazione di ridenominazione degli attributi
Previsto dall’algebra relazionale è realizzato dalla istruzione
SELECT:
SELECT
Attributo1, AttributoN AS MIOAttributo, Attributo M
FROM Tabella;
Specifichiamo ad esempio, la durata dei viaggi come
Numero di settimana e giorni residui:
SELECT Destinazione, Data, int(durataGG/7) AS Settimane,
(durataGG mod 7) AS giorni
FROM Viaggi;
Select: Ridenominazione
Che restituisce:
Alcune caratteristiche
Supponiamo di specificare la seguente interrogazione:
SELECT Destinazione
FROM Viaggi;
Il cui risultato è:
Compaiono dei duplicati.
Una tabella relazionale è un
insieme di elementi righe (tuple),
per cui ogni elemento distinto
deve essere unico
…segue
Per restituire alla tabella il suo significato insiemistico,
esiste in SQL la parola chiave “distinct”:
SELECT distinct Destinazione
FROM Viaggi;
Se è richiesta esplicitamente
la presenza dei duplicati,
si usa nella query la parola
chiave “all”
Select tra più tabelle
Supponiamo che esista un’altra tabella, Prenotazioni, e
che tra esse vi sia una relazione 1 a molti, ovvero 1
Viaggio -> più Prenotazioni
Viaggi
1
Cod_viaggio
Destinazione
Durata_giorni
Data_partenza
Partenza
Mezzo
Nro_posti
Costo

Prenotazioni
Cod_viaggio
Nro-prenotazione
Nro_posti-prenotati
Cliente
Indirizzo_cliente
Anticipo
Select tra più tabelle
La tabella delle Prenotazioni potrebbe essere la seguente:
Potremmo chiederci ad esempio, quali sono le mete dei
Clienti prenotati
In questo caso però, le mete (‘Destinazioni’) compaiono
nella tabella Viaggi, mentre i ‘Clienti’ figurano nella
tabella Prenotazioni: cioè due tabelle distinte
Select: Tabelle correlate
L’ideale sarebbe disporre di un’unica tabella in grado di contenere
entrambe le informazioni, e sulla quale svolgere l’interrogazione.
Dobbiamo cioè correlare dati in tabelle diverse identificando un
attributo che abbia valori uguali sulle due tabelle.
Qual è questo attributo con valori uguali?
Viaggi
codViaggio Destinazione
Data
Partenza
Prenotazioni
Mezzo NumPosti Costo codViaggio Nro-Prenot Nro_psti-Ptr Cliente
Indirizzo Anticipo
A1B0
Parigi
1505/1999
Roma
Aereo
30
300
A1B0
432312
1
Caio Rossi Via Verdi
100
A1B0
Parigi
1505/1999
Roma
Aereo
30
300
A1B0
432313
4
Adele Nari Via Font
100
AMP2
Amsterdam 17/05/2005 Napoli
Aereo
18
500
AMP2
334311
1
Giusp Esp Cso Italia
150
AMP2
Amsterdam 17/05/2005 Napoli
Aereo
18
500
AMP2
334312
4
Vito Fonta Via C.Cort
300
…
…
..
..
…
...
…
…
…
…
…
…
…
Select: Inner Join
Abbiamo cioè costruito il prodotto cartesiano Viaggi X Prenotazioni,
con il vincolo di considerare solo le righe che presentano l’uguaglianza
nell’attributo comune codViaggio.
L’SQL è in grado di generare una tale relazione; l’operatore binario
corrispondente è noto come INNER JOIN
SELECT **
SELECT
FROMINNER
Viaggi,
Prenotazioni
FROM Viaggi
JOIN
Prenotazioni ON
WHERE
Viaggi.CodViaggio=Prenotazioni.codViaggio;
Viaggi.CodViaggio=Prenotazioni.codViaggio;
…segue
Da questa tabella, restringendo l’insieme degli attributi osservati,
otteniamo la risposta al quesito da cui eravamo partiti: Le mete dei clienti
SELECT
Prenotazioni.Cliente,
Prenotazioni.Indirizzo, Viaggi.Destinazione,
FROM
WHERE
Prenotazioni, Viaggi
viaggi.codViaggio=prenotazioni.CodViaggio;
Varianti join: LEFT JOIN
Un’alternativa all’INNER JOIN è quella di costruire una tabella che ne
ampli il risultato, estendendolo cioè con le righe della tabella di sinistra
per le quali non esiste una corrispondente riga nella tabella di destra
SELECT *
FROM Viaggi LEFT JOIN Prenotazioni ON
Viaggi.CodViaggio=Prenotazioni.codViaggio;
Valori
NULL
Varianti join: LEFT JOIN
Su questo esempio allora ci si potrebbe chiedere quali siano i pacchetti
Viaggio che siano rimasti invenduti:
Ordine crescente
Del dynaset
SELECT
Viaggi.CodViaggio,Viaggi.Destinazione,
Viaggi.Data
FROM Viaggi LEFT JOIN Prenotazioni ON
Viaggi.CodViaggio=Prenotazioni.codViaggio
WHERE (Prenotazioni.codViaggio IS NULL) AND
(Viaggi.Data < Date())
ORDER BY Viaggi.Data;
Varianti join: RIGHT JOIN
Il RIGHT JOIN ha un comportamento anologo al LEFT JOIN: aggiunge
alla tabella restituita dall’INNER JOIN le righe della tabella di destra
per le quali non esiste una corrispondente riga nella tabella di sinistra
Il risultato coincide con l’inner Join perché per ogni record della tabella
di destra (Prenotazioni) esiste un record corrispondente nella tabella di
sinistra (Viaggi). La sintassi è:
SELECT *
FROM Viaggi RIGHT JOIN Prenotazioni ON
Viaggi.CodViaggio=Prenotazioni.codViaggio;
Fly UP