Spec-Zone .ru
спецификации, руководства, описания, API

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 возвращает единственное значение ('abcde') у этого есть тип данных CHAR, длина 5, набор символов и сопоставление, равное значениям по умолчанию в действительности в CREATE TABLE время, и индикация, которой может быть значение в столбце NULL. Nullability значения, выбранного скалярным подзапросом, не копируется, потому что, если результат подзапроса пуст, результат NULL. Для подзапроса, только показанного, если t1 были пусты, результат будет NULL даже при том, что s2 NOT NULL.

Есть несколько контекстов, в которых не может использоваться скалярный подзапрос. Если оператор разрешает только литеральное значение, невозможно использовать подзапрос. Например, LIMIT требует литеральных целочисленных параметров, и LOAD DATA INFILE требует имени файла литеральной строки. Невозможно использовать подзапросы, чтобы предоставить эти значения.

Когда Вы видите примеры в следующих разделах, которые содержат довольно спартанскую конструкцию (SELECT column1 FROM t1), предположите, что Ваш собственный код содержит намного более разнообразные и сложные конструкции.

Предположите, что мы делаем две таблицы:

CREATE TABLE t1 (s1 INT);INSERT INTO t1 VALUES (1);CREATE TABLE t2 (s1 INT);INSERT INTO t2 VALUES (2);

Затем выполните a SELECT:

SELECT (SELECT s1 FROM t2) FROM t1;

Результат 2 потому что есть строка в t2 содержа столбец s1 у этого есть значение 2.

Скалярный подзапрос может быть частью выражения, но помнить круглые скобки, даже если подзапрос является операндом, который обеспечивает параметр за функцию. Например:

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