Che differenza c'e' tra questa query :
SELECT COGNOME, NOME FROM CLIENTI WHERE COGNOME LIKE 'A*' GROUP BY COGNOME,
NOME
e questa
SELECT COGNOME, NOME FROM CLIENTI GROUP BY COGNOME, NOME HAVING COGNOME LIKE
'A*'
??????
Grazie e scusate se la domanda e' da super pivelli !!!!
:-)
La preposizione WHERE viene applicata prima di effettuare i raggruppamenti
su qui agisce invece la preposizione HAVING.
Quando la query và in esecuzione, prima analizza i record secondo i criteri
del WHERE, poi, con i record risultanti, crea i raggruppamenti definiti
nella clausa GROUP BY, a questo punto applica i criteri specificati in
HAVING.
ciao.
---- cut---
> La preposizione WHERE viene applicata prima di effettuare i raggruppamenti
> su qui agisce invece la preposizione HAVING.
> Quando la query và in esecuzione, prima analizza i record secondo i
criteri
> del WHERE, poi, con i record risultanti, crea i raggruppamenti definiti
> nella clausa GROUP BY, a questo punto applica i criteri specificati in
> HAVING.
Innanzitutto , grazie per avermi risposto.
Dunque, ho capito il senso di quello che dici, ma non comprendo l'utilita'
di questa diversificazione.
Cioe'... :
che senso ha applicare dei criteri nei record raggruppati quando gli stessi
criteri si possono mettere nella preposizione WHERE iniziale ?
Forse ci sono delle differenze nella velocita' di esecuzione ?
Grazie
Ciao
Ti ragruppa i record uguali es.
pippo italia
pippo italia
Solo Where ti dà come risultato due record, con Having ti dà come risultato
un solo record, questo esempio è molto stupido ma spero ti aiuti a capire.
--
Ciao Marco S.
www.marcosanti.it
Altra cosa non puoi inserire condizioni HAVING su campi che non siano
espressi nella clausola Group BY, cioè non potresti impostare criteri per
quei campi che non ti interessa coinvolgere nell opzioni di raggruppamento.
un banale esempio:
SELECT Cognome, Nome FROM CLIENTI WHERE IDCliente <> 10 GROUP BY Cognome,
Nome
Per farlo tutto con having, dovresti portare in raggruppamento anche
idCLiente, il quale, risultando diverso per ogni record, non ti darebbe i
risultati sperati in fase di raggruppamento.
Ti riporto un'estratto da MSDN che chiarisce un po'.
ciao.
- DA MSDN: Utilizzo delle proposizioni HAVING e WHERE nella stessa query
In alcuni casi, prima di applicare una condizione ai gruppi (tramite una
proposizione HAVING) può risultare utile escludere singole righe (tramite
una proposizione WHERE).
Una proposizione HAVING è simile a una proposizione WHERE, con la sola
differenza che non viene applicata alle singole righe, ma solo ai gruppi nel
loro insieme, ovvero alle righe del gruppo di risultati che rappresenta i
gruppi. In una query è possibile includere entrambe le proposizioni WHERE e
HAVING. In tal caso:
a.. Viene innanzitutto applicata la proposizione WHERE alle singole righe
nelle origini di input e vengono raggruppate solo le righe che soddisfano le
condizioni della proposizione.
b.. Viene quindi applicata la proposizione HAVING alle righe del gruppo di
risultati ottenuto con il raggruppamento e vengono visualizzati nell'output
della query solo i gruppi che soddisfano le condizioni della proposizione.
La proposizione HAVING può essere applicata solo alle colonne che sono
incluse anche nella proposizione GROUP BY o in una funzione di aggregazione.
Si supponga di unire le tabelle titles e publishers in modo da creare una
query per la visualizzazione del prezzo medio dei libri di un gruppo di
editori. Si supponga inoltre di voler visualizzare soltanto il prezzo medio
di un gruppo specifico di editori, ad esempio gli editori della California,
e infine di voler visualizzare il prezzo medio solo se superiore a 10
dollari.
In questo caso è possibile stabilire la prima condizione includendo una
proposizione WHERE che consente di eliminare gli editori degli stati diversi
dalla California prima del calcolo del prezzo medio. Per la seconda
condizione è necessario utilizzare una proposizione HAVING, in quanto la
condizione si basa sui risultati del raggruppamento e del riepilogo dei
dati. L'istruzione SQL è la seguente:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10 "