Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
W niektórych przypadkach można wykluczyć poszczególne wiersze z grup (przy użyciu WHERE
klauzuli) przed zastosowaniem warunku do grup jako całości (przy użyciu klauzuli HAVING
).
Klauzula HAVING
jest jak klauzula WHERE
, ale dotyczy tylko grup jako całości (czyli wierszy w zestawie wyników reprezentujących grupy), natomiast klauzula WHERE
ma zastosowanie do poszczególnych wierszy. Zapytanie może zawierać zarówno klauzulę, WHERE
jak i klauzulę HAVING
. W takim przypadku:
Klauzula
WHERE
jest stosowana najpierw do poszczególnych wierszy w tabelach lub obiektach wartości tabeli w okienku Diagram . Tylko wiersze spełniające warunki klauzuliWHERE
są grupowane.Klauzula
HAVING
jest następnie stosowana do wierszy w zestawie wyników. W danych wyjściowych zapytania są wyświetlane tylko grupy spełniająceHAVING
warunki. KlauzulęHAVING
można zastosować tylko do kolumn, które również są wyświetlane w klauzuli GROUP BY lub w funkcji agregującej.
Określ klauzule WHERE i HAVING dla dwóch połączonych tabel
Uwaga
Baza danych używana w tym artykule to baza danych pubs
, dostępna jako część przykładowych baz danych Northwind i pubs programu Microsoft SQL Server na GitHubie.
Załóżmy na przykład, że łączysz tabele titles
i publishers
, aby utworzyć zapytanie przedstawiające średnią cenę książki dla zestawu wydawców. Chcesz zobaczyć średnią cenę tylko dla określonego zestawu wydawców - być może tylko wydawców w stanie Kalifornia. A nawet wtedy, chcesz zobaczyć średnią cenę tylko wtedy, gdy wynosi ponad 10,00 USD.
Pierwszy warunek można ustanowić, dołączając klauzulę WHERE
, która odrzuca wszystkich wydawców, którzy nie są w Kalifornii, przed obliczeniem średnich cen. Drugi warunek wymaga klauzuli HAVING
, ponieważ warunek jest oparty na wynikach grupowania i podsumowywania danych. Wynikowa instrukcja SQL może wyglądać następująco:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
W narzędziach Visual Database Tools of SQL Server Management Studio można utworzyć zarówno klauzule, jak HAVING
i WHERE
w okienku Kryteria . Domyślnie jeśli określisz warunek wyszukiwania dla kolumny, warunek stanie się częścią klauzuli HAVING
. Można jednak zmienić warunek na klauzulę WHERE
.
Możesz utworzyć klauzulę WHERE
i klauzulę HAVING
, które dotyczą tej samej kolumny. W tym celu należy dodać kolumnę dwa razy do okienka Kryteria , a następnie określić jedno wystąpienie w ramach HAVING
klauzuli i drugie wystąpienie w ramach klauzuli WHERE
.
Określanie warunku WHERE w zagregowanym zapytaniu
Określ grupy dla zapytania. Aby uzyskać szczegółowe informacje, zobacz Grupowanie wierszy w wynikach zapytania (Visual Database Tools).
Jeśli jeszcze nie jest w okienku Kryteria, dodaj kolumnę, na której chcesz oprzeć
WHERE
warunek.Wyczyść kolumnę Dane wyjściowe , chyba że kolumna danych jest częścią klauzuli GROUP BY lub dołączona do funkcji agregującej.
W kolumnie Filtr określ
WHERE
warunek. Projektant zapytań i widoków dodaje warunek doHAVING
klauzuli instrukcji SQL.Uwaga
Zapytanie pokazane w przykładzie tej procedury łączy dwie tabele
titles
ipublishers
.W tym momencie w zapytaniu instrukcja SQL zawiera klauzulę
HAVING
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
W kolumnie Grupuj według wybierz pozycję Gdzie z listy opcji grupy i podsumowania. Projektant zapytań i widoków usuwa warunek w klauzuli
HAVING
instrukcji SQL i dodaje go do klauzuliWHERE
.Instrukcja SQL zmienia się w celu uwzględnienia klauzuli
WHERE
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;