2009-11-04 9 views
13

Kann eine WHERE-Klausel nach einer HAVING-Klausel verwendet werden?Es ist möglich, eine WHERE-Klausel nach einer HAVING-Klausel zu haben?

Das erste, was mir in den Sinn kommt, sind Unterabfragen, aber ich bin mir nicht sicher.

P.S. Wenn die Antwort bejahend ist, könnten Sie einige Beispiele geben?

+3

Ist das ein Trick/Interviewfrage, oder haben Sie ein echtes Problem zu lösen? – itsadok

+1

Ja. Die Frage ist von einem Interview. –

Antwort

25

Nein, nicht in derselben Abfrage.

Die where Klausel geht vor der having und der group by.Wenn Sie wollen Datensätze filtern, bevor die Gruppierung die Bedingung in der Klausel where geht, und wenn Sie gruppiert herausfiltern möchten zeichnet die Bedingung in der having Klausel geht:

select ... 
from ... 
where ... 
group by ... 
having ... 

Wenn keiner von denen möglich zu bedienen aus irgendeinem Grund müssen Sie die Abfrage eine Unterabfrage, so dass Sie die where Klausel in der äußeren Abfrage setzen können:

select ... 
from (
    select ... 
    from ... 
    where ... 
    group by ... 
    having ... 
) x 
where ... 
4

Eine HAVING-Klausel ist nur eine WHERE-Klausel nach einer GROUP BY. Warum setzen Sie Ihre WHERE-Bedingungen nicht in die HAVING-Klausel?

+3

+1 Genau. Die WHERE-Klausel nach HAVING heißt AND. – Andomar

+0

Konzeptuell wird die HAVING-Klausel nach der GROUP BY-Operation angewendet, während die WHERE-Klausel zuvor angewendet wurde. Daher könnte theoretisch eine Optimierung durch "Filtern" in der WHERE-Klausel erfolgen. In der Praxis werden Sie (wie immer) darauf achten müssen, wie der Optimierer z. Untersuchen Sie den Ausführungsplan. Denken Sie auch an den menschlichen Leser, der normalerweise erwarten würde, dass das Filtern in der WHERE-Klausel (und nicht in den Join-Klauseln, HAVING-Klauseln usw.) steht. – onedaywhen

2

Von SELECT Hilfe

Verarbeitungsreihenfolge der WHERE, GROUP BY, und having-Klauseln Die folgenden Schritte mit einer WHERE-Klausel, eine GROUP BY-Klausel die Verarbeitungsreihenfolge für eine SELECT- Anweisung zeigen und eine HAVING-Klausel:

Die FROM-Klausel gibt eine ursprüngliche Ergebnismenge zurück.

Die WHERE-Klausel schließt Zeilen nicht aus, die die Suchbedingung erfüllen.

Die GROUP BY-Klausel erfasst die ausgewählten Zeilen in einer Gruppe für jeden eindeutigen Wert in der GROUP BY-Klausel.

Die in der Auswahlliste angegebenen Aggregatfunktionen berechnen die Summenwerte für jede Gruppe.

Die HAVING-Klausel zusätzlich schließt Zeilen aus, die die Suche nicht erfüllen Bedingung.

Also, nein, du kannst nicht.

5

Wenn es eine Trickfrage ist, ist es möglich, wenn das WHERE und das HAVING nicht auf dem gleichen Niveau sind, wie Sie erwähnt haben, mit Unterabfrage.

Ich denke, so etwas wie das

mit dem Wert = (SELECT max (Wert) FROM foo WHERE krit = 123) funktionieren würde

P. S .: warum Sie fragen würde? Haben Sie ein spezifisches Problem?

p.s.s: OK dumm von mir, verpasste ich das "Interview *" tag ...

0

im gleichen Umfang, Antwort ist nein. Wenn Unterabfragen zulässig sind, können Sie die vollständige Verwendung von HAVING vermeiden.

Ich denke HAVING ist ein Anachronismus. Hugh Darwen bezieht sich auf HAVING als "The Folly of Structured Abfragen":

In alten SQL, die WHERE Klausel konnte nicht auf die Ergebnisse der Aggregation verwendet werden, so sie hatten HAVING zu erfinden (mit gleichen Bedeutung wie WHERE):

SELECT D#, AVG(Salary) AS Avg_Sal 
    FROM Emp 
GROUP 
    BY D# 
HAVING AVG(Salary) > 999; 

Aber würden wir jemals HAVING hatte eine, wenn 1979 schreiben konnte:

SELECT * 
    FROM (
     SELECT D#, AVG(Sal) AS Avg_Sal 
      FROM Emp 
     GROUP 
      BY D# 
     ) 
     AS dummy 
WHERE Avg_Sal > 999; 

Ich vermute stark die Antwort auf Darwens Frage ist nein.