FROM R X R (AS) X
REN (
B1,B2 A1,A4
ß
PROJ (SEL (R1 JOIN
A1,A4 A2 = A3 AND A4 = C1
R2 JOIN REN (R1))))
C1,C2 A1,A2
ß
viene tradotto con: SELECT X.A1 AS B1, Y.A4 AS B2
FROM R1 X, R2 Y, R1 Z
WHERE X.A2 = Y.A3 AND Y.A4 = Z.A1
Quando dico X.A2 sto dicendo il secondo attributo (la seconda colonna) di X che è un’istanza di R1, quindi:
prendi il dato della seconda colonna di r1 quando è stanziata con x.
Atra cosa mega figa è che con SQL possiamo creare interrogazioni che hanno nella target list (quindi nel from)
delle operazioni. Con l’algebra relazionale potevamo fare interrogazioni che potevano restituire solo dati già
presenti all’interno delle tabelle, esempio:
SELECT Reddito/2 AS redditoSemestrale
FROM Persone
WHERE Nome = 'Luigi' 35
Altra roba mega figa è la condizione like. Usato per effettuare confronti su stringhe, con pattern specifici: _
rappresenta un singolo carattere mentre % rappresenta una sequenza di caratteri (zero o più). in questo
esempio cerchiamo le persone che hanno un nome che inizia per 'A' e ha una 'd' come terza lettera.
SELECT *
FROM persone
WHERE nome LIKE 'A_d%'
SEL (Impiegati) questa espressione trova gli impiegati in cui età è maggiore di 40, oppure la cui
Età>40 OR Età IS NULL
età è null. In sql questo viene tradotto con le parole chiave is null oppure is not null, in questo caso:
SELECT *
FROM impiegati
WHERE età > 40 OR età IS NULL
GESTIONE DEI DUPLICATI nella PROIEZIONE
Fino ad adesso abbiamo visto che la selezione si “traduce” con il where. La proiezione è ovviamente più
complicata. La cosa che dobbiamo ricordare è che la proiezione oltre a rimuovere le colonne, rimuove anche
i duplicati. Infatti, facendo PROJ (Impiegati) ottengo tabella a dx.
Cognome, Filiale
In sql invece si è deciso di non togliere i duplicati; infatti, con un select classico ottengo la stessa tabella di sx,
se volessi eliminarli e ottenere tabella di dx dovrei usare DISTINCT così:
SELECT DISTICT
Cognome, filiale
FROM impiegati
Le espressioni SQL sono dichiarative, i DBMS eseguono le operazioni in modo efficiente, ad esempio:
eseguono le selezioni al più presto e se possibile, eseguono join e non prodotti cartesiani. La capacità dei
DBMS di “ottimizzare” le interrogazioni rende (di solito) non necessario preoccuparsi dell'efficienza quando
si specifica un'interrogazione. È perciò più importante preoccuparsi della chiarezza (anche perché così è più
difficile sbagliare). Riassumendo: le Istruzioni SELECT permettono di realizzare: selezioni, proiezioni,
ridenominazioni con una sola relazione nella clausola FROM. join (e prodotti cartesiani) con più relazioni nella
FROM:
Esempi interrogazioni simili a quelle d’esame 36
1.Trovare i padri di persone che guadagnano più di 20. Che tabelle sono coinvolte? Paternità e persone,
quindi intuiamo sia necessario fare un join tra queste due.
PROJ (Paternita JOIN (SEL (Persone))
Padre Figlio =Nome Reddito>20
SELECT DISTINCT padre perché se questo ha 3 figli, non voglio che compaia 3 volte
à
FROM persone, paternita indico le tabelle coinvolte tra cui from farà prodotto cartesiano e specifico…
à
WHERE figlio = nome AND reddito > 20 specifico il where perché mi ricordo che il from fa un prodotto
à
cartesiano fra tutte le tuple, che non è il risultato che voglio, quindi specifico qui i requisiti
2.Persone che guadagnano più dei rispettivi padri e mostrare: nome, reddito e reddito del padre. Nella target
list ci vanno 3 cose. Tabelle coinvolte? 3 perché non posso svolgere questa interrogazione con una passata
sola la quale fa una riga per volta e non può confrontare due tuple diverse!!! Per quello devo considerare
due volte la stessa tabella!
PROJ (SEL
Nome, Reddito, RP Reddito > RP
(REN (persone) JOIN
NP, EP, RP Nome,Eta,Reddito NP=Padre
ß (paternita JOIN persone)))
Figlio=Nome
SELECT f.nome, f.reddito, p.reddito
FROM persone p, paternita, persone f
WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito
ORDINAMENTO DEL RISULTATO Nome e reddito delle persone con meno di trenta anni in ordine
à
alfabetico
SELECT nome, reddito
FROM persone
WHERE eta < 30
ORDER BY nome
Per ordinamento decrescente usare le sigle: ORDER BY nome ASC / DSC. Se hanno lo stesso nome? Valuto un
secondo attributo a parità del primo: quindi ORDER BY Nome ASC, Cognome DSC. Se ci sono dei NULL? C’è
una modalità NULL FIRST, NULL LAST per ordinarli.
UNIONE - INTERSEZIONE - DIFFERENZA
SELECT ...
UNION [ALL] / INTERSEPT /EXEPT
SELECT ...
I duplicati vengono eliminati (a meno che si usi ALL); anche dalle proiezioni ( se ho due luigi, ne mette uno).
Manca notazione posizionale mancano ultimi 20 minuti 37
JOIN ESPLICITO
I JOIN permettono di combinare i dati provenienti da più tabelle in base a una condizione comune. Esistono
diversi tipi di join, tra cui: JOIN ESPLICITO (Equi Join) e JOIN ESTERNO (Outer Join: Left, Right, Full). Il JOIN
esplicito è l'equivalente dell'Equi Join. Si utilizza per collegare due tabelle sulla base di una condizione di
uguaglianza tra i loro attributi comuni. Le risoluzioni sotto sonoo equivalenti, solo che quella col join è più
leggebile, avendo una struttura più chiara, che Evita ambiguità tra tabelle
1) Padre e madre di ogni persona
SELECT paternita.figlio,padre, madre
FROM maternita, paternita
WHERE paternita.figlio = maternita.figlio
ß
SELECT madre, paternita.figlio, padre
FROM maternita JOIN paternita ON paternita.figlio = maternita.figlio
2) Persone che guadagnano più dei rispettivi padri e mostrare: nome, reddito e reddito del padre
SELECT f.nome, f.reddito, p.reddito
FROM persone p, paternita, persone f
WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito
ß
SELECT f.nome, f.reddito, p.reddito
FROM (persone p JOIN paternita ON p.nome = padre)
JOIN persone f ON figlio = f.nome
WHERE f.reddito > p.reddito
JOIN ESTERNO
Nel join normale, se una tupla non si combina con nessun’altra, non partecipa nel risultato e per questo,
quindi, si perde. Se ad esempio volessi trovare padre e, se nota, madre di ogni persona, mi potrei trovare in
situazioni in cui non conosco uno dei due: di Luigi ad esempio, conosco la mamma, ma non il papà. Con un
join normale perderei questa informazione, ma usando un join esterno, la tupla partecipa comunque perché
si vanno ad inserire dei valori NULL. Conosciamo 3 tipi di OUTER JOIN:
LEFT JOIN → Mantiene tutte le tuple della tabella a sinistra, anche se non trovano corrispondenza.
- RIGHT JOIN → Mantiene tutte le tuple della tabella a destra.
- FULL OUTER JOIN → Mantiene tutte le tuple di entrambe le tabelle.
-
SELECT paternita.figlio, padre, madre
FROM paternita LEFT JOIN maternita ON paternita.figlio = maternita.figlio
ß
SELECT paternita.figlio, padre, madre
FROM paternita LEFT OUTER JOIN maternita ON paternita.figlio = maternita.figlioà OUTER e' opzionale
ß
SELECT paternita.figlio, padre, madre
FROM maternita FULL OUTER JOIN paternita ON maternita.figlio = paternita.figlio in questo caso, sia che
à
manchi la madre o il padre, comunque lo riesco a trovare. Chiaramente se in uno non noto né il padre né la
madre, non comparirà proprio. 38
INTERROGAZIONI NIDIFICATE
Le query nidificate in SQL permettono di fare confronti tra un valore di una tabella e un insieme di valori
derivati da una subquery interrogazione annidata dentro una query principale e genera un insieme di
à
risultati che poi vengono usati nella condizione della query esterna.
SELECT ...
FROM ...
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition).
Operator è uno tra: =, <>, >, >=, <, or <=. IN è equivalente a = ANY e NOT IN è equivalente a <> ALL
1) Nome e reddito dei padri di persone che guadagnano più di 20. 1° soluzione con join, 2° con nidi
SELECT DISTINCT P.Nome, P.Reddito
FROM Persone P, Paternita, Persone F
WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20
SELECT Nome, Reddito
FROM Persone
WHERE Nome IN (SELECT Padre
FROM Paternita, Persone
WHERE Figlio = Nome AND Reddito > 20)
2) Nome e reddito dei padri di persone che guadagnano più di 20, con indicazione del reddito del figlio
(eliminando i duplicati se ci sono)
SELECT DISTINCT P.Nome, P.Reddito, F.Reddito
FROM Persone P, Paternita, Persone F
WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20
SELECT Nome, Reddito, ????
FROM Persone
WHERE Nome in (SELECT Padre
FROM Paternita
WHERE Figlio = any (SELECT Nome
FROM Persone
WHERE Reddito > 20))
SELECT DISTINCT P.Nome, P.Reddito, F.Reddito
FROM Persone P, Persone F
WHERE F.Reddito > 20 AND P.Nome IN (SELECT Padre
FROM Paternita
WHERE Figlio = F.Nome);
Le subquery in SQL permettono di eseguire interrogazioni annidate: ovvero una query dentro un'altra query,
per confrontare valori con insiemi di dati derivati da altre tabelle. Sono inserite nella clausola WHERE, con
una condizione booleana, e possono essere profondamente nidificate, senza limiti di livello. Hanno delle
regole riguardo la visibilità delle variabili: nna variabile può essere usata solo all’interno della query in cui è
✔
definita o nelle subquery interne. Accesso ai blocchi esterni → Una subquery interna può usare variabili
✔
definite nel blocco SQL principale. Limitazioni → Non è possibile usare operatori insiemistici (UNION,
INTERSECT, EXCEPT) dentro una subquery. 39
QUANTIFICAZIONE ESISTENZIALE, EXIST
SELECT *
FROM Persone
WHERE EXISTS(SELECT *
FROM Paternita
WHERE Padre = Nome)
OR
EXISTS(SELECT *
FROM Maternita
WHERE Madre = Nome)
Obiettivo generale della query è selezionare tutte le righe dalla tabella Persone in base alle condizioni
espresse. L‘operatore EXISTS viene utilizzato per verificare l'esistenza di determinate righe in altre tabelle, in
questo caso restituisce TRUE se la sottoquery interna produce almeno una riga. Condizione 1 (EXISTS con
Paternità): Controlla se esiste almeno una riga (una riga basta per restituire true) nella tabella Paternità in
cui il valore della colonna Padre corrisponde al valore della colonna Nome della tabella Persone. Condizione
2 (EXISTS con Maternità): Controlla se esiste almeno una riga nella tabella Maternità
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti Basi di dati
-
Appunti di Basi di dati
-
Appunti Basi di dati completi
-
Appunti personali Basi di dati