いくつかのMySQLでの結合クエリーの操作方法の概要

9612 ワード

前言
現在、システムのさまざまなビジネスはこのように複雑で、データはデータベース内のさまざまなテーブルに存在しています.このプライマリ・キー、その外部キー、テーブルとテーブルの間にはこれらのプライマリ・キーと外部キーが接続されています.ビジネス操作を行う場合は、複数のテーブル間でsql文を使用して関係を確立し、さまざまなsql操作を行う必要があります.では、sqlを使用して様々な操作を書く場合、どのようにsql文を使用して、複数のテーブルを関連付けてビジネス操作を行うのでしょうか.この文章は、この知識点についてまとめています.
結合クエリーは、2つのテーブル(複数のテーブル)で一致する一般的なデータベース操作です.MySQLデータベースでは、次の結合クエリーがサポートされています.
  • CROSS JOIN(クロスジョイント)
  • INNER JOIN(内部連結)
  • OUTER JOIN(外付け)
  • その他の
  • さまざまな結合操作を行うときは、「SQL論理クエリー文の実行順序」という記事でまとめたSQL論理クエリー文の実行の最初の3つのステップを思い出してください.
  • FROM文(デカルト積)
  • を実行
  • ONフィルタ
  • を実行する.
  • 外部行
  • を追加
    各結合は、FROM句に複数のテーブルが含まれている場合でも、2つのテーブル間でのみ発生します.結合操作のたびに論理クエリ文の最初の3ステップのみが行われ、仮想テーブルが生成されるたびに、この仮想テーブルはFROM文の次のテーブルに順次結合され、FROM文のテーブルが処理されるまで上記の手順を繰り返します.前期準備
     1.テストデータベースTestDBを新規作成します.
          
    
    create database TestDB;
    

    テストテーブルtable 1とtable 2を作成します.
    
       CREATE TABLE table1
       (
         customer_id VARCHAR(10) NOT NULL,
         city VARCHAR(10) NOT NULL,
         PRIMARY KEY(customer_id)
       )ENGINE=INNODB DEFAULT CHARSET=UTF8;
    
       CREATE TABLE table2
       (
         order_id INT NOT NULL auto_increment,
         customer_id VARCHAR(10),
         PRIMARY KEY(order_id)
       )ENGINE=INNODB DEFAULT CHARSET=UTF8;
    
    

    テストデータを挿入します.
    
       INSERT INTO table1(customer_id,city) VALUES('163','hangzhou');
       INSERT INTO table1(customer_id,city) VALUES('9you','shanghai');
       INSERT INTO table1(customer_id,city) VALUES('tx','hangzhou');
       INSERT INTO table1(customer_id,city) VALUES('baidu','hangzhou');
    
       INSERT INTO table2(customer_id) VALUES('163');
       INSERT INTO table2(customer_id) VALUES('163');
       INSERT INTO table2(customer_id) VALUES('9you');
       INSERT INTO table2(customer_id) VALUES('9you');
       INSERT INTO table2(customer_id) VALUES('9you');
       INSERT INTO table2(customer_id) VALUES('tx');
    
    

    準備が終わったら、table 1とtable 2は次のように見えます.
    
       mysql> select * from table1;
       +-------------+----------+
       | customer_id | city   |
       +-------------+----------+
       | 163     | hangzhou |
       | 9you    | shanghai |
       | baidu    | hangzhou |
       | tx     | hangzhou |
       +-------------+----------+
       4 rows in set (0.00 sec)
    
       mysql> select * from table2;
       +----------+-------------+
       | order_id | customer_id |
       +----------+-------------+
       |    1 | 163     |
       |    2 | 163     |
       |    3 | 9you    |
       |    4 | 9you    |
       |    5 | 9you    |
       |    6 | tx     |
       +----------+-------------+
       7 rows in set (0.00 sec)
    
    

    準備の仕事があまり悪くないので、今日のまとめを始めましょう.CROSS JOIN結合(クロス結合)
    CROSS JOINは、2つのテーブルに対してFROM文(デカルト積)操作を実行し、2つのテーブルのすべてのカラムの組合せを返します.左のテーブルにm行データ、右のテーブルにn行データがある場合、CROSS JOINを実行するとm*n行データが返されます.CROSS JOINは、SQL論理クエリ文の実行の最初の3ステップのうちの最初のステップのみを実行します.
    CROSS JOINは何ができますか?CROSS JOINはデカルト積操作のみを行い,フィルタリングは行わないため,実際にはCROSS JOINを用いて大量のテストデータを生成することができる.
    上記のテストデータについて、次のクエリを使用します.
    
    select * from table1 cross join table2;
    
    

    次の結果が得られます.
    
    +-------------+----------+----------+-------------+
    | customer_id | city   | order_id | customer_id |
    +-------------+----------+----------+-------------+
    | 163     | hangzhou |    1 | 163     |
    | 9you    | shanghai |    1 | 163     |
    | baidu    | hangzhou |    1 | 163     |
    | tx     | hangzhou |    1 | 163     |
    | 163     | hangzhou |    2 | 163     |
    | 9you    | shanghai |    2 | 163     |
    | baidu    | hangzhou |    2 | 163     |
    | tx     | hangzhou |    2 | 163     |
    | 163     | hangzhou |    3 | 9you    |
    | 9you    | shanghai |    3 | 9you    |
    | baidu    | hangzhou |    3 | 9you    |
    | tx     | hangzhou |    3 | 9you    |
    | 163     | hangzhou |    4 | 9you    |
    | 9you    | shanghai |    4 | 9you    |
    | baidu    | hangzhou |    4 | 9you    |
    | tx     | hangzhou |    4 | 9you    |
    | 163     | hangzhou |    5 | 9you    |
    | 9you    | shanghai |    5 | 9you    |
    | baidu    | hangzhou |    5 | 9you    |
    | tx     | hangzhou |    5 | 9you    |
    | 163     | hangzhou |    6 | tx     |
    | 9you    | shanghai |    6 | tx     |
    | baidu    | hangzhou |    6 | tx     |
    | tx     | hangzhou |    6 | tx     |
    +-------------+----------+----------+-------------+
    
    

    INNER JOIN結合(内部連結)
    INNER JOINがCROSS JOINよりも強力な点は、INNER JOINがいくつかのフィルタ条件に基づいてテーブル間のデータをマッチングできることです.SQL論理クエリ文の最初の3つのステップでは、INNER JOINは最初のステップと2番目のステップを実行します.すなわち、ステップ3がなく、外部行を追加しないことは、INNER JOINとこれから言うOUTER JOINの最大の違いの一つである.
    INNER JOINを使って調べてみましょう.
    
    select * 
    from table1 
    inner join table2 
    on table1.customer_id=table2.customer_id;
    
    

    次の結果が得られます.
    
    +-------------+----------+----------+-------------+
    | customer_id | city   | order_id | customer_id |
    +-------------+----------+----------+-------------+
    | 163     | hangzhou |    1 | 163     |
    | 163     | hangzhou |    2 | 163     |
    | 9you    | shanghai |    3 | 9you    |
    | 9you    | shanghai |    4 | 9you    |
    | 9you    | shanghai |    5 | 9you    |
    | tx     | hangzhou |    6 | tx     |
    +-------------+----------+----------+-------------+
    
    

    INNER JOINでは、ON条件のフィルタリングを使用していない場合、INNER JOINとCROSS JOINの効果は同じです.ONで設定したフィルタ条件列に同じ名前がある場合、USINGキーワードを使用してONのフィルタ条件を簡単に書くことができます.これにより、sql文を簡略化できます.たとえば、次のようにします.
    
    select * from table1 inner join table2 using(customer_id);
    
    

    実際にsql文を記述する場合、INNERキーワードを省略できます.たとえば、次のようにします.
    
    select * 
    from table1 
    join table2 
    on table1.customer_id=table2.customer_id;
    
    

    しかし、覚えておいてください.これはINNER JOINです.OUTER JOIN接続(外部接続)
    ああ、面接を受けたことがあるのを覚えています.私にこの質問をしたことがあります.では、ここでもう一度よくまとめてください.OUTER JOINにより、いくつかのフィルタ条件に従ってテーブル間のデータをマッチングすることができます.OUTER JOINの結果セットはINNER JOINの結果セットに外部行を加える.つまり、OUTER JOINを使用する場合、SQL論理クエリ文の実行の最初の3ステップは、いずれも1回実行されます.外部行の追加方法については、「SQL論理クエリー文実行順序」という記事の外部行の追加部分を参照してください.
    MySQLデータベースはLEFTOUTER JOINとRIGHT OUTER JOINをサポートしており、INNERキーワードと同様にOUTERキーワードは省略できます.OUTER JOINについても同様にUSINGを用いてON句を簡略化することができる.したがって、次のsql文について説明します.
    
    select * 
    from table1 
    left outer join table2 
    on table1.customer_id=table2.customer_id;
    
    

    このように簡単に書くことができます.
    
    select * 
    from table1 
    left join table2 
    using(customer_id);
    
    

    ただし、INNER JOINとの違いは、OUTER JOINについては、ON(またはusing)句を指定する必要があります.そうしないとMySQLデータベースから異常が放出されます.NATURAL JOIN接続(自然接続)
    NATURAL JOINはINNER(OUTER)JOINとUSINGの組み合わせに等しく、2つのテーブルの同じ名前の列を一致させる役割を果たしています.同様に、NATURAL LEFT(RIGHT)JOINは、LEFT(RIGHT)JOINとUSINGの組み合わせに等しい.例:
    
    select * 
    from table1 
    join table2 
    using(customer_id);
    
    

    
    select * 
    from table1 
    natural join table2;
    
    

    等価.
    たとえば、
    
    select * 
    from table1 
    left join table2 
    using(customer_id);
    
    

    
    select * 
    from table1 
    natural left join table2;
    
    

    等価.STRAIGHT_JOIN結合
    STRAIGHT_JOINは新しい結合タイプではなく、ユーザによるsqlオプティマイザの制御であり、JOINと同等である.STRAGHT経由JOIN,MySQLデータベースは左のテーブルを強制的に先に読み込む.たとえば、次のsql文があります.
    
    explain select * 
    from table1 join table2 
    on table1.customer_id=table2.customer_id;
    
    

    主な出力は次のとおりです.
    
    +----+-------------+--------+------+---------------+
    | id | select_type | table | type | possible_keys |
    +----+-------------+--------+------+---------------+
    | 1 | SIMPLE   | table2 | ALL | NULL     |
    | 1 | SIMPLE   | table1 | ALL | PRIMARY    |
    +----+-------------+--------+------+---------------+
    
    

    MySQLは先に選択したtable 2テーブルで、それからマッチングが行われていることがよくわかります.STRAGHTを指定するとJOIN方式、例えば:
    
    explain select * 
    from table1 straight_join table2 
    on table1.customer_id=table2.customer_id;
    
    

    上記の文の主な出力部分は次のとおりです.
    
    +----+-------------+--------+------+---------------+
    | id | select_type | table | type | possible_keys |
    +----+-------------+--------+------+---------------+
    | 1 | SIMPLE   | table1 | ALL | PRIMARY    |
    | 1 | SIMPLE   | table2 | ALL | NULL     |
    +----+-------------+--------+------+---------------+
    
    

    STRAGHT_を指定するとJOIN方式以降、MySQLはtable 1テーブルを選択してからマッチングします.
    では、読者から聞かれましたが、これは何のメリットがありますか?性能か、それとも性能か.ここではテストデータが少ないので、大量のデータのアクセスを行う場合、STRAGHT_を指定します.JOINはMySQLに左の表を先に読ませ、MySQLが私たちの意思通りに結合操作を完了させる.パフォーマンスの最適化には、STRAGHT_を使用することが考えられます.JOIN. マルチテーブル結合
    上記のすべての例では、私は2つのテーブル間の結合を使用していますが、より多くの場合、私たちは仕事中に2つのテーブルだけでなく、3つ以上のテーブルの結合クエリー操作に関連する可能性があります.
    INNER JOINのマルチテーブル結合クエリーでは、クエリーの結果に影響を与えることなく、テーブルの順序を任意に設定できます.これは、オプティマイザがコストに基づいて質問表の順序を自動的に評価するためです.結合順序を指定したい場合は、上記でまとめたSTRAGHT_を使用します.JOIN.
    一方,OUTER JOINのマルチテーブル結合クエリでは,テーブルの位置が異なり,外部行の追加にかかわる問題があり,最終的な結果に影響を及ぼす可能性がある.まとめ
    これはMySQLの接続操作のすべての内容で、内容は多いが、まだ比較的簡単で、文章の中の例を結びつけて、もう一度自分で実際に操作して、完全に完成することができます.この文章はこうなった.