400 likes | 608 Views
Ordinamento. Ordinamento del risultato. E‘ possibile dare un ordinamento del risultato di una select. L‘ordinamento si può effettuare in base a un attributo, e può essere crescente o decrescente. La sintassi è la seguente: SELECT lista_attributi FROM nome_tabella WHERE condizioni
E N D
Ordinamento del risultato E‘ possibile dare un ordinamento del risultato di una select. L‘ordinamento si può effettuare in base a un attributo, e può essere crescente o decrescente. La sintassi è la seguente: SELECT lista_attributi FROM nome_tabella WHERE condizioni ORDER BY Attributo [ASC/DESC] Le righe vengono ordinate in base al campo Attributo in maniera crescente o decrescente secondo se è data la specifica ASC o DESC. ASC è il default. Secondo il tipo dell’attributo, l’ordinamento è quello più naturale su quel dominio.
Esempio Nome e reddito delle persone con meno di trenta anni in ordine alfabetico SELECT nome, reddito FROM persone WHERE eta < 30 ORDER BY nome
SELECT nome, reddito FROM persone WHERE eta < 30 ORDER BY nome SELECT nome, reddito FROM persone WHERE eta < 30 Persone Persone
Doppio ordinamento Si può voler ordinare i dati in base a una certa chiave (attributo) e poi ordinare i dati che che coincidono su quella chiave in base a un’altra chiave (attributo).
Ordinamento, Esempio Ordinare gli studenti in base al loro cognome, in modo tale che due persone con lo stesso cognome siano ordinate in base al nome, e persone con lo stesso nome e cognome siano ordinate in base all’ordine inverso della data di nascita Select * From Studenti Order by cognome [asc], nome [asc] , nascita desc
Esercizi Esercizio 1: Ordinare i negozi di Roma in base ai nomi. Select * From Negozi Where neg_citta=‘Roma’ Order by neg_nome Esercizio 2: Ordinare i componenti per costi decrescenti Select * From Componenti Order by com_costo desc Esercizio 3: Ordinare i componenti per costi decrescenti e, a parità di costo, per codici crescenti Select * From componenti Order by com_costo desc, com_cod asc
Operatori aggregati • Nella target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple e che restituiscono una tabella molto particolare, costituita da un singolo valore scalare. • SQL-2 prevede 5 possibili operatori di aggregamento: • Conteggio (COUNT), • Minimo (MIN), • Massimo(MAX), • Media (AVG), • Somma (SUM) • Gli operatori di aggregamento NON sono rappresentabili in Algebra Relazionale
Operatori aggregati: COUNT • COUNT restituisce il numero di righe della tabella o il numero di valori di un particolare attributo • Esempio: Il numero di figli di Franco: • SELECT count(*) as NumFigliDiFranco • FROM Paternita • WHERE Padre = 'Franco' • l’operatore aggregato (count) viene applicato al risultato dell’interrogazione: • SELECT * • FROM Paternita • WHERE Padre = 'Franco'
Paternità • SELECT * • FROM Paternita • WHERE Padre = 'Franco' count • SELECT count(*) • as NumFigliDiFranco • FROM Paternita • WHERE Padre = 'Franco'
(*), ALL e DISTINCT Mediante le specifiche (*), ALL e DISTINCT è possibile contare (*): tutte le righe selezionate; ALL: tutti i valori non nulli delle righe selezionate; DISTINCT: tutti i valori non nulli distinti delle righe selezionate. Se la specifica viene omessa, il default è ALL.
EsamiBD Contare il numero di studenti iscritti al corso di BD e Laboratorio SELECT count(*) as “NumStud” FROM EsamiBD Contare il numero di esami di BD superati positivamente SELECT count([ALL] BD) “ContaBD” FROM EsamiBD Numero di voti distinti dati all’esame di LBD SELECT count(distinct LBD) “ContDistLBD” FROM EsamiBD
Esercizi Esercizio 1: Calcolare il numero di codici presenti nella tabella Articoli; spiegare perché in questo caso non ha senso applicare le specifiche ALL e DISTINCT Art_cod è una chiave primaria SELECT count(art_cod) FROM Articoli Esercizio 2: calcolare il numero totale delle categorie, basandosi sulla tabella categorie. SELECT count(*) FROM Categorie
Esercizi Esercizio 3: Calcolare il numero di categorie presenti nella tabella Articoli SELECT count (Distinct cat_cod) FROM Articoli Esercizio 4: Calcolare il numero di categorie presenti nella tabella Articoli, per cui il prezzo dell’articolo corrispondente sia inferiore a 400 euro. SELECT count (Distinct cat_cod) FROM articoli WHERE art_prezzo<400
Max e Min Le funzioni MAX e MIN calcolano rispettivamente il maggiore e il minore degli elementi di una colonna. Esempio L’età della persona più anziana nella tabella persone SELECT max(eta) FROM Persone Il più basso dei voti assegnati all’esame di BD SELECT min(BD) FROM EsamiBD
Esercizi Esercizio 1: Quali sono la massima e la minima quantità di articoli richiesti in un ordine? SELECT MIN (ordart_qta) FROM Ordart SELECT MAX (ordart_qta) FROM Ordart Esercizio 2: Calcolare a quanto ammonterebbe il prezzo massimo della tabella articoli se vi venisse apportato un aumento del 12% SELECT MAX (1,12 * art_prezzo) FROM Articoli
Esercizi Esercizio 3: Determinare qual è il costo minimo di un articolo, considerato il suo prezzo, l’iva e le spese di trasporto SELECT MIN ((1+art_iva/100)*Art_prezzo+art_spese_trasporto) FROM Articoli
Sum La funzione SUM calcola la somma dei valori di una colonna. Le specifiche ALL e DISTINCT permettono di sommare tutti i valori non nulli o tutti i valori distinti. Il default in mancanza di specifiche è ALL. Esempio: Calcolare la somma degli stipendi mensili degli impiegati del settore Produzione. SELECT SUM (ALL stipendio) FROM Impiegati WHERE Dipart=‘Produzione’
Esercizi Esercizio 1: Sommare i prezzi di tutti i componenti SELECT SUM (com_prezzo) FROM Componenti Esercizio 2: Sommare i prezzi distinti di tutti i componenti SELECT SUM (DISTINCT com_prezzo) FROM Componenti Esercizio 3: Sommare i prezzi di tutti i componenti prodotti nel laboratorio dal codice ‘0050’ SELECT SUM (com_prezzo) FROM Componenti Where lab_cod=‘0050’
Esercizi Esercizio 4: Calcolare la somma dei prezzi dei due armadi presenti nella tabella Articoli SELECT SUM (Art_prezzo) FROM Articoli Where Art_descrizione LIKE ‘Armadio%’ Esercizio 5: Calcolare il numero totale di articoli ordinati SELECT SUM (ordart_qta) FROM Ordart
AVG La funzione AVG calcola la media (average) dei valori non nulli di una colonna. Le specifiche ALL e DISTINCT servono a calcolare la media fra tutti i valori o tra i valori distinti. Il default è ALL. Esempio: Calcolare la media degli stipendi degli impiegati del dipartimento di Produzione e che hanno meno di 30 anni SELECT AVG(stipendi) FROM Impiegati WHERE Dipart=‘Produzione’ AND eta<30
Esercizi Esercizio 1: Calcolare la media delle spese di trasporto degli articoli SELECT AVG (Art_spese_trasporto) FROM Articoli Esercizio 2: Calcolare la media dei prezzi dei componenti SELECT AVG (Com_costo) FROM Componenti Esercizio 3: Calcolare la media dei prezzi lordi degli articoli, inclusivi di spese di trasporto (per gli articoli per cui prezzo, IVA e Spese trasporto sono definite) Select AVG(Art_prezzo*(1+art_IVA/100)+Art_Spese_trasporto) FROM Articoli
Operatori aggregati e target list Non è possibile utilizzare in una stessa select una proiezione su alcuni attributi della tabella considerata e operatori aggregati sulla stessa tabella. • un’interrogazione scorretta: SELECT nome, max(reddito) FROM persone • di chi sarebbe il nome? La target list deve essere omogenea. E’ corretta invece la seguente: SELECT min(eta), avg(reddito) FROM persone
Group by A volte può essere richiesto di calcolare operatori aggregati non per l’intera tabella, ma raggruppando le righe i cui valori coincidono su un certo attributo. Per esempio, vogliamo sapere la media degli stipendi degli impiegati per ogni dipartimento. In tal caso si può utilizzare la clausola GROUP BY. SELECT Dipart, AVG(stipendio) FROM Impiegati GROUP BY Dipart Nella colonna AVG(stipendio) c’è la media di tutti gli stipendi degli impiegati di ogni reparto
Semantica degli operatori di raggruppamento (1) • La query è innanzitutto eseguita senza operatori aggregati e senza GROUP BY: SELECT Dipart, stipendio FROM Impiegati
Semantica degli operatori di raggruppamento (2) Quindi il risultato è diviso in sottoinsiemi aventi gli stessi valori per gli attributi indicati nel GROUP BY (Dept nel nostro caso) Quindi l’operatore aggregato è calcolato su ogni sottoinsieme: AVG
Esercizi Esercizio 1: Calcolare il prezzo più alto degli articoli per ciascuna categoria. SELECT cat_cod, MAX (art_prezzo) FROM Articoli GROUP BY cat_cod Esercizio 2: Calcolare il numero di articoli appartenenti a ciascuna categoria SELECT cat_cod, count(art_cod) FROM Articoli GROUP BY cat_cod
Esercizi Esercizio 3: Calcolare il numero di componenti di ciascun articolo. SELECT art_cod, sum(compart_qta) FROM compart GROUP BY art_cod Esercizio 4: Calcolare quanti articoli sono richiesti in ciascun ordine SELECT ord_cod, SUM(ordart_qta) FROM ordart GROUP BY ord_cod
Condizioni sui gruppi, clausola HAVING • Si possono applicare condizioni sul valore aggregato per ogni gruppo. Si può realizzare mediante la clausola HAVING. • Esempio: I dipartimenti la cui media degli stipendi è maggiore di 1700 euro Select dipart, AVG(stipendio) FROM Impiegati Group by Dipart HAVING AVG(stipendio)>1700 HAVING AVG(stipendio)>1700
Where o Having In generale se la condizione coinvolge un attributo, si usa la clausola where, mentre se coinvolge un operatore aggregato si usa la clausola having. EsamiBD (matricola,nome, cognome, città, voto, età) Le città per cui la media dei voti dei suoi studenti di meno di 21 anni è maggiore di 26 SELECT città, avg(voto) FROM EsamiBD WHERE eta < 21 GROUP BY città HAVING avg(voto) > 26
Sintassi, riassumiamo SelectSQL ::= selectListaAttributi O Espressioni fromListaTabelle [ whereCondizioniSemplici ] [ groupbyListaAttributiDiRaggruppamento ] [ havingCondizioniAggregate ] [ orderbyListaAttributiDiOrdinamento ]
Esercizio 1 Quanti laboratori sono presenti in ogni città, escludendo le città con un solo laboratorio? Select lab_citta, count(lab_cod) as “numero laboratori” From Laboratori Group by lab_citta Having count(lab_cod)>1
Esercizio 2 Calcolare da quanti componenti è costituito ciascun articolo, escludendo gli articoli costituiti da meno di 10 componenti. Select art_cod, sum(com_cod) From Compart Group by art_cod Having sum(com_cod)>10
Esercizio 3 Calcolare da quanti tipi di componenti è costituito ciascun articoli, escudendo gli articoli costituiti da meno di 5 tipi di componenti Select art_cod, count(com_cod) From Compart Group by art_cod Having count (com_cod)>5
Esercizio 4 Calcolare da quanti componenti è costituito ciascun articolo, escludendo gli articoli costituiti da meno di 5 tipi di componenti. Select art_cod, sum(compart_qta) From Compart Group by art_cod Having count (com_cod)>5 14/10/2014
Esercizio 5 Per ogni categoria di mobili, calcolare la media dei prezzi degli articoli le cui spese di trasporto sono superiori a 50 euro, e la cui media non supera i 400 euro Select cat_cod, avg(art_prezzo) From Articoli Where art_spese_trasporto>50 Group by cat_cod Having AVG(art_prezzo)<400
Esercizio 6 Calcolare la media dei prezzi delle categorie che compendono almeno un articolo per il quale il campo art_prezzo è inferiore a 300 euro e ordinare il risultato secondi i valori della media. Select cat_cod, avg(art_prezzo) From Articoli Group by cat_cod Having min(art_prezzo)<300 Order by avg(art_prezzo)