Database
 sql >> Baza danych >  >> RDS >> Database

Klauzula SQL HAVING dla początkujących

W SQL HAVING klauzula może być użyta do określenia warunku wyszukiwania dla grupy lub agregatu.

HAVING klauzula jest zwykle używana z GROUP BY klauzula. W przypadkach, w których tak nie jest, istnieje domniemana pojedyncza, zagregowana grupa.

HAVING klauzula jest podobna do WHERE klauzula, z wyjątkiem tego, że WHERE filtruje poszczególne wiersze, natomiast HAVING filtruje grupy. WHERE klauzula filtruje dane przed jest zgrupowany, podczas gdy HAVING filtruje dane po jest zgrupowany.

Przykład 1 – HAVING z COUNT()

Załóżmy, że mamy następującą tabelę:

SELECT * FROM Pets;

Wynik:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

W tej tabeli moglibyśmy uruchomić następujące zapytanie:

SELECT 
    PetTypeId, 
    COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;

Wynik:

+-------------+---------+
| PetTypeId   | Count   |
|-------------+---------|
| 3           | 4       |
| 2           | 3       |
+-------------+---------+

W tym przypadku użyliśmy HAVING klauzula w połączeniu z GROUP BY klauzula zwracająca tylko te wiersze, które mają COUNT(PetTypeId) większej niż 2 . Używa COUNT() function, która jest standardową funkcją agregującą SQL dostępną w większości głównych systemów zarządzania bazą danych (RDBMS).

Jeśli pominiemy HAVING klauzula, otrzymujemy jeszcze jeden wynik:

SELECT 
    PetTypeId, 
    COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;

Wynik:

+-------------+---------+
| PetTypeId   | Count   |
|-------------+---------|
| 3           | 4       |
| 2           | 3       |
| 1           | 1       |
+-------------+---------+

Przykład 2 – HAVING z SUM()

Oto kolejny przykład. Tym razem używamy HAVING klauzula z SUM() funkcja, która jest kolejną funkcją agregującą dostępną w większości głównych RDBMS (zobacz SQLite SUM() dla innego przykładu).

SELECT
    CountryCode,
    District,
    SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;

Wynik:

+---------------+-----------------+--------------+
| CountryCode   | District        | Population   |
|---------------+-----------------+--------------|
| AGO           | Luanda          | 2022000      |
| AUS           | New South Wales | 3993949      |
| AUS           | Queensland      | 1805236      |
| AUS           | Victoria        | 2990711      |
| AUS           | West Australia  | 1096829      |
+---------------+-----------------+--------------+

Przykład 3 – HAVING z IN Operator

Nie jesteś ograniczony tylko do operatora ) dla początkujących”>większego niż operator (> ) podczas korzystania z HAVING klauzula. Możesz użyć tych samych operatorów, których używasz z WHERE klauzula (np. = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE itp.).

Oto przykład, który używa IN operatora, aby określić zakres wartości zagregowanych do zwrócenia.

SELECT
    CountryCode,
    District,
    SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) IN (2022000, 3993949, 2990711)
ORDER BY CountryCode;

Wynik:

+---------------+-----------------+--------------+
| CountryCode   | District        | Population   |
|---------------+-----------------+--------------|
| AGO           | Luanda          | 2022000      |
| AUS           | New South Wales | 3993949      |
| AUS           | Victoria        | 2990711      |
+---------------+-----------------+--------------+

Przykład 4 – HAVING bez GROUP BY Klauzula

Chociaż HAVING jest zwykle używany z GROUP BY klauzuli, można jej używać również bez niej. Gdy jest używany bez tego, istnieje domniemana pojedyncza, zagregowana grupa.

Otrzymane wyniki mogą zależeć od twojego DBMS, ale oto przykład, który został zrobiony w SQL Server.

SELECT
    SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;

Wynik:

+--------------+
| Population   |
|--------------|
| 1429559884   |
+--------------+

Ten przykład po prostu zwraca łączną populację wszystkich miast w tabeli.

Oto, co się stanie, jeśli zamienimy operator większe niż (> ) z operatorem mniej niż (< ).

SELECT
    SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;

Wynik:

(0 rows affected)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać kolumnę w SQL

  2. SQL między operatorem

  3. Operator SQL LIKE dla początkujących

  4. Czy powinienem używać NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT lub NOT EXISTS?

  5. Co mają wspólnego igrzyska olimpijskie, mecze piłkarskie UEFA Euro 2016 i bazy danych?