SQL: несколько подзапросов строк и столбцов
Подзапросы с несколькими строками
Многострочный подзапрос возвращает одну или несколько строк во внешнюю инструкцию SQL. Вы можете использовать оператор IN, ANY или ALL во внешнем запросе для обработки подзапроса, который возвращает несколько строк.
Содержание:
SQL: использование оператора IN с подзапросом с несколькими строками
Оператор IN используется для проверки значения в наборе значений. Список значений может быть получен из результатов, возвращаемых подзапросом. Смотрите следующий пример:
Чтобы получить 'ord_num', 'ord_amount', 'ord_date', 'cust_code' и 'agent_code' из таблицы 'orders' со следующими условиями:
Пример таблицы: агенты
Пример таблицы: заказы
во внешнем запросе:
'agent_code' таблицы 'orders' должен быть в списке внутри оператора IN во внутреннем запросе:
во внутреннем запросе:
'working_area' таблицы 'агентов' должно быть 'Бангалор',
Вот полный оператор SQL:
SELECT ord_num,ord_amount,ord_date,
cust_code, agent_code
FROM orders
WHERE agent_code IN(
SELECT agent_code FROM agents
WHERE working_area='Bangalore');
Выход :
ORD_NUM ORD_AMOUNT ORD_DATE CUST_CODE AGENT_CODE ---------- ---------- --------- ---------- ---------- 200130 2500 30 июля 2010 года C00025 A011 200105 2500 18-ИЮЛ-08 C00025 A011 200117 800 20-ОКТ-08 C00014 A001 200124 500 20-ИЮНЬ-08 C00017 A007 200112 2000 30 мая 2008 года C00016 A007
Давайте разберем приведенный выше запрос и проанализируем, что происходит во внутреннем запросе. Вот код внутреннего запроса:
SELECT agent_code FROM agents
WHERE working_area='Bangalore';
Выход :
AGENT_CODE ---------- A001 A007 A011
Приведенный выше запрос возвращает два кода оператора: «A011» и «A001».
Иллюстрированная презентация:
SQL: использование оператора NOT IN с подзапросом с несколькими строками
Вы также можете использовать оператор NOT IN для выполнения логической противоположности оператора IN. Смотрите следующий пример:
Пример таблицы: заказы
Пример таблицы: агенты
Чтобы получить 'ord_num', 'ord_amount', 'ord_date', 'cust_code' и 'agent_code' из таблицы 'orders' со следующими условиями:
во внешнем запросе:
'agent_code' таблицы 'orders' должен отличаться от списка в операторе IN.
во внутреннем запросе:
'working_area' таблицы 'агентов' должно быть 'Мумбаи'
Вот полный оператор SQL:
SELECT ord_num,ord_amount,ord_date,
cust_code, agent_code
FROM orders
WHERE agent_code NOT IN(
SELECT agent_code FROM agents
WHERE working_area='Bangalore');
Выход:
ORD_NUM ORD_AMOUNT ORD_DATE CUST_CODE AGENT_CO --------- ---------- --------- ---------- -------- 200129 2500 20-ИЮЛ-08 C00024 A006 200118 500 20-ИЮЛЬ-08 C00023 A006 200111 1000 10-ИЮЛ-08 C00020 A008 200101 3000 15-ИЮЛ-08 C00001 A008 200114 3500 15-AUG-08 C00002 A008 200100 1000 08-ЯНВ-08 C00015 A003 200127 2500 20-ИЮЛЬ-08 C00015 A003 200113 4000 10-ИЮНЬ-08 C00022 A002 200133 1200 29 июня 2008 года C00009 A002 200128 3500 20 июля 2010 года C00009 A002 200126 500 24-ИЮНЬ-08 C00022 A002 200120 500 20 июля 2010 года C00009 A002 200123 500 16-SEP-08 C00022 A002 200106 2500 20-АПР-08 C00005 A002 200116 500 13-ИЮЛ-08 C00010 A009 200132 4000 15-AUG-08 C00013 A013 200115 2000 08-ФЕВ-08 C00013 A013 200125 2000 10-ОКТ-08 C00018 A005 200103 1500 15 мая 2008 года C00021 A005 200134 4200 25-SEP-08 C00004 A005 ......... .........
Давайте разберем приведенный выше запрос и проанализируем, что происходит во внутреннем запросе. Вот код внутреннего запроса:
SELECT agent_code ОТ агентов ГДЕ working_area = 'Бангалор';
Выход :
AGENT_CODE ---------- A001 A007 A011
Иллюстрированная презентация:
SQL: использование ЛЮБОГО с подзапросом с несколькими строками
Вы можете использовать ЛЮБОЙ оператор для сравнения значения с любым значением в списке. Вы должны поместить оператор =, <>,>, <, <= или> = перед любым запросом. В следующем примере используется ЛЮБОЙ, чтобы проверить, принадлежит ли какой-либо агент, принадлежащий стране, «Великобритания».
Пример таблицы: агенты
Образец таблицы: клиент
Чтобы получить 'agent_code', 'agent_name', 'working_area', 'Commission' из таблицы 'agent' при следующих условиях -
во внешнем запросе:
'agent_code' должен быть любым 'agent_code' из таблицы 'customer'
во внутреннем запросе:
) 'cust_country' в таблице 'customer' должно быть 'UK',
Вот полный оператор SQL:
SELECT agent_code,agent_name,working_area,commission
FROM agents
WHERE agent_code=ANY(
SELECT agent_code FROM customer
WHERE cust_country='UK');
Выход:
AGENT_CODE AGENT_NAME WORKING_AREA COMMISSION ---------- ---------------------------------------- ----------------------------------- ---------- A009 Бенджамин Хэмпшир .11 A003 Алекс Лондон .13 A006 McDen London .15
Наглядная презентация:
SQL: несколько столбцов подзапросов
Вы можете написать подзапросы, которые возвращают несколько столбцов. В следующем примере извлекается сумма заказа с наименьшей ценой, сгруппированная по коду агента.
Пример таблицы: заказы
select ord_num, agent_code, ord_date, ord_amount
from orders
where(agent_code, ord_amount) IN
(SELECT agent_code, MIN(ord_amount)
FROM orders
GROUP BY agent_code);
Выход:
ORD_NUM AGENT_CODE ORD_DATE ORD_AMOUNT ---------- ---------- --------- ---------- 200104 A004 13-MAR-08 1500 200121 A004 23-SEP-08 1500 200126 A002 24-ИЮНЬ-08 500 200120 A002 20-июл-08 500 200123 A002 16-SEP-08 500 200124 A007 20-ИЮНЬ-08 500 200116 A009 13-июл-08 500 200105 A011 18-JUL-08 2500 200130 A011 30-июл-08 2500 200131 A012 26-AUG-08 900 200135 A010 16-SEP-08 2000 200115 A013 08-FEB-08 2000 200117 A001 20-OCT-08 800 200111 A008 10-JUL-08 1000 200118 A006 20-июл-08 500 200103 A005 15 мая 2008 года 200100 A003 08-JAN-08 1000
Иллюстрированная презентация:
SQL: подзапросы, использующие DISTINCT
В этом разделе мы обсуждаем использование предложения DISTINCT в подзапросе.
Пример :
Пример таблицы: заказы
Чтобы получить 'ord_num', 'ord_amount', 'ord_date', 'cust_code' и 'agent_code' из таблицы 'orders' при следующих условиях -
во внешнем запросе:
'agent_code' таблицы 'orders' должен совпадать с 'agent_code' таблицы 'orders' при следующих условиях:
'agent_code' таблицы 'orders' должен быть четко представлен следующим
внутренний запрос:
; 'cust_code' таблицы 'orders' должен быть 'C00005'
Вот полный оператор SQL:
SELECT ord_num,ord_amount,ord_date,
cust_code, agent_code
FROM orders
WHERE agent_code=(
SELECT DISTINCT agent_code
FROM orders WHERE cust_code='C00005');
Выход :
ORD_NUM ORD_AMOUNT ORD_DATE CUST_CODE AGENT_CODE ---------- ---------- --------- ---------- ---------- 200106 2500 20-АПР-08 C00005 A002 200123 500 16-SEP-08 C00022 A002 200120 500 20 июля 2010 года C00009 A002 200126 500 24-ИЮНЬ-08 C00022 A002 200128 3500 20 июля 2010 года C00009 A002 200133 1200 29 июня 2008 года C00009 A002 200113 4000 10-ИЮНЬ-08 C00022 A002
Внутренняя часть вышеприведенного запроса возвращает код агента A002.
Упрощенная форма приведенного выше кода:
SELECT ord_num,ord_amount,ord_date,
cust_code, agent_code
FROM orders
WHERE agent_code='A002';
Упражнения по SQL
- Упражнения по SQL, практика, решение
- SQL Получить данные из таблиц [33 Упражнения]
- Булевы и реляционные операторы SQL [12 упражнений]
- Подстановочные знаки SQL и специальные операторы [22 упражнения]
- Агрегатные функции SQL [25 упражнений]
- Вывод запроса форматирования SQL [10 упражнений]
- SQL-запросы к нескольким таблицам [7 упражнений]
- ФИЛЬТРАЦИЯ И СОРТИРОВКА в базе данных персонала [38 упражнений]
- SQL СОЕДИНЯЕТ
- SQL ПОДПИСИ
- SQL Union [9 упражнений]
- SQL View [16 упражнений]
- Управление учетными записями пользователей SQL [16 упражнение]
- База данных фильмов
- ОСНОВНЫЕ запросы к базе данных фильмов [10 упражнений]
- ПОДПИСКИ на фильм База данных [16 упражнений]
- ПРИСОЕДИНЯЕТСЯ к базе данных фильма [24 упражнения]
- Футбольная база
- Вступление
- ОСНОВНЫЕ запросы по футболу базы данных [29 упражнений]
- ПОДПИСКИ по футбольной базе данных [33 упражнения]
- База данных больницы
- База данных сотрудников
- ОСНОВНЫЕ запросы к базе данных сотрудников [115 упражнений]
- БРОНИРОВАНИЕ на сотрудника База данных [77 Упражнения]
- Еще не все!
Хотите улучшить вышеуказанную статью? Вносите свои заметки / комментарии / примеры через Disqus.
Новый контент: Composer: менеджер зависимостей для PHP , R программирования