INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOINの違い
MySQLで複数のテーブルからデータを抽出するSELECTクエリ
MySQLのSELECTクエリは、データベースからデータを抽出する強力なツールです。複数のテーブルを結合することで、複数のテーブルから関連するデータをまとめて取得できます。
結合の種類
- INNER JOIN: 両方のテーブルで共通する行のみを抽出します。
- LEFT JOIN: 左側のテーブルのすべての行を抽出し、右側のテーブルで一致する行があれば追加します。
- FULL OUTER JOIN: 両方のテーブルのすべての行を抽出し、一致する行は重複して表示されます。
結合条件は、ON句で指定します。共通する列を比較することで、結合する行を指定できます。
例:INNER JOIN
SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
このクエリは、customersテーブルとordersテーブルを結合し、両方のテーブルで共通するid列に基づいてすべての行を抽出します。
例:LEFT JOIN
SELECT *
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
SELECT *
FROM customers
RIGHT JOIN orders
ON customers.id = orders.customer_id;
例:FULL OUTER JOIN
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.id = orders.customer_id;
このクエリは、customersテーブルとordersテーブルのすべての行を抽出し、一致する行は重複して表示されます。
- SELECT句で抽出する列を指定できます。
- ORDER BY句でソート順序を指定できます。
注意事項
- 結合するテーブルには、共通する列が必要です。
- 結合条件は、抽出したいデータに合致する必要があります。
SELECTクエリと結合を使用することで、複数のテーブルから関連するデータをまとめて抽出できます。これは、データ分析やレポート作成などに役立ちます。
SELECT customers.name, orders.product_name
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
SELECT customers.name, orders.product_name
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
このクエリは、customersテーブルのすべての行を抽出し、ordersテーブルで一致する行があれば追加します。結果は、すべての顧客の名前と、注文した商品名 (注文していない場合はNULL) の一覧になります。
SELECT customers.name, orders.product_name
FROM customers
RIGHT JOIN orders
ON customers.id = orders.customer_id;
SELECT customers.name, orders.product_name
FROM customers
FULL OUTER JOIN orders
ON customers.id = orders.customer_id;
複数のテーブルからデータを抽出するその他の方法
サブクエリを使用して、複数のテーブルからデータを抽出できます。サブクエリは、SELECTクエリの内部で実行される別のSELECTクエリです。
例:
SELECT name
FROM customers
WHERE id IN (
SELECT customer_id
FROM orders
);
このクエリは、ordersテーブルで注文した顧客の名前を抽出します。
UNIONを使用して、複数のSELECTクエリの結果を結合できます。
SELECT name
FROM customers
UNION
SELECT product_name
FROM orders;
このクエリは、顧客の名前と商品名のリストを抽出します。
CTE (Common Table Expressions)
CTEを使用して、複雑なクエリをより簡単に記述できます。
WITH t AS (
SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id
)
SELECT name, product_name
FROM t;
mysql sql select