- Вложенные подзапросы Подзапрос может быть вложен внутри других подзапросов. SQL имеет возможность вкладывать запросы друг в друга. Подзапрос — это оператор SELECT, вложенный в другой оператор SELECT и возвращающий промежуточные результаты. SQL сначала выполняет самый внутренний подзапрос, затем следующий уровень. См. Следующие примеры: Пример -1: Вложенные подзапросы Если мы хотим получить этот уникальный job_id и среднюю зарплату из таблицы сотрудников, у которой уникальный job_id salary меньше, чем (максимум средних значений min_salary каждого уникального job_id из таблицы вакансий, которая job_id находится в списке, выбирая из (таблица job_history, которая находится в пределах Department_id 50 и 100)), можно использовать следующий оператор SQL: Примерная таблица: сотрудники Пример таблицы: вакансии Код SQL: ВЫБЕРИТЕ job_id, AVG (зарплата) FROM сотрудников GROUP BY job_id ИМЕЕТ AVG (зарплата) Приведенный выше код выполняется в Oracle 11g Express Edition. или ВЫБРАТЬ job_i d, AVG (зарплата) SELECT job_id, AVG (salary) FROM employee GROUP BY job_id HAVING AVG (salary) Приведенный выше код выполняется в PostgreSQL 9.3 Вывод JOB_ID AVG (SALARY) ---------- ----------- IT_PROG 5760AC_ACCOUNT 8300ST_MAN 7280AD_ASST 4400SH_CLERK 3215FI_ACCOUNT 7920PU_CLERK 2780SA_REP 8350MK_REP 6000ST_CLERK 2785 6500 Объяснение: Этот пример содержит три запроса: вложенный подзапрос, подзапрос и внешний запрос. Эти части запросов выполняются в указанном порядке. Давайте разделим пример на три части и рассмотрим полученные результаты. Сначала вложите следующий вложенный подзапрос: Код SQL: ВЫБЕРИТЕ job_id FROM job_history WHERE department_id МЕЖДУ 50 И 100; Этот вложенный подзапрос извлекает идентификаторы job_id из таблицы job_history, которая находится в пределах идентификатора отдела 50 и 100. Вот результат. Вывод: JOB_ID ---------- ST_CLERKST_CLERKIT_PROGSA_REPSA_MANAD_ASSTAC_ACCOUNT Вот наглядное изображение того, как выше выводится. Теперь подзапрос, который получает вывод от вложенный подзапрос, указанный выше. SELECT MAX (AVG (min_salary)) FROM jobs WHERE job_id IN (..... вывод вложенного подзапроса ...... ) GROUP BY job_id Внутренний подзапрос работает следующим образом: Код SQL: SELECT MAX (AVG (min_salary)) FROM jobs WHERE job_id IN ('ST_CLERK', 'ST_CLERK', 'IT_PROG', 'SA_REP', 'SA_MAN', 'AD_ASST', 'AC_ACCOUNT' ) GROUP BY job_id; Подзапрос возвращает максимум средних значений min_salary для каждого возвращаемого уникального идентификатора job_id (т.е. ‘ST_CLERK’, ‘ST_CLERK’, ‘IT_PROG’, ‘SA_REP’, ‘SA_MAN’, ‘AD_ASST’, ‘AC_ACCOUNT’) предыдущим подзапросом. Вот результат: Вывод: MAX (AVG (MIN_SALARY)) --------- ----------- 10000 Вот наглядное представление того, как возвращается вышеприведенный вывод. Теперь внешний запрос, который получает выходные данные из подзапроса и который также получает выходные данные из вложенного подзапроса, указанного выше. SELECT job_id, AVG (salary) FROM employee GROUP BY job_id HAVING AVG (salary) Внутренний внешний запрос работает следующим образом: Код SQL: SELECT job_id, AVG (salary) FROM employee GROUP BY job_id HAVING AVG (salary) Внешний запрос возвращает job_id, средняя зарплата сотрудников, которая меньше максимальной средней min_salary, возвращенной предыдущим запросом Вывод: JOB_ID AVG (SALARY) ----- ----- ----------- IT_PROG 5760AC_ACCOUNT 8300ST_MAN 7280AD_ASST 4400SH_CLERK 3215FI_ACCOUNT 7920PU_CLERK 2780SA_REP 8350MK_REP 6000ST_CLERK 2785HR_REP 6500 Пример -2: вложенные подзапросы p> Вот еще один пример вложенного подзапроса. Пример таблицы: заказы Пример таблицы: customer Пример t able: агенты Код SQL: ВЫБЕРИТЕ ord_num, ord_date, ord_amount, advance_amountFROM заказы WHERE ord_amount> 2000 И ord_date Вывод: ORD_NUM ORD_DATE ORD_AMOUNT ADVANCE_AMOUNT ---------- -------- - ---------- -------------- 200130 30-июл-08 2500400 200127 20-июл-08 2500400 200110 15-апр-08 3000500 200105 18-ИЮЛ-08 2500 500 200129 20-ИЮЛ-08 2500 500 200108 15-ФЕВ-08 4000600 200113 10-ИЮН-08 4000600 200106 20-АПР-08 2500 700 200109 30-ИЮЛ-08 3500 800 200107 30- AUG-08 4500 900 200101 15-JUL-08 3000 1000 200128 20-JUL-08 3500 1500 200114 15-AUG-08 3500 2000 Пояснение: Последний внутренний запрос будет извлекать строки из таблицы агентов, у которых комиссия меньше 0,12%. Второй последний внутренний запрос возвращает невыплаченную сумму для этих клиентов которые находятся в 3-м классе и не принадлежат к стране Индия, и их начальная сумма депозита меньше 7000, а их агенты должны были заработать комиссию менее 0,12%. Внешний запрос возвращает ord_num , ord_date, ord_amount, advance_amount для тех заказов из таблицы заказов, которые h ord_amount больше 2000, а ord_date до ’01 -sep-08 ‘, и сумма аванса может быть невыплаченной суммой для тех клиентов, которые находятся в 3-м классе и не принадлежат стране Индии, и там внесенная начальная сумма меньше 7000 а их агенты должны были заработать комиссию менее 0,12%. Давайте разберем код и проанализируем, что происходит во внутреннем запросе. Вот первый код внутреннего запроса с выводом: Код SQL: ВЫБРАТЬ * ОТ агентовГДЕ комиссия Вывод: AGENT_CODE AGENT_NAME РАБОЧАЯ_ЗОНА КОМИССИЯ PHONE_NO СТРАНА ---------- ----- ---------- ----------------- ---------- ------------- - --------- A009 Benjamin Hampshair .11 008-22536178A002 Mukesh Mumbai .11 029-12358964 Вот второй код внутреннего запроса (включая первый) с выводом : Код SQL: ВЫБРАТЬ OUTSTANDING_AMTFROM CUSTOMERWHERE GRADE = 3 AND CUST_COUNTRY 'India' И open_amt Вывод: OUTSTANDING_AMT --------------- 6000 3000 5000 См. нашу базу данных моделей Практические упражнения SQL Упражнения SQL, практика, решение SQL Получение данных из таблиц [33 упражнения] Логические операторы SQL и реляционные операторы [12 упражнений] Подстановочные знаки SQL и специальные операторы [22 упражнения] Агрегатные функции SQL [25 упражнений] Вывод запроса форматирования SQL [10 упражнений] SQL-запросы к нескольким таблицам [7 упражнений] ФИЛЬТРАЦИЯ и СОРТИРОВКА в базе данных HR [38 упражнений] SQL JOINS SQL JOINS [29 упражнений] SQL JOINS в базе данных HR [27 упражнений] SQL SUBQUERIES ПОДзапросы SQL [39 упражнений] ПОДПРОСЫ SQL в базе данных HR [55 упражнений] SQL Union [9 упражнений] Просмотр SQL [16 упражнений] Управление учетными записями пользователей SQL [16 упражнений e] База данных фильмов БАЗОВЫЕ запросы к базе данных фильмов [10 упражнений] ПОДзапросы к базе данных фильмов [ 16 упражнений] ПРИСОЕДИНЯЕТСЯ к базе данных фильмов [24 упражнения] Soccer Database Введение БАЗОВЫЕ запросы к базе данных футбола [29 упражнений] ЗАПРОСЫ в базе данных футбола [33 упражнения] СОЕДИНЯЕТ запросы к базе данных футбола [61 упражнения] База данных больниц Введение BASIC, SUBQUERIES и JOINS [39 упражнений] База данных сотрудников БАЗОВЫЕ запросы к базе данных сотрудников [115 упражнений] ПОДПРОСЫ в базе данных сотрудников [77 упражнений] Еще не все! Хотите улучшить статью выше? Публикуйте свои заметки/комментарии/примеры через Disqus.
- Пример -1: Вложенные подзапросы
- Пример -2: вложенные подзапросы p> Вот еще один пример вложенного подзапроса.
Вложенные подзапросы
Подзапрос может быть вложен внутри других подзапросов. SQL имеет возможность вкладывать запросы друг в друга. Подзапрос — это оператор SELECT, вложенный в другой оператор SELECT и возвращающий промежуточные результаты. SQL сначала выполняет самый внутренний подзапрос, затем следующий уровень. См. Следующие примеры:
Пример -1: Вложенные подзапросы
Если мы хотим получить этот уникальный job_id и среднюю зарплату из таблицы сотрудников, у которой уникальный job_id salary меньше, чем (максимум средних значений min_salary каждого уникального job_id из таблицы вакансий, которая job_id находится в списке, выбирая из (таблица job_history, которая находится в пределах Department_id 50 и 100)), можно использовать следующий оператор SQL:
Примерная таблица: сотрудники
Пример таблицы: вакансии
Код SQL:
ВЫБЕРИТЕ job_id, AVG (зарплата) FROM сотрудников GROUP BY job_id ИМЕЕТ AVG (зарплата)
Приведенный выше код выполняется в Oracle 11g Express Edition.
или
ВЫБРАТЬ job_i d, AVG (зарплата) SELECT job_id, AVG (salary) FROM employee GROUP BY job_id HAVING AVG (salary)
Приведенный выше код выполняется в PostgreSQL 9.3
Вывод
JOB_ID AVG (SALARY) ---------- ----------- IT_PROG 5760AC_ACCOUNT 8300ST_MAN 7280AD_ASST 4400SH_CLERK 3215FI_ACCOUNT 7920PU_CLERK 2780SA_REP 8350MK_REP 6000ST_CLERK 2785 6500
Объяснение:
Этот пример содержит три запроса: вложенный подзапрос, подзапрос и внешний запрос. Эти части запросов выполняются в указанном порядке.
Давайте разделим пример на три части и рассмотрим полученные результаты.
Сначала вложите следующий вложенный подзапрос:
Код SQL:
ВЫБЕРИТЕ job_id FROM job_history WHERE department_id МЕЖДУ 50 И 100;
Этот вложенный подзапрос извлекает идентификаторы job_id из таблицы job_history, которая находится в пределах идентификатора отдела 50 и 100.
Вот результат.
Вывод:
JOB_ID ---------- ST_CLERKST_CLERKIT_PROGSA_REPSA_MANAD_ASSTAC_ACCOUNT
Вот наглядное изображение того, как выше выводится.
Теперь подзапрос, который получает вывод от вложенный подзапрос, указанный выше.
SELECT MAX (AVG (min_salary)) FROM jobs WHERE job_id IN (..... вывод вложенного подзапроса ...... ) GROUP BY job_id
Внутренний подзапрос работает следующим образом:
Код SQL:
SELECT MAX (AVG (min_salary)) FROM jobs WHERE job_id IN ('ST_CLERK', 'ST_CLERK', 'IT_PROG', 'SA_REP', 'SA_MAN', 'AD_ASST', 'AC_ACCOUNT' ) GROUP BY job_id;
Подзапрос возвращает максимум средних значений min_salary для каждого возвращаемого уникального идентификатора job_id (т.е. ‘ST_CLERK’, ‘ST_CLERK’, ‘IT_PROG’, ‘SA_REP’, ‘SA_MAN’, ‘AD_ASST’, ‘AC_ACCOUNT’) предыдущим подзапросом.
Вот результат:
Вывод:
MAX (AVG (MIN_SALARY)) --------- ----------- 10000
Вот наглядное представление того, как возвращается вышеприведенный вывод.
Теперь внешний запрос, который получает выходные данные из подзапроса и который также получает выходные данные из вложенного подзапроса, указанного выше.
SELECT job_id, AVG (salary) FROM employee GROUP BY job_id HAVING AVG (salary)
Внутренний внешний запрос работает следующим образом:
Код SQL:
SELECT job_id, AVG (salary) FROM employee GROUP BY job_id HAVING AVG (salary)
Внешний запрос возвращает job_id, средняя зарплата сотрудников, которая меньше максимальной средней min_salary, возвращенной предыдущим запросом
Вывод:
JOB_ID AVG (SALARY) ----- ----- ----------- IT_PROG 5760AC_ACCOUNT 8300ST_MAN 7280AD_ASST 4400SH_CLERK 3215FI_ACCOUNT 7920PU_CLERK 2780SA_REP 8350MK_REP 6000ST_CLERK 2785HR_REP 6500
Пример -2: вложенные подзапросы p> Вот еще один пример вложенного подзапроса.
Пример таблицы: заказы
Пример таблицы: customer
Пример t able: агенты
Код SQL:
ВЫБЕРИТЕ ord_num, ord_date, ord_amount, advance_amountFROM заказы WHERE ord_amount> 2000 И ord_date
Вывод:
ORD_NUM ORD_DATE ORD_AMOUNT ADVANCE_AMOUNT ---------- -------- - ---------- -------------- 200130 30-июл-08 2500400 200127 20-июл-08 2500400 200110 15-апр-08 3000500 200105 18-ИЮЛ-08 2500 500 200129 20-ИЮЛ-08 2500 500 200108 15-ФЕВ-08 4000600 200113 10-ИЮН-08 4000600 200106 20-АПР-08 2500 700 200109 30-ИЮЛ-08 3500 800 200107 30- AUG-08 4500 900 200101 15-JUL-08 3000 1000 200128 20-JUL-08 3500 1500 200114 15-AUG-08 3500 2000
Пояснение:
Последний внутренний запрос будет извлекать строки из таблицы агентов, у которых комиссия меньше 0,12%.
Второй последний внутренний запрос возвращает невыплаченную сумму для этих клиентов которые находятся в 3-м классе и не принадлежат к стране Индия, и их начальная сумма депозита меньше 7000, а их агенты должны были заработать комиссию менее 0,12%.
Внешний запрос возвращает ord_num , ord_date, ord_amount, advance_amount для тех заказов из таблицы заказов, которые h ord_amount больше 2000, а ord_date до ’01 -sep-08 ‘, и сумма аванса может быть невыплаченной суммой для тех клиентов, которые находятся в 3-м классе и не принадлежат стране Индии, и там внесенная начальная сумма меньше 7000 а их агенты должны были заработать комиссию менее 0,12%.
Давайте разберем код и проанализируем, что происходит во внутреннем запросе. Вот первый код внутреннего запроса с выводом:
Код SQL:
ВЫБРАТЬ * ОТ агентовГДЕ комиссия
Вывод:
AGENT_CODE AGENT_NAME РАБОЧАЯ_ЗОНА КОМИССИЯ PHONE_NO СТРАНА ---------- ----- ---------- ----------------- ---------- ------------- - --------- A009 Benjamin Hampshair .11 008-22536178A002 Mukesh Mumbai .11 029-12358964
Вот второй код внутреннего запроса (включая первый) с выводом :
Код SQL:
ВЫБРАТЬ OUTSTANDING_AMTFROM CUSTOMERWHERE GRADE = 3 AND CUST_COUNTRY 'India' И open_amt
Вывод:
OUTSTANDING_AMT --------------- 6000 3000 5000
См. нашу базу данных моделей
Практические упражнения SQL
- Упражнения SQL, практика, решение
- SQL Получение данных из таблиц [33 упражнения]
- Логические операторы SQL и реляционные операторы [12 упражнений]
- Подстановочные знаки SQL и специальные операторы [22 упражнения]
- Агрегатные функции SQL [25 упражнений]
- Вывод запроса форматирования SQL [10 упражнений]
- SQL-запросы к нескольким таблицам [7 упражнений]
- ФИЛЬТРАЦИЯ и СОРТИРОВКА в базе данных HR [38 упражнений]
- SQL JOINS
- SQL JOINS [29 упражнений]
- SQL JOINS в базе данных HR [27 упражнений]
- SQL SUBQUERIES
- ПОДзапросы SQL [39 упражнений]
- ПОДПРОСЫ SQL в базе данных HR [55 упражнений]
- SQL Union [9 упражнений]
- Просмотр SQL [16 упражнений]
- Управление учетными записями пользователей SQL [16 упражнений e]
- База данных фильмов
- БАЗОВЫЕ запросы к базе данных фильмов [10 упражнений]
- ПОДзапросы к базе данных фильмов [ 16 упражнений]
- ПРИСОЕДИНЯЕТСЯ к базе данных фильмов [24 упражнения]
- Soccer Database
- Введение
- БАЗОВЫЕ запросы к базе данных футбола [29 упражнений]
- ЗАПРОСЫ в базе данных футбола [33 упражнения]
- СОЕДИНЯЕТ запросы к базе данных футбола [61 упражнения]
- База данных больниц
- Введение
- BASIC, SUBQUERIES и JOINS [39 упражнений]
- База данных сотрудников
- БАЗОВЫЕ запросы к базе данных сотрудников [115 упражнений]
- ПОДПРОСЫ в базе данных сотрудников [77 упражнений]
- Еще не все!
Хотите улучшить статью выше? Публикуйте свои заметки/комментарии/примеры через Disqus.