SQLで結合を使用する方法
序章
多くのデータベース設計では、特定のデータポイント間の関係に基づいて、情報をさまざまなテーブルに分けています。 このような場合でも、一度に複数のテーブルから情報を取得したい場合があります。
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
データ型を使用して表されます。price
:decimal
データ型を使用して表された各製品の価格。 このステートメントは、この列の値が最大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つの列が必要であると判断しました。
empID
:productID
列と同様に、この列には、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つの列があります。
saleID
:productID
および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)
等結合を使用するのがテーブルを結合する最も一般的な方法ですが、<
、>
、LIKE
、NOT 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;
と同等です。
sales
とproducts
にはそれぞれ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
句は、table1
をtable2
と結合することから始まります。 この結合の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
テーブルを結合し、それぞれエイリアスS
とP
を提供する次のクエリを実行します。
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の使用方法に関するこのシリーズの他のチュートリアルを確認することをお勧めします。