Spec-Zone .ru
спецификации, руководства, описания, API
|
В его самой простой форме подзапрос является скалярным подзапросом, который возвращает единственное значение.
Скалярный подзапрос является простым операндом, и можно использовать его почти где угодно, единственное значение
столбца или литерал являются законными, и можно ожидать, что у этого будут те характеристики, которые имеют все
операнды: тип данных, длина, индикация, которой это может быть 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;