Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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
WHEREjest stosowana najpierw do poszczególnych wierszy w tabelach lub obiektach wartości tabeli w okienku Diagram . Tylko wiersze spełniające warunki klauzuliWHEREsą grupowane.Klauzula
HAVINGjest następnie stosowana do wierszy w zestawie wyników. W danych wyjściowych zapytania są wyświetlane tylko grupy spełniająceHAVINGwarunki. KlauzulęHAVINGmożna zastosować tylko do kolumn, które również są wyświetlane w klauzuliGROUP BYlub 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ć
WHEREwarunek.Wyczyść kolumnę Dane wyjściowe , chyba że kolumna danych jest częścią
GROUP BYklauzuli lub dołączona do funkcji agregującej.W kolumnie Filtr określ
WHEREwarunek. Projektant zapytań i widoków dodaje warunek doHAVINGklauzuli instrukcji SQL.Uwaga
Zapytanie pokazane w przykładzie tej procedury łączy dwie tabele
titlesipublishers.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
HAVINGinstrukcji 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;