sql >> Databáze >  >> RDS >> Database

SQL HAVING doložka pro začátečníky

V SQL, HAVING klauzuli lze použít k určení podmínky vyhledávání pro skupinu nebo agregaci.

HAVING klauzule se obvykle používá s GROUP BY doložka. V případech, kdy tomu tak není, existuje implicitní jediná agregovaná skupina.

HAVING klauzule je podobná klauzuli WHERE klauzule, kromě toho WHERE filtruje jednotlivé řádky, zatímco HAVING skupiny filtrů. WHERE klauzule filtruje data před je seskupen, zatímco HAVING filtruje data po je seskupena.

Příklad 1 – HAVING s COUNT()

Předpokládejme, že máme následující tabulku:

SELECT * FROM Pets;

Výsledek:

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

Proti této tabulce bychom mohli spustit následující dotaz:

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

Výsledek:

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

V tomto případě jsme použili HAVING klauzule ve spojení s GROUP BY klauzule vrátit pouze ty řádky, které mají COUNT(PetTypeId) větší než 2 . Toto používá COUNT() funkce, což je standardní agregační funkce SQL dostupná ve většině hlavních RDBMS.

Pokud pomineme HAVING klauzule, dostaneme ještě jeden výsledek:

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

Výsledek:

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

Příklad 2 – HAVING pomocí SUM()

Zde je další příklad. Tentokrát použijeme HAVING klauzule s SUM() funkce, což je další agregační funkce dostupná ve většině hlavních RDBMS (viz SQLite SUM() pro další příklad).

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;

Výsledek:

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

Příklad 3 – HAVING s IN Operátor

Nejste omezeni pouze na ) Operátor pro začátečníky”>větší než operátor (> ) při použití HAVING doložka. Můžete použít stejné operátory, které můžete použít s WHERE klauzule (například = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , atd.).

Zde je příklad, který používá IN operátor k určení rozsahu agregovaných hodnot, které se mají vrátit.

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;

Výsledek:

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

Příklad 4 – HAVING bez GROUP BY Ustanovení

Ačkoli HAVING se obvykle používá s GROUP BY doložka, lze ji použít i bez ní. Při použití bez něj existuje implicitní jediná agregovaná skupina.

Výsledky, které získáte, mohou záviset na vašem DBMS, ale zde je příklad, který byl proveden na serveru SQL.

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

Výsledek:

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

Tento příklad jednoduše vrátí celkový počet obyvatel všech měst v tabulce.

Co se stane, když zaměníme operátor větší než (> ) s operátorem menší než (< ).

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

Výsledek:

(0 rows affected)


  1. Běžné otázky a odpovědi na pohovor MySql pro čerstvější a zkušenější

  2. Aktualizujte prohlášení s vnitřním spojením na Oracle

  3. Je do MySQL vloženo nesprávné celé číslo (2147483647)?

  4. Jak převést XMLTYPE ve VARCHAR v ORACLE?