вложенные_запросы

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

mysql> SELECT * FROM topics WHERE topic_name='bash script';
+----------+-------------+-----------+
| id_topic | topic_name  | id_author |
+----------+-------------+-----------+
|        3 | Bash script |         2 |
+----------+-------------+-----------+
1 ROW IN SET (0.00 sec)

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

mysql> SELECT name FROM users WHERE id_user='2';
+--------+
| name   |
+--------+
| Vasyan |
+--------+
1 ROW IN SET (0.00 sec)

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

mysql> SELECT name FROM users WHERE id_user IN
    -> (SELECT id_author FROM topics WHERE topic_name='bash script');
+--------+
| name   |
+--------+
| Vasyan |
+--------+
1 ROW IN SET (0.00 sec)

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

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

SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
       (SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
          (SELECT имя_столбца FROM имя_таблицы WHERE условие)
       )
     ;

Обратите внимание, что подзапросы могут выбирать только один столбец, значения которого они будут возвращать внешнему запросу. Попытка выбрать несколько столбцов приведет к ошибке.

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

 
 
 
 
 
  • вложенные_запросы.txt
  • Последнее изменение: 2021/09/20 18:02
  • admin