кодесурса
«SQL

SQL: несколько подзапросов строк и столбцов

script1adsense2code
script1adsense3code

Подзапросы с несколькими строками

Многострочный подзапрос возвращает одну или несколько строк во внешнюю инструкцию 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:

Код 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

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

Код SQL:

SELECT agent_code FROM agents
WHERE working_area='Bangalore';

Выход:

 AGENT_CODE
----------
A001
A007
A011

Приведенный выше запрос возвращает два кода оператора: «A011» и «A001».

Иллюстрированная презентация:

«SQL:

SQL: использование оператора NOT IN с подзапросом с несколькими строками

Вы также можете использовать оператор NOT IN для выполнения логической противоположности оператора IN. Смотрите следующий пример:

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


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


Чтобы получить 'ord_num', 'ord_amount', 'ord_date', 'cust_code' и 'agent_code' из таблицы 'orders' со следующими условиями:

во внешнем запросе:
'agent_code' таблицы 'orders' должен отличаться от списка в операторе IN.

во внутреннем запросе:
'working_area' таблицы 'агентов' должно быть 'Мумбаи'

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

Код 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
.........
.........

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

Код SQL:

SELECT agent_code FROM agents
WHERE working_area='Bangalore';

Выход:

 AGENT_CODE
----------
A001
A007
A011

Иллюстрированная презентация:

«SQL:

SQL: использование ЛЮБОГО с подзапросом с несколькими строками

Вы можете использовать ЛЮБОЙ оператор для сравнения значения с любым значением в списке. Вы должны поместить оператор =, <>,>, <, <= или> = перед любым запросом. В следующем примере используется ЛЮБОЙ, чтобы проверить, принадлежит ли какой-либо агент, принадлежащий стране, «Великобритания».

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


Чтобы получить 'agent_code', 'agent_name', 'working_area', 'Commission' из таблицы 'agent' при следующих условиях -

во внешнем запросе:
'agent_code' должен быть любым 'agent_code' из таблицы 'customer'

во внутреннем запросе:
)
'cust_country' в таблице 'customer' должно быть 'UK',

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

Код 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:

SQL: несколько столбцов подзапросов

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

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


Код 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:

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:

Код 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.

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

Код SQL:

SELECT ord_num,ord_amount,ord_date,
cust_code, agent_code
FROM orders
WHERE agent_code='A002';

Иллюстрированная презентация:

«SQL:

Смотрите нашу базу данных моделей

Упражнения по SQL

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

Предыдущий: Подзапросы с одной строкой
Далее: коррелированные подзапросы с использованием псевдонимов

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code