Udostępnij za pośrednictwem


Używanie klauzul HAVING i WHERE w tym samym zapytaniu (Visual Database Tools)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 klauzuli WHERE 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ące HAVING 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

  1. Określ grupy dla zapytania. Aby uzyskać szczegółowe informacje, zobacz Grupowanie wierszy w wynikach zapytania (Visual Database Tools).

  2. Jeśli jeszcze nie jest w okienku Kryteria, dodaj kolumnę, na której chcesz oprzeć WHERE warunek.

  3. Wyczyść kolumnę Dane wyjściowe , chyba że kolumna danych jest częścią klauzuli GROUP BY lub dołączona do funkcji agregującej.

  4. W kolumnie Filtr określ WHERE warunek. Projektant zapytań i widoków dodaje warunek do HAVING klauzuli instrukcji SQL.

    Uwaga

    Zapytanie pokazane w przykładzie tej procedury łączy dwie tabele titles i publishers.

    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'
    
  5. 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 klauzuli WHERE.

    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;