SQLで結合を使用する方法

提供:Dev Guides
移動先:案内検索

序章

多くのデータベース設計では、特定のデータポイント間の関係に基づいて、情報をさまざまなテーブルに分けています。 このような場合でも、一度に複数のテーブルから情報を取得したい場合があります。

1つのStructuredQuery Language (SQL)操作で複数のテーブルのデータにアクセスする一般的な方法は、テーブルをJOIN句と組み合わせることです。 関係代数の結合演算に基づいて、JOIN句は、相互に関連する各テーブルの行を照合することにより、個別のテーブルを結合します。 通常、この関係は、あるテーブルの外部キーや別のテーブルの主キーなど、共通の値を共有する1対の列(各テーブルから1つ)に基づいています。キーリファレンス。

このガイドでは、JOIN句を含むさまざまなSQLクエリを作成する方法の概要を説明します。 また、さまざまなタイプのJOIN句、それらが複数のテーブルからのデータを組み合わせる方法、および列名をエイリアスしてJOIN操作の記述を面倒にする方法についても説明します。

前提条件

このガイドに従うには、SQLを使用するある種のリレーショナルデータベース管理システム(RDBMS)を実行しているコンピューターが必要です。 このガイドの手順と例は、次の環境を使用して検証されています。

  • Ubuntu 20.04 初期サーバーセットアップガイドで説明されているように、管理者権限を持つ非rootユーザーとUFWで構成されたファイアウォールを備えたUbuntu20.04を実行しているサーバー。
  • Ubuntu 20.04にMySQLをインストールする方法で概説されているように、MySQLがサーバーにインストールされて保護されています。 このガイドは、ステップ3 で説明されているように、新しく作成されたユーザーによって検証されました。

:多くのRDBMSは、独自のSQL実装を使用していることに注意してください。 このチュートリアルで概説されているコマンドはほとんどのRDBMSで機能しますが、MySQL以外のシステムでテストした場合、正確な構文または出力が異なる場合があります。


  • また、JOIN操作の使用を練習するために使用できるサンプルデータがロードされたいくつかのテーブルを含むデータベースも必要です。 MySQLサーバーに接続し、このガイド全体の例で使用されるテストデータベースを作成する方法の詳細については、次のMySQLへの接続とサンプルデータベースのセットアップセクションを実行することをお勧めします。

このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルクエリを試すこともできます。 次のLaunch an Interactive Terminal!ボタンをクリックして開始します。

インタラクティブターミナルを起動します!

MySQLへの接続とサンプルデータベースの設定

SQLデータベースシステムがリモートサーバーで実行されている場合は、ローカルマシンからサーバーにSSHで接続します。

ssh sammy@your_server_ip

次に、MySQLサーバープロンプトを開き、sammyをMySQLユーザーアカウントの名前に置き換えます。 このページに埋め込まれたインタラクティブ端末を使用している場合、プロンプトが表示されたときに使用するパスワードはsecretという単語であることに注意してください。

mysql -u sammy -p

joinsDBという名前のデータベースを作成します。

CREATE DATABASE joinsDB;

データベースが正常に作成されると、次のような出力が表示されます。

OutputQuery OK, 1 row affected (0.01 sec)

joinsDBデータベースを選択するには、次のUSEステートメントを実行します。

USE joinsDB;
OutputDatabase changed

joinsDBを選択した後、その中にいくつかのテーブルを作成します。 このガイドで使用されている例では、工場を運営していて、SQLデータベースで製品ライン、営業チームの従業員、および会社の売上に関する情報の追跡を開始することを決定したとします。 最初に3つのテーブルから始めることを計画しており、最初のテーブルには製品に関する情報が格納されます。 この最初のテーブルには3つの列が必要であると判断します。

  • productID:各製品の識別番号。intデータ型で表されます。 この列は、テーブルの主キーとして機能します。つまり、各値は、それぞれの行の一意の識別子として機能します。 主キーのすべての値は一意である必要があるため、この列にもUNIQUE制約が適用されます
  • productName:各製品の名前。最大20文字のvarcharデータ型を使用して表されます。
  • pricedecimalデータ型を使用して表された各製品の価格。 このステートメントは、この列の値が最大4桁の長さに制限され、そのうちの2桁が小数点の右側にあることを指定します。 したがって、この列で許可される値の範囲は、-99.99から99.99になります。

