Spec-Zone.ru › MySQL 9.2

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. Для показанного подзапроса, если 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-9.2-en/scalar-subqueries.html

Spec-Zone.ru

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