Domanda

Devo cercare su Google nel modo sbagliato o sto vivendo un momento stupido nel tempo.

Qual è la differenza tra HAVING e WHERE in un'istruzione SQL SELECT ?

EDIT: ho contrassegnato la risposta di Steven come corretta in quanto conteneva le informazioni chiave sul collegamento:

  

Quando GROUP BY non viene utilizzato, HAVING si comporta come una clausola WHERE

La situazione in cui avevo visto il DOVE non aveva GROUP BY ed è dove è iniziata la mia confusione. Naturalmente, fino a quando non lo sai, non puoi specificarlo nella domanda.

Mille grazie per tutte le risposte che sono state molto illuminanti.

È stato utile?

Soluzione

  

HAVING specifica una condizione di ricerca per a   gruppo o una funzione aggregata utilizzata nell'istruzione SELECT.

Fonte

Altri suggerimenti

HAVING: viene utilizzato per verificare le condizioni dopo l'aggregazione ha luogo.
DOVE: viene utilizzato per verificare le condizioni prima che ha luogo l'aggregazione.

Questo codice:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

Ti dà una tabella di tutte le città in MA e il numero di indirizzi in ogni città.

Questo codice:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

Ti dà una tabella delle città in MA con più di 5 indirizzi e il numero di indirizzi in ogni città.

La differenza numero uno per me: se HAVING fosse rimosso dal linguaggio SQL, la vita andrebbe avanti più o meno come prima. Certamente, una query di minoranza dovrebbe essere riscritta usando una tabella derivata, CTE, ecc. Ma sarebbe probabilmente più facile da capire e mantenere come risultato. Forse il codice di ottimizzazione dei fornitori dovrebbe essere riscritto per tener conto di ciò, ancora una volta un'opportunità di miglioramento nel settore.

Ora considera per un momento la rimozione di DOVE dalla lingua. Questa volta la maggioranza delle query esistenti dovrebbe essere riscritta senza un ovvio costrutto alternativo. I programmatori dovrebbero essere creativi, ad es. join interno a una tabella nota per contenere esattamente una riga (ad es. DUAL in Oracle) utilizzando la clausola ON per simulare la precedente clausola WHERE . Tali costruzioni sarebbero inventate; sarebbe ovvio che mancava qualcosa nella lingua e di conseguenza la situazione sarebbe peggiorata.

TL; DR potremmo perdere HAVING domani e le cose non sarebbero andate peggio, forse meglio, ma lo stesso non si può dire di DOVE .


Dalle risposte qui, sembra che molte persone non si rendano conto che una clausola HAVING può essere usata senza una clausola GROUP BY . In questo caso, la clausola HAVING viene applicata all'intera espressione della tabella e richiede che vengano visualizzate solo le costanti nella clausola SELECT . In genere la clausola HAVING coinvolgerà aggregati.

Questo è più utile di quanto sembri. Ad esempio, considera questa query per verificare se la colonna name è univoca per tutti i valori in T :

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

Esistono solo due possibili risultati: se la clausola HAVING è vera, il risultato sarà una singola riga contenente il valore 1 , altrimenti il ??risultato sarà vuoto set.

La clausola HAVING è stata aggiunta a SQL perché non è stato possibile utilizzare la parola chiave WHERE con le funzioni di aggregazione.

Dai un'occhiata a questo link w3schools per ulteriori informazioni

La sintassi:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

Una query come questa:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

... può essere riscritto usando una tabella derivata (e omettendo il HAVING ) in questo modo:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

La differenza tra i due sta nella relazione con la clausola GROUP BY:

  • DOVE viene prima di GROUP BY; SQL valuta la clausola WHERE prima di raggruppare i record.

  • HAVING viene dopo GROUP BY; SQL valuta HAVING dopo aver raggruppato i record.

 seleziona diagramma delle istruzioni

Riferimenti

HAVING viene utilizzato quando si utilizza un aggregato come GROUP BY .

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

DOVE viene applicato come limitazione sul set restituito da SQL; utilizza le oeprazioni e gli indici dei set predefiniti di SQL ed è quindi il modo più veloce per filtrare i set di risultati. Usa sempre DOVE quando possibile.

HAVING è necessario per alcuni filtri aggregati. Filtra la query DOPO che sql ha recuperato, assemblato e ordinato i risultati. Pertanto, è molto più lento di DOVE e dovrebbe essere evitato tranne nelle situazioni che lo richiedono.

SQL Server ti permetterà di cavartela usando HAVING anche quando DOVE sarebbe molto più veloce. Non farlo.

