Różnica pomiędzy having a where w T-SQL

Odpowiedz Nowy wątek
2018-01-12 15:28
Skromny Wąż
0

Czy jest jakaś różnica między tymi zapytaniami? Wiem, że HAVING używa się po GROUP BY, a WHERE przed GROUP BY, ale czy czy jest jeszcze jakaś różnica?

SELECT CustomerID, MIN(OrderID) as FirstOrder, MAX(OrderID) as LastOrder
FROM dbo.Orders
WHERE Country IN(SELECT Country FROM dbo.Customers WHERE Country = 'Germany')
GROUP BY CustomerID
ORDER BY CustomerID 
SELECT CustomerID, MIN(OrderID) as FirstOrder, MAX(OrderID) as LastOrder
FROM dbo.Orders
GROUP BY CustomerID
HAVING CustomerID IN(SELECT CustomerID FROM dbo.Customers WHERE Country = 'Germany')
ORDER BY CustomerID 
edytowany 1x, ostatnio: furious programming, 2018-01-13 00:01

Pozostało 580 znaków

2018-01-12 15:42
1

having odnosi się do grup agregacji, where do rekordów

co ciekawe, zobaczysz na planie wykonania ze i tak najpierw wykona się filtrowanie, tak aby zoptymalizować zapytanie przez redukcję rekordów :)

edytowany 2x, ostatnio: fgaaaal, 2018-01-12 15:50

Pozostało 580 znaków

2018-01-12 15:44
2

Warunki w WHERE działają przed grupowaniem z klauzuli GROUP natomiast HAVING po wykonaniu grupowania.


"Trolling is a art"

Pozostało 580 znaków

2018-01-12 23:50
0

pomijając fakt, że oba są brzydkie to drugie jest bez sensu


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-01-12 23:55
Mały Lew
0

@abrakadaber: dlaczego uważasz że są brzydkie?

Pozostało 580 znaków

2018-01-13 00:10
0

Bo to podzapytanie jest bez sensu. Można w samym WHERE napisac country = 'germany'

Trza by było JOINa zrobić, a to już wyższa szkoła jazdy... - Marcin.Miga 2018-01-13 00:19
@Marcin.Miga: w 1 query nie trzeba, bo SELECT Country FROM dbo.Customers WHERE Country = 'Germany' zwróci relację zawierającą tylko 'Germany' - hauleth 2018-01-13 00:33
@hauleth: A w Orders to kolumna Country w ogóle jest? - Marcin.Miga 2018-01-13 00:36
@Marcin.Miga: wygląda na to, że tak WHERE Country IN(SELECT Country FROM dbo.Customers WHERE Country = 'Germany') - hauleth 2018-01-13 00:37

Pozostało 580 znaków

2018-01-13 02:44
1

Lepszy przykład to sytuacja gdzie masz jakieś funkcje agregujące i to na ich wartości chcesz mieć warunek, wtedy widać jasno czym się różni where od having. Where odnosi się do jednego rekordu a having do wyniku zapytania (lub do każdej grupy, jeśli mamy grupowanie). Wyobraź sobie że chciałbyś wypisać kategorię produktu, dla której średnia cena artykułu jest większa od 50. Więc warunek chcesz postawić na wyniku funkcji agregującej. Nie da się tutaj użyć "where", bo ono odnosi się do ceny jednego produktu. Trzeba napisać jakieś:

SELECT categories.category_name FROM categories INNER JOIN products ON categories.id = products.category_id
GROUP BY categories.category_name
HAVING avg(products.price) > 50

W where nie możesz mieć avg(products.price) bo nie miałoby to sensu, a warunek where products.price > 50 odnosiłby się do każdego produktu z osobna.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2018-01-13 02:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0