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

MySQLスカラーサブクエリの戻り値とは?0行・複数行時の挙動と使用上の制限を解説

MySQLスカラーサブクエリとは

MySQLにおけるスカラーサブクエリ(Scalar Subquery)とは、必ず1行から1列分の値だけを返すサブクエリのことです。そのため、単一の値(スカラー値)が許容される場面であれば、どこにでも使用することができます。

ただし、スカラーサブクエリが「1行1列」以外の結果を返した場合には、以下のような挙動になります。

ケース1:サブクエリが0行を返す場合

サブクエリの結果が0行だった場合、スカラーサブクエリ式の値はNULLとして扱われます。エラーにはなりませんが、比較条件が成立しないため、結果セットは空になります。

ケース2:サブクエリが2行以上を返す場合

サブクエリが複数行を返した場合、スカラーサブクエリの性質上、MySQLはエラーを返します。「1行1列」というルールに反するためです。

これらの挙動は、次のテーブルを使った具体例で確認できます。

mysql> Select * from Customers;
+-------------+----------+
| Customer_Id | Name |
+-------------+----------+
| 1 | Rahul |
| 2 | Yashpal |
| 3 | Gaurav |
| 4 | Virender |
+-------------+----------+
4 rows in set (0.00 sec)

mysql> Select * from Reservations;
+------+-------------+------------+
| ID | Customer_id | Day |
+------+-------------+------------+
| 1 | 1 | 2017-12-30 |
| 2 | 2 | 2017-12-28 |
| 3 | 2 | 2017-12-29 |
| 4 | 1 | 2017-12-25 |
| 5 | 3 | 2017-12-26 |
+------+-------------+------------+
5 rows in set (0.00 sec)

正常に1行1列を返す例

まず、サブクエリが正確に1行1列の値を返す場合は、問題なく実行できます。

mysql> Select Name from Customers WHERE customer_id = (Select Customer_id FROM reservations where id = 3);
+---------+
| Name |
+---------+
| Yashpal |
+---------+
1 row in set (0.00 sec)

この例では、Reservationsテーブルのid=3の行に対応するCustomer_id(=2)が1つだけ返されるため、Customersテーブルから該当する顧客名「Yashpal」が正しく取得されています。

0行を返す場合(NULLとして評価される)

次に、サブクエリが0行を返すケースを見てみましょう。

mysql> Select Name from Customers WHERE customer_id = (Select Customer_id FROM reservations where id = 10);
Empty set (0.00 sec)

id=10に該当する行は存在しないため、スカラーサブクエリ式の値はNULLになります。その結果、WHERE句の条件を満たす行がなく、MySQLは空の結果セット(Empty set)を返します。

MySQLクエリでスカラーサブクエリを使用する際の制限

スカラーサブクエリには重要な制限があります。それは、リテラル値(定数)しか許されない箇所では、スカラーサブクエリを使用できないという点です。

代表的な例がLIMIT句です。LIMITはリテラルの整数値を引数として要求するため、スカラーサブクエリで返却行数を指定することはできません。

-- このような使い方は不可
SELECT * FROM Customers LIMIT (SELECT COUNT(*) FROM Reservations);

同様に、CREATE TABLE文のDEFAULT値など、リテラルのみが許可されるコンテキストでもスカラーサブクエリは利用できません。こうした場合は、アプリケーション側で先に必要な値を取得してからクエリを組み立てるなどの対策が必要です。

まとめ

  • スカラーサブクエリは「1行1列」の値を返すサブクエリである
  • 結果が0行の場合はNULLとして評価される
  • 結果が2行以上の場合はエラーになる
  • LIMIT句などリテラル値しか許されない箇所では使用できない
  1. Java JDBCでMySQLのCOUNTクエリを実行したときの戻り値の型は何?取得方法を解説

    COUNT関数の戻り値の型は「long」 MySQLのCOUNT()関数をJava JDBCから実行した場合、戻り値の型はlong型になります。結果を取得するには、ResultSetのgetLong()メソッドを使用します。 rs.next(); long result = rs.getLong(anyAliasName); 以下では、サンプルデータベース「test3」を使って、実際にテーブルを作成し、COUNTクエリの結果をJavaで取得する手順を順番に解説します。 1. サンプルテーブルの作成 まず、テスト用のテーブルを作成します。テーブル作成用のSQLは次のとおりです。 mysql&g

  2. MySQLのLIKE演算子を使って特定の文字で始まる名前を取得する方法

    MySQLのLIKEで特定の文字から始まるレコードを検索するMySQLで特定の文字で始まる名前を取得したい場合は、LIKE演算子とワイルドカード「%」を組み合わせて使用します。ここでは、実際にテーブルを作成し、データを挿入して、特定の文字で始まる名前を抽出する手順を解説します。1. サンプルテーブルの作成まず、学生の名前を格納するテーブルを作成します。mysql> create table DemoTable ( StudentFirstName varchar(20) ); Query OK, 0 rows affected (1.01 sec)2. レコードの挿入次に、INS