Подзапросы, возвращающие несколько значений

Подзапросы, возвращающие несколько значений

Эта группа включает подзапросы, начинающиеся с IN, NOT IN или оператора сравнения с ключевыми словами ANY или ALL.

Подзапросы, начинающиеся с IN и NOT IN

Результатом выполнения подзапроса, начинающиеся с ключевых слов IN и NOT IN, является список, включающий от нуля до нескольких значений. После того как подзапрос возвратит результаты, к их обработке приступит внешний запрос.

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

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

Пример

Получить список клиентов из Сиэтла, заключивших договор на аренду оборудования (Equipment rental).

SQL:
SELECT lastname, name, region
FROM tbl_clients
WHERE region = ‘Seattle’ AND client_id IN (
SELECT client_id
FROM tbl_contract
JOIN tbl_service ON tbl_contract.service_id=tbl_service.service_id
WHERE service = ‘Equipment rental’)

Результат:

lastname name region
Stolz
Barbara
Seattle
Perez Linda Seattle
Haines Elsie Seattle
Varrik Kaarel Seattle
Donegan Janet
Seattle
Card Richard Seattle
Jones Jeffrey Seattle
Green Jonas Seattle
Patterson William Seattle

Обратите внимание на допустимость использования объединения и нескольких условий в предложение WHERE как во внутреннем, так и во внешнем запросе.


Получить список клиентов из Сиэтла, заключивших договор на аренду оборудования (пример, обратный приведенному выше).

