Basi di dati (4) - INAF IASF BOLOGNAbulgarelli/AB/Basi_di_Dati_files/4.pdf · ON OD.productid =...

23
Andrea Bulgarelli 1 Basi di dati (4) Docente: Andrea Bulgarelli [email protected] Argomento: select (1.0) Università di Modena e Reggio Emilia

Transcript of Basi di dati (4) - INAF IASF BOLOGNAbulgarelli/AB/Basi_di_Dati_files/4.pdf · ON OD.productid =...

Andrea Bulgarelli 1

Basi di dati (4)

Docente: Andrea Bulgarelli [email protected] Argomento: select (1.0)

Università di Modena e Reggio Emilia

2 Andrea Bulgarelli

Panoramica

 Select   Joins  Subquery  Wildcard  Esempi

3 Andrea Bulgarelli

SELECT

SELECT [DISTINCT] [TOP n] select_list [INTO new_table_name] FROM table_list [WHERE criteri di selezione] [GROUP BY colonne di aggregazione] [HAVING criteri per le funzioni aggregate] [ORDER BY ordinamento risultati [ASC|DESC] ]

4 Andrea Bulgarelli

SELECT (2)   <lista-select>:

 Uno o più attributi specificati delle tabelle di <lista-from>

 Funzioni aggregate: COUNT, AVG, MIN, MAX, SUM

 *  Costanti

  <lista-from>  Tabelle, viste o join

  <lista-order>  Uno o più sttributi di <lista-select>  ASC | DESC

5 Andrea Bulgarelli

Esempio   Usiamo il database di test pubs, tabella titles SELECT type, pub_id,

'avg' = AVG(price), 'sum' = sum(ytd_sales)

FROM titles

GROUP BY type, pub_id

  Da notare l’assegnazione delle intestazioni ed il raggruppamento delle righe di output rispetto ad alcune colonne

  Da notare che la presenza di funzioni di aggregazione qualifica il tipo di risultati presentabili

6 Andrea Bulgarelli

Tipologie di SELECT  Una SELECT può riportare

 un insieme di righe con opportuno tracciato record (result set) con   Dati afferenti a singole entità del database   Dati aggregati per opportuni raggruppamenti di

entità  Un singolo valore scalare

 Ogni query appartiene ad esattamente una delle tipologie precedenti

7 Andrea Bulgarelli

Raggruppamenti   La clausola GROUP BY implica un raggruppamento

delle righe di output in categorie   Il risultato finale è una sola riga per ciascun

raggruppamento   Le colonne presentate in output possono contenere

solamente i qualificatori del raggruppamento ed i valori aggregati calcolati per ciascun raggruppamento

  Esempio: SELECT CategoryID, AVG(UnitPrice) FROM Products GROUP BY CategoryID

  Funzioni aggreganti: MAX, MIN, AVG, SUM, COUNT, STDEV, VAR. Tutte ignorano i NULL tranne COUNT

8 Andrea Bulgarelli

Raggruppamenti (2)

  La clausola HAVING si comporta come una WHERE per i GROUP BY

  La clausola HAVING può anche essere usata indipendentemente dal GROUP BY, nel qual caso si comporta come una WHERE

9 Andrea Bulgarelli

Operazioni di JOIN   Il JOIN è l’operazione di “collegamento” di due o più tabelle

mediante elementi (chiave) comuni tra queste   Lo standard SQL-92 permette di gestire INNER JOIN (default),

FULL|LEFT|RIGHT OUTER JOIN, CROSS JOIN

SELECT <selectlist> FROM <tab1> AS <alias1> [<join_type>] JOIN

<tab2> AS <alias2> ON <condizioni> [<join_type>] JOIN

<tab3> AS <alias3> ON <condizioni> [WHERE <condizioni_filtro> ]

10 Andrea Bulgarelli

INNER JOIN   Restituisce (o tratta) tutte le righe per cui nelle due o più tabelle

coinvolte i valori di aggancio sono effettivamente presenti e verificano la condizione di JOIN

  Il qualificatore INNER viene (quasi) sempre omesso   Come conseguenza della definizione l’ordine di esecuzione di più

INNER JOIN non è rilevante per il risultato finale

SELECT empid,empname,salary,E.deptno, deptname,E.jobid,jobdesc

FROM Employees AS E JOIN Departments AS D ON E.deptno = D.deptno JOIN Jobs AS J ON E.jobid = J.jobid

11 Andrea Bulgarelli

OUTER JOINs   Obiettivo degli OUTER JOIN è allargare l’insieme

risultante dalla query includendo anche le righe di una e/o dell’altra colonna che non hanno controparte, integrate con valori NULL

  SQL-92 è il primo standard a supportare completamente gli operatori di OUTER JOIN

SELECT * FROM Employees AS E LEFT OUTER JOIN Departments AS D ON E.deptno = D.deptno

12 Andrea Bulgarelli

CROSS JOIN

  Il CROSS JOIN costruisce il prodotto cartesiano delle tabelle coinvolte

  In sintassi SQL-89 si scriveva select deptname, jobdesc from departments, jobs

