2013-02-26 10 views
7

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"

+1

vedi anche: [SQL - vista VS dove] (http://stackoverflow.com/questions/9253244); [WHERE vs HAVING] (http://stackoverflow.com/questions/2905292) – mellamokb

risposta

6

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 

Demo: http://www.sqlfiddle.com/#!2/f6741/16

1

Dove valuta sul livello di riga singola, mentre viene utilizzato per gruppo per espressioni.

3

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à. "

+0

Grazie. Ma conosco la differenza. Perché hai bisogno di usare dove quando tutto può essere raggiunto usando la clausola? – Sethunath

+0

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'. –

+1

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à. "* –

1

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

Problemi correlati