So che questo è molto discusso, ma nessuna delle mie ricerche potrebbe convincermi della differenza tra le clausole "where
" e "having
" in MySQL. Da quello che capisco, possiamo ottenere tutto ciò che può essere fatto con la clausola 'where' usando 'having
'. Per es. select * from users having username='admin'
. Allora perché hai bisogno della clausola 'where
'? L'utilizzo di dove effettuare le differenze di prestazioni?Perché hai "dove" quando c'è "aver"
risposta
I WHERE
filtri clausola dati dalla sorgente prima inerti, considerando che sono stati applicati filtri HAVING
clausola dati dopo il GROUP BY
. In genere, questo significa che qualsiasi filtro non aggregato può essere visualizzato in entrambe le posizioni, ma se si dispone di una colonna a cui non si fa riferimento nella query, è possibile filtrarla solo in una clausola WHERE
.
Per esempio, se avete la seguente tabella:
| ID | VALUE |
--------------
| 1 | 15 |
| 2 | 15 |
| 3 | 20 |
| 4 | 20 |
| 5 | 25 |
| 6 | 30 |
| 7 | 40 |
si supponga di voler applicare la seguente query:
select value, count(value)
from Table1
group by value
Ma si voleva solo per includere righe in cui ID > 2
. Se lo si inserisce in una clausola HAVING
, si otterrà un error, perché la colonna ID
non è disponibile per il post aggregato in quanto non è nella clausola SELECT
.In tal caso, si sarebbero tenuti ad utilizzare una clausola WHERE
invece:
select value, count(value)
from Table1
where id > 2
group by value
Dove valuta sul livello di riga singola, mentre viene utilizzato per gruppo per espressioni.
La differenza tra HAVING
da WHERE
clausola è che HAVING
supporta colonne aggregate mentre WHERE
non perché è applicabile solo per singole righe., EG
SELECT ID
FROM tableName
GROUP BY ID
HAVING COUNT(ID) > 1 --- <<== HERE
Dalla documentazione MySQL,
"È possibile utilizzare Alias se si utilizza HAVING anziché WHERE questa è una delle differenze definite tra le due clausole. Avere è anche più lento e non sarà operativo timized, ma se stai piazzando una funzione complessa come questa nel tuo dove ovviamente non ti aspetti una grande velocità. "
Grazie. Ma conosco la differenza. Perché hai bisogno di usare dove quando tutto può essere raggiunto usando la clausola? – Sethunath
nell'esempio fanno la stessa cosa ma se sei un buon sviluppatore sql dovresti sapere dove usare entrambe le parole chiave. 'WHERE' viene valutato prima della clausola' HAVING'. –
Dai documenti MySQL, * "È possibile utilizzare Alias se si utilizza HAVING anziché WHERE questa è una delle differenze definite tra le due clausole. Avere è anche più lento e non sarà ottimizzato, ma se si sta posizionando una funzione complessa come questo nel tuo dove ovviamente non ti aspetti una grande velocità. "* –
Con la clausola HAVING
, è possibile specificare una condizione di filtrare gruppi al contrario di filtraggio singole righe, che avviene nella fase WHERE
.
Solo i gruppi per i quali l'espressione logica nella clausola 017 valuta come TRUE vengono restituiti dalla fase HAVING
. I gruppi per i quali viene valutata l'espressione logica a FALSE or UNKNOWN
vengono filtrati.
Se non si utilizza GROUP BY
, HAVING
si comporta come una clausola WHERE
. Per quanto riguarda confronto delle prestazioni consulta questo article
vedi anche: [SQL - vista VS dove] (http://stackoverflow.com/questions/9253244); [WHERE vs HAVING] (http://stackoverflow.com/questions/2905292) – mellamokb