Spec-Zone.ru › MySQL 8.4

15.2.15.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. Возможность значения NULL, выбранного скалярным подзапросом, не копируется, потому что если результат подзапроса пустой, результат равен NULL. Для показанного подзапроса, если t1 было пусто, результат был бы NULL, даже если s2 является NOT NULL.

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

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

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

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, потому что в t2 есть строка, содержащая столбец s1 со значением 2.

Предшествующее выражение также можно записать так, используя TABLE:

SELECT (TABLE t2) FROM t1;

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

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

Тот же результат можно получить, используя SELECT UPPER((TABLE t1)) FROM t2.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/scalar-subqueries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API