SQLでWHERE句とGROUP BY句を使ってデータをフィルタリングする方法

2024-04-07

SQLクエリ、カウント、グループ化

準備

以下の環境を用意する必要があります。

  • データベース (MySQL、PostgreSQL、SQLiteなど)
  • SQL クエリを実行できるツール (MySQL Workbench、pgAdmin、DB Browser for SQLiteなど)

データ

このチュートリアルでは、以下のサンプルデータを使用します。

CREATE TABLE customers (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  country VARCHAR(255) NOT NULL,
  age INT NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO customers (name, country, age) VALUES
  ('John Doe', 'USA', 30),
  ('Jane Doe', 'USA', 25),
  ('Alice Smith', 'UK', 20),
  ('Bob Smith', 'UK', 22),
  ('Tom Hanks', 'USA', 55),
  ('Sally Field', 'USA', 50);

COUNT()関数は、テーブル内のレコード数をカウントします。

SELECT COUNT(*) FROM customers;

このクエリは、customersテーブル内のすべてのレコード数を返し、6という結果になります。

GROUP BY句は、1つ以上の列に基づいてデータをグループ化します。

SELECT country, COUNT(*)
FROM customers
GROUP BY country;

このクエリは、customersテーブルを国別にグループ化し、各国の顧客数を表示します。

country | COUNT(*)
------- | --------
USA     | 4
UK      | 2

WHERE句は、条件に基づいてレコードをフィルタリングします。

SELECT country, COUNT(*)
FROM customers
WHERE age > 30
GROUP BY country;
country | COUNT(*)
------- | --------
USA     | 2

HAVING句は、グループ化されたデータに対して条件を指定します。

SELECT country, COUNT(*)
FROM customers
GROUP BY country
HAVING COUNT(*) > 1;

このクエリは、顧客数が2人以上の国を表示します。

country | COUNT(*)
------- | --------
USA     | 4

このチュートリアルでは、SQLクエリでデータをどのようにカウントしてグループ化できるかを学びました。

これらの機能を組み合わせることで、さまざまなデータ分析を行うことができます。

練習問題

  • 各国の顧客の平均年齢を求めましょう。
  • 20歳以上の顧客の割合を求めましょう。
  • 各国の顧客数が多い順にリストアップしましょう。



各国の顧客の平均年齢

SELECT country, AVG(age)
FROM customers
GROUP BY country;
country | AVG(age)
------- | --------
USA     | 42.5
UK      | 21

20歳以上の顧客の割合

SELECT COUNT(*) AS total_customers,
  COUNT(CASE WHEN age >= 20 THEN 1 END) AS adult_customers,
  ROUND(COUNT(CASE WHEN age >= 20 THEN 1 END) / COUNT(*) * 100, 2) AS percentage
FROM customers;

このクエリは、20歳以上の顧客の割合を表示します。

total_customers | adult_customers | percentage
--------------- | --------------- | --------
6              | 5              | 83.33%

各国の顧客数が多い順にリストアップ

SELECT country, COUNT(*) AS customer_count
FROM customers
GROUP BY country
ORDER BY customer_count DESC;
country | customer_count
------- | --------
USA     | 4
UK      | 2



データをカウントしてグループ化する他の方法

ウィンドウ関数は、グループ内のデータに対して計算を行う関数です。

SELECT name, country,
  COUNT(*) OVER (PARTITION BY country) AS customer_count
FROM customers;

サブクエリは、別のクエリの結果を返すクエリです。

SELECT country, (
  SELECT COUNT(*)
  FROM customers
  WHERE country = c.country
) AS customer_count
FROM customers AS c
GROUP BY country;

結合は、複数のテーブルを結合する操作です。

SELECT c.country, COUNT(*) AS customer_count
FROM customers AS c
INNER JOIN (
  SELECT country
  FROM customers
  GROUP BY country
  HAVING COUNT(*) > 1
) AS g ON c.country = g.country;
  • シンプルなクエリの場合は、GROUP BY句を使うのが最も簡単です。
  • より複雑なクエリの場合は、ウィンドウ関数やサブクエリを使う必要がある場合があります。
  • 複数のテーブルからデータを取得する場合は、結合を使う必要があります。

sql


SQLで売上分析をレベルアップ!GROUP BYとMAX(DATE)関数を使って顧客ごとの最新購入を把握する方法

このチュートリアルでは、SQLにおけるGROUP BYと**MAX(DATE)**関数を使って、特定のグループにおける最大日付を取得する方法を解説します。対象読者このチュートリアルは、SQLの基本的な知識を持つ読者を対象としています。前提知識...


SSMS、T-SQL、PowerShell を駆使した SQL Server 2008 ユーザー権限付与

SQL Server Management Studio (SSMS) を使用するSSMS を開き、該当する SQL Server インスタンスに接続します。オブジェクト エクスプローラーで、権限を付与するデータベースを展開します。セキュリティ フォルダを展開し、ユーザー フォルダを選択します。...


BULK INSERTを使ってCSVファイルをSQL Serverにインポートする方法

CSVファイルは、カンマ区切りでデータを記述したファイルフォーマットです。シンプルな構造のため、様々なツールで扱えます。一方、SQL Serverは、データベース管理システムです。CSVファイルのデータをSQL Serverにインポートすることで、データ分析や管理が容易になります。...


データベース容量の肥大化を防ごう!SQL Server データベースのサイズを確認する方法

クエリを使用するこのクエリを実行すると、以下の情報を含む結果セットが返されます。データベースの名前データベース ファイルの物理的な場所データベース ファイルが占有する予約済みスペース (MB および GB)システム ビューを使用するSQL Server 2008 以降では、sys...


状況別!PostgreSQLで結合テーブルから1行だけ抽出する方法

シナリオ 1: 結合条件に基づいて 1 行を抽出する最も単純な方法は、WHERE 句を使用して結合条件を指定し、一致する行を 1 行のみ抽出する方法です。例えば、顧客テーブル (customers) と注文テーブル (orders) を結合し、特定の顧客 ID に紐づく最新の注文のみを取得する場合、以下のクエリを実行できます。...