簡単に言うと、サブクエリーは単一値を返すスカラーサブクエリーということになります。スカラーサブクエリーは単純な演算子で、単一カラム値やリテラルが正当であればほとんどどこでも利用することができ、データ型、長さ、NULL
になり得るかどうかという指示など、すべての演算子が持つ特徴もすべて持っています。例
:
CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL); INSERT INTO t1 VALUES(100, 'abcde'); SELECT (SELECT s2 FROM t1);
この SELECT
内のサブクエリーは、CHAR
のデータ型を持ち、長さが 5
で、CREATE
TABLE
時にデフォルトと同等のキャラクタセットと照合が実施されており、そしてカラム内の値が
NULL
になり得るという指示を持つ単一値
('abcde'
)
を返します。実際は、ほとんどのサブクエリーが
NULL
になり得ます。もし例で使用されたテーブルが空であれば、サブクエリーの値は
NULL
になるでしょう。
スカラーサブクエリーを利用できないコンテキストがいくつかあります。もしステートメントがリテラル値だけを許容するなら、サブクエリーを利用することはできません。たとえば、LIMIT
にはリテラル整数の引数が必要であり、LOAD
DATA INFILE
にはリテラル文字列のファイル名が必要です。これらの値を供給するのにサブクエリーを利用することはできません。
次の節にある、より質素な構造を含む
(SELECT column1 FROM t1)
の例を見るとき、自分自身のコードが、それよりもさらに多様で、複雑な構造を含んでいると想像してください。
2 つテーブルを作成すると仮定します。
CREATE TABLE t1 (s1 INT); INSERT INTO t1 VALUES (1); CREATE TABLE t2 (s1 INT); INSERT INTO t2 VALUES (2);
次に、SELECT
を実行します。
SELECT (SELECT s1 FROM t2) FROM t1;
2
の値を持つカラム
s1
を含む行が
t2
にあるので、その結果は
2
となります。
スカラーサブクエリーは式の一部になり得ますが、もしそのサブクエリーが関数に引数を与える演算子だとしても、括弧を忘れないでください。例 :
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;