SQL:
SELECT lastname, name, region
FROM tbl_clients
WHERE region = ‘Seattle’ AND client_id NOT IN (
SELECT client_id
FROM tbl_contract

JOIN tbl_service ON tbl_contract.service_id=tbl_service`service_id
WHERE service = ‘Equipment rental’)


Подзапросы, начинающиеся с операторов сравнения и включающие ключевые слова ANY или ALL

В другом виде подзапросов, которые не возвращают или возвращают несколько строк, используется оператор сравнения, модифицированный ключевыми словами ANY или ALL.

Если подзапросу будет предшествовать ключевое слово ALL, условие сравнения считается выполненным только в том случае, если оно выполняется для всех значений в результирующем столбце подзапроса.

Пример

SQL:
SELECT contract_id, contract_date
FROM tbl_contract
WHERE contract_date > ALL (
SELECT contract_date
FROM tbl_contract JOIN tbl_service ON tbl_contract.service_id=tbl_service.service_id
WHERE service = ‘Equipment rental’)

Выполнение запроса происходит в 2 этапа. Сначала внутренний запрос выбирает список дат, когда были заключены договора на аренду оборудования. Внешний запрос находит наибольшее значение в списке дат и для каждого договора в таблице tbl_contract определяет не содержится ли в поле contract_date большая дата.

Таким образом, мы получаем список договоров, заключенных после всех договоров на аренду оборудования.


Оператор ALL, как правило, эффективно используется с неравенствами, а не с равенствами, поскольку значение «равно всем», которое должно получиться в этом случае в результате выполнения подзапроса, может иметь место, только если все результаты идентичны.

В SQL выражение < > ALL реально означает не равно ни одному из результатов подзапроса.

Если тексту подзапроса предшествует ключевое слово ANY, то условие сравнения будет считаться выполненным, если оно удовлетворяется хотя бы для какого-либо (одного или нескольких) значения в результирующем столбце подзапроса.

Пример

SQL:
SELECT contract_id, contract_date
FROM tbl_contract WHERE contract_date < ANY (
SELECT contract_date
FROM tbl_contract JOIN tbl_serviceON tbl_contract.service_id=tbl_service.service_id
WHERE service = ‘Equipment rental’)

Приведенный запрос находит договора, заключенные раньше, чем был заключен первый договор на обслуживание.


Если внутренний подзапрос, начинающийся с ALL или ANY, возвращает пустое значение, считается, что запрос в целом завершился неудачно. В этом случае вы не получите никаких результатов, поскольку невозможно выполнить сравнение со значением NULL.

« Previous | Next »

Обзор использования подзапросов — SQL для Oracle

Без рубрики sql oracle · 24.07.2021 ·

Однострочный подзапросМногострочный подзапрос
Возвращает только одну строкуВозвращает более одной строки
Использует однострочные операторы сравненияИспользует многострочные операторы сравнения

С помощью использования подзапросов можно создавать мощные инструкции из простых выражений. Подзапросы используются, когда запрос основан на критерии поиска с неизвестными промежуточными значениями.

Подзапрос можно поместить в некоторые предложения SQL, включая следующие:

Подзапрос (внутренний запрос) выполняется однократно до основного (внешнего) запроса.

Результат подзапроса используется основным запросом.

Однострочным подзапросом используется однострочный оператор, такой как =, >, =,

Post Views: 86

Похожие записи

Без рубрики sql oracle · 25.04.2023 ·

Используя предложение WITH, можно определить блок запроса до его применения в запросе. Предложение WITH (формально называется subquery_factoring_clause) позволяет многократно использовать один и тот же блок запроса в инструкции SELECT, когда она встречается более одного раза в сложном запросе. Это особенно… Читать далее

Без рубрики mikl · 22.04.2023 ·

Оператор WITH в SQL — это чрезвычайно полезный инструмент для создания временных таблиц и использования их внутри других запросов. Это позволяет упростить код и улучшить производительность запросов. Оператор WITH (также известный как Common Table Expression) используется для создания временных таблиц,… Читать далее

Без рубрики sql oracle · 15.04.2022 ·

Внешняя таблица не описывает никаких данных, которые хранятся в базе данных. Внешняя таблица не описывает порядок хранения данных во внешнем источнике. Вместо этого она описывает, как уровень внешней таблицы должен представлять данные для сервера. За преобразования, которые требуется выполнять над… Читать далее

Без рубрики sql oracle · 15.04.2022 ·

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

Без рубрики sql oracle · 04.04.2022 ·

Внешние таблицы создаются с помощью предложения ORGANIZATION EXTERNAL инструкции CREATE TABLE. В действительности таблица не создается. Точнее, создаются метаданные в словаре данных, который можно использовать для доступа к внешним данным. Предложение ORGANIZATION применяется для указания порядка, в котором сохраняются строки… Читать далее

Без рубрики sql oracle · 04.04.2022 ·

В базе данных Oracle имеется функция для удаления таблиц. При удалении таблицы база данных не сразу освобождает пространство, занимаемое таблицей. Точнее, база данных переименовывает таблицу и помещает ее в корзину, где таблица позже может быть восстановлена с помощью инструкции FLASHBACK… Читать далее

Без рубрики sql oracle · 18. 03.2022 ·

Рассмотрим, как создаются внешние таблицы посредством драйвера доступа ORACLE_LOADER. Предположим, что существует текстовый файл, в котором имеются записи в следующем формате:      10,jones,11-Dec-1934 20,smith,12-Jun-1972 Записи разделяются символом новой строки, и все поля заканчиваются запятой ( , ). Имя файла: /emp_dir/emp.dat…. Читать далее

Без рубрики sql oracle · 18.03.2022 ·

Используя драйвер доступа ORACLE_DATAPUMP, можно выполнять с внешними таблицами операции выгрузки и повторной загрузки. Примечание. В контексте внешних таблиц загрузка данных обозначает операцию чтения данных из внешней таблицы и их загрузку в таблицу базы данных. Под выгрузкой данных понимается чтение… Читать далее

Без рубрики sql oracle · 12.02.2022 ·

Можно настроить много аспектов интерфейса и среды SQL Developer, изменяя предпочтения SQL Developer согласно Вашим потребностям. Чтобы изменить предпочтения SQL Developer, выберите Tools, а затем Preferences. Настройте интерфейс SQL Developer и среду. В меню Tools выберите Preferences. Предпочтения группируется в… Читать далее

Без рубрики sql oracle · 12.02.2022 ·

В этой рубрике было рассмотрено использование SQL Developer, чтобы выполнять следующие задачи: Просматривать, создавать и редактировать объекты базы данных Выполнять SQL-операторы и сценарии на Рабочем листе SQL Создавать и сохранять пользовательские отчеты SQL Developer является бесплатным графическим инструментом, позволяющим упростить… Читать далее

Типы подзапросов в SQL

Обзор

Подзапросы — это запросы, вложенные в другой запрос SQL. Они помогают нам ориентироваться на определенные строки для выполнения различных операций в SQL. Они используются для SELECT, UPDATE, INSERT и DELETE записей в SQL. Существуют различные типы подзапросов SQL, такие как подзапрос с одной строкой, подзапрос с несколькими строками, подзапрос с несколькими столбцами, коррелированный подзапрос и вложенный подзапрос. Каждый тип выполняет разные роли, и их результат используется в зависимости от требований пользователя.

Scope

  • В этой статье описываются подзапросы и типы подзапросов в SQL.
  • Он показывает нам, как использовать подзапросы в операторах UPDATE, DELETE, INSERT и SELECT для изменения определенной части таблиц.
  • Он показывает нам, когда использовать различные типы подзапросов в SQL, такие как подзапросы с одной строкой, подзапросы с несколькими строками, подзапросы с несколькими столбцами, коррелированные подзапросы и вложенные подзапросы, в соответствии с нашим требованием.

Введение

Подзапросы — это запросы, вложенные в другой запрос SQL. Подзапрос может содержать более одного запроса внутри себя, один за другим. Они позволяют нам выбирать определенные строки, которые удовлетворяют определенным условиям во время выполнения. Они также известны как внутренний запрос или внутренний выбор, а запрос, который их содержит, известен как внешний запрос или внешний выбор.

  • Подзапросы вложены в такие операторы, как SELECT, INSERT, UPDATE, DELETE или любой другой подзапрос.
  • Подзапросы присутствуют в предложении WHERE, предложении FROM или предложении HAVING запроса PARENT SQL.
  • Они используются с операторами сравнения и логическими операторами, такими как >, <, >=, <>, <=, SOME, ANY, ALL и IN.
  • Они выполняются перед внешним запросом во время выполнения и передают результат для завершения оператора.
  • Подзапросы используются для сравнения выражения с выходными данными и проверки того, была ли выбрана какая-либо строка.

В предложении WHERE может быть вложено не более 255 уровней подзапросов. Предложение FROM не имеет ограничений на количество вложенных подзапросов. В реальном мире мы сталкиваемся не более чем с пятью подзапросами. Таким образом, 255 слишком велико, чтобы быть установленным в качестве предела.

Синтаксис

В этой статье мы рассмотрим различные типы подзапросов и некоторые из их полезных примеров .

Типы подзапросов в SQL

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

Галереи

id город
1 Джайпур
2 Калькутта
3 Мадхубани

9 0004 картины

9006 0 Шаблоны 90 056
id имя галерея_id цена
1 3 5000
2 Звонок 1 4500
3 Подарок 1 3200
4 Уроки игры на скрипке 2 6700
5 Curiosity 2 9800

агенты по продажам

9005 1 9 0056 9 0060 Хелен
id фамилия имя галерея_id Agency_fee
1 Коричневый Денис 2 2250
2 Белый Кейт 3 3120
3 Черный Сара 2 1640
4 Смит 1 4500
5 Стюарт Том 3 2130 900 61

руководители

id Gallery_id
1 2
2 3
4 1

Однострочный подзапрос

Подзапросы, возвращающие одна строка в качестве вывода для их родительского запроса называется подзапросом с одной строкой. Однострочные подзапросы используются в инструкции SQL SELECT с предложением HAVING, предложением WHERE или предложением FROM и оператором сравнения. В операторе SELECT используются однострочные подзапросы. Давайте посмотрим на это на примере.

Приведенный выше запрос SQL отображает среднюю цену всех картин помимо их первоначальной цены. Результат выглядит так:

90 060 5840
покраска цена avg_price
Узоры 5000 9006 1 5840
Звонок 4500 5840
Подарок 3200
Уроки игры на скрипке 6700 5840
Любопытство 9800 5840

900 04 Подзапрос возвращает среднюю цену 5840 , которая является единственным значением. Он добавляется в каждую строку таблицы.

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

Подзапросы с одной строкой также можно использовать с предложением WHERE в операторе SELECT для фильтрации результатов внешнего запроса. Давайте посмотрим на пример.

Приведенный выше SQL-запрос показывает записи агентов по продажам, у которых агентское вознаграждение больше, чем среднее значение всех вознаграждений. Подзапрос, присутствующий в выписке, вычисляет среднее агентское вознаграждение, которое составляет 2728 . Затем родительский оператор использует возвращенное значение, чтобы отфильтровать информацию о тех агентах по продажам, у которых агентское вознаграждение выше среднего. Результат выглядит как следующая таблица:

id фамилия имя Gallery_id Agency_fee
2 Белый Кейт 3 3120
4 Смит Хелен 1 4500

9003 4 несколько рядов Подзапрос

Подзапросы, которые возвращают несколько строк в качестве выходных данных для своего родительского запроса, называются подзапросами с несколькими строками. Подзапросы с несколькими строками можно использовать в инструкции SQL SELECT с предложением HAVING, предложением WHERE, предложением FROM и логическим оператором (ALL, IN, NOT IN и ANY). Давайте рассмотрим это на примере.

Приведенный выше SQL-запрос вычисляет среднее агентское вознаграждение всех агентов по продажам, не являющихся менеджерами. Подзапрос возвращает список идентификаторов всех менеджеров. Затем внешний запрос фильтрует таблицу, чтобы найти записи агентов по продажам, которые не являются менеджерами, и вычисляет среднее агентское вознаграждение этих агентов. Он возвращает одно среднее значение агентского вознаграждения. Вывод выглядит следующим образом:

агентский сбор
1885

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

Подзапросы, которые возвращают несколько столбцов в качестве выходных данных для родительского запроса, называются подзапросами с несколькими столбцами. Давайте посмотрим на это на примере.

Приведенный выше SQL-запрос извлекает картину с самой низкой ценой. Внутренний подзапрос возвращает запись картины с самой низкой ценой. Внешний запрос сравнивает все записи с помощью оператора IN и возвращает запись с минимальной ценой.

Выдает следующий результат:

9006 0 Gift
id название галерея_id цена
3 1 3200

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

Коррелированные подзапросы могут использоваться в операторах SELECT с использованием предложений WHERE и FROM. Давайте лучше разберемся на примере.

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

Результат:

город total_paintings
Джайпур 2
Калькутта 2
Мадхубани 1

Вы можете получить тот же результат, используя JOIN в SQL. Посмотрим как!

Примечание: Как правило, JOINS работает быстрее, чем подзапросы, но вы можете использовать их, если считаете их более интуитивными.

Коррелированные подзапросы также используются в операторах SQL с предложениями WHERE.

Давайте рассмотрим пример.

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

Результат вышеуказанного запроса выглядит следующим образом:

фамилия имя агентский сбор
Браун Денис 2250
Белый Кейт 3120
Смит Хелен 4500

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

Подзапросы, находящиеся внутри другого подзапроса, называются вложенными подзапросами. Подзапросы выполняются уровень за уровнем. Сначала выполняются внутренние, а затем внешние. Давайте посмотрим на некоторые примеры.

Приведенный выше SQL-запрос предназначен для отображения средней цены картин, цена которых превышает их первоначальную цену более чем на 5000. Результат выглядит так:

Вывод следующего запроса выглядит так:

покраска цена avg_price
узоры 5000 9006 1 7166.66
Уроки игры на скрипке 6700 7166.66
Curiosity 9800 7166.66

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

Сначала вложенный запрос выполняется следующим образом:

Этот вложенный запрос извлекает цену картин, значение которых больше или равно 5000 .

Результат следующего запроса:

90 060 9800
цена
5000
6700

Внутренний подзапрос выглядел следующим образом:

to:

Подзапрос возвращает среднюю цену картин, возвращенных вложенным подзапросом (т. е. 5000, 6700, 9800). Результатом подзапроса является одно среднее значение 7166,66.

Вывод:

AVG(цена)
7166,66

Внешний запрос преобразован путем получения результата из подзапроса и вложенного запроса.

Внутренний запрос работает следующим образом:

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

Конечный результат:

покраска цена avg_price
узоры 5000 9006 1 7166.66
Уроки игры на скрипке 6700 7166.66
Любопытство 9800 7166,66

Другие примеры

Рассмотрим следующую таблицу для приведенных ниже примеров:

9005 1 90 051 90 051 900 51 9 0051 90 077
ORD_NUM ORD_AMOUNT ADVANCE_AMT ORD_DATE CUST_CODE AGENT_CO DE ORD_DESCRIPTION
200114 3500 2000 15 августа 2008 г. 900 61 С00002 А008 A 004
200118 500 100 20 июля 2008 г. C00023 A006
200119 4000 700 16-SEP-08 C00007 A010
200121 1500 600 23-SEP-08 C00008 A004
200130 2500 400 30-JUL-08 C00025 A011
200134 4200 1800 25-SEP-08 C00 004 A005
200108 4000 600 15-FEB-08 C 00008 A004
200103 1500 700 15 МАЯ 08 C00 021 А005
200105 2500 500 18-JUL-08 C00025 A011
200109 3500 8 00 30-JUL-08 C00011 A010
200101 3000 1000 15-JUL-08 C00001 A008
200111 1000 300 10-JUL-08 C00020 A008
200104 1500 500 13-MAR-08 C00006 A004
200106 2500 700 20-APR-08 C00005 A002
200125 2000 600 10 октября 08 C00018 A005

Подзапросы используются для вставки операторов для вставки выбранных строк из одной таблицы в другую.

Синтаксис

Рассмотрим пример вставки записей в SQL с помощью подзапросов.

Приведенный выше SQL-запрос вставит те заказы в таблицу новых заказов, для которых значение ADVANCE_AMOUNT равно 2000 или 1800 в таблице заказов.

Подзапросы используются в операторе UPDATE для установки новых значений в столбец, возвращаемый подзапросом в качестве вывода.

Синтаксис

Обновим запись, используя подзапросы в SQL.

Следующий SQL-запрос обновляет ord_date в таблице neworder до 15-JAN-10 записей, у которых разница между суммой заказа и суммой аванса меньше минимальной суммы заказа в таблице заказов.

Подзапросы используются в инструкции DELETE для удаления определенных строк, возвращаемых в результате подзапроса.

Синтаксис

Удалим несколько строк, используя подзапросы в SQL.

Приведенный выше код удаляет те заказы из таблицы новых заказов, сумма аванса которых меньше максимальной суммы в таблице заказов.

  • В этой статье мы узнали, что существует много типов подзапросов.
  • Подзапросы, которые мы используем для ВЫБОРА, УДАЛЕНИЯ, ОБНОВЛЕНИЯ и ВСТАВКИ наших записей, зависят от наших потребностей. Мы можем использовать подзапросы с одной строкой для возврата одной строки, подзапросы с несколькими строками для возврата нескольких строк, коррелированные подзапросы для возврата нескольких столбцов в зависимости от родительского запроса и вложенные подзапросы для возврата подзапроса к другому. Мы видели примеры всех из них один за другим.
  • Теперь пришло время вам больше и больше практиковаться, чтобы стать отличным знатоком SQL!!

Дополнительные ресурсы

  1. Вопрос для интервью для запроса SQL

[Пошаговое] руководство по подзапросу SQL

Подзапрос SQL в соответствии с предлагаемым термином представляет собой запрос, вложенный в другой запрос. Эти подзапросы могут присутствовать в предложении FROM, предложении WHERE или предложении SELECT. Подзапросы — это мощный инструмент для объединения данных, доступных в двух таблицах, в один результат.

Что такое подзапрос SQL?

Подзапрос SQL — это не что иное, как запрос внутри другого запроса. Мы используем подзапрос для получения данных из двух таблиц. Подзапрос также часто называют внутренним запросом, а оператор, содержащий подзапрос, также называют внешним запросом или внешним выбором. Мы можем реализовать подзапросы с операторами SELECT, INSERT, UPDATE и DELETE вместе с такими операторами, как =, <, >, >=, <=, IN, BETWEEN и т. д.

Общие правила подзапросов

При использовании подзапросов соблюдаются некоторые правила. Они:

  • Подзапрос должен быть заключен в круглые скобки.
  • Подзапросы, возвращающие одну строку, могут использоваться только с операторами с несколькими значениями, такими как оператор IN.
  • SQL Server позволяет вкладывать подзапросы до 32 уровней.

Подзапросы обычно используются с оператором SELECT. Базовая форма показана ниже — 

.

(ВЫБЕРИТЕ [DISTINCT] subquery_select_argument

ОТ {table_name | представление_имя}

{имя_таблицы | имя_вида} …

[ГДЕ условия_поиска]

[СГРУППИРОВАТЬ ПО совокупному_выражению [ совокупному_выражению] …]

[ИМЕЕТ search_conditions])

Пример:

Рассмотрим таблицу «products», имеющую следующие записи.

Теперь давайте реализуем следующий подзапрос SQL с оператором SELECT.

Это приведет к следующему результату.

Предложение FROM используется для указания оператора подзапроса в SQL.

Примечание. Результат оценки сохраняется во временной переменной.

Пример:

Следующий SQL-запрос извлекает результат, где количество на складе из таблицы products_bkp, где количество на складе превышает среднее количество на складе

Рассмотрим таблицу «products_bkp» со структурой, аналогичной таблице «products».

Теперь, чтобы скопировать полную таблицу «products» в таблицу «products_bkp», вы можете использовать подзапрос SQL с оператором INSERT следующим образом.

Это скопирует данные в таблицу «products_bkp».

Вы можете установить новое значение столбца в операторе UPDATE, равное результату, возвращаемому однострочным подзапросом.

Пример:

Если вы хотите обновить цену за единицу в таблице products_bkp, где цена за единицу будет больше, чем минимальная цена за единицу из таблицы товаров, мы можем использовать следующий SQL-запрос:

Это приведет к следующему результату.

Мы можем использовать оператор DELETE с подзапросами для удаления записей.

Пример:

Следующий запрос SQL удалит данные из таблицы products_bkp, где цена за единицу меньше максимальной цены за единицу из таблицы products.

Это приведет к следующему результату.

Получите опыт работы с новейшими инструментами и методами бизнес-аналитики с помощью программы последипломного образования в области бизнес-анализа.