次の3つの列を持つproductsという名前のテーブルを作成します。

CREATE TABLE products (
productID int UNIQUE,
productName varchar(20),
price decimal (4,2),
PRIMARY KEY (productID)
);

2番目のテーブルには、会社の営業チームの従業員に関する情報が格納されます。 このテーブルにも3つの列が必要であると判断しました。

  • empIDproductID列と同様に、この列には、intデータ型で表される営業チームの各従業員の一意の識別番号が保持されます。 同様に、この列にはUNIQUE制約が適用され、teamテーブルの主キーとして機能します。
  • empName:最大20文字のvarcharデータ型を使用して表された各営業担当者の名前
  • productSpecialty:営業チームの各メンバーには、専門分野として製品が割り当てられています。 彼らはあなたの会社が作るどんな製品でも売ることができます、しかし彼らの全体的な焦点は彼らが専門とするどんな製品にもなります。 これを表に示すために、各従業員が専門とする製品のproductID値を保持するこの列を作成します。

productSpecialty列が有効な製品ID番号を表す値のみを保持するようにするには、productsテーブルのproductID列。 外部キー制約は、それが適用される列の値が、それが参照する列にすでに存在している必要があることを要求することによって、2つのテーブル間の関係を表現する方法です。 次のCREATE TABLEステートメントでは、FOREIGN KEY制約により、teamテーブルのproductSpecialty列に追加された値がproductsテーブルのproductID列。

次の3つの列を使用して、teamという名前のテーブルを作成します。

CREATE TABLE team (
empID int UNIQUE,
empName varchar(20),
productSpecialty int,
PRIMARY KEY (empID),
FOREIGN KEY (productSpecialty) REFERENCES products (productID)
);

最後に作成するテーブルには、会社の売上の記録が保持されます。 このテーブルには4つの列があります。

  • saleIDproductIDおよびempID列と同様に、この列はintデータ型で表される各販売の一意の識別番号を保持します。 この列にはUNIQUE制約もあるため、salesテーブルの主キーとして機能できます。
  • quantity:販売された各製品のユニット数。intデータ型で表されます。
  • productID:販売された製品の識別番号。intで表されます。
  • salesperson:販売を行った従業員の識別番号

teamテーブルのproductSpecialty列と同様に、[X102X]制約をproductID列とsalesperson列の両方に適用することにしました。 これにより、これらの列には、productsテーブルのproductID列とteamテーブルのempID列にそれぞれすでに存在する値のみが含まれるようになります。

次の4つの列を使用して、salesという名前のテーブルを作成します。

CREATE TABLE sales (
saleID int UNIQUE,
quantity int,
productID int,
salesperson int,
PRIMARY KEY (saleID),
FOREIGN KEY (productID) REFERENCES products (productID),
FOREIGN KEY (salesperson) REFERENCES team (empID)
);

その後、次のINSERT INTO操作を実行して、productsテーブルにサンプルデータをロードします。

INSERT INTO products
VALUES
(1, 'widget', 18.99),
(2, 'gizmo', 14.49),
(3, 'thingamajig', 39.99),
(4, 'doodad', 11.50),
(5, 'whatzit', 29.99);

次に、teamテーブルにいくつかのサンプルデータをロードします。

INSERT INTO team
VALUES
(1, 'Florence', 1),
(2, 'Mary', 4),
(3, 'Diana', 3),
(4, 'Betty', 2);

salesテーブルにもいくつかのサンプルデータをロードします。

INSERT INTO sales
VALUES
(1, 7, 1, 1),
(2, 10, 5, 4),
(3, 8, 2, 4),
(4, 1, 3, 3),
(5, 5, 1, 3);

