Spec-Zone.ru › MySQL 5.7

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. Невозможность значения, выбранного скалярным подзапросом, не копируется, потому что, если результат подзапроса пуст, результатом является 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.

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

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

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

Spec-Zone.ru

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