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()
を使用します 関数。これは、ほとんどの主要なRDBMSで使用可能なSQL標準の集計関数です。
HAVING
を省略した場合 句、もう1つの結果が得られます:
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で使用できるもう1つの集約関数です(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
で使用できるのと同じ演算子を使用できます 句( =
など) 、)初心者向け演算子"> <
、 =)初心者向け演算子>>> =
、 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
で使用されます 句、それなしでも使用できます。それなしで使用すると、暗黙の単一の集約されたグループが存在します。
得られる結果はDBMSによって異なる場合がありますが、SQLServerで実行された例を次に示します。
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)