Database
 sql >> база данни >  >> RDS >> Database

SQL HAVING клауза за начинаещи

В SQL, HAVING клаузата може да се използва за определяне на условие за търсене за група или агрегат.

HAVING клаузата обикновено се използва с GROUP BY клауза. В случаите, когато не е, има имплицитна единична, агрегирана група.

HAVING Клаузата е подобна на WHERE клауза, с изключение на WHERE филтрира отделни редове, докато HAVING филтрира групи. WHERE клаузата филтрира данни преди той е групиран, докато HAVING филтрира данни след то е групирано.

Пример 1 – HAVING с COUNT()

Да предположим, че имаме следната таблица:

SELECT * FROM Pets;

Резултат:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Можем да изпълним следната заявка към тази таблица:

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

Резултат:

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

В този случай използвахме HAVING клауза във връзка с GROUP BY клауза за връщане само на онези редове, които имат COUNT(PetTypeId) от по-голямо от 2 . Това използва COUNT() функция, която е стандартна SQL агрегатна функция, налична в повечето основни RDBMS.

Ако пропуснем HAVING клауза, получаваме още един резултат:

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

Резултат:

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

Пример 2 – HAVING с SUM()

Ето още един пример. Този път използваме HAVING клауза с SUM() функция, която е друга обобщена функция, налична в повечето основни RDBMS (вижте SQLite SUM() за друг пример).

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;

Резултат:

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

Пример 3 – HAVING с IN Оператор

Не сте ограничени само до ) Оператор за начинаещи”>по-голям от оператора (> ), когато използвате HAVING клауза. Можете да използвате същите оператори, които можете да използвате с WHERE клауза (като = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE и др.).

Ето пример, който използва IN оператор, за да посочите диапазон от обобщени стойности, които да се връщат.

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;

Резултат:

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

Пример 4 – HAVING без GROUP BY Клауза

Въпреки че HAVING обикновено се използва с GROUP BY клауза, може да се използва и без него. Когато се използва без него, има имплицитна единична, агрегирана група.

Резултатите, които получавате, може да зависят от вашата СУБД, но ето пример, направен в SQL Server.

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

Резултат:

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

Този пример просто връща общото население на всички градове в таблицата.

Ето какво се случва, ако сменим оператора по-голямо от (> ) с оператор по-малко от (< ).

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

Резултат:

(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. Топ 18 безплатни и широко използвани бази данни NoSQL с отворен код

  2. Използване на strace като DG40DBC инструмент за отстраняване на грешки в Linux

  3. Решете между базирано на агент срещу наблюдение без агент

  4. Планове за копаене:Не само за кеша на плановете

  5. SQL АКТУАЛИЗАЦИЯ:Научете как да актуализирате стойности в таблица