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

MySQLのパフォーマンス:SQLのJOINの概要

    この記事では、SQLでテーブルを結合するための基本を学びます。左、右、内側、および外側のJOINについて学習し、それらの使用方法の例を示します。

    RDBMS(リレーショナルデータベース管理システム)のデータは、テーブルにグループ化されます。これらのテーブルには、格納できるデータのタイプが厳密に定義されています。さまざまなテーブルを接続し、相互に関連する可能性のあるさまざまなタイプのデータを接続するために、JOIN句を使用します。

    結合の種類

    JOINには、INNER、OUTER、LEFT、RIGHTの4つの基本的なタイプがあります。 2つのテーブルを接続すると、ON句の条件に基づいて、それぞれが対応するテーブルの異なるサブセットを返します。

    • LEFTおよびRIGHTJOINは同様のタスクを実行します。どちらも、2番目のテーブルに関連する情報を含む1つのテーブル全体を返します。
    • 内部結合と外部結合は非常に異なるタスクを実行します。 INNER JOINは非常に限られた結果を生成しますが、OUTERは完全なデータセットを返します。
    注:この記事の執筆時点では、MariaDBとMySQLは外部結合をサポートしていません。ただし、この出力を別の方法で生成する方法の例を示します。

    この例では、このチュートリアルの営業部門の例を使用しており、営業担当者、注文、顧客の3つのテーブルを使用しています。

    営業担当者テーブルには、ID、名前、手数料率の3つの列があります。

    次に、注文テーブルには、注文ID、注文の合計費用、顧客、および可能な場合は営業担当者の4つの列が含まれます。

    顧客テーブルには、IDと基本的な連絡先情報の2つの列が含まれます。

    これで、さまざまな人々にさまざまな方法で役立つ複数の情報テーブルができました。これらの3つのテーブル(営業担当者、注文、顧客)を使用して、各JOINがどのように役立つかを示す例を示します。

    左参加

    おそらく最も一般的に使用されるタイプのJOINはLEFTJOINです。 2つのテーブルが結合されていると考えると、FROM句で言及されているテーブルが左側にあります。 JOIN句で言及されているものは右側にあります。 LEFT JOINでは、LEFT(またはFROM)テーブルのすべての行が結果に返され、ON句に一致するRIGHT(またはJOIN)テーブルの対応する行にリンクされます。

    左側の一部の行には、右側の一致するデータがない場合があることに注意してください。その場合、結果のRIGHTテーブルから入力されたはずのフィールドにNULL値が入力されます。

    また、RIGHTテーブルの複数の行がLEFTテーブルの行と一致する場合、複数の行が結果セットに含まれます。ベン図は、LEFTJOINがどのように視覚化されるかを示しています。

    マーケティングディレクターは、顧客ごとに分類されたすべての注文に関するレポートを要求します。これにはLEFTJOINを使用できます:

    SELECT *
    FROM orders
    LEFT JOIN customer
    ON orders.customer_id = customer.id;

    このクエリは、「customer」テーブルの行にリンクされた「orders」テーブルのすべてのデータを要求します。ここで、customerのidはcustomer_idと同じです。結果は次のようになります:

    Widgets LLCの顧客の場合、注文が3つあるため、エントリが3つあることに注意してください。 Jolly Inc.は2つの注文を出し、AcmeInc.は1つの注文を出しました。注文がなかったため、Cheapoはこのリストに表示されません。

    右結合

    RIGHTJOINはLEFTJOINと非常に似ていますが、RIGHT(JOIN)テーブルからすべての行を返し、LEFT(FROM)テーブルから対応する行のみを返す点が異なります。この場合も、LEFTテーブルにデータがない場合、それらの列にはNULL値が入力されます。

    LEFTテーブルに複数の行がある場合、結果セットには複数の行があります。そのベン図は次のようになります:

    経営陣がすべての顧客とのレポートを希望する場合。注文しなくても、RIGHTJOINを使用できます。

    SELECT *
    FROM orders
    RIGHT JOIN customer
    ON orders.customer_id = customer.id;

    ここでも、「注文」テーブルから始めて、それを顧客テーブルに結合します。 RIGHT JOINを使用したため、RIGHT(JOIN)テーブルのエントリごとに少なくとも1つの行を取得します。 customer.idとorders.customer_idが一致すると、情報が入力されます。結果には、注文列にNULL値が含まれるCheapoCoが含まれます。

    内部結合

    INNER JOINは、ON句に一致する各列の行のみを返します。右側に一致するものがない場合、左側の行は除外され、その逆も同様です。 INNER JOINのベン図は次のようになります:

    それは給料日であり、給与部門は支払うコミッションの額を知る必要があります。このために、彼らは各営業担当者を通じて出された注文を知る必要があります。すべての注文が営業担当者を経由したわけではないため、それらについては気にしません。このために、内部結合を使用できます:

    SELECT *,cost * commission_rate / 100 AS commission_amount
    FROM orders
    INNER JOIN salespeople
    ON orders.salesperson_id = salespeople.id;

    ここでも、注文テーブルから始めます。今回は、営業担当者テーブルと結合します。注文テーブルに営業担当者テーブルのエントリと一致するエントリがある場合、その行が含まれます。一致しない行にNULL値を入力する代わりに、それらの行は結果で無視されます。

    データベースには、販売額と手数料率だけでなく、計算された手数料も返すように指示していることに注意してください。結果は次のようになります。

    外部参加

    OUTER JOINは、一致するかどうかに関係なくすべてを返します。 LEFTとRIGHTJOINの結果を組み合わせると、OUTERJOINが得られます。 OUTER JOINのベン図は次のようになります:

    今、それは月末であり、セールスマネージャーはすべての売上と支払われたすべてのコミッションを知りたいと思っています。このために、外部結合を使用します:

    SELECT *,cost * commission_rate / 100 AS commission_amount
    FROM orders
    FULL OUTER JOIN salespeople
    ON orders.salesperson_id = salespeople.id;

    給与レポートと同様に、注文と営業担当者への参加から始めます。違いは、OUTER JOINを使用すると、対応する一致がない場合にNULLが入力されたLEFTテーブルとRIGHTテーブルの両方から結果が得られることです。結果は次のようになります:

    ここで、MariaDBとMySQLはOUTERJOINをサポートしていないと言ったことを思い出してください。また、LEFTJOINをRIGHTJOINに追加すると、OUTERJOINが得られるとも述べました。これら2つのシステムの秘訣は、まさにそれを行うことです。 UNION句を使用してこれを実現します。あるクエリの結果を別のクエリに追加します:

    SELECT *,cost * commission_rate / 100 AS commission_amount
    FROM orders
    LEFT JOIN salespeople
    ON orders.salesperson_id = salespeople.id
    UNION
    SELECT *,cost * commission_rate / 100 AS commission_amount
    FROM orders
    RIGHT JOIN salespeople
    ON orders.salesperson_id = salespeople.id;

    結果は次のようになります:

    複数の結合

    JOINを使用すると、3つ以上のテーブルを接続することもできます。顧客と営業担当者の情報を含む完全な販売レポートが必要な場合は、最後に別のJOINを実行するだけです。

    SELECT *
    FROM orders
    LEFT JOIN salespeople
    ON orders.salesperson_id = salespeople.id
    LEFT JOIN customer
    ON customer.id = orders.customer_id;

    この例では、以前と同じように、注文テーブルから始めて、それを営業担当者テーブルに接続します。次のステップは、テーブルを顧客テーブルに結合することです。これにより、注文テーブルにリンクできるすべての情報が入力されます。

    この記事は簡単な紹介であり、SQLでJOINを使用する方法を網羅的に説明することを意図したものではありません。

    この便利なクーポンを今日使用するには、以下をクリックしてください!

    Liquid Webには、業界で最も強力なデータベースサーバーがいくつかあります。これらのサーバーは、企業規模の企業向けに、最小のホームビジネスから最大のマルチデータベースクラスターまでを実行するために利用できます。

    800.580.4985までお電話いただくか、チャットまたはチケットを開いて、経験豊富なソリューションまたはホスティングアドバイザーのいずれかと話し、これらの手法を今日活用する方法を学びましょう。

    シリーズナビゲーション<<前の記事

    1. より高速なデータベースのためのSQLVARCHARデータ型の推奨事項と禁止事項

    2. oracleDATEとTIMESTAMPの違い

    3. MSAccessチームのスペシャルゲストミハルバーと一緒に参加しましょう!

    4. エラー「ORA-01789:クエリブロックの結果列の数が正しくありません」を修正しました