sql >> Database >  >> RDS >> Database

SQL MET clausule voor beginners

In SQL is de HAVING clausule kan worden gebruikt om een ​​zoekvoorwaarde voor een groep of een aggregaat op te geven.

De HAVING clausule wordt meestal gebruikt met de GROUP BY clausule. In gevallen waar dit niet het geval is, is er een impliciete enkele, geaggregeerde groep.

De HAVING clausule is vergelijkbaar met de WHERE clausule, behalve dat WHERE filtert individuele rijen, terwijl HAVING filtert groepen. De WHERE clausule filtert gegevens voor het is gegroepeerd, terwijl HAVING filtert gegevens na het is gegroepeerd.

Voorbeeld 1 – HAVING met COUNT()

Stel dat we de volgende tabel hebben:

SELECT * FROM Pets;

Resultaat:

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

We kunnen de volgende query uitvoeren op deze tabel:

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

Resultaat:

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

In dit geval gebruikten we de HAVING clausule in combinatie met de GROUP BY clausule om alleen die rijen terug te geven die een COUNT(PetTypeId) . hebben groter dan 2 . Dit gebruikt de COUNT() functie, een standaard SQL-aggregaatfunctie die beschikbaar is in de meeste grote RDBMS'en.

Als we de HAVING . weglaten clausule, krijgen we nog een resultaat:

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

Resultaat:

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

Voorbeeld 2 – HAVING met SUM()

Hier is nog een voorbeeld. Deze keer gebruiken we de HAVING clausule met de SUM() functie, een andere verzamelfunctie die beschikbaar is in de meeste grote RDBMS'en (zie SQLite SUM() voor een ander voorbeeld).

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;

Resultaat:

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

Voorbeeld 3 – HAVING met de IN Operator

Je bent niet beperkt tot alleen de ) Operator voor beginners”>groter dan operator (> ) bij gebruik van de HAVING clausule. U kunt dezelfde operators gebruiken die u kunt gebruiken met de WHERE clausule (zoals = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , enz.).

Hier is een voorbeeld dat de IN . gebruikt operator om een ​​bereik van geaggregeerde waarden op te geven dat moet worden geretourneerd.

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;

Resultaat:

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

Voorbeeld 4 – HAVING zonder een GROUP BY Clausule

Hoewel HAVING wordt meestal gebruikt met de GROUP BY clausule, kan het ook zonder worden gebruikt. Bij gebruik zonder is er een impliciete enkele, geaggregeerde groep.

De resultaten die u krijgt, kunnen afhankelijk zijn van uw DBMS, maar hier is een voorbeeld dat in SQL Server is gemaakt.

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

Resultaat:

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

Dit voorbeeld retourneert eenvoudig de totale bevolking van alle steden in de tabel.

Dit gebeurt er als we de operator groter dan (> .) omwisselen ) met een operator kleiner dan (< ).

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

Resultaat:

(0 rows affected)


  1. Vul een tekenreeks in met voorloopnullen zodat deze 3 tekens lang is in SQL Server 2008

  2. sqlite get-veld met meer dan 2 MB

  3. PostgreSQL wiskundige functies

  4. Geavanceerde failover met behulp van post/pre-script hooks