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

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キーワードを明示的に使う方が意図が伝わりやすいでしょう。

  1. 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

  2. MySQLのSELECT文でIN()に単一の値を指定することは可能か?

    MySQLのIN()で単一の値を設定できます結論から言うと、MySQLのIN()句には単一の値を指定することが可能です。IN()は通常、複数の候補値をカンマ区切りで列挙するために使われますが、値が1つだけの場合でもエラーにはならず、正常に動作します。ここでは、実際にテーブルを作成して動作を確認してみましょう。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> FirstName varchar(20) -> ); Query OK, 0 rows affected