SQL GROUPBYステートメントについて知っておくべきことすべて

SQL GROUPBYステートメントについて知っておくべきことすべて

リレーショナルデータベースの能力の多くは、データのフィルタリングとテーブルの結合から得られます。これが、私たちがそもそもそれらの関係を表す理由です。しかし、最新のデータベースシステムは、グループ化というもう1つの価値ある手法を提供します。





グループ化により、データベースから要約情報を抽出できます。結果を組み合わせて、有用な統計データを作成できます。グループ化により、図のリストの平均化などの一般的なケースのコードを作成する必要がなくなります。そしてそれはより効率的なシステムを作ることができます。





GROUP BY句は何をしますか?

GROUP BYは、その名前が示すように、結果をより小さなセットにグループ化します。結果は、グループ化された列の個別の値ごとに1つの行で構成されます。いくつかの共通の値を共有する行を持ついくつかのサンプルデータを見ると、その使用法を示すことができます。





外付けハードドライブのWindows10にファイルをコピーできません

以下は、レコードアルバムを表す2つのテーブルを持つ非常に単純なデータベースです。このようなデータベースは、次の方法で設定できます。 基本的なスキーマを書く 選択したデータベースシステム用。 NS アルバム テーブルには主キーを持つ9つの行があります id 名前、アーティスト、リリース年、販売の列と列:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

NS アーティスト テーブルはさらにシンプルです。 id列とname列の7つの行があります。



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

このような単純なデータセットだけで、GROUPBYのさまざまな側面を理解できます。もちろん、実際のデータセットにはさらに多くの行がありますが、原則は同じです。

単一の列によるグループ化

アーティストごとにアルバムがいくつあるかを調べたいとしましょう。典型的なものから始めましょう 選択する Artist_id列をフェッチするクエリ:





SELECT artist_id FROM albums

これにより、予想どおり、9行すべてが返されます。

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

アーティストごとにこれらの結果をグループ化するには、フレーズを追加します GROUP BY artist_id





SELECT artist_id FROM albums GROUP BY artist_id

これにより、次の結果が得られます。

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

結果セットには7行あり、合計9行から減少しています。 アルバム テーブル。それぞれがユニーク Artist_id 単一の行があります。最後に、実際のカウントを取得するには、 カウント(*) 選択した列へ:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

結果は、IDを持つアーティストの2組の行をグループ化します 26 。データベースにはそれぞれ2枚のアルバムがあります。

関連している: 初心者向けの基本的なSQLコマンドのチートシート

集計関数を使用してグループ化されたデータにアクセスする方法

あなたは使用した可能性があります カウント 特に前に機能する カウント(*) 上に見られるような形。セット内の結果の数をフェッチします。これを使用して、テーブル内のレコードの総数を取得できます。

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNTは集計関数です。この用語は、複数の行の値を単一の値に変換する関数を指します。これらは、GROUPBYステートメントと組み合わせて使用​​されることがよくあります。

行数を数えるだけでなく、グループ化された値に集計関数を適用できます。

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

上記のアーティスト2と6の合計売上は、複数のアルバムの売上を合わせたものです。

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

複数の列によるグループ化

複数の列でグループ化できます。複数の列または式をコンマで区切って含めるだけです。結果は、これらの列の組み合わせに従ってグループ化されます。

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

これは通常、単一の列でグループ化するよりも多くの結果を生成します。

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

小さな例では、2枚のアルバムだけが同じリリース年と販売数(1977年には28枚)を持っていることに注意してください。

便利な集計関数

COUNTの他に、いくつかの関数がGROUPでうまく機能します。各関数は、各結果グループに属するレコードに基づいて値を返します。

  • COUNT()は、一致するレコードの総数を返します。
  • SUM()は、指定された列のすべての値の合計を返します。
  • MIN()は、指定された列の最小値を返します。
  • MAX()は、指定された列の最大値を返します。
  • AVG()は平均を返します。 SUM()/ COUNT()と同等です。

GROUP句なしでこれらの関数を使用することもできます。

グーグルプレイで国を変更する方法
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

WHERE句でGROUPBYを使用する

通常のSELECTと同様に、WHEREを使用して結果セットをフィルタリングできます。

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

これで、アーティストごとにグループ化された、1990年以降にリリースされたアルバムのみがあります。 GROUP BYとは別に、WHERE句で結合を使用することもできます。

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

ただし、集約された列に基づいてフィルタリングしようとすると、次の点に注意してください。

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

エラーが発生します:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

集合データに基づく列は、WHERE句では使用できません。

HAVING句の使用

では、グループ化が行われた後、結果セットをどのようにフィルタリングしますか? NS 持っている 条項はこの必要性を扱います:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

HAVING句はGROUPBYの後にあることに注意してください。それ以外の場合は、基本的にWHEREをHAVINGに置き換えるだけです。結果は次のとおりです。

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

グループ化の前に、WHERE条件を使用して結果をフィルタリングすることもできます。これは、グループ化後にフィルタリングするためのHAVING句と連携して機能します。

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

1990年以降、データベースで複数のアルバムをリリースしたアーティストは1人だけです。

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

結果をGROUPBYと組み合わせる

GROUP BYステートメントは、SQL言語の非常に便利な部分です。たとえば、目次ページのデータの要約情報を提供できます。これは、大量のデータをフェッチするための優れた代替手段です。データベースは、その設計自体がジョブに最適であるため、この余分なワークロードを適切に処理します。

グループ化と複数のテーブルを結合する方法を理解すると、リレーショナルデータベースの機能のほとんどを利用できるようになります。

共有 共有 つぶやき Eメール SQL結合を使用して複数のデータベーステーブルを一度にクエリする方法

SQL結合を使用してクエリを合理化し、時間を節約し、SQLパワーユーザーのように感じさせる方法を学びます。

snapchat2020でストリークを取り戻す方法
次を読む 関連トピック
  • プログラミング
  • SQL
著者について ボビージャック(58の記事が公開されました)

ボビーは、20年のほとんどの間ソフトウェア開発者として働いた技術愛好家です。彼はゲームに情熱を注いでおり、Switch Player Magazineのレビュー編集者として働いており、オンラインパブリッシングとウェブ開発のあらゆる側面に没頭しています。

ボビージャックのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください