MySQLのSELECTステートメントでカンマを使える?CROSS JOINとの関係を解説
MySQLのSELECTステートメント間にカンマは使用できますか?
はい、使用できます。FROM句でテーブル名をカンマ(,)で区切って指定すると、複数のテーブルを組み合わせて照会することが可能です。構文は以下の2通りがあります。
構文1:select * from テーブル名1,テーブル名2; 構文2:select * from テーブル名1 cross join テーブル名2;
この2つの構文は、まったく同じ結果を返します。つまり、カンマ区切りによるテーブル指定は CROSS JOIN(交叉結合)と完全に同等です。両者とも、各テーブルのすべての行を組み合わせた「直積(デカルト積)」を求める操作になります。
それでは、実際にテーブルを作成して動作を確認してみましょう。
検証用テーブルの作成
1つ目のテーブルを作成する
まず、create table文で最初のテーブルを作成します。
mysql> create table DemoTable1882 ( Id int ); Query OK, 0 rows affected (0.00 sec)
insertコマンドを使って、いくつかのレコードを挿入します。
mysql> insert into DemoTable1882 values(10); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1882 values(20); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1882 values(30); Query OK, 1 row affected (0.00 sec)
selectステートメントで、テーブル内の全レコードを表示してみます。
mysql> select * from DemoTable1882;
実行結果は以下のとおりです。
+------+ | Id | +------+ | 10 | | 20 | | 30 | +------+ 3 rows in set (0.00 sec)
2つ目のテーブルを作成する
続いて、2つ目のテーブルを作成するクエリです。
mysql> create table DemoTable1883 ( Id int ); Query OK, 0 rows affected (0.00 sec)
こちらにもinsertコマンドでレコードを挿入します。
mysql> insert into DemoTable1883 values(100); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1883 values(101); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1883 values(102); Query OK, 1 row affected (0.00 sec)
selectステートメントで全レコードを確認しましょう。
mysql> select * from DemoTable1883;
実行結果は以下のとおりです。
+------+ | Id | +------+ | 100 | | 101 | | 102 | +------+ 3 rows in set (0.00 sec)
カンマ区切りでSELECTを実行した結果
ここで、SELECTステートメントのFROM句においてテーブル名をカンマで区切るクエリを実行してみます。
mysql> select * from DemoTable1882,DemoTable1883;
実行結果は以下のとおりです。
+------+------+ | Id | Id | +------+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 10 | 101 | | 20 | 101 | | 30 | 101 | | 10 | 102 | | 20 | 102 | | 30 | 102 | +------+------+ 9 rows in set (0.00 sec)
1つ目のテーブル(3行)と2つ目のテーブル(3行)のすべての行が組み合わされ、合計9行(3×3)の結果セットが返されました。これが「直積」の動作です。
CROSS JOINでSELECTを実行した結果
次に、カンマ区切りと同じ結果になる2つ目の方法として、CROSS JOINを使用したクエリを実行します。
mysql> select * from DemoTable1882 cross join DemoTable1883;
実行結果は以下のとおりです。
+------+------+ | Id | Id | +------+------+ | 10 | 100 | | 20 | 100 | | 30 | 100 | | 10 | 101 | | 20 | 101 | | 30 | 101 | | 10 | 102 | | 20 | 102 | | 30 | 102 | +------+------+ 9 rows in set (0.00 sec)
ご覧のとおり、カンマ区切りの場合とまったく同じ9行の結果が得られました。
まとめ
MySQLでは、FROM句でテーブル名をカンマで区切る書き方と、CROSS JOINを使う書き方は意味的に同一であり、どちらもテーブル同士の直積を求めます。
なお、実務では意図しない大量の行が生成される原因となるため、直積が必要な場合を除き、通常はWHERE句やON句で結合条件を明示するINNER JOINやLEFT JOINなどを使うことが推奨されます。可読性の観点からも、CROSS JOINキーワードを明示的に使う方が意図が伝わりやすいでしょう。
-
MySQLクエリで「LIKE concat()」を使用することはできる?
はい、MySQLではLIKE句とconcat()関数を組み合わせて使用することが可能です。concat()関数で動的にパターン文字列を生成し、それをLIKE句の検索条件として利用できます。実際にサンプルを使って手順を見ていきましょう。まず、テーブルを作成します。mysql> create table DemoTable ( Name varchar(50) ); Query OK, 0 rows affected (0.63 sec)次に、insertコマンドを使ってテーブルにレコードを挿入します。mysql> insert into DemoTable values(Jo
-
MySQLのSELECT文でIN()に単一の値を指定することは可能か?
MySQLのIN()で単一の値を設定できます結論から言うと、MySQLのIN()句には単一の値を指定することが可能です。IN()は通常、複数の候補値をカンマ区切りで列挙するために使われますが、値が1つだけの場合でもエラーにはならず、正常に動作します。ここでは、実際にテーブルを作成して動作を確認してみましょう。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> FirstName varchar(20) -> ); Query OK, 0 rows affected