ГлавнаяУроки SQL → Урок 5. Вложенные запросы

SQL - Урок 5. Вложенные запросы

В прошлом уроке мы столкнулись с одним неудобством. Когда мы хотели узнать, кто создал тему "велосипеды", и делали соответствующий запрос:



Вместо имени автора, мы получали его идентификатор. Это и понятно, ведь мы делали запрос к одной таблице - Темы, а имена авторов тем хранятся в другой таблице - Пользователи. Поэтому, узнав идентификатор автора темы, нам надо сделать еще один запрос - к таблице Пользователи, чтобы узнать его имя:



В SQL предусмотрена возможность объединять такие запросы в один путем превращения одного из них в подзапрос (вложенный запрос). Итак, чтобы узнать, кто создал тему "велосипеды", мы сделаем следующий запрос:



То есть, после ключевого слова WHERE, в условие мы записываем еще один запрос. MySQL сначала обрабатывает подзапрос, возвращает id_author=2, и это значение передается в предложение WHERE внешнего запроса.

В одном запросе может быть несколько подзапросов, синтаксис у такого запроса следующий:
SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN (SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN (SELECT имя_столбца FROM имя_таблицы WHERE условие) ) ;
Обратите внимание, что подзапросы могут выбирать только один столбец, значения которого они будут возвращать внешнему запросу. Попытка выбрать несколько столбцов приведет к ошибке.

Давайте для закрепления составим еще один запрос, узнаем, какие сообщения на форуме оставлял автор темы "велосипеды":



Теперь усложним задачу, узнаем, в каких темах оставлял сообщения автор темы "велосипеды":



Давайте разберемся, как это работает.
  • Сначала MySQL выполнит самый глубокий запрос:

    SELECT id_author FROM topics WHERE topic_name='велосипеды'

  • Полученный результат (id_author=2) передаст во внешний запрос, который примет вид:

    SELECT id_topic FROM posts WHERE id_author IN (2);

  • Полученный результат (id_topic:4,1) передаст во внешний запрос, который примет вид:

    SELECT topic_name FROM topics WHERE id_topic IN (4,1);

  • И выдаст окончательный результат (topic_name: о рыбалке, о рыбалке). Т.е. автор темы "велосипеды" оставлял сообщения в теме "О рыбалке", созданной Сергеем (id=1) и в теме "О рыбалке", созданной Светой (id=4).
Вот собственно и все, что хотелось сказать о вложенных запросах. Хотя, есть два момента, на которые стоит обратить внимание:
  • Не рекомендуется создавать запросы со степенью вложения больше трех. Это приводит к увеличению времени выполнения и к сложности восприятия кода.


  • Приведенный синтаксис вложенных запросов, скорее наиболее употребительный, но вовсе не единственный. Например, мы могли бы вместо запроса
    SELECT name FROM users WHERE id_user IN
    (SELECT id_author FROM topics WHERE topic_name='велосипеды');

    написать
    SELECT name FROM users WHERE id_user =
    (SELECT id_author FROM topics WHERE topic_name='велосипеды');

    Т.е. мы можем использовать любые операторы, используемые с ключевым словом WHERE (их мы изучали в прошлом уроке).




Предыдущий урок Вернуться в раздел Следующий урок 

Научись программировать на Python прямо сейчас!



Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.


Уроки PHP Код кнопки:


Теперь нажмите кнопку, что бы не забыть адрес и вернуться к нам снова.