English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете, как嵌入 один запрос в другой в SQL.
Подзапрос, также называемый вложенным запросом или подвыборкой, являетсяSELECTВложенный в другой SQL-запрос WHERE или HAVINGЗапрос в предложении. Данные, возвращаемые подзапросом, используются внешним предложением, как и использование литеральных значений.
Подзапрос предоставляет простой и эффективный способ обработки запросов, зависимых от результатов другого запроса. Они почти такие же, как обычные SELECT-запросы, но без ограничений. Самые важные моменты следующие:
Подзапросы должны всегда быть заключены в скобки.
Подзапросы должны всегда出现在 скобках. Это означает, что нельзя использовать SELECT *, если в таблице только один столбец. Если目的是 сравнение строк, можно использовать подзапросы, возвращающие несколько столбцов.
Вы можете использовать операторы, возвращающие несколько значений (напримерIN или NOT INоператором) для нескольких строк подзапроса.
Подзапросы не могут бытьUNION. Разрешается использовать только один оператор SELECT.
Подзапросы наиболее часто используются сSELECTвместе с операторомINSERT,UPDATEилиDELETEв предложении или в другом подзапросе.
Следующие строки возвращают详细信息 клиентов, заказавших товары на сумму более 5000 долларов в таблице заказов. Также обратите внимание, что мы используем ключевое словоDISTINCTУдалены дублирующиеся значения cust_id из результата.
SELECT * FROM customers; WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);
Совет:Подзапросы могут возвращать единичное значение, строку, столбец или таблицу, содержащую одну или несколько строк и/или столбцов.
Примечание:Подзапросы могут быть вложены во внешниеSELECT,INSERT,UPDATEилиDELETEпредложенияWHEREилиHAVINGпредложение, также можно вложить в другой подзапрос.
Подзапросы также можно использовать с оператором INSERT. Вот пример:
INSERT INTO premium_customers SELECT * FROM customers; WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);
Эти строки插入 данные клиентов с высоким уровнем в таблицу premium_customers с использованием данных, возвращенных подзапросом. Здесь клиенты с высоким уровнем - это клиенты, которые заказали товары на сумму более 5000 долларов.
Совет: обратитесь кСм.Клонирование таблицы SQLруководства, чтобы узнать, как быстро вставить несколько строк из другой таблицы в таблицу с помощью оператора INSERT ... SELECT.
Вы также можете использовать подзапросы с оператором UPDATE, чтобы обновить одно или несколько столбцов в таблице, например:
UPDATE orders; SET order_value = order_value + 10; WHERE cust_id IN (SELECT cust_id FROM customers WHERE postal_code = 75016);
Увеличивая текущую стоимость заказа на 10 долларов, вышеуказанное предложение обновит стоимость заказа клиентов, проживающих в регионе с почтовым индексом 75016, в таблице заказов (orders).
Таким же образом, можно использовать подзапросы с оператором DELETE, чтобы удалить строку или несколько строк из таблицы, как показано ниже:
DELETE FROM orders WHERE order_id IN (SELECT order_id FROM order_details WHERE product_id = 5);
SQL-запрос из примера выше будет содержатьproduct_idУдалите эти заказы из таблицы заказов продукта 5.