Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
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
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  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.