Newsgroup: it.comp.appl.access
Titolo: differenza nell'utilizzo  tra where e having

Buongiorno a tutti,
 
ho una query di raggruppamento con questo risultato:
 
codice	descrizione
284	ARANCE NAVELLINO
 
per ottenerlo sono validi tutti e due i codici SQL
 
1)
SELECT LISTINO.codice, LISTINO.descrizione
FROM LISTINO
GROUP BY LISTINO.codice, LISTINO.descrizione
HAVING LISTINO.descrizione="arance navellino";
 
2)
SELECT LISTINO.codice, LISTINO.descrizione
FROM LISTINO
WHERE LISTINO.descrizione="arance navellino"
GROUP BY LISTINO.codice, LISTINO.descrizione;
 
la domanda che ho è:
 
quando usare where o having ?
 
grazie per la risposta


WHERE effettua la selezione righe PRIMA del raggruppamento
ed è quindi più efficiente se NON occorre attendere 
il riscontro dei valori possibili nei gruppi per effettuare la selezione righe

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

Ammammata ha detto una cosa che per come l'hai esposta ha dell'assurdo... e non ha nulla di tecnico, magari confrontala.con quello che ha spiegato Giorgio e ti rendi conto.
 
Qui trovi una bella spiegazione sufficientemente tecnica e sufficientemente semplice, che completa il senso di quanto ha giustamente esposto Giorgio. 
 
https://stackoverflow.com/questions/287474/whats-the-difference-between-having-and-where
 
 
@Alex

 Ammammata ha detto una cosa che per come l'hai esposta ha dell'assurdo...
 
quindi ho detto una cosa assurda?


Si decisamente non ha nulla a che vedere con un limite fantasma di 100(n) records è tutt'altro il concetto tecnico che li lega...
 
Assurdo è stato un modo gentile per dire che hai scritto veramente una bestialità... ma se non era chiaro ora spero lo sia.
 
@Alex

 
 
esempio (se mi sbalio mi corigerete):
usi where per filtrare i singoli record con un valore superiore a 100
usi having per filtrare i gruppi di record il cui totale è superiore a 100
-----------------
 
di grazia, dove ho scritto qualcosa che si interpreta "limite fantasma di 
100(n) records" ? ti ricordo che il mio *esempio* fa riferimento al post di 
Giorgio da Prato
 
è vero che l'italiano va "interpretato", come le nostre leggi, ma se parlo 
di "totale" e di "valore" mi sembra chiaro che si tratta di valori SOMMATI, 
e non CONTATI
 
quindi (l'esempio originale non parla di somma, la ho aggiunta io nel mio 
esempio):
 
------------------
 
1)
SELECT LISTINO.codice, LISTINO.descrizione
FROM LISTINO
GROUP BY LISTINO.codice, LISTINO.descrizione
HAVING LISTINO.descrizione="arance navellino";
 
2)
SELECT LISTINO.codice, LISTINO.descrizione
FROM LISTINO
WHERE LISTINO.descrizione="arance navellino"
GROUP BY LISTINO.codice, LISTINO.descrizione;
 
------------------
 
 
se voglio filtrare i record PRIMA di raggrupparli e sommarli, uso WHERE
(considero solo i record dove è verificata la condizione WHERE)
 
se voglio filtrare i *risultati* del raggruppamento e somma, quindi DOPO 
averli usati tutti, uso HAVING 
(faccio tutti i calcoli e raggruppamenti e solo alla fine vado a guardare 
la condizione HAVING che ragiona sui totali)
 
 
chiudo con la considerazione che:
 
WHERE LISTINO.descrizione="arance navellino"
elabora solo quei record che hanno questa descrizione e il risultato finale 
è un solo record
 
HAVING LISTINO.descrizione="arance navellino"
elabora tutti i record, ho un risultato intermedio di N record e di questi 
ne tengo buono uno solo, quello che soddisfa la condizione HAVING
 
quindi, se ho un miliardo di record indicizzati sulla descrizione, allora 
mi conviene usare il metodo WHERE, che mi restringe l'elaborazione ai soli 
che soddisfano la condizione, accorciando i tempi
 
se uso HAVING il sistema deve passarsi tutto il miliardo di record, 
raggrupparli e solo alla fine buttare via tutti i risultati tranne quello 
buono (ma si tratta di una esigenza diversa per cui si deve accettare il 
tempo di elaborazione che serve per completare la query)
 
comunque lasciamo a 
vito.fa...@istitutoalberghieroabano.net
 il commento 
finale 


Allora ho sicuramente frainteso il senso di quel 100mcome fosse un confine discriminante la convenienza invece intendevi il valore del campo:
 
   esempio (se mi sbalio mi corigerete): 
   usi where per filtrare i singoli record con 
   un valore superiore a 100 
   usi having per filtrare i gruppi di record il 
   cui totale è superiore a 100 
 
Scusa l'errore.
@Alex

Il giorno mercoledì 24 aprile 2019 08:47:31 UTC+2, 
vito.f...@istitutoalberghieroabano.net
 ha scritto:

Ciao,
la differenza trà Where e Having sta nel fatto che Having, applicando il criterio dopo che il raggruppamento è stato effettuato, è in grado di operare sul risultato delle funzioni di aggregazione (Sum, Max, ecc.).
Nel caso specifico che hai indicato, non essendo presenti funzioni di aggregazione, il risultato è uguale ma operativamente Where è la via da seguire.
 
Un esempio in cui l'uso di Having è necessario: per estrarre i gruppi di codice e descrizione con descrizione="arance navellino" e con prezzo massimo <=10 sarebbe:
SELECT LISTINO.codice, LISTINO.descrizione, Max(LISTINO.Prezzo) As PrezzoMassimo
FROM LISTINO 
WHERE LISTINO.descrizione="arance navellino" 
GROUP BY LISTINO.codice, LISTINO.descrizione
HAVING Max(LISTINO.Prezzo)<=10;
 
Ciao,
Mat.