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
- 1. Quando hai troppi tavoli?
- 2. Perché hai 2 storyboard quando c'è il layout automatico?
- 3. Quando hai usato la parola chiave 'mutabile' C++?
- 4. Quando hai bisogno di "int" in C++?
- 5. Perché hai deciso di "contro" usare Erlang?
- 6. Dove/quando usiamo JSON?
- 7. Hai sempre bisogno di una classe ObjectFactory quando usi JAXB?
- 8. Perché hai bisogno di un percorso definito per Html.Action?
- 9. Perché dovrei aver bisogno di una conversione?
- 10. Perché rilasciare una proprietà che hai già impostato su zero?
- 11. Hai scritto funzioni molto lunghe? Se è così, perché?
- 12. Perché hai bisogno di lambda per nidificare defaultdict?
- 13. Chiudi la connessione della mangusta quando hai finito
- 14. Perché ottengo risultati diversi quando si confrontano stringhe dopo aver utilizzato una concatenazione diversa in Java?
- 15. Dove recuperare lo stato iniziale quando si usa flummox (flusso)?
- 16. Dove e perché aggiungere repository su build.gradle
- 17. Java Quicksort perché/dove cambiano i valori?
- 18. Dove e perché usiamo __toString() in PHP?
- 19. HttpRouteBuilder - Dove è andato e perché?
- 20. Dove si trova l'ordinamento utilizzato nella fase MapReduce e perché?
- 21. Hai problemi con indefinito! == undefined
- 22. Quando e dove impostare un IOperationInvoker personalizzato?
- 23. dove la memoria allocata quando dichiariamo statico?
- 24. Dove e quando utilizzare LINQ to Objects?
- 25. riempimento punto SMTP .. quando e dove farlo?
- 26. Perché la GUI rimane bloccata anche dopo aver usato SwingUtilities.invokeLater?
- 27. Perché la console si chiude dopo aver incluso cin.get()?
- 28. Perché IsDisposed restituisce false dopo aver chiamato Dispose()?
- 29. Hai bisogno di aiuto capire MySQL iniezione
- 30. Come disabilitare il messaggio Devises - "Hai già effettuato l'accesso." - quando si reindirizza l'indice degli utenti?
vedi anche: [SQL - vista VS dove] (http://stackoverflow.com/questions/9253244); [WHERE vs HAVING] (http://stackoverflow.com/questions/2905292) – mellamokb