MySQLのSTRAIGHT_JOIN(ストレートジョイン)の使い方を徹底解説!実行順序を制御する結合方法
MySQLにおけるSTRAIGHT_JOINは、INNER JOINやJOINと同様に動作する結合方法です。つまり、両テーブルに一致する行のみを結果として返します。ただし、通常の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キーワードの直後に記述することで、クエリ全体のすべての結合順序を固定することもできます。
ただし、安易に使用するとデータ量の変化によってかえってパフォーマンスが悪化する可能性もあるため、使用は最適化の最終手段として検討するのがおすすめです。
-
MySQLでWITH ROLLUPを正しく使う方法!GROUP BYと組み合わせた集計テクニックを解説
WITH ROLLUPとは?MySQLのWITH ROLLUPは、GROUP BY句と組み合わせて使用することで、グループごとの集計結果に加えて、全体の合計(総計)行を自動的に追加してくれる便利な機能です。レポート作成やデータ分析の際に、別途合計用のクエリを実行する必要がなくなるため、非常に効率的です。基本構文WITH ROLLUPを使用する際の基本的な構文は以下の通りです。select yourColumnName1,sum(yourColumnName2) from yourTableNamegroup by yourColumnName1 with rollup;サンプルテーブルの作成ま
-
MySQLでCURDATE()とLIKE句を使った部分一致検索の方法
MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----