Post on 05-Jul-2015
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 1
BASI DI DATI
ESERCITAZIONI -04-MSSQL - SQL
Email: francesco.magagnino@ewave.it
Università di TrentoCorso di Laurea in Ingegneria dell’Informazione e dell’Organizzazione
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 2
Operatori insiemistici Le relazioni sono insiemi; si possono applicare operatori
insiemistici Gli operatori insiemistici eliminano automaticamente i
duplicati (altrimenti specificare ALL)
U → Unione (Union)
∩ → Intersezione (Intersect)
− → Differenza (Except)
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 3
Tabelle iniziali
tDipendenti
tDirigenti
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 4
Principali comandi in SQL (DML)
Unione tra select omogeneeSelect <campi>from <nome tabella> Union Select <campi2>from <nome tabella2>
SELECT dbo.tDipendenti.*FROM dbo.tDipendentiunionSELECT dbo.tDirigenti.*FROM dbo.tDirigenti
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 5
Principali comandi in SQL (DML)
Intersezione tra select omogeneeSelect <campi>from <nome tabella> Intersect Select <campi2>from <nome tabella2>
SELECT dbo.tDipendenti.*FROM dbo.tDipendentiIntersectSELECT dbo.tDirigenti.*FROM dbo.tDirigenti
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 6
Intersect in MSSQL
SELECT _tDipendenti.*FROM _tDipendentiWHERE EXISTS(SELECT *FROM _tDirigentiWHERE _tDipendenti.nome = _tDirigenti.nomeAND _tDipendenti.codice = _tDirigenti.codiceAND _tDipendenti.età = _tDirigenti.età)
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 7
Principali comandi in SQL (DML)
Differenza tra select omogeneeSelect <campi>from <nome tabella> Except Select <campi2>from <nome tabella2>
SELECT dbo.tDipendenti.*FROM dbo.tDipendentiExceptSELECT dbo.tDirigenti.*FROM dbo.tDirigenti
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 8
Except in MSSQL SELECT _tDipendenti.*FROM _tDipendentiWHERE NOT EXISTS( SELECT * FROM _tDirigentiWHERE _tDipendenti.nome = _tDirigenti.nome AND _tDipendenti.codice = _tDirigenti.codice
AND _tDipendenti.età = _tDirigenti.età )unionSELECT _tDirigenti.*FROM _tDirigentiWHERE NOT EXISTS( SELECT * FROM _tDipendentiWHERE _tDirigenti.nome = _tDipendenti.nome AND _tDirigenti.codice = _tDipendenti.codice
AND _tDirigenti.età = _tDipendenti.età )
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 9
Join Utilizza i collegamenti sui valori che sono alla base del modello relazionale. Combina selezioni e proiezioni per estrarre informazioni dalle relazioni.
Inner joinVisualizza solo le righe per cui esiste una corrispondenza in entrambe le tabelle unite. (Join predefinito)
Outer joinVisualizza anche le righe in cui non esiste alcuna corrispondenza nella tabella unita. Left outer join Right outer join Full outer join
Cross joinVisualizza una riga per ogni possibile coppia di righe delle due tabelle.
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 10
Tabelle
tLibro (5)
tAutore (3)
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 11
Principali comandi in SQL (DML)
Inner Join (1): Contiene tutte le righe delle tabelle che soddisfano le condizioni
select <campi> from <nome tabella> JOIN <nome tabella2> ON
<condizione> JOIN <tabella 3> ON <condizione>
SELECT dbo.tLibro.*, dbo.tAutore.*FROM dbo.tLibro INNER JOIN dbo.tAutoreON dbo.tLibro.IdAutore = dbo.tAutore.AutoreId
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 12
Inner Join (2):
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 13
Principali comandi in SQL (DML)Outer Join (1):
Left: le righe senza corrispondente che si trovano nella tabella di sinistra (cioè quella dichiarata per prima nella query)
Right: le righe della seconda tabella che non hanno corrispondente nella prima
Rispetto alla query: Left si prendono tutti i record della tabella a sinistra Right si prendono tutti i record della tabella a destra
select <campi> from <nome tabella> LEFT JOIN <nome tabella2> ON <condizione>
SELECT dbo.tLibro.*, dbo.tAutore.*FROM dbo.tLibro RIGHT OUTER JOIN dbo.tAutore ON dbo.tLibro.IdAutore = dbo.tAutore.AutoreId
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 14
Outer Join (2):
RIGHT
OUTER
JOIN
LEFT
OUTER
JOIN
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 15
Principali comandi in SQL (DML)
Cross join (1):
select <campi> from <nome tabella> CROSS JOIN <nome tabella2>
SELECT dbo.tLibro.*, dbo.tAutore.*FROM dbo.tLibro CROSS JOIN dbo.tAutore
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 16
Cross join (2): ....6*3=18!!
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 17
Esercizi Usare il db “CDs”
3. Inner join con tutte le colonne delle tabelle tCd e tCantante data la relazione legata all'id del cantante (cantante_id)
4. Inner join con le caratteristiche di ogni cd e relativo nome del cantante data la relazione legata all'id del cantante (cantante_id)
5. Inner join con titolo de cd e relativo nome del cantante data la relazione legata all'id del cantante (cantante_id)
6. Inner join con titolo de cd, relativo nome del cantante e genere del cantante data la relazione legata all'id del cantante (cantante_id) e all'id del genere (genere_id)
7. Inner join con titolo de cd, relativo nome del cantante e label del cd data la relazione legata all'id del cantante (cantante_id) e all'id della label(label_id)
Basi di Dati - 2006-2007 (L. Colazzo - F. Magagnino) 18
Esercizi2. Inner join con titolo del cd, relativo nome del cantante e genere del
cantante data la relazione legata all'id del cantante (cantante_id) e all'id del genere (genere_id) - Filtrare rispetto al genere uguale a "rock“
3. Inner join con titolo del cd, relativo nome del cantante e genere del cantante data la relazione legata all'id del cantante (cantante_id) e all'id del genere (genere_id) - Filtrare rispetto al genere uguale a "rock" e "pop“
4. Inner join con titolo del cd, relativo nome del cantante e genere del cantante data la relazione legata all'id del cantante (cantante_id) e all'id del genere (genere_id) - Filtrare rispetto al genere uguale a "rock" e al cantante uguale a "madonna“
5. Inner join con titolo del cd, relativo nome del cantante e genere del cantante data la relazione legata all'id del cantante (cantante_id) e all'id del genere (genere_id) - Filtrare rispetto al genere uguale a "rock" e al cantante uguale a "madonna", ordinare in modo discendente per il titolo del cd
6. Inner join con titolo del cd, PREZZO DEL CD, ANNO DEL CD, relativo nome del cantante e genere del cantante data la relazione legata all'id del cantante (cantante_id) e all'id del genere (genere_id) - Visualizzare i due più vecchi