sql >> データベース >  >> RDS >> Database

初心者のためのSQLHAVING句

    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)


    1. OracleVirtualBoxのインストール手順

    2. MariaDB JSON_MERGE()の説明

    3. Pythonを使用したデータエンジニアのインタビューの質問

    4. SQLiteで文字列をトリミングする方法