В этом учебном пособии вы узнаете, как использовать подзапросы (subqueries) в MySQL с синтаксисом и примерами.
Так что же такое подзапрос в MySQL?
В MySQL подзапрос представляет собой запрос в запросе. Вы можете создавать подзапросы в своих операторах SQL. Эти подзапросы могут находиться в операторе WHERE, в операторе FROM или в операторе SELECT.
Примечание
- В MySQL подзапрос также называется INNER QUERY или INNER SELECT.
- В MySQL основной запрос, который содержит подзапрос, также называется OUTER QUERY или OUTER SELECT.
WHERE оператор
Чаще всего подзапрос будет найден в операторе WHERE. Эти подзапросы также называются вложенными подзапросами.
Например:
1 2 3 4 5 6 |
SELECT c.contact_id, c.last_name FROM contacts c WHERE c.site_name IN (SELECT a.site_name FROM address_book a WHERE a.address_book_id < 50); |
Подзапрос, содержащийся в предложении оператора SELECT:
FROM address_book a
WHERE a.address_book_id < 50);
Этот подзапрос позволяет находить все значения поля site_name из таблицы address_book, у которого address_book_id менее 50. Подзапрос затем используется для фильтрации результатов основного запроса с использованием условия IN.
Этот подзапрос может быть альтернативно записан как INNER-соединение следующим образом:
1 2 3 4 5 |
SELECT c.contact_id, c.last_name FROM contacts c INNER JOIN address_book a ON c.site_name = a.site_name WHERE a.address_book_id < 50; |
Этот пример с INNER JOIN будет работать более эффективно, чем исходный подзапрос. Важно отметить, однако, что не все подзапросы могут быть переписаны с помощью объединений.
FROM оператор
Подзапрос также можно найти в операторе FROM. Они называются встроенными представлениями (views).
Например:
1 2 3 4 5 6 |
SELECT contacts.last_name, subquery1.total_size FROM contacts, (SELECT site_name, SUM(file_size) AS total_size FROM pages GROUP BY site_name) subquery1 WHERE subquery1.site_name = contacts.site_name; |
В этом примере мы создали подзапрос в операторе FROM следующим образом:
FROM pages
GROUP BY site_name) subquery1
Этот подзапрос имеет псевдоним с именем subquery1. Это будет имя, используемое для ссылки на этот подзапрос или любое из его полей.
SELECT оператор
Подзапрос также можно найти в предложении оператора SELECT. Они обычно используются, когда вы хотите получить расчет с использованием агрегатной функции, такой как функции SUM, COUNT, MIN, MAX или AVG, но вы не хотите, чтобы агрегированная функция применялась к основному запросу.
Например:
1 2 3 4 5 |
SELECT p1.site_name, (SELECT MAX(file_size) FROM pages p2 WHERE p1.site_id = p2.site_id) subquery2 FROM pages p1; |
В этом примере мы создали подзапрос в предложении SELECT следующим образом:
FROM pages p2
WHERE p1.site_id = p2.site_id) subquery2
Подзапрос имеет псевдоним с именем subquery2. Это будет имя, используемое для ссылки на этот подзапрос или любое из его полей.
Трюк для размещения подзапроса в предложении SELECT заключается в том, что подзапрос должен возвращать одно значение. Вот почему в подзапросе используется общая функция, такая как функция SUM, COUNT, MIN, MAX или AVG.