In sintassi SQL-92 si scrive select deptname, jobdesc

from departments CROSS JOIN jobs

Il risultato è identico, ma la sintassi SQL-89 porta ad errori perché il cross-join si può confondere con un inner join senza condizioni

13 Andrea Bulgarelli

Altri usi delle JOIN (SQL server)   Utilizzo di JOIN per la cancellazione di dati

USE Northwind

BEGIN TRANSACTION test

DELETE [Order Details] FROM [Order Details] AS OD JOIN [Orders] AS O ON O.orderid = OD.orderid WHERE CustomerID = ‘VINET’

ROLLBACK TRANSACTION test

14 Andrea Bulgarelli

 Utilizzo di JOIN per la modifica di dati

UPDATE OD SET Discount = Discount + 0.05 FROM [Order Details] AS OD JOIN [Products] AS P ON OD.productid =

P.productid WHERE SupplierID = 1

Altri usi delle JOIN (SQL server)

15 Andrea Bulgarelli

Elementi per il miglioramento della performance di un JOIN  Creare indici su colonne usate spesso in

join  Creare indici compositi sulle combinazioni

di colonne richiamate spesso (attenzione alle prestazioni in modifica!!)

 Separare su dischi diversi le tabelle che partecipano a join per sfruttare il parallelismo di I/O sui dischi

16 Andrea Bulgarelli

Subquery e tabelle derivate   Le subquery sono casi speciali di query

all’interno di una query   In genere eliminano la necessità di usare tabelle

temporanee o variabili   In molti casi (ma non in tutti) una subquery può

anche essere trasformata in un join equivalente

  Le tabelle derivate sono un tipo speciale di subquery, posizionate nella clausola FROM della query e referenziate tramite un alias

17 Andrea Bulgarelli

Tipi di subquery (1): query annidate   Le subquery SCALARI ANNIDATE (o innestate,

o nidificate)  Producono un result set costituito da una sola riga e

colonna, utilizzabile ovunque sia assegnabile un valore scalare singolo

 Permettono di rendere le query dinamiche e rispondenti ai dati presenti nel database, piuttosto che a valori esplicitamente impostati nel codice

  Esempio: nel database Northwind, elencare tutti gli ordini ricevuti nell’ultimo giorno utile di contabilizzazione  Adottiamo una strategia in due passi

  Troviamo l’ultima data   Cerchiamo tutti i record di fatture emesse in tale data

18 Andrea Bulgarelli

Sviluppo dell’esempio  Primo passo

<ultima_data> = select max(OrderDate) from Orders

 Secondo passo select customerid,orderid,orderdate

from orders where orderdate = ( <ultima_data> )

… e quindi abbiamo la query complessiva select customerid,orderid,orderdate

from orders where orderdate = ( select max(OrderDate) from Orders )

19 Andrea Bulgarelli

Osservazioni   La SELECT innestata può essere ovunque; altro esempio

use Northwind GO

select 'Prodotto'=ProductID,'Deviazione risp. media'=UnitPrice-(

select avg(UnitPrice) from [Products] ) from [Products] GO

  Se la subquery viene introdotta da un operatore di confronto (=, < >, >, > =, <, ! >, ! <, or < =), allora deve riportare sempre un unico valore; le subquery introdotte con [NOT] IN o ALL, ANY, o [NOT] EXISTS possono riportare delle liste di risultati

20 Andrea Bulgarelli

Esempio di uso del predicato NOT IN   Nel database Northwind contare gli ordini che fanno capo a clienti

non inglesi SELECT Count(*)

FROM Orders

WHERE CustomerID NOT IN (

SELECT CustomerID

FROM CUstomers

WHERE Country = ‘UK’

)

  Attenzione alla presenza di valori NULL! y ∈ {x} ⇔ OR ( y = x ), quindi y ∉ {x} ⇔ AND ( y <> x ), e se uno degli x è NULL, allora y<>NULL è indefinito ed il predicato è falso. I valori NULL vanno esclusi accuratamente dal result set usando la funzione ISNULL o COALESCE

21 Andrea Bulgarelli

Esempio di uso del predicato EXISTS   Nel database Northwind trovare tutti i clienti che hanno ordinato

almeno una volta il prodotto 64

SELECT C.ContactName FROM Customers AS C WHERE EXISTS ( SELECT * FROM Orders AS O JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID WHERE OD.ProductID = 64 AND C.CustomerID = O.CustomerID )

22 Andrea Bulgarelli

Tipi di subquery (2): subquery correlate   Le subquery CORRELATE sono subquery in cui il valore della

SELECT interna è legato a valori della SELECT esterna   Esempio: nel DB Northwind selezionare gli ordini che includono più

di 36 unità del prodotto 17

SELECT O.* FROM Orders AS O WHERE

36 < (

SELECT OD.Quantity FROM [Order Details] AS OD WHERE OD.ProductID = 17 AND OD.OrderID = O.OrderID

)

23 Andrea Bulgarelli

Wildcard e LIKE