sql >> Databasteknik >  >> RDS >> Database

SQL HAVING-klausul för nybörjare

I SQL, HAVING sats kan användas för att ange ett sökvillkor för en grupp eller ett aggregat.

HAVING satsen används vanligtvis med GROUP BY klausul. I de fall det inte är det, finns det en implicit enskild, aggregerad grupp.

HAVING satsen liknar WHERE sats, förutom att WHERE filtrerar enskilda rader, medan HAVING filtrerar grupper. WHERE klausul filtrerar data före den är grupperad, medan HAVING filtrerar data efter den är grupperad.

Exempel 1 – HAV med COUNT()

Anta att vi har följande tabell:

SELECT * FROM Pets;

Resultat:

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

Vi kan köra följande fråga mot den här tabellen:

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

Resultat:

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

I det här fallet använde vi HAVING sats i kombination med GROUP BY sats för att returnera bara de rader som har en COUNT(PetTypeId) större än 2 . Detta använder COUNT() funktion, som är en aggregerad SQL-standardfunktion tillgänglig i de flesta större RDBMS:er.

Om vi ​​utelämnar HAVING klausul får vi ett resultat till:

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

Resultat:

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

Exempel 2 – HAV med SUM()

Här är ett annat exempel. Den här gången använder vi HAVING sats med SUM() funktion, som är en annan aggregatfunktion tillgänglig i de flesta större RDBMS:er (se SQLite SUM() för ett annat exempel).

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;

Resultat:

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

Exempel 3 – HAV med IN Operatör

Du är inte begränsad till bara ) Operatör för nybörjare">större än operatör (> ) när du använder HAVING klausul. Du kan använda samma operatorer som du kan använda med WHERE klausul (som = , ) Operatör för nybörjare">< , =) Operatör för nybörjare">>= , IN , GILLA , etc).

Här är ett exempel som använder IN operatorn för att ange ett intervall av aggregerade värden som ska returneras.

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;

Resultat:

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

Exempel 4 – HAV utan en GROUP BY Klausul

Även om HAV används vanligtvis med GROUP BY klausul kan den också användas utan den. När den används utan den finns det en implicit enkel, aggregerad grupp.

Resultaten du får kan bero på ditt DBMS, men här är ett exempel som gjordes i SQL Server.

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

Resultat:

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

Detta exempel returnerar helt enkelt den aggregerade befolkningen för alla städer i tabellen.

Det här är vad som händer om vi byter ut operatorn större än (> ) med en mindre än-operator (< ).

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

Resultat:

(0 rows affected)


  1. Returnera partitionsnumret för varje rad när du frågar efter en partitionerad tabell i SQL Server (T-SQL)

  2. Transponera dynamiska kolumner till rader

  3. Lista över datum- och tidsfunktioner i SQL Server (T-SQL)

  4. Som skiftlägeskänslig i MySQL