sql >> データベース >  >> RDS >> Database

SQL内部結合

    この記事では、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つの列を連結する関数ですが、これは結合とは無関係です。


    1. SQLServerの現在のデータベースのすべてのファイルグループを返す

    2. psycopg2を使用してpostgresテーブルにデータをインポートする際の値エラー

    3. Android:電話から連絡先をインポートする方法は?

    4. データベース設計者になる方法