MySQL JOIN ON vs USING ? の違いを徹底解説!

2024-04-02

MySQL JOIN ON vs USING ?

MySQLでテーブルを結合する際、JOIN句にONUSINGの2つのオプションがあります。どちらも同じ結果を返す場合もありますが、それぞれ異なる特徴があり、使い分けが重要です。

ONは、結合条件を指定するオプションです。結合するテーブルの列を比較し、一致する行のみを結果に含めます。

SELECT *
FROM テーブル1
JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

USINGは、結合する列を指定するオプションです。ONと異なり、結合条件は省略されます。両方のテーブルで同じ名前の列が存在する場合、それらの列で結合されます。

SELECT *
FROM テーブル1
JOIN テーブル2
USING (列名);

比較

機能ONUSING
結合条件指定可能省略不可
列名完全一致が必要部分一致でも可
可読性冗長になる場合がある簡潔で分かりやすい
柔軟性高い低い

使い分け

  • 結合条件を明確に記述したい場合はONを使用します。
  • 列名が一致し、シンプルな結合を行う場合はUSINGを使用します。
  • 外部キー制約が定義されている場合は、USINGの方が効率的な場合があります。

注意点

  • USINGは、両方のテーブルで同じ名前の列が存在する場合のみ使用できます。
  • USINGは、結合条件を省略するため、意図しない結果になる可能性があります。

補足

  • NATURAL JOINという、USINGに似たオプションもあります。これは、両方のテーブルで同じ名前の列をすべて使って結合するオプションです。ただし、列名が一致しない場合や、結合条件を明確に記述したい場合は使用しないことを推奨します。
  • 上記の説明は基本的な内容のみです。詳細については、上記の参考資料を参照してください。



-- テーブル定義
CREATE TABLE テーブル1 (
  id INT,
  name VARCHAR(255)
);

CREATE TABLE テーブル2 (
  id INT,
  age INT
);

-- データ挿入
INSERT INTO テーブル1 (id, name) VALUES (1, 'John Doe');
INSERT INTO テーブル1 (id, name) VALUES (2, 'Jane Doe');
INSERT INTO テーブル2 (id, age) VALUES (1, 30);
INSERT INTO テーブル2 (id, age) VALUES (2, 25);

-- 結合
SELECT *
FROM テーブル1
JOIN テーブル2
ON テーブル1.id = テーブル2.id;

-- 結果
-- id | name | id | age
-- -- | -- | -- | --
-- 1 | John Doe | 1 | 30
-- 2 | Jane Doe | 2 | 25

USING

-- テーブル定義
CREATE TABLE テーブル1 (
  id INT,
  name VARCHAR(255)
);

CREATE TABLE テーブル2 (
  id INT,
  age INT
);

-- データ挿入
INSERT INTO テーブル1 (id, name) VALUES (1, 'John Doe');
INSERT INTO テーブル1 (id, name) VALUES (2, 'Jane Doe');
INSERT INTO テーブル2 (id, age) VALUES (1, 30);
INSERT INTO テーブル2 (id, age) VALUES (2, 25);

-- 結合
SELECT *
FROM テーブル1
JOIN テーブル2
USING (id);

-- 結果
-- id | name | age
-- -- | -- | --
-- 1 | John Doe | 30
-- 2 | Jane Doe | 25

解説

上記のサンプルコードでは、ONUSINGを使用して、テーブル1テーブル2を結合しています。

  • ONの場合、テーブル1.idテーブル2.idを比較して、一致する行のみを結果に含めています。
  • USINGの場合、idという名前の列で両方のテーブルを結合しています。

実行結果

両方のコードとも、同じ結果を出力します。

ONUSINGは、どちらもMySQLでテーブルを結合するために使用できるオプションです。それぞれ異なる特徴があり、使い分けが重要です。




MySQLでテーブルを結合するその他の方法

INNER JOINは、結合条件を満たす行のみを結果に含める最も一般的な結合方法です。

SELECT *
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.id = テーブル2.id;

LEFT JOINは、結合条件を満たす行に加えて、左側のテーブルのすべての行を結果に含めます。

SELECT *
FROM テーブル1
LEFT JOIN テーブル2
ON テーブル1.id = テーブル2.id;
SELECT *
FROM テーブル1
RIGHT JOIN テーブル2
ON テーブル1.id = テーブル2.id;
SELECT *
FROM テーブル1
FULL JOIN テーブル2
ON テーブル1.id = テーブル2.id;

CROSS JOINは、すべての行を組み合わせた結果を出力します。

SELECT *
FROM テーブル1
CROSS JOIN テーブル2;
  • 上記以外にも、STRAIGHT_JOINNATURAL JOINなど、いくつかの結合方法があります。
  • 結合方法を選択する際には、必要なデータと結合条件を考慮する必要があります。

mysql join using


テーブル名、列名、大文字小文字…「Unknown Column In Where Clause」エラーの原因と解決策

Unknown Column In Where Clause エラーは、WHERE 句で指定された列が存在しない場合に発生します。このエラーは、テーブル名、列名、または大文字小文字の区別など、さまざまな原因によって発生する可能性があります。...


MySQL の AUTO_INCREMENT と PRIMARY KEY の違い

MySQL テーブルに AUTO_INCREMENT 属性を持つ id 列を追加することで、レコードを挿入するたびに自動的にID番号を割り当てることができます。これは、プライマリキーとして使用する場合に便利です。手順テーブルの変更既存のテーブルに id 列を追加するには、以下の ALTER TABLE ステートメントを使用します。...


【決定版】PHPで簡単操作!MySQLのDATETIME型に1日加算する方法2選

このチュートリアルでは、PHPを使用してMySQLデータベースに格納されているDATETIME型の日付に1日加算する方法を説明します。2つの主要な方法を紹介します。DATE_ADD()関数を使うDateTimeクラスを使うそれぞれの方法について、詳細な説明と具体的なコード例を交えて解説します。...


CASE WHENでNULL値を無視してDISTINCT値をカウントする方法

MySQLでDISTINCT値の出現回数を数えるには、いくつかの方法があります。方法COUNT DISTINCTこの方法は、指定された列のDISTINCT値の数をカウントします。例このクエリは、customersテーブルのcountry列に存在するDISTINCTな国の数をカウントします。...


INFORMATION_SCHEMAデータベースを使って現在選択されているデータベースを確認する方法

このクエリを実行すると、現在選択されているデータベースの名前が表示されます。何も選択されていない場合は NULL が返されます。例:このステートメントを実行すると、すべての MySQL 変数が表示されます。その中に database という変数があり、その値が現在選択されているデータベースの名前になります。...


SQL SQL SQL SQL Amazon で見る



もう迷わない!MySQLのDelete with Joinで複雑な条件に基づいてデータを削除する方法

MySQLで複数のテーブルを結合(JOIN)して、特定の条件に基づいてデータを削除する方法を紹介します。メリット複数のテーブルからデータを結合して、複雑な条件に基づいて削除できる不要なデータを効率的に削除できるSQLの知識を深めることができる


Natural JoinとInner Join: データベース操作の効率化と可読性を高めるためのヒント

概要SQLにおけるNatural JoinとInner Joinは、複数のテーブルを結合する際に使用される重要な操作です。どちらも共通の列に基づいてテーブルを結合しますが、いくつかの重要な違いがあります。Natural Joinは、共通の列名とデータ型を持つすべての列に基づいて2つのテーブルを結合する操作です。つまり、結合条件を明示的に指定する必要がなく、より簡潔な記述が可能となります。