ВЛОЖЕННЫЕ ЗАПРОСЫ
Простые вложенные запросы
Вложенные запросы поддерживаются MySQL, начиная с версии 4.1. Вложенные запросы обеспечивают мощный, удобный и лаконичный способ выражения комплексных данных, требуемых в коротких инструкциях SQL. Начнем с простых примеров, а затем перейдем к более сложным.
Принцип работы вложенных запросов
С помощью выражения INNER JOIN можно найти название преступной группировки, в которую входит конкретный преступник (рис. 8.1):
mysql> SELECT gruppirovka_name FROM
- -> gruppirovka INNER JOIN prestupnik
- -> USING (gruppirovka_id)
- -> WHERE prestupnik_name =
- -> "Belov Aleksandr Petrovich";
! gruppirouka_name !
+------------------+
i Matueeuskaya !
+------------------+
1 row in set <0.03 sec)
Рис. 8.1. Поиск группировки по фамилии
Однако есть еще один способ с использованием вложенного запроса (рис. 8.2):
mysql> SELECT gruppirovka_name FROM gruppirovka
- -> WHERE gruppirovka_id = (SELECT gruppi-rovka_id
- -> FROM prestupnik WHERE prestup-nik_name ="Belov
- -> Aleksandr Petrovich");
! gruppirovka_name !
+------------------+
! Matueeuskaya !
+------------------+
1 rou in set <0.02 sec)
Рис. 8.2. Использование вложенного запроса
Запрос называется вложенным в том случае, когда один запрос включает в себя другой. Внутренний запрос, или подзапрос, является вложенным и заключен в круглые скобки. Он определяет значение gruppirovka_id для преступника с именем «Belov Aleksandr Petrovich». Для внутренних запросов всегда следует использовать круглые скобки. Внешний запрос перечисляется первым и в данном случае не заключается в скобки. Он выполняет поиск значения gruppirovka_name для преступной группировки со значением gruppirovka_id, соответствующим результату подзапроса. Таким образом, внутренний запрос выполняет поиск значения gruppirovka_id, а внешний — использует его для поиска названия преступной группировки.
Какой метод более предпочтителен? Этот вопрос следует проработать. С точки зрения производительности, вложенные запросы сложнее оптимизировать, и они практически всегда работают медленней, чем невложенные. Но в некоторых ситуациях они представляют собой единственный способ написания отдельного запроса. Кроме того, иногда вложенные запросы могут выдавать информацию, которую сложно извлечь другими методами. А еще вложенные запросы более четко выражены. После усваивания основной идеи такие запросы легко понимаются. Многие проектировщики SQL считают, что вложенные запросы следует изучать перед альтернативами, связанными с объединениями.
В предыдущем примере был использован оператор оценки —- знак равенства (=). Можно использовать в своих кодах все типы операторов сравнения: меньше чем (<), меньше или равно (<=), больше чем (>), больше или равно (>=), а также не равно (!= или о).