В этом учебном пособии вы узнаете, как использовать подзапросы в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
В SQL Server подзапрос представляет собой запрос в запросе. Вы можете создавать подзапросы в своих операторах SQL. Эти подзапросы могут находиться в предложении WHERE, в предложении FROM или в предложении SELECT.
Примечание
- В SQL Server (Transact-SQL) подзапросом также называется INNER QUERY или INNER SELECT.
- В SQL Server (Transact-SQL) основной запрос, который содержит подзапрос, также называется OUTER QUERY или OUTER SELECT.
Предложение WHERE
Чаще всего подзапрос будет найден в предложении WHERE. Эти подзапросы также называются вложенными подзапросами.
Например:
1 2 3 4 5 6 |
SELECT p.product_id, p.product_name FROM products p WHERE p.product_id IN (SELECT inv.product_id FROM inventory inv WHERE inv.quantity > 10); |
Часть подзапроса вышеприведенного оператора SELECT:
1 2 3 |
(SELECT inv.product_id FROM inventory inv WHERE inv.quantity > 30); |
Этот подзапрос позволяет находить все значения product_id из таблицы inventory, количество которых больше 30. Подзапрос затем используется для фильтрации результатов основного запроса с использованием условия IN.
Этот подзапрос может быть альтернативно записан как INNER-соединение следующим образом:
1 2 3 4 5 |
SELECT p.product_id, p.product_name FROM products p INNER JOIN inventory inv ON p.product_id = inv.product_id WHERE inv.quantity > 10; |
Этот INNER JOIN будет работать более эффективнее, чем исходный подзапрос. Важно отметить, однако, что не все подзапросы могут быть переписаны с помощью объединений JOIN.
Предложение FROM
Подзапрос также можно найти в предложении FROM. Они называются встроенными представлениями.
Например:
1 2 3 4 5 6 |
SELECT suppliers.supplier_name, subquery1.total_amt FROM suppliers, (SELECT supplier_id, SUM(orders.amount) AS total_amt FROM orders GROUP BY supplier_id) subquery1 WHERE subquery1.supplier_id = suppliers.supplier_id; |
В этом примере мы создали подзапрос в предложении FROM следующим образом:
1 2 3 |
(SELECT supplier_id, SUM(orders.amount) AS total_amt FROM orders GROUP BY supplier_id) subquery1 |
Этот подзапрос был псевдонимом с именем subquery1. Это будет имя, используемое для ссылки на этот подзапрос или любое из его полей.
Предложение SELECT
Подзапрос также можно найти в предложении SELECT. Они обычно используются, когда вы хотите получить расчет с использованием агрегатной функции, такой как функция SUM, COUNT, MIN или MAX, но вы не хотите, чтобы агрегированная функция применялась к основному запросу.
Например:
1 2 3 4 5 |
SELECT e1.last_name, e1.first_name, (SELECT MAX(salary) FROM employees e2 WHERE e1.employee_id = e2.employee_id) subquery2 FROM employees e1; |
В этом примере мы создали подзапрос в предложении SELECT следующим образом:
1 2 3 |
(SELECT MAX(salary) FROM employees e2 WHERE e1.employee_id = e2.employee_id) subquery2 |
Подзапрос был с псевдонимом с именем subquery2. Это будет имя, используемое для ссылки на этот подзапрос или любое из его полей.
Трюк для размещения подзапроса в предложении select заключается в том, что подзапрос должен возвращать одно значение. Вот почему в подзапросе используется агрегирующая функция, такая как функция SUM, COUNT, MIN или MAX.