Spec-Zone .ru
спецификации, руководства, описания, API

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;

A LEFT [OUTER] JOIN может быть быстрее чем эквивалентный подзапрос, потому что сервер мог бы быть в состоянии оптимизировать его лучше — факт, который не является определенным для одного только MySQL Server. До SQL 92, не существовали внешние объединения, таким образом, подзапросы были единственным способом сделать определенные вещи. Сегодня, MySQL Server и много других современных систем баз данных предлагают широкий диапазон типов внешнего объединения.

MySQL Server поддерживает многократную таблицу DELETE операторы, которые могут использоваться, чтобы эффективно удалить строки, основанные на информации от одной таблицы или даже от многих таблиц одновременно. Многократная таблица UPDATE операторы также поддерживаются. См. Раздел 13.2.2,"DELETE Синтаксис", и Раздел 13.2.11,"UPDATE Синтаксис".