La clausola WHERE non funziona per le funzioni di aggregazione
significa: non dovresti usare così bonus: nome tabella

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

QUI Invece di usare la clausola WHERE devi usare HAVING ..

senza usare la clausola GROUP BY, la clausola HAVING funziona come la clausola WHERE

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

Differenza b / n DOVE e HAVING :

La principale differenza tra la clausola WHERE e HAVING è, WHERE viene utilizzato per le operazioni di riga e HAVING è utilizzato per operazioni su colonne.

Perché abbiamo bisogno della clausola HAVING ?

Come sappiamo, le funzioni aggregate possono essere eseguite solo su colonne, quindi non possiamo utilizzare le funzioni aggregate nella clausola WHERE . Pertanto, utilizziamo le funzioni aggregate nella clausola HAVING .

Quando GROUP BY non viene utilizzato, le clausole WHERE e HAVING sono sostanzialmente equivalenti.

Tuttavia, quando si utilizza GROUP BY :

  • La clausola WHERE viene utilizzata per filtrare i record da un risultato. Il il filtro si verifica prima di creare qualsiasi raggruppamento.
  • La clausola HAVING viene utilizzata per filtrare i valori da un gruppo (ad esempio, a controllare le condizioni dopo che è stata eseguita l'aggregazione in gruppi).

Risorsa da Qui

Ho avuto un problema e ho scoperto un'altra differenza tra DOVE e HAVING . Non agisce allo stesso modo sulle colonne indicizzate.

DOVE my_indexed_row = 123 mostrerà le righe ed eseguirà automaticamente un " ASC ASC " su altre righe indicizzate.

HAVING my_indexed_row = 123 mostra tutto dal più vecchio " inserito " riga alla più recente, nessun ordine.

Un modo di pensarci è che la clausola having è un filtro aggiuntivo alla clausola where.

Una clausola DOVE viene utilizzata per filtrare i record da un risultato. Il filtro si verifica prima che vengano creati eventuali raggruppamenti. Una clausola HAVING viene utilizzata per filtrare i valori di un gruppo

In una query aggregata, (Qualsiasi query in cui viene utilizzata una funzione aggregata) I predicati in una clausola where vengono valutati prima della generazione del set di risultati intermedi aggregato,

I predicati in una clausola Avere vengono applicati all'insieme di risultati aggregato DOPO che è stato generato. Ecco perché le condizioni predicate sui valori aggregati devono essere inserite nella clausola Avendo, non nella clausola Where e perché è possibile utilizzare gli alias definiti nella clausola Select in una Clausola Have, ma non in una Clausola Where.

La clausola WHERE viene utilizzata per confrontare i valori nella tabella di base, mentre la clausola HAVING può essere utilizzata per filtrare i risultati delle funzioni aggregate nel set di risultati della query Fai clic su qui !

Uso HAVING per vincolare una query in base ai risultati di una funzione aggregata. PER ESEMPIO. seleziona * nel gruppo blahblahblah da QUALCOSA avendo il conteggio (QUALCOSA) > 0

Da qui .

  

lo standard SQL richiede che HAVING   deve fare riferimento solo alle colonne nel file   La clausola GROUP BY o le colonne utilizzate in   funzioni aggregate

al contrario della clausola WHERE che viene applicata alle righe del database

Mentre lavoravo a un progetto, questa era anche la mia domanda. Come indicato sopra, il HAVING verifica la condizione sul risultato della query già trovato. Ma DOVE serve a verificare le condizioni durante l'esecuzione della query.

Lasciami fare un esempio per illustrare questo. Supponiamo di avere una tabella di database come questa.

  

usertable {int userid, date datefield, int dailyincome}

Supponiamo che le seguenti righe siano nella tabella:

  

1, 2011-05-20, 100

     

1, 2011-05-21, 50

     

1, 2011-05-30, 10

     

2, 2011-05-30, 10

     

2, 2011-05-20, 20

Ora, vogliamo ottenere userid e sum (dailyincome) il cui sum(dailyincome)>100

Se scriviamo:

  

SELEZIONA userid, somma (dailyincome) DA userable DOVE   sum (dailyincome) > 100 GROUP BY userid

Questo sarà un errore. La query corretta sarebbe:

  

SELEZIONA userid, somma (dailyincome) DA userable GROUP BY userid HAVE   sum (dailyincome) > 100

Può darsi che l'oggetto di " dove " è una riga, mentre l'oggetto di "avere" è un gruppo. Ho ragione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top