SQL: однострочные подзапросы

Содержание
  1. Подзапросы с одной строкой Подзапрос с одной строкой возвращает ноль или одну строку во внешний оператор SQL. Вы можете поместить подзапрос в предложение WHERE, предложение HAVING или предложение FROM оператора SELECT. Содержание: Подзапросы с одной строкой в ​​предложении WHERE Использование операторов сравнения в подзапросах с одной строкой Подзапросы в предложении HAVING Подзапросы в предложении FROM Ошибка в однострочных подзапросах Однострочные подзапросы в предложении WHERE Вы можете поместить подзапрос в предложение WHERE другого запроса. Давайте рассмотрим пример запроса, который содержит подзапрос, помещенный в его предложение WHERE. Пример таблицы: агенты Код SQL: ВЫБЕРИТЕ имя_агента, код_агента, телефон_noFROM agentWHERE agent_code = (ВЫБЕРИТЕ код_агента ОТ агентовWHERE agent_name = 'Alex'); Вывод: AGENT_NAME AGENT_CODE PHONE_NO ----------------------- ----------------- ---------- --------------- Alex A003 075-12458969 В приведенном выше примере извлекаются ageent_name, agent_code, phone_no из таблицы агентов, имя_агента которой — ‘Alex’. Давайте разделим запрос на две части и проанализируем, что происходит. Код SQL: SELECT agent_code ОТ агентовWHERE agent_name = 'Alex'; Вывод: AGENT_CODE ---------- A003 Приведенный выше подзапрос выполняется первым и возвращает код_агента для строки, имя_агента которой — «Алекс». Agent_code для этой строки — «A003», который передается в предложение where внешнего (основного) запроса. Упрощенная форма приведенного выше кода: Код SQL: SELECT имя_агента , agent_code, phone_noFROM agentWHERE agent_code = 'A003'; Графическая презентация: Использование операторов сравнения в подзапросах Single Row В предыдущем примере использовался оператор равенства (=) в WHERE пункт. Другие операторы сравнения, такие как ,>, Условие в внешний запрос: значение ‘ord_amount’ таблицы ‘orders’ должно быть больше, чем среднее ‘ord_amount’ таблицы ‘orders’ со следующим условием: внутреннее соединение. Условие во внутреннем запросе: ‘ord_date’ таблицы ‘orders’ должен быть ’20 -APR-08′ для вычисления среднего ‘ ord_amount ‘. Пример таблицы: orders Вот полный оператор SQL: Код SQL: SELECT ord_num, ord_amount, ord_date, cust_code, agent_codeFROM ordersWHERE ord_amount> (SELECT AVG (ord_amount) FROM ordersWHERE ord_date = '20 -APR-08 '); Вывод: ORD_NUM ORD_AMOUNT ORD_DATE CUST_CODE AGENT_CODE -------- - ---------- --------- ---------- ---------- 200114 3500 15-АВГ-08 C00002 A008 200119 4000 16-СЕН-08 C00007 A010 200134 4200 25-СЕН-08 C00004 A005 200108 4000 15-ФЕВ-08 C00008 A004 200109 3500 30-ИЮЛ-08 C00011 A010 200101 3000 15-ИЮЛ-08 C00001 A008 200128 3500 20-ИЮЛ- 08 C00009 A002 200132 4000 15-AUG-08 C00013 A013 200110 3000 15-APR-08 C00019 A010 200107 4500 30-AUG-08 C00007 A010 200113 4000 10-JUN-08 C00022 A002 Давайте перерыв запрос и проанализировать, что происходит во внутреннем запросе. Вот код внутреннего запроса: Код SQL: ВЫБРАТЬ AVG (ord_amount) ОТ ordersWHERE ord_date = '20 -APR-08 '; Вывод: AVG (ORD_AMOUNT) ------------ --- 2500 Вышеупомянутый запрос возвращает среднее значение ‘ord_amount’ 2500, используется в предложении WHERE внешнего запроса, показанного ранее. Упрощенная форма приведенного выше кода: Код SQL: SELECT ord_num , ord_amount, ord_date, cust_code, agent_codeFROM ordersWHERE ord_amount> 2500; Графическая презентация: Подзапросы в предложении HAVING Предложение HAVING используется для фильтрации групп строк. Вы можете поместить подзапрос в предложение HAVING внешнего запроса. Это позволяет фильтровать группы строк на основе результата, возвращаемого вашим подзапросом. В следующем примере используется подзапрос в предложении HAVING внешнего запроса. В этом примере из таблицы заказов извлекаются ‘ord_amount, количество agent_codes и agent_code’ со следующими условиями: — таблица agent_code of orders должна приходить четко. — среднее значение ord_amount каждого группа agent_code в таблице заказов должна быть равна средней величине ord_amount таблицы заказов. — таблица agent_code of orders должна быть ‘A008’. Пример таблицы: заказы Вот полный оператор SQL: Код SQL: SELECT AVG (ord_amount), COUNT (agent_code), agent_codeFROM заказывает GROUP BY agent_codeHAVING AVG (ord_amount) = ( SELECT AVG (ord_amount) FROM ordersWHERE agent_code = 'A008'); Вывод: AVG (ORD_AMOUNT) COUNT (AGENT_CODE) AGENT_CODE --- ------------ ----------------- ---------- 2500 2 A011 2500 3 A008 Давайте разберем код и проанализируем, что происходит во внутреннем запросе. Вот код внутреннего запроса: Код SQL: ВЫБРАТЬ AVG (ord_amount) ОТ ordersWHERE agent_code = 'A008'; Вывод: AVG (ORD_AMOUNT) --------------- 2500 Внутренняя часть приведенного выше запроса возвращает среднее значение ‘ord_amount’ Упрощенная форма кода: Код SQL: SELECT AVG (ord_amount), COUNT (agent_code), agent_codeFROM заказывает GROUP BY agent_codeHAVING AVG (ord_amount) = 2500; Графическая презентация: Подзапросы в предложении FROM Вы можете разместить подзапрос в предложении FROM внешнего запроса. Эти типы подзапросов также известны как встроенные представления, поскольку подзапрос предоставляет данные, встроенные в предложение FROM. В следующем примере извлекается item_id, у которого item_id меньше 4. Пример таблицы: foods Здесь является оператором SQL: Код SQL: SELECT item_idFROM (SELECT item_id FROM FOODS WHERE item_id Вывод: ITEM_ID ------ 123 Подзапрос возвращает строки из таблицу food, у которой item_id меньше 4, во внешний запрос, который затем извлекает и отображает эти значения item_id. Что касается предложения FROM внешнего запроса, то вывод подзапроса — это просто еще один источник данных. Наглядное представление: Ошибка в однострочных подзапросах В этом разделе мы обсудим некоторые ошибки, с которыми вы можете столкнуться при выполнении операции «однострочного подзапроса». В наших предыдущих примерах мы видели, что подзапрос с одной строкой всегда возвращает одну строку, и если подзапрос возвращает более одной строки, возникает ошибка. В следующем примере подзапрос пытается передать несколько строк оператору равенства (=) во внешнем запросе.. Пример таблицы: продукты Код SQL: SELECT item_id, item_name FROM foodsWHERE item_id = (SELECT item_id FROM food WHERE item_name LIKE '% a%'); Если вы запустите запрос в Oracle Database 10g Express Edition, вы получите следующую ошибку: ORA-01427: однострочный подзапрос возвращает более одной строки Давайте прервемся код и проанализируйте, что происходит во внутреннем запросе. Вот код внутреннего запроса: Код SQL: SELECT item_id FROM foods WHERE item_name LIKE '% a%'; Вывод: ITEM_ID ------ 57 Внутренний запрос возвращает две строки, и подзапрос пытается передать эти строки оператору равенства во внешнем соединении. Поскольку оператор равенства может обрабатывать одну строку, запрос недействителен и возвращается ошибка. Наглядное представление: См. нашу базу данных моделей Практические упражнения 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 Объединение [9 упражнений] Просмотр SQL [16 упражнений] Управление учетной записью пользователя SQL nt [16 упражнений] База данных фильмов БАЗОВЫЕ запросы к базе данных фильмов [10 упражнений] ПОДзапросы на База данных фильмов [16 упражнений] ПОДКЛЮЧАЕТСЯ к базе данных фильмов [24 упражнения] База данных футбола Введение БАЗОВЫЕ запросы к базе данных футбола [29 упражнений] ПОДзапросы к базе данных футбола [33 упражнения] СОЕДИНЯЕТ запросы к базе данных футбола [61 упражнения] База данных больниц Введение BASIC, SUBQUERIES и JOINS [39 упражнений] База данных сотрудников BASIC запросы к базе данных сотрудников [115 Упражнения] ПОДПРОСЫ в базе данных сотрудников [77 упражнений] Еще не все! Хотите улучшить статью выше? Публикуйте свои заметки/комментарии/примеры через Disqus.
  2. Однострочные подзапросы в предложении WHERE
  3. Использование операторов сравнения в подзапросах Single Row
  4. Подзапросы в предложении HAVING
  5. Подзапросы в предложении FROM
  6. Ошибка в однострочных подзапросах

Подзапросы с одной строкой

Подзапрос с одной строкой возвращает ноль или одну строку во внешний оператор SQL. Вы можете поместить подзапрос в предложение WHERE, предложение HAVING или предложение FROM оператора SELECT.

Содержание:

  • Подзапросы с одной строкой в ​​предложении WHERE
  • Использование операторов сравнения в подзапросах с одной строкой
  • Подзапросы в предложении HAVING
  • Подзапросы в предложении FROM
  • Ошибка в однострочных подзапросах

Однострочные подзапросы в предложении WHERE

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

Пример таблицы: агенты

Код SQL:

  ВЫБЕРИТЕ имя_агента, код_агента, телефон_noFROM agentWHERE agent_code = (ВЫБЕРИТЕ код_агента ОТ агентовWHERE agent_name = 'Alex');   

Вывод:

 AGENT_NAME AGENT_CODE PHONE_NO -----------------------  ----------------- ---------- --------------- Alex A003 075-12458969 

В приведенном выше примере извлекаются ageent_name, agent_code, phone_no из таблицы агентов, имя_агента которой — ‘Alex’. Давайте разделим запрос на две части и проанализируем, что происходит.

Код SQL:

  SELECT agent_code  ОТ агентовWHERE agent_name = 'Alex';  

Вывод:

 AGENT_CODE ---------- A003 

Приведенный выше подзапрос выполняется первым и возвращает код_агента для строки, имя_агента которой — «Алекс». Agent_code для этой строки — «A003», который передается в предложение where внешнего (основного) запроса.
Упрощенная форма приведенного выше кода:

Код SQL:

  SELECT имя_агента  , agent_code, phone_noFROM agentWHERE agent_code = 'A003';  

Графическая презентация:

Использование операторов сравнения в подзапросах Single Row

В предыдущем примере использовался оператор равенства (=) в WHERE пункт. Другие операторы сравнения, такие как ,>,

Условие в внешний запрос :
значение ‘ord_amount’ таблицы ‘orders’ должно быть больше, чем среднее ‘ord_amount’ таблицы ‘orders’ со следующим условием: внутреннее соединение.

Условие во внутреннем запросе :
‘ord_date’ таблицы ‘orders’ должен быть ’20 -APR-08′ для вычисления среднего ‘ ord_amount ‘.

Пример таблицы: orders

Вот полный оператор SQL:

Код SQL:

  SELECT ord_num, ord_amount, ord_date, cust_code, agent_codeFROM ordersWHERE ord_amount> (SELECT AVG (ord_amount)  FROM ordersWHERE ord_date = '20 -APR-08 ');  

Вывод:

 ORD_NUM ORD_AMOUNT ORD_DATE CUST_CODE AGENT_CODE --------  - ---------- --------- ---------- ---------- 200114 3500 15-АВГ-08 C00002 A008 200119  4000 16-СЕН-08 C00007 A010 200134 4200 25-СЕН-08 C00004 A005 200108 4000 15-ФЕВ-08 C00008 A004 200109 3500 30-ИЮЛ-08 C00011 A010 200101 3000 15-ИЮЛ-08 C00001 A008 200128 3500 20-ИЮЛ-  08 C00009 A002 200132 4000 15-AUG-08 C00013 A013 200110 3000 15-APR-08 C00019 A010 200107 4500 30-AUG-08 C00007 A010 200113 4000 10-JUN-08 C00022 A002 

Давайте перерыв запрос и проанализировать, что происходит во внутреннем запросе. Вот код внутреннего запроса:

Код SQL:

  ВЫБРАТЬ AVG (ord_amount) ОТ ordersWHERE  ord_date = '20 -APR-08 ';  

Вывод:

 AVG (ORD_AMOUNT) ------------  --- 2500 

Вышеупомянутый запрос возвращает среднее значение ‘ord_amount’ 2500, используется в предложении WHERE внешнего запроса, показанного ранее.

Упрощенная форма приведенного выше кода:

Код SQL:

  SELECT ord_num  , ord_amount, ord_date, cust_code, agent_codeFROM ordersWHERE ord_amount> 2500;  

Графическая презентация:

Подзапросы в предложении HAVING

Предложение HAVING используется для фильтрации групп строк. Вы можете поместить подзапрос в предложение HAVING внешнего запроса. Это позволяет фильтровать группы строк на основе результата, возвращаемого вашим подзапросом. В следующем примере используется подзапрос в предложении HAVING внешнего запроса. В этом примере из таблицы заказов извлекаются ‘ord_amount, количество agent_codes и agent_code’ со следующими условиями:

— таблица agent_code of orders должна приходить четко.
— среднее значение ord_amount каждого группа agent_code в таблице заказов должна быть равна средней величине ord_amount таблицы заказов.
— таблица agent_code of orders должна быть ‘A008’.

Пример таблицы: заказы

Вот полный оператор SQL:

Код SQL:

  SELECT AVG (ord_amount), COUNT (agent_code), agent_codeFROM заказывает GROUP BY agent_codeHAVING AVG (ord_amount) = (  SELECT AVG (ord_amount) FROM ordersWHERE agent_code = 'A008');  

Вывод:

 AVG (ORD_AMOUNT) COUNT (AGENT_CODE) AGENT_CODE ---  ------------ ----------------- ---------- 2500 2 A011 2500 3 A008 

Давайте разберем код и проанализируем, что происходит во внутреннем запросе. Вот код внутреннего запроса:

Код SQL:

  ВЫБРАТЬ AVG (ord_amount) ОТ ordersWHERE  agent_code = 'A008';  

Вывод:

 AVG (ORD_AMOUNT) --------------- 2500  

Внутренняя часть приведенного выше запроса возвращает среднее значение ‘ord_amount’

Упрощенная форма кода:

Код SQL:

  SELECT AVG (ord_amount), COUNT (agent_code), agent_codeFROM заказывает GROUP BY agent_codeHAVING  AVG (ord_amount) = 2500;  

Графическая презентация:

Подзапросы в предложении FROM

Вы можете разместить подзапрос в предложении FROM внешнего запроса. Эти типы подзапросов также известны как встроенные представления, поскольку подзапрос предоставляет данные, встроенные в предложение FROM. В следующем примере извлекается item_id, у которого item_id меньше 4.

Пример таблицы: foods

Здесь является оператором SQL:

Код SQL:

  SELECT item_idFROM (SELECT item_id FROM FOODS WHERE item_id  

Вывод:

 ITEM_ID ------ 123 

Подзапрос возвращает строки из таблицу food, у которой item_id меньше 4, во внешний запрос, который затем извлекает и отображает эти значения item_id. Что касается предложения FROM внешнего запроса, то вывод подзапроса — это просто еще один источник данных.

Наглядное представление:

Ошибка в однострочных подзапросах

В этом разделе мы обсудим некоторые ошибки, с которыми вы можете столкнуться при выполнении операции «однострочного подзапроса». В наших предыдущих примерах мы видели, что подзапрос с одной строкой всегда возвращает одну строку, и если подзапрос возвращает более одной строки, возникает ошибка. В следующем примере подзапрос пытается передать несколько строк оператору равенства (=) во внешнем запросе..

Пример таблицы: продукты

Код SQL:

  SELECT item_id, item_name FROM foodsWHERE item_id = (SELECT item_id FROM food WHERE item_name LIKE '% a%');  

Если вы запустите запрос в Oracle Database 10g Express Edition, вы получите следующую ошибку:

ORA-01427: однострочный подзапрос возвращает более одной строки

Давайте прервемся код и проанализируйте, что происходит во внутреннем запросе. Вот код внутреннего запроса:

Код SQL:

  SELECT item_id FROM foods WHERE item_name LIKE  '% a%';  

Вывод:

 ITEM_ID ------ 57 

Внутренний запрос возвращает две строки, и подзапрос пытается передать эти строки оператору равенства во внешнем соединении. Поскольку оператор равенства может обрабатывать одну строку, запрос недействителен и возвращается ошибка.

Наглядное представление:

См. нашу базу данных моделей

Практические упражнения 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 Объединение [9 упражнений]
  • Просмотр SQL [16 упражнений]
  • Управление учетной записью пользователя SQL nt [16 упражнений]
  • База данных фильмов
    • БАЗОВЫЕ запросы к базе данных фильмов [10 упражнений]
    • ПОДзапросы на База данных фильмов [16 упражнений]
    • ПОДКЛЮЧАЕТСЯ к базе данных фильмов [24 упражнения]
  • База данных футбола
    • Введение
    • БАЗОВЫЕ запросы к базе данных футбола [29 упражнений]
    • ПОДзапросы к базе данных футбола [33 упражнения]
    • СОЕДИНЯЕТ запросы к базе данных футбола [61 упражнения]
  • База данных больниц
    • Введение
    • BASIC, SUBQUERIES и JOINS [39 упражнений]
  • База данных сотрудников
    • BASIC запросы к базе данных сотрудников [115 Упражнения]
    • ПОДПРОСЫ в базе данных сотрудников [77 упражнений]
  • Еще не все!

Хотите улучшить статью выше? Публикуйте свои заметки/комментарии/примеры через Disqus.

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