- Подзапросы с одной строкой Подзапрос с одной строкой возвращает ноль или одну строку во внешний оператор 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.
- Однострочные подзапросы в предложении WHERE
- Использование операторов сравнения в подзапросах Single Row
- Подзапросы в предложении HAVING
- Подзапросы в предложении FROM
- Ошибка в однострочных подзапросах
Подзапросы с одной строкой
Подзапрос с одной строкой возвращает ноль или одну строку во внешний оператор 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.