最後に、あなたの会社があなたの販売チームの誰も関与せずにいくつかの販売を行っていると想像してください。 これらの売上を記録するには、次の操作を実行して、salesperson列の値を含まない3つの行をsalesテーブルに追加します。

INSERT INTO sales (saleID, quantity, productID)
VALUES
(6, 1, 5),
(7, 3, 1),
(8, 4, 5);

これで、ガイドの残りの部分に従い、SQLでテーブルを結合する方法について学習する準備が整いました。

JOIN操作の構文を理解する

JOIN句は、UPDATEおよびDELETE操作を含む、さまざまなSQLステートメントで使用できます。 ただし、説明のために、このガイドの例ではSELECTクエリを使用して、JOIN句がどのように機能するかを示しています。

次の例は、JOIN句を含むSELECTステートメントの一般的な構文を示しています。

SELECT table1.column1, table2.column2
FROM table1 JOIN table2
ON search_condition;

この構文は、2つの別々のテーブルから2つの列を返すSELECTステートメントで始まります。 JOIN句は複数のテーブルの内容を比較するため、この構文例では、列の名前の前にテーブルの名前とピリオドを付けて、各列を選択するテーブルを指定します。 これは、完全修飾列参照として知られています。

このような完全修飾列参照はどの操作でも使用できますが、技術的には、異なるテーブルの2つの列が同じ名前を共有する操作でのみ必要です。 ただし、JOINの操作を読みやすく、理解しやすくするために、複数のテーブルを操作するときに使用することをお勧めします。

SELECT句の後に、FROM句が続きます。 どのクエリでも、FROM句は、目的のデータを返すために検索する必要があるデータセットを定義する場所です。 ここでの唯一の違いは、FROM句に、JOINキーワードで区切られた2つのテーブルが含まれていることです。 クエリの記述を考えるのに役立つ方法は、SELECTどの列を返すかFROMどのテーブルをクエリするかを覚えておくことです。

続いてON句があり、検索条件を定義することにより、クエリが2つのテーブルを結合する方法を説明しています。 検索条件は、1つ以上の述語のセット、または特定の条件が「true」、「false」、または「unknown」であるかどうかを評価できる式です。 JOIN操作は、両方のテーブルのすべての行を結合し、ON句の検索条件が「true」と評価された行を返すと考えると便利です。

ON句には、通常、2つの関連する列(1つのテーブルの外部キーと外部キーが参照する別のテーブルの主キーなど)の値が等しいかどうかをテストする検索条件を含めるのが理にかなっています。 これは、 equijoinと呼ばれることもあります。

等結合が複数のテーブルのデータと一致する方法の例として、前に追加したサンプルデータを使用して次のクエリを実行します。 このステートメントは、productsテーブルとteamテーブルを、それぞれのproductID列とproductSpecialty列の一致する値をテストする検索条件で結合します。 次に、営業チームのすべてのメンバーの名前、彼らが専門とする各製品の名前、およびそれらの製品の価格が返されます。

SELECT team.empName, products.productName, products.price
FROM products JOIN team
ON products.productID = team.productSpecialty;

このクエリの結果セットは次のとおりです。

Output+----------+-------------+-------+
| empName  | productName | price |
+----------+-------------+-------+
| Florence | widget      | 18.99 |
| Mary     | doodad      | 11.50 |
| Diana    | thingamajig | 39.99 |
| Betty    | gizmo       | 14.49 |
+----------+-------------+-------+
4 rows in set (0.00 sec)

SQLがこれらのテーブルを組み合わせてこの結果セットを形成する方法を説明するために、このプロセスを詳しく見てみましょう。 明確にするために、データベース管理システムが2つのテーブルを結合したときに起こることは正確には次のとおりではありませんが、JOIN操作をこのような手順に従うと考えると役立つ場合があります。

まず、クエリはFROM句の最初のテーブルproductsのすべての行と列を出力します。

