13.2.10.11 Перезапись подзапросов в виде объединений
Иногда существуют альтернативные способы проверки принадлежности значения к набору значений, кроме использования подзапроса. Также в некоторых случаях не только возможно переписать запрос без подзапроса, но и это может быть эффективнее, чем использовать подзапросы. Одним из таких способов является конструкция IN():
Например, этот запрос:
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
Может быть переписан как:
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
Запросы:
SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2);
SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);
Могут быть переписаны как:
SELECT table1.*
FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;
Объединение LEFT [OUTER] JOIN может быть быстрее, чем эквивалентный подзапрос, потому что сервер, возможно, сможет оптимизировать его лучше — факт, который не специфичен только для MySQL Server. До SQL-92 внешние объединения не существовали, поэтому подзапросы были единственным способом выполнения определенных задач. Сегодня MySQL Server и многие другие современные системы баз данных предлагают широкий спектр типов внешних объединений.
MySQL Server поддерживает многотабличные операторы DELETE, которые могут использоваться для эффективного удаления строк на основе информации из одной таблицы или даже из нескольких таблиц одновременно. Также поддерживаются многотабличные операторы UPDATE. См. раздел 13.2.2, «Оператор УДАЛЕНИЕ строк» и раздел 13.2.11, «Оператор ОБНОВЛЕНИЕ строк».
© 2025 Oracle
Licensed under the GPLv2 License.