Spec-Zone.ru › MySQL 5.7

13.2.10.5 Подзапросы строк

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

=  >  <  >=  <=  <>  !=  <=>

Вот два примера:

SELECT * FROM t1
  WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1
  WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);

В обоих запросах, если таблица t2 содержит одну строку с id = 10, подзапрос возвращает одну строку. Если в этой строке значения col3 и col4 равны значениям col1 и col2 соответственно в любой строке таблицы t1, выражение WHERE имеет значение TRUE, и каждый запрос возвращает эти t1 строки. Если значения t2 строки col3 и col4 не равны значениям col1 и col2 любой строки из таблицы t1, выражение имеет значение FALSE, и запрос возвращает пустой результат. Выражение является неопределённым (то есть, NULL), если подзапрос не возвращает ни одной строки. Возникает ошибка, если подзапрос возвращает несколько строк, потому что подзапрос строки может вернуть не более одной строки.

Сведения о работе каждого оператора для сравнения строк см. в разделе 12.4.2, «Функции и операторы сравнения».

Выражения (1,2) и ROW(1,2) иногда называются конструирователями строк. Они эквивалентны. Конструктор строки и строка, возвращаемая подзапросом, должны содержать одинаковое количество значений.

Конструктор строки используется для сравнения с подзапросами, возвращающими два или более столбцов. Когда подзапрос возвращает один столбец, это рассматривается как скалярное значение, а не как строка, поэтому конструктор строки не может использоваться с подзапросом, который не возвращает как минимум два столбца. Таким образом, следующий запрос завершается с синтаксической ошибкой:

SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)

Конструкторы строк допустимы и в других контекстах. Например, следующие два утверждения семантически эквивалентны (и обрабатываются оптимизатором одинаково):

SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;

Следующий запрос отвечает на запрос «“найти все строки в таблице t1, которые также существуют в таблице t2”:

SELECT column1,column2,column3
  FROM t1
  WHERE (column1,column2,column3) IN
         (SELECT column1,column2,column3 FROM t2);

Дополнительную информацию об оптимизаторе и конструкторах строк см. в разделе 8.2.1.19, «Оптимизация выражения конструктора строк»

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

Spec-Zone.ru

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