JOIN Process Example+-----------+-------------+-------+
| productID | productName | price |
+-----------+-------------+-------+
|         1 | widget      | 18.99 |
|         2 | gizmo       | 14.49 |
|         3 | thingamajig | 39.99 |
|         4 | doodad      | 11.50 |
|         5 | whatzit     | 29.99 |
+-----------+-------------+-------+

次に、これらの各行を調べて、productSpecialtyがその行のproductID値と等しいteamテーブルの任意の行と一致します。

JOIN Process Example+-----------+-------------+-------+-------+----------+------------------+
| productID | productName | price | empID | empName  | productSpecialty |
+-----------+-------------+-------+-------+----------+------------------+
|         1 | widget      | 18.99 |     1 | Florence |                1 |
|         2 | gizmo       | 14.49 |     4 | Betty    |                2 |
|         3 | thingamajig | 39.99 |     3 | Diana    |                3 |
|         4 | doodad      | 11.50 |     2 | Mary     |                4 |
|         5 | whatzit     | 29.99 |       |          |                  |
+-----------+-------------+-------+-------+----------+------------------+

次に、一致しない行を切り取り、SELECT句の順序に基づいて列を再配置し、指定されていない列を削除し、行を再配置して、最終結果セットを返します。 :

JOIN Process Example+----------+-------------+-------+
| empName  | productName | price |
+----------+-------------+-------+
| Florence | widget      | 18.99 |
| Mary     | doodad      | 11.50 |
| Diana    | thingamajig | 39.99 |
| Betty    | gizmo       | 14.49 |
+----------+-------------+-------+
4 rows in set (0.00 sec)

等結合を使用するのがテーブルを結合する最も一般的な方法ですが、<>LIKENOT LIKE、または、ON句の検索条件のBETWEENですら。 ただし、より複雑な検索条件を使用すると、結果セットに表示されるデータを予測することが困難になる可能性があることに注意してください。

ほとんどの実装では、SQL標準で「JOIN適格」データ型と呼ばれるものを持つ任意の列のセットでテーブルを結合できます。 つまり、一般に、数値データを保持する列を、それぞれのデータ型に関係なく、数値データを保持する他の列と結合することができます。 同様に、通常、文字値を保持する任意の列を、文字データを保持する他の列と結合することができます。 ただし、前述のように、2つのテーブルを結合するために一致する列は、通常、外部キーとそれが参照する別のテーブルの主キーのように、テーブル間の関係をすでに示している列になります。

多くのSQL実装では、ONの代わりにUSINGキーワードを使用して同じ名前の列を結合することもできます。 このような操作の構文は次のようになります。

SELECT table1.column1, table2.column2
FROM table1 JOIN table2
USING (related_column);

この構文例では、USING句はON table1.related_column = table2.related_column;と同等です。

salesproductsにはそれぞれproductIDという名前の列があるため、これらの列をUSINGキーワードと照合することで結合できます。 次のコマンドはこれを実行し、各販売のsaleID、販売されたユニットの数量、販売された各製品の名前、およびその価格を返します。 また、saleID値に基づいて、結果セットを昇順で並べ替えます。

SELECT sales.saleID, sales.quantity, products.productName, products.price
FROM sales JOIN products
USING (productID)
ORDER BY saleID;
Output+--------+----------+-------------+-------+
| saleID | quantity | productName | price |
+--------+----------+-------------+-------+
|      1 |        7 | widget     | 18.99 |
|      2 |       10 | whatzit     | 29.99 |
|      3 |        8 | gizmo       | 14.49 |
|      4 |        1 | thingamajig | 39.99 |
|      5 |        5 | widget      | 18.99 |
|      6 |        1 | whatzit     | 29.99 |
|      7 |        3 | widget      | 18.99 |
|      8 |        4 | whatzit     | 29.99 |
+--------+----------+-------------+-------+
8 rows in set (0.00 sec)

