この記事では、INNER JOIN
の概要を説明します SQL、およびいくつかの基本的な例。
SQL INNER JOIN
結合条件に一致する行が両方のテーブルに少なくとも1つある場合、行を返します。両方のテーブルから一致しない行を破棄します。これがデフォルトの結合タイプです。
構文
内部結合を指定するには、次の2つの方法があります。FROM
句(INNER JOIN
を使用 構文)、またはWHERE
を使用する 句。
FROM
で内部結合を指定するには 条項:
SELECT *
FROM Table1 INNER JOIN Table2
ON Table1.Column = Table2.Column;
WHERE
で内部結合を指定するには 条項:
SELECT *
FROM Table1, Table2
WHERE Table1.Column = Table2.Column;
以下はそれぞれの例です。
例
ここに、内部結合を指定する各方法の例があります。
サンプルデータ
まず、例に使用する表を次に示します。
PetTypes
テーブル:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
テーブル:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Owners
テーブル:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | +-----------+-------------+------------+----------------+-------------------+
注:
-
PetTypeId
Pets
の列 テーブルはPetTypeId
の外部キーですPetTypes
の テーブル(そのテーブルの主キーです)。 -
OwnerId
Pets
の列 テーブルはOwnerId
の外部キーですOwners
の列 テーブル。
INNERJOIN構文を使用した例
INNER JOIN
を使用して内部結合を指定する基本的な例を次に示します。 構文。
SELECT
p.PetName,
pt.PetType
FROM Pets p INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
結果:
-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
FROM
で内部結合を指定するには 句では、INNER JOIN
を使用します 。 ON
も使用します 結合された行の各ペアに対して評価される述部を定義するキーワード。
結合タイプに関係なく、列名をテーブル名で修飾します。これを行う理由は、テーブル間の列名に関するあいまいさを回避するためです。両方のテーブルに同じ名前の列が含まれている可能性があり(この例のように)、そのような場合、DBMSは参照している列を認識しません。列名の前にテーブル名を付けると、正しい列を参照していることが保証され、参照している列のあいまいさから生じる可能性のあるエラーを防ぐことができます。
この例では、両方のテーブルにPetTypeId
があります 桁。 Pets.PetTypeId
columnは、PetTypes.PetTypeId
への外部キーです。 そのテーブルの主キーである列。
この例では、すべてのペットが返されることがわかりますが、すべてのペットタイプが返されるわけではありません。 Pets
にはウサギがいません テーブル、つまりRabbits
ペットの種類は返却されません。
Rabbits
の理由 タイプが返されないのは、INNER JOIN
が原因です 結合条件に一致する行が両方のテーブルに少なくとも1つある場合にのみ、行を返します。この場合、Rabbits
1つのテーブル(PetTypes
)にのみ存在します 表)。
結合タイプはオプションです
結合タイプはオプションであることに注意してください。したがって、ほとんどの(すべてではないにしても)DBMSでは、INNER
を省略できます。 キーワード。これを省略すると(つまり、JOIN
のみを指定する場合) )、内部結合であると見なされます。
したがって、上記の例を次のように書き直すことができます。
SELECT
Pets.PetName,
PetTypes.PetType
FROM Pets
JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId;
フォーマット
他のSQLステートメントと同様に、空白やインデントなどを使用してクエリをフォーマットできます。
たとえば、FROM
必要に応じて、句を1行にまとめることができます。
SELECT
Pets.PetName,
PetTypes.PetType
FROM Pets JOIN PetTypes ON Pets.PetTypeId = PetTypes.PetTypeId;
複数のテーブルを結合する大きなテーブルを作成する場合、インデントは非常に役立ちます。
WHERE句を使用した例
上記の結合は、 equi-joinとも呼ばれます。 。等結合は、結合述語に等式比較のみを含む結合です。
WHERE
を使用して内部結合を指定する例を次に示します。 条項:
SELECT
p.PetName,
pt.PetType
FROM
Pets p,
PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;
結果:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
これにより、前の例と同じ結果が返されました。
ここでは、テーブルのコンマ区切りリストを提供し、次にWHERE
を提供しました。 調子。 WHERE
を省略した場合 条件では、CROSS JOIN
になってしまいます。 。
多くの初心者は、上記の構文がINNER JOIN
よりもはるかに理解しやすいと感じています。 構文。必要に応じてこの構文を自由に使用できますが、ほとんどのSQLプロフェッショナルはINNER JOIN
を使用することを好むことに注意してください。 前の例の構文..
3つのテーブルの内部結合
これは、3つのテーブルで内部結合を実行する例です。
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
結果:
+-----------+-----------+---------------+ | PetName | PetType | PetOwner | |-----------+-----------+---------------| | Fluffy | Cat | Nancy Simpson | | Fetch | Dog | Nancy Simpson | | Scratch | Cat | Bart Pitt | | Wag | Dog | Nancy Simpson | | Tweet | Bird | Homer Connery | | Fluffy | Dog | Boris Trump | | Bark | Dog | Bart Pitt | | Meow | Cat | Boris Trump | +-----------+-----------+---------------+ (8 rows affected)
この例では、Owners
を持ってきました 所有者に関する情報を返すためにこのクエリが必要だったため、テーブルをミックスに追加しました。
3番目のテーブルを使用するには、別のINNER JOIN... ON
を追加するだけでした。 関連するテーブル/列の詳細とともに引数。
この場合、T-SQLのCONCAT()
を使用しました 2つの列を連結する関数ですが、これは結合とは無関係です。