Скалярные подзапросы
Скалярный подзапрос — это подзапрос, возвращающий единственное значение. Это простейшая форма подзапроса, и его можно использовать там, где допустимо использовать литерал или значение из единственного столбца.
Тип данных, длина и кодировка и сортировка берутся из результата, возвращенного подзапросом. Результатом подзапроса всегда может быть NULL, то есть не возвращено ни одного результата. Даже если исходное значение определено как NOT NULL, это игнорируется.
Подзапрос нельзя использовать в тех случаях, когда ожидается только литерал, например, LOAD DATA INFILE ожидает литеральную строку, содержащую имя файла, а LIMIT требует литерального целого числа.
Примеры
CREATE TABLE sq1 (num TINYINT); CREATE TABLE sq2 (num TINYINT); INSERT INTO sq1 VALUES (1); INSERT INTO sq2 VALUES (10* (SELECT num FROM sq1)); SELECT * FROM sq2; +------+ | num | +------+ | 10 | +------+
Вставка второй строки означает, что подзапрос больше не является скалярным, и этот конкретный запрос недействителен:
INSERT INTO sq1 VALUES (2); INSERT INTO sq2 VALUES (10* (SELECT num FROM sq1)); ERROR 1242 (21000): Subquery returns more than 1 row
В подзапросе нет строк, поэтому скалярное значение равно NULL:
INSERT INTO sq2 VALUES (10* (SELECT num FROM sq3 WHERE num='3')); SELECT * FROM sq2; +------+ | num | +------+ | 10 | | NULL | +------+
Более традиционный скалярный подзапрос, входящий в состав условия WHERE:
SELECT * FROM sq1 WHERE num = (SELECT MAX(num)/10 FROM sq2); +------+ | num | +------+ | 1 | +------+
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/subqueries-scalar-subqueries/