テーブルを結合するとき、データベースシステムは、予測が容易でない方法で行を再配置することがあります。 このようなORDER BY句を含めると、結果セットの一貫性と読みやすさが向上します。

3つ以上のテーブルを結合する

2つ以上のテーブルのデータを組み合わせる必要がある場合があります。 他のJOIN句内にJOIN句を埋め込むことにより、任意の数のテーブルを結合できます。 次の構文は、3つのテーブルを結合するときにこれがどのように見えるかの例です。

SELECT table1.column1, table2.column2, table3.column3
FROM table1 JOIN table2
ON table1.related_column = table2.related_column
JOIN table3
ON table3.related_column = table1_or_2.related_column;

この構文例のFROM句は、table1table2と結合することから始まります。 この結合のON句の後、結合されたテーブルの初期セットをtable3と結合する2番目のJOINを開始します。 3番目のテーブルは、1番目または2番目のテーブルのいずれかの列に結合できることに注意してください。

説明のために、従業員の売上がどれだけの収益をもたらしたかを知りたいが、専門の製品を販売している従業員が関与する売上記録のみを気にしていると想像してください。

この情報を取得するには、次のクエリを実行できます。 このクエリは、productsテーブルとsalesテーブルを、それぞれのproductID列と照合して結合することから始まります。 次に、最初のJOINの各行をproductSpecialty列に一致させることにより、teamテーブルを最初の2つに結合します。 次に、クエリはWHERE句を使用して結果をフィルタリングし、一致した従業員が販売を行った人物でもある行のみを返します。 このクエリには、saleID列の値に基づいて最終結果を昇順で並べ替えるORDER BY句も含まれています。

SELECT sales.saleID,
team.empName,
products.productName,
(sales.quantity * products.price)
FROM products JOIN sales
USING (productID)
JOIN team
ON team.productSpecialty = sales.productID
WHERE team.empID = sales.salesperson
ORDER BY sales.saleID;

このクエリのSELECT句にリストされている列の中には、salesテーブルのquantity列の値をproductsテーブルのprice値。 一致した行にこれらの値の積を返します。

Output+--------+----------+-------------+-----------------------------------+
| saleID | empName  | productName | (sales.quantity * products.price) |
+--------+----------+-------------+-----------------------------------+
|      1 | Florence | widget      |                            132.93 |
|      3 | Betty    | gizmo       |                            115.92 |
|      4 | Diana    | thingamajig |                             39.99 |
+--------+----------+-------------+-----------------------------------+
3 rows in set (0.00 sec)

これまでのすべての例では、同じタイプのJOIN句であるINNER JOINを取り上げています。 INNER結合、OUTER結合の概要、およびそれらの違いについては、次のセクションを読み続けてください。

インナーvs。 アウターJOIN操作

JOIN句には、主に2つのタイプがあります。INNER結合とOUTER結合です。 これらの2つのタイプの結合の違いは、それらが返すデータに関係しています。 INNER結合操作は、結合された各テーブルから一致する行のみを返しますが、OUTER結合は、一致する行と一致しない行の両方を返します。

前のセクションの構文例とクエリでは、INNERキーワードが含まれていない場合でも、すべてINNER JOIN句が使用されています。 ほとんどのSQL実装は、特に明記されていない限り、JOIN句をINNER結合として扱います。

OUTER JOINを指定するクエリは、複数のテーブルを組み合わせて、一致する行と一致しない行を返します。 これは、値が欠落している行を見つける場合や、部分的な一致が許容される場合に役立ちます。

OUTER結合操作は、LEFT OUTER結合、RIGHT OUTER結合、およびFULL OUTER結合の3つのタイプにさらに分けることができます。 LEFT OUTER結合、または単にLEFT結合は、2つの結合されたテーブルから一致するすべての行と、「左」テーブルから一致しないすべての行を返します。 JOIN操作のコンテキストでは、「左」テーブルは常にFROMキーワードの直後でJOINキーワードの左側に指定された最初のテーブルです。 同様に、「右」テーブルは2番目のテーブル、つまりJOINの直後のテーブルであり、RIGHT OUTER結合は、結合されたテーブルの一致するすべての行と、「右」の表。 FULL OUTER JOINは、一致するものがないいずれかのテーブルの行を含む、両方のテーブルのすべての行を返します。

