Вложенные подзапросы SQL

Содержание
  1. Вложенные подзапросы Подзапрос может быть вложен внутри других подзапросов. 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.
  2. Пример -1: Вложенные подзапросы
  3. Пример -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.

Оцените статью
nanomode.ru
Добавить комментарий