Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  スカラーオペランドとしてのサブクエリー

13.2.10.1 スカラーオペランドとしてのサブクエリー

もっとも単純な形式のサブクエリーは、単一値を返すスカラーサブクエリーです。スカラーサブクエリーは単純なオペランドであるため、単一カラム値またはリテラルが正当である場所であればほぼどこでも使用できるほか、データ型、長さ、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 可能性はコピーされません。今示したサブクエリーで t1 が空であった場合は、s2NOT 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;

t2 には、2 の値を持つカラム s1 が含まれている行が存在するため、その結果は 2 になります。

スカラーサブクエリーを式の一部にすることはできますが、そのサブクエリーが関数への引数を提供するオペランドである場合でも、括弧を忘れないでください。例:

SELECT UPPER((SELECT s1 FROM t1)) FROM t2;

User Comments
  Posted by mrfox on February 6, 2007
when the same subquery is used several times, mysql does not use this fact to optimize the query, so be careful not to run into performance problems.

example:

SELECT
col0,
(SELECT col1 FROM table1 WHERE table1.id = table0.id),
(SELECT col2 FROM table1 WHERE table1.id = table0.id)
FROM
table0
WHERE ...

the join of table0 with table1 is executed once for EACH subquery, leading to very bad performance for this kind of query.
  Posted by Rami Jamleh on June 3, 2012
Oracle says that you can left join via scalar sub-queries
e.g
create table x (id int auto_increment primary key,name varchar(20),yid int);

create table y (id int auto_increment primary key,name varchar(20));

insert into x(name,yid) values('Alex',null),('Marvin',1),('Bob',null);
insert into y(name) values('GO'),('GOO'),('GOOO');

watch this now
select id,name,(select name from y where x.yid = y.id) from x;
which is equivalent to
select x.id,x.name,y.name
from x left join y on (x.yid = y.id);

and they say outer joins may have negative impact on performance
Sign Up Login You must be logged in to post a comment.