これらのさまざまなタイプのJOIN句がデータを返す方法を説明するために、前のサンプルデータベースへの接続と設定サブセクションで作成したテーブルに対して次のクエリ例を実行します。 これらのクエリは、それぞれが異なるタイプのJOIN句を指定することを除いて同じです。

この最初の例では、INNER JOINを使用して、それぞれのsalesperson列とempID列を照合することにより、salesテーブルとteamテーブルを結合します。 ここでも、INNERキーワードは、明示的に含まれていなくても暗黙的に示されます。

SELECT sales.saleID, sales.quantity, sales.salesperson, team.empName 
FROM sales JOIN team
ON sales.salesperson = team.empID;

このクエリはINNER JOIN句を使用するため、両方のテーブルから一致する行のみを返します。

Output+--------+----------+-------------+----------+
| saleID | quantity | salesperson | empName  |
+--------+----------+-------------+----------+
|      1 |        7 |           1 | Florence |
|      4 |        1 |           3 | Diana    |
|      5 |        5 |           3 | Diana    |
|      2 |       10 |           4 | Betty    |
|      3 |        8 |           4 | Betty    |
+--------+----------+-------------+----------+
5 rows in set (0.00 sec)

このバージョンのクエリでは、代わりにLEFT OUTER JOIN句を使用します。

SELECT sales.saleID, sales.quantity, sales.salesperson, team.empName
FROM sales LEFT OUTER JOIN team
ON sales.salesperson = team.empID;

前のクエリと同様に、これも両方のテーブルから一致するすべての値を返します。 ただし、「左」テーブル(この場合はsales)から、「右」テーブル(team)に一致しない値も返します。 左側のテーブルのこれらの行には右側の一致がないため、一致しない値はNULLとして返されます。

Output+--------+----------+-------------+----------+
| saleID | quantity | salesperson | empName  |
+--------+----------+-------------+----------+
|      1 |        7 |           1 | Florence |
|      2 |       10 |           4 | Betty    |
|      3 |        8 |           4 | Betty    |
|      4 |        1 |           3 | Diana    |
|      5 |        5 |           3 | Diana    |
|      6 |        1 |        NULL | NULL     |
|      7 |        3 |        NULL | NULL     |
|      8 |        4 |        NULL | NULL     |
+--------+----------+-------------+----------+
8 rows in set (0.00 sec)

この次のバージョンのクエリでは、代わりにRIGHT JOIN句を使用します。

SELECT sales.saleID, sales.quantity, sales.salesperson, team.empName
FROM sales RIGHT JOIN team
ON sales.salesperson = team.empID;

このクエリのJOIN句は、RIGHT OUTER JOINではなくRIGHT JOINを読み取ることに注意してください。 INNERキーワードでINNER JOIN句を指定する必要がないのと同様に、LEFT JOINまたはRIGHT JOINを記述するたびにOUTERが暗黙指定されます。 ]。

このクエリの結果は、両方のテーブルからすべての行を返すという点で前のクエリの結果とは逆ですが、「右」のテーブルから一致しない行のみを返します。

Output+--------+----------+-------------+----------+
| saleID | quantity | salesperson | empName  |
+--------+----------+-------------+----------+
|      1 |        7 |           1 | Florence |
|   NULL |     NULL |        NULL | Mary     |
|      4 |        1 |           3 | Diana    |
|      5 |        5 |           3 | Diana    |
|      2 |       10 |           4 | Betty    |
|      3 |        8 |           4 | Betty    |
+--------+----------+-------------+----------+
6 rows in set (0.00 sec)

:MySQLはFULL OUTER JOIN句をサポートしていないことに注意してください。 FULL OUTER JOIN句を使用した場合にこのクエリが返すデータを示すために、PostgreSQLデータベースでの結果セットは次のようになります。

SELECT sales.saleID, sales.quantity, sales.salesperson, team.empName
FROM sales FULL OUTER JOIN team
ON sales.salesperson = team.empID;
Output saleid | quantity | salesperson | empname  
--------+----------+-------------+----------
      1 |        7 |           1 | Florence
      2 |       10 |           4 | Betty
      3 |        8 |           4 | Betty
      4 |        1 |           3 | Diana
      5 |        5 |           3 | Diana
      6 |        1 |             | 
      7 |        3 |             | 
      8 |        4 |             | 
        |          |             | Mary
(9 rows)

この出力が示すように、FULL JOINは、一致しないものを含む両方のテーブルのすべての行を返します。


JOIN句でのテーブル名と列名のエイリアス

長い名前または非常にわかりやすい名前でテーブルを結合する場合、完全修飾された複数の列参照を作成する必要があるのは面倒な場合があります。 これを回避するために、ユーザーはテーブル名または列名に短いエイリアスを指定すると便利な場合があります。

SQLでこれを行うには、FROM句の任意のテーブル定義にASキーワードを付けてから、その後に任意のエイリアスを付けます。

SELECT t1.column1, t2.column2
FROM table1 AS t1 JOIN table2 AS t2
ON t1.related_column = t2.related_column;

この構文例では、FROM句まで定義されていない場合でも、SELECT句でエイリアスを使用しています。 これが可能なのは、SQLクエリでは、実行の順序がFROM句で始まるためです。 これは混乱を招く可能性がありますが、クエリの作成を開始する前に、これを覚えてエイリアスについて考えると役立ちます。

例として、salesテーブルとproductsテーブルを結合し、それぞれエイリアスSPを提供する次のクエリを実行します。

SELECT S.saleID, S.quantity,
P.productName,
(P.price * S.quantity) AS revenue 
FROM sales AS S JOIN products AS P
USING (productID);

この例では、salesテーブルのquantity列の値と、productsの一致する値の積に対して、3番目のエイリアスrevenueも作成されることに注意してください。 ]テーブルのprice列。 これは、結果セットの列名でのみ明らかですが、このようなエイリアスを提供すると、クエリ結果の背後にある意味や目的を伝えるのに役立ちます。

Output+--------+----------+-------------+---------+
| saleID | quantity | productName | revenue |
+--------+----------+-------------+---------+
|      1 |        7 | widget      |  132.93 |
|      2 |       10 | whatzit     |  299.90 |
|      3 |        8 | gizmo       |  115.92 |
|      4 |        1 | thingamajig |   39.99 |
|      5 |        5 | widget      |   94.95 |
|      6 |        1 | whatzit     |   29.99 |
|      7 |        3 | widget      |   56.97 |
|      8 |        4 | whatzit     |  119.96 |
+--------+----------+-------------+---------+
8 rows in set (0.00 sec)

エイリアスを定義する場合、ASキーワードは技術的にオプションであることに注意してください。 前の例は、次のように書くこともできます。

SELECT S.saleID, S.quantity, P.productName, (P.price * S.quantity) revenue 
FROM sales S JOIN products P
USING (productID);

エイリアスを定義するためにASキーワードは必要ありませんが、それを含めることをお勧めします。 そうすることで、クエリの目的を明確に保ち、読みやすさを向上させることができます。

結論

このガイドを読むことで、JOIN操作を使用して、個別のテーブルを1つのクエリ結果セットに結合する方法を学習しました。 ここに示すコマンドはほとんどのリレーショナルデータベースで機能するはずですが、すべてのSQLデータベースが独自の言語実装を使用していることに注意してください。 各コマンドとそのオプションの完全なセットの詳細については、DBMSの公式ドキュメントを参照してください。

SQLの操作について詳しく知りたい場合は、SQLの使用方法に関するこのシリーズの他のチュートリアルを確認することをお勧めします。