サブクエリ(または内部クエリ)は、より大きなクエリの中にネストされた SQL クエリです。サブクエリは最初に実行され、その結果が外部クエリで使用されます。サブクエリは WHERE
、SELECT
、FROM
、および HAVING
句に含まれることがあります。
-
MySQL サーバーに接続する
まず、mysql
クライアントを使用して MySQL サーバーに接続します。MySQL サーバーのユーザー名とパスワードが必要です。この実験では、パスワードなしで root
ユーザーとして接続できると仮定します。
ターミナルを開き、次のコマンドを実行します。
mysql -u root
MySQL プロンプト mysql>
が表示されるはずです。
-
データベースとテーブルを作成する
まだデータベースとテーブルがない場合は、今すぐ作成します。labdb
という名前のデータベースと customers
および orders
テーブルを作成しましょう。
CREATE DATABASE IF NOT EXISTS labdb;
USE labdb;
CREATE TABLE IF NOT EXISTS customers (
customer_id INT PRIMARY KEY,
name VARCHAR(255),
city VARCHAR(255)
);
CREATE TABLE IF NOT EXISTS orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10, 2),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
-
サンプルデータを挿入する
テーブルにいくつかのサンプルデータを挿入します。
INSERT INTO customers (customer_id, name, city) VALUES
(1, 'Alice Smith', 'New York'),
(2, 'Bob Johnson', 'Los Angeles'),
(3, 'Charlie Brown', 'Chicago'),
(4, 'David Lee', 'Houston');
INSERT INTO orders (order_id, customer_id, order_date, total_amount) VALUES
(101, 1, '2023-01-15', 120.00),
(102, 2, '2023-02-20', 80.00),
(103, 1, '2023-03-10', 150.00),
(104, 3, '2023-04-05', 200.00),
(105, 2, '2023-05-12', 110.00),
(106, 4, '2023-06-18', 90.00);
-
WHERE 句でサブクエリを記述する
ここで、合計金額が 100 ドルを超える注文を行った顧客を見つけるクエリを記述します。
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE total_amount > 100);
説明
- サブクエリ
(SELECT customer_id FROM orders WHERE total_amount > 100)
は、total_amount
が 100 を超える orders
テーブルから customer_id
を選択します。
- 外部クエリ
SELECT * FROM customers WHERE customer_id IN (...)
は、customer_id
がサブクエリによって返される customer_id
のセットに含まれる customers
テーブルのすべての列を選択します。
-
クエリを実行する
MySQL クライアントでクエリを実行します。次のような出力が表示されるはずです。
+-------------+-------------+-----------+
| customer_id | name | city |
+-------------+-------------+-----------+
| 1 | Alice Smith | New York |
| 2 | Bob Johnson | Los Angeles |
| 3 | Charlie Brown | Chicago |
+-------------+-------------+-----------+
3 rows in set (0.00 sec)
これは、Alice Smith、Bob Johnson、および Charlie Brown が合計金額が 100 ドルを超える注文を行ったことを示しています。
-
EXISTS を使用した代替方法
EXISTS
演算子を使用して同じ結果を得ることもできます。このアプローチは、特に大規模なデータセットでは、場合によってはより効率的です。
SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id AND o.total_amount > 100
);
このクエリは、各顧客について合計金額が 100 を超える注文が少なくとも 1 件存在するかどうかを確認します。
-
EXISTS クエリを実行する
MySQL クライアントでクエリを実行します。前と同じ出力が表示されるはずです。
+-------------+-------------+-----------+
| customer_id | name | city |
+-------------+-------------+-----------+
| 1 | Alice Smith | New York |
| 2 | Bob Johnson | Los Angeles |
| 3 | Charlie Brown | Chicago |
+-------------+-------------+-----------+
3 rows in set (0.00 sec)
-
クリーンアップ(オプション)
データベースとテーブルをクリーンアップしたい場合は、次のコマンドを実行できます。
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS customers;
DROP DATABASE IF EXISTS labdb;
最後に、exit
と入力して Enter キーを押して MySQL クライアントを終了することを忘れないでください。