この記事では、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 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | +-----------+-------------+------------+----------------+-------------------+
注:
-
PetTypeIdPetsの列 テーブルはPetTypeIdの外部キーですPetTypesの テーブル(そのテーブルの主キーです)。 -
OwnerIdPetsの列 テーブルは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つの列を連結する関数ですが、これは結合とは無関係です。