MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのSTRAIGHT_JOIN(ストレートジョイン)の使い方を徹底解説!実行順序を制御する結合方法

MySQLにおけるSTRAIGHT_JOINは、INNER JOINJOINと同様に動作する結合方法です。つまり、両テーブルに一致する行のみを結果として返します。ただし、通常のJOINと大きく異なる点が一つあります。それは、オプティマイザによる結合順序の最適化を無効化し、クエリに記述された通りの順序(左側のテーブルから先)で必ず結合を実行するという点です。

この記事では、実際に2つのテーブルを作成し、外部キー制約で関連付けたうえで、STRAIGHT_JOINの具体的な使い方を解説します。

1. サンプルテーブルの作成

まず、結合のデモに使用する2つのテーブルを作成します。

最初のテーブル(子テーブル側)

mysql> CREATE table ForeignTableDemo
-> (
-> Id int,
-> Name varchar(100),
-> FK int
-> );
Query OK, 0 rows affected (0.47 sec)

2番目のテーブル(親テーブル側)

mysql> CREATE table PrimaryTableDemo
-> (
-> FK int,
-> Address varchar(100),
-> primary key(FK)
-> );
Query OK, 0 rows affected (0.47 sec)

2. 外部キー制約の追加

次に、ForeignTableDemoのFK列に対して、PrimaryTableDemoを参照する外部キー制約を追加します。

mysql> ALTER table ForeignTableDemo add constraint FKConst foreign key(FK) references PrimaryTableDemo(FK);
Query OK, 0 rows affected (1.54 sec)
Records: 0 Duplicates: 0 Warnings: 0

3. データの挿入

まず、親テーブルであるPrimaryTableDemoにレコードを挿入します。

mysql> INSERT into PrimaryTableDemo values(1,'US');
Query OK, 1 row affected (0.10 sec)

mysql> INSERT into PrimaryTableDemo values(2,'UK');
Query OK, 1 row affected (0.14 sec)

mysql> INSERT into PrimaryTableDemo values(3,'Unknown');
Query OK, 1 row affected (0.08 sec)

挿入結果の確認

mysql> SELECT * from PrimaryTableDemo;

実行結果は以下の通りです。

+----+---------+
| FK | Address |
+----+---------+
| 1  | US      |
| 2  | UK      |
| 3  | Unknown |
+----+---------+
3 rows in set (0.00 sec)

続いて、子テーブルであるForeignTableDemoにもレコードを追加します。

mysql> INSERT into ForeignTableDemo values (1,'John',1);
Query OK, 1 row affected (0.20 sec)

mysql> INSERT into ForeignTableDemo values (2,'Bob',2);
Query OK, 1 row affected (0.27 sec)

挿入結果の確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> SELECT * from ForeignTableDemo;

実行結果は以下の通りです。

+------+------+------+
| Id   | Name | FK   |
+------+------+------+
| 1    | John | 1    |
| 2    | Bob  | 2    |
+------+------+------+
2 rows in set (0.00 sec)

4. STRAIGHT_JOINを使ったクエリの実行

それでは、STRAIGHT_JOINを使用したクエリを実行します。このクエリは、両テーブルで一致する行のみを表示します。

mysql> SELECT ForeignTableDemo.Id, ForeignTableDemo.Name, PrimaryTableDemo.Address
-> from ForeignTableDemo
-> STRAIGHT_JOIN PrimaryTableDemo
-> on ForeignTableDemo.FK=PrimaryTableDemo.FK;

実行結果は以下の通りです。

+------+------+---------+
| Id   | Name | Address |
+------+------+---------+
| 1    | John | US      |
| 2    | Bob  | UK      |
+------+------+---------+
2 rows in set (0.00 sec)

STRAIGHT_JOINを使うべきケースとは?

STRAIGHT_JOINは、結果としてはINNER JOINと同じですが、以下のような場面で活用できます。

  • オプティマイザが非効率な結合順序を選択した場合:MySQLのクエリオプティマイザが誤った判断をしてパフォーマンスが低下するとき、開発者が意図した順序で強制的に結合させることができます。
  • パフォーマンスチューニング時:EXPLAINで実行計画を確認しながら、より高速な結合順序を明示的に指定したい場合に有効です。
  • SELECT句内でのみ使用可能:STRAIGHT_JOINは結合タイプとして使えるほか、SELECT STRAIGHT_JOIN ...のようにSELECTキーワードの直後に記述することで、クエリ全体のすべての結合順序を固定することもできます。

ただし、安易に使用するとデータ量の変化によってかえってパフォーマンスが悪化する可能性もあるため、使用は最適化の最終手段として検討するのがおすすめです。

  1. MySQLでWITH ROLLUPを正しく使う方法!GROUP BYと組み合わせた集計テクニックを解説

    WITH ROLLUPとは?MySQLのWITH ROLLUPは、GROUP BY句と組み合わせて使用することで、グループごとの集計結果に加えて、全体の合計(総計)行を自動的に追加してくれる便利な機能です。レポート作成やデータ分析の際に、別途合計用のクエリを実行する必要がなくなるため、非常に効率的です。基本構文WITH ROLLUPを使用する際の基本的な構文は以下の通りです。select yourColumnName1,sum(yourColumnName2) from yourTableNamegroup by yourColumnName1 with rollup;サンプルテーブルの作成ま

  2. MySQLでCURDATE()とLIKE句を使った部分一致検索の方法

    MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----