martedì 25 novembre 2008

APPROFONDIMENTI SU SQL: CLAUSOLE WHERE, HAVING, GROUP BY

L'utilizzo delle clausole Where, Having, Group by consente di effettuare delle ricerche specifiche; infatti in alcuni casi può essere necessario escludere singole righe dai gruppi (utilizzando una clausola WHERE) prima di applicare una condizione ai gruppi(utilizzando una clausola HAVING)
WHERE consente di restringere il campo della ricerca, ad esempio il comando:
SELECT *FROM elenco libri WHERE poeta= 'Giacomo Leopardi'; restituisce tutti i campi della tabella elenco libri in cui il campo poeta è uguale a Giacomo Leopardi.
La clausola WHERE può utilizzare operatori logici come OR, AND, NOT, e operatori di confronto come BETWEEN, LIKE.
Inoltre, la clausola WHERE viene applicata prima alle singole righe nelle tabelle o negli oggetti con valori di tabella nel riquadro Diagramma.
Successivamente viene applicata la clausola HAVING alle righe del gruppo di risultati.
Quindi, la clausola HAVING è analoga alla clausola WHERE ma è applicabile solo ai gruppi come insieme, ossia alle righe nel gruppo di risultati che rappresentano i gruppi, mentre la clausola WHERE è applicabile a righe singole. Una query può contenere sia una clausola WHERE che una clausola HAVING.
La clausola HAVING può essere applicata solo alle colonne presenti anche nella clausola GROUP BY o in una funzione di aggregazione.
GROUP BY e una clausola che raggruppa i dati in funzione del campo specificato, consentendo di effettuare operazioni di conteggio dei risultati all’interno di una stessa query.

ESEMPIO DI CLAUSOLA WHERE, HAVING, GROUP BY: Si supponga ad esempio di unire le tabelle titoli ed editori per creare una query in cui sia visualizzato il prezzo medio dei libri per un gruppo di editori, limitando la ricerca a un gruppo specifico di editori, ad esempio quelli dell'Italia, e a un prezzo medio maggiore di 10 euro.In questo caso, prima di calcolare il prezzo medio è possibile stabilire la prima condizione con una clausola WHERE che escluda tutti gli editori che non si trovano in Italia. La seconda condizione richiede una clausola HAVING, in quanto la condizione è basata sui risultati del raggruppamento e del riepilogo di dati. L'istruzione SQL risultante sarà analoga alla seguente:

SELECT titoli.edit_id, AVG(titoli.prezzo)
FROM titoli INNER JOIN editori
ON titoli.edit_id = editori.edit_id
WHERE editori.nazione = 'IT'
GROUP BY titoli.edit_id
HAVING AVG(prezzo) > 10

Nessun commento: