Оператор where sql: SQL оператор WHERE — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

Содержание

Команда WHERE - условие для выбора строк в базе данных

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

Данная команда может использоваться для выборки строк с помощью SELECT, удаления строк с помощью DELETE, редактирования строк с помощью UPDATE.

См. также команды OR, AND, IN, BETWEEN, LIKE, NOT, IS NULL, IS NOT NULL, которые допустимо использовать в комбинации с командой WHERE.

Синтаксис

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500
4 Коля 30 1000
5 Иван 27 500
6 Кирилл 28 1000

Пример

В данном примере выбираются записи, у которых поле id больше 2-х и меньше 4-х:

SELECT * FROM workers WHERE id>=2 AND id

SQL запрос выберет следующие строки:

id
айди
name
имя
age
возраст
salary
зарплата
2 Петя 25 500
3 Вася 23 500
4 Коля 30 1000

Пример

В данном примере выбираются записи, у которых возраст равен 23 и одновременно зарплата равна 400:

SELECT * FROM workers WHERE age=23 AND salary=400

SQL запрос выберет следующие строки:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400

Пример

В данном примере из таблицы удаляются записи, у которых поле id больше 2-х и меньше 4-х:

DELETE FROM workers WHERE id>=2 AND id

В таблице останутся следующие строки:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
5 Иван 27 500
6 Кирилл 28 1000

SQL Примеры



SQL Синтаксис

Объяснение примера


SQL SELECT

Объяснение примеров


SQL SELECT DISTINCT

Объяснение примеров


SQL WHERE

Объяснение примеров


SQL Операторы AND, OR и NOT

Объяснение примеров


SQL ORDER BY

Объяснение примеров


SQL INSERT INTO

Объяснение примеров



SQL Значение NULL

Объяснение примеров


SQL Обновление

Объяснение примеров


SQL DELETE

Объяснение примеров


SQL SELECT TOP

Объяснение примеров


SQL MIN() и MAX()

Объяснение примеров


SQL COUNT, AVG() и SUM()

Объяснение примеров


SQL LIKE

Объяснение примеров


SQL Подстановочный знак

Объяснение примеров


SQL IN

Объяснение примеров


SQL BETWEEN

Объяснение примеров


SQL Псевдонимы

Объяснение примеров


SQL Соединение

Объяснение примеров


SQL UNION

Объяснение примеров


SQL GROUP BY

Объяснение примеров


SQL HAVING

Объяснение примеров


SQL EXISTS

Объяснение примера


SQL ANY и ALL

Объяснение примеров


SQL INSERT INTO SELECT

Объяснение примеров


SQL CASE

Объяснение примеров


SQL Комментарии

Объяснение примеров


SQL База данных

Учебники по базам данных SQL можно найти здесь:


Онлайн - Сертификация SchoolsW3

Идеальное решение для профессионалов, которым необходимо сбалансировать работу, семью и карьерный рост.

Уже выдано более 25 000 сертификатов!

Получите ваш сертификат »

HTML Сертификат документ на ваши знания HTML.

CSS Сертификат документ на ваши знания новейших CSS.

JavaScript Сертификат документ на ваши знания JavaScript и HTML DOM.

Python Сертификат документ на ваши знания Python.

jQuery Сертификат документ на ваши знания jQuery.

SQL Сертификат документ на ваши знания SQL.

PHP Сертификат документ на ваши знания PHP и SQL (MySQL).

XML Сертификат документ на ваши знания XML, XML DOM и XSLT.

Bootstrap Сертификат документ на ваши знания Bootstrap фреймворк.



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

Вложенный запрос — это запрос на выборку, который используется внутри инструкции SELECT, INSERT, UPDATE или DELETE или внутри другого вложенного запроса. Подзапрос может быть использован везде, где разрешены выражения.

Пример структуры вложенного запроса

SELECT поля_таблиц 
FROM список_таблиц 
WHERE конкретное_поле IN (
    SELECT поле_таблицы FROM таблица
)

Здесь, SELECT поля_таблиц FROM список_таблиц WHERE конкретное_поле IN (. ..) — внешний запрос, а SELECT поле_таблицы FROM таблица — вложенный (внутренний) запрос.

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

Подзапрос может содержать все стандартные инструкции, разрешённые для использования в обычном SQL-запросе: DISTINCT, GROUP BY, LIMIT, ORDER BY, объединения таблиц, запросов и т.д.

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

Подзапрос как скалярный операнд

Скалярный подзапрос — запрос, возвращающий единственное скалярное значение (строку, число и т.д.).

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

SELECT (SELECT name FROM company LIMIT 1);

Таким же образом можно использовать скалярные подзапросы для фильтрации строк с помощью WHERE, используя операторы сравнения.

SELECT * 
FROM FamilyMembers 
WHERE birthday = (SELECT MAX(birthday) FROM FamilyMembers);

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

Подзапросы с ANY, IN, ALL

ANY — ключевое слово, которое должно следовать за операцией сравнения (>, <, <>, = и т.д.), возвращающее TRUE, если хотя бы одно из значений столбца подзапроса удовлетворяет обозначенному условию.

SELECT поля_таблицы_1 
FROM таблица_1 
WHERE поле_таблицы_1 <= ANY (SELECT поле_таблицы_2 FROM таблица_2);

ALL — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию.

SELECT поля_таблицы_1 
FROM таблица_1 
WHERE поле_таблицы_1 > ALL (SELECT поле_таблицы_2 FROM таблица_2);

IN — ключевое слово, являющееся псевдонимом ключевому слову ANY с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны:

...
WHERE поле_таблицы_1 = ANY (SELECT поле_таблицы_2 FROM таблица_2);
...
WHERE поле_таблицы_1 IN (SELECT поле_таблицы_2 FROM таблица_2);

Строковые подзапросы

Строковый подзапрос — это подзапрос, возвращающий единственную строку с более чем одной колонкой. Например, следующий запрос получает в подзапросе единственную строку, после чего по порядку попарно сравнивает полученные значения со значениями во внешнем запросе.

SELECT поля_таблицы_1 
FROM таблица_1
WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = 
    (
        SELECT первое_поле_таблицы_2, второе_поле_таблицы_2 
        FROM таблица_2 
        WHERE id = 10
    );

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

SELECT поля_таблицы_1 FROM таблица_1 WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = (1, 1);
SELECT поля_таблицы_1 FROM таблица_1 WHERE первое_поле_таблицы_1 = 1 AND второе_поле_таблицы_1 = 1;

Связанные подзапросы

Связанным подзапросом является подзапрос, который содержит ссылку на таблицу, которая была объявлена во внешнем запросе. Здесь вложенный запрос ссылается на внешюю таблицу "таблица_1":

SELECT поля_таблицы_1 FROM таблица_1
WHERE поле_таблицы_1 IN 
    (
        SELECT поле_таблицы_2 FROM таблица_2
        WHERE таблица_2.поле_таблицы_2 = таблица_1.поле_таблицы_1
    );

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

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

SELECT поля_таблицы_1 FROM (подзапрос) [AS] псевдоним_производной_таблицы

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

Обработка вложенных запросов

Вложенные подзапросы обрабатываются «снизу вверх». То есть сначала обрабатывается вложенный запрос самого нижнего уровня. Далее значения, полученные по результату его выполнения, передаются и используются при реализации подзапроса более высокого уровня и т.д.

SQL - операторы | ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Что такое оператор в SQL?

Оператор – это зарезервированное слово или символ, используемый в основном в WHERE и давал инструкцию SQL для выполнения операции (ий), например, сравнения и арифметических операций.

Операторы используются для определения условий в SQL и служат в качестве соединений для нескольких условий в заявлении.

  • Арифметические операторы
  • Операторы сравнения
  • Логические операторы
  • Операторы, используемые для отрицания условия

Арифметические операторы в SQL:

Предположим, переменная а равна 10, а переменная b равна 20, тогда:

Показать примеры

оператор
Описание
пример
+ Добавление – Добавление значения по обе стороны от оператора a + b = 30
Вычитание – Вычитание правого операнда из левого операнда а – b = -10
* Умножение – Умножение значения по обе стороны от оператора а * б = 200
/ Деление – Делит левый операнд на правый операнда b / a = 2
% Модуль – Делит левый операнд на правый операнд и возвращает остаток b % а = 0

Операторы сравнения в SQL:

Предположим, переменная а равно 10, а переменная b равна 20, тогда:

Показать примеры

оператор Описание пример
= Проверяет, является ли значения двух операндов равны или нет, если да, то условие становится истинным. (a = b) не соответствует действительности.
!= Проверяет, является ли значения двух операндов равны или нет, если значения не равны, то условие становится истинным. (a != b) истинно.
<> Проверяет, является ли значения двух операндов равны или нет, если значения не равны, то условие становится истинным. (a <> b) истинно.
> Проверяет, является ли значение левого операнда больше значения правого операнда, если да, то условие становится истинным. (a > b) не соответствует действительности.
< Проверяет, является ли значение левого операнда меньше значения правого операнда, если да, то условие становится истинным. (a < b) истинно.
> = Проверяет, является ли значение левого операнда больше или равно значению правого операнда, если да, то условие становится истинным. (a >= b) неверно.
<= Проверяет, является ли значение левого операнда меньше или равно значению правого операнда, если да, то условие становится истинным. (a <= b) истинно.
<! Проверяет, является ли значение левого операнда не меньше, чем значение правого операнда, если да, то условие становится истинным. (a! < b) неверно.
!> Проверяет, является ли значение левого операнда не больше, чем значение правого операнда, если да, то условие становится истинным. (a! > b) верно.

Логические операторы в SQL:

Вот список всех логических операторов, доступных в SQL.

Показать примеры

оператор Описание
ALL Оператор ALL используется для сравнения значения для всех значений в другом наборе значений.
AND Оператор AND допускает существование нескольких условий в SQL-инструкции WHERE.
ANY Оператор ANY используется для сравнения любого применимого значения в списке в соответствии с условиями.
BETWEEN Оператор BETWEEN используется для поиска значений, которые находятся в пределах набора значений, учитывая минимальное значение и максимальное значение.
EXIST Оператор EXISTS используется для поиска наличия строки в указанной таблице, которая соответствуют определенным критериям.
IN Оператор IN используется для сравнения значения в списке буквенных значений, которые были определены.
LIKE Оператор LIKE используется для сравнения аналогичных значений с использованием подстановочных операторов.
NOT Оператор NOT изменяет значение логического оператора, с которым она используется. Например: NOT EXISTS, NOT BETWEEN, NOT IN и т.д. Это оператор отрицает.
OR Оператор OR используется для объединения нескольких условий в SQL-инструкции WHERE.
IS NULL Оператор NULL, используется для сравнения значения со значением NULL.
UNIQUE Единственный оператор выполняет поиск каждой строки из указанной таблицы для уникальности (без дубликатов).

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

использование в инструкции Select и в разных операциях

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

Условие WHERE используется не только в инструкции SELECT, но также в операциях UPDATE, DELETE и т. д., которые мы рассмотрим в последующих главах.

Синтаксис

Основной синтаксис инструкции SELECT с условием WHERE приведен ниже.

SELECT столбец1, столбец2, столбецN FROM имя_таблицы; WHERE [условие]

SELECT столбец1, столбец2, столбецN

FROM имя_таблицы;

WHERE [условие]

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Вы можете указать условие с помощью операторов сравнения или логических операторов, таких как >,

Пример

Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:

Приведенный ниже код извлекает поля ID, Name и Salary из таблицы CUSTOMERS, для которых значение Salary больше 2000:

SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000;

SELECT ID, NAME, SALARY

FROM CUSTOMERS

WHERE SALARY > 2000;

Этот код дает следующий результат:

Следующий код извлекает поля ID, Name и Salary из таблицы CUSTOMERS для клиента с именем Hardik. Здесь важно отметить, что все строковые значения должны быть указаны внутри одинарных кавычек (»). В то же время, числовые значения следует указывать без кавычек, как в приведенном выше примере.

SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE NAME = 'Hardik';

SELECT ID, NAME, SALARY

FROM CUSTOMERS

WHERE NAME = 'Hardik';

Этот код дает следующий результат:

Источник: //www.tutorialspoint.com/

Редакция: Команда webformyself.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Хотите изучить MySQL?

Посмотрите курс по базе данных MySQL!

Смотреть

База Данных MySQL Операторы

База Данных MySQL Операторы HTML5CSS. -= Побитовое монопольное равенство |*= Побитовое или равно

Логические операторы SQL

Оператор Описание
ALL Значение true, если все значения подчиненного запроса удовлетворяют условию
AND Значение true, если все условия разделены и истинны
ANY Значение true, если любой из значений подчиненного запроса удовлетворяет условию
BETWEEN Значение true, если операнд находится в диапазоне сравнений
EXISTS Значение true, если вложенный запрос возвращает одну или несколько записей
IN Значение true, если операнд равен одному из списка выражений
LIKE Значение true, если операнд соответствует шаблону
NOT Отображает запись, если условие (ы) не соответствует действительности
OR Значение true, если любое из условий, разделенных или истинно
SOME Значение true, если любой из значений подчиненного запроса удовлетворяет условию


PHP\CSS\JS\HMTL Editor

sql_where

explore: view_name_1 {
join: view_name_2 {
sql_where: $ {view_name_1. id} 100 ;;
}
}

sql_where позволяет применить ограничение запроса, которое пользователи не могут изменить. Ограничение будет вставлено в предложение WHERE базового SQL, которое Looker генерирует тогда и только тогда, когда соединение используется в запросе. В дополнение к запросам, выполняемым пользователями-людьми, ограничение будет применяться к панелям мониторинга, запланированным просмотрам и встроенной информации, которая основана на этом обзоре.

Условие можно записать на чистом SQL, используя действительные имена таблиц и столбцов вашей базы данных. Он также может использовать ссылки на поля Looker, такие как $ {view_name.field_name} , что является предпочтительным методом, потому что Looker может лучше автоматически включать необходимые соединения. Условие sql_where не отображается для пользователя, если он не просматривает базовый SQL любых запросов, которые они создают.

Например, вы можете указать, что если используется соединение с пользователями, должны быть включены только пользователи младше 50 лет:

исследовать: orders_users_under_50 { view_name: заказы присоединиться: пользователи { sql_on: $ {users. id} = $ {orders.user_id} ;; sql_where: $ {users.age} <50 ;; тип: left_outer } }

Если пользователь выбирает Orders.Count и Users.Count , SQL, который Looker сгенерирует из этого LookML, будет:

ВЫБРАТЬ COUNT (orders.id) AS orders_count, COUNT (DISTINCT users.id, 1000) AS users_count ОТ thelook2.orders AS заказы ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к thelook2.users КАК пользователи НА users.id = orders.user_id ГДЕ users.age

Скобки обязательны, если вы используете OR Logic

Если вы используете логику ИЛИ с sql_where , очень важно заключать условие SQL в круглые скобки.Например, вместо того, чтобы писать это:

sql_where: region = 'Северо-восток' OR company = 'Periaptly' ;;

Вы бы написали это:

sql_where: (region = 'Северо-восток' OR company = 'Periaptly') ;;

Если вы забыли добавить круглые скобки в этом примере, и пользователь добавил свой собственный фильтр, сгенерированное предложение WHERE может иметь вид:

ГДЕ user_filter = 'что-то' И region = 'Северо-восток' ИЛИ company = 'Periaptly'

В этой ситуации фильтр, примененный пользователем, может не работать. Несмотря ни на что, строки с company = 'Periaptly' будут отображаться, потому что сначала оценивается условие AND. Без круглых скобок только часть условия sql_where сочетается с пользовательским фильтром. Если бы были добавлены круглые скобки, предложение WHERE выглядело бы так:

ГДЕ user_filter = 'что-то' И (регион = 'Северо-восток' ИЛИ ​​компания = 'Periaptly')

Теперь пользовательский фильтр будет применяться к каждой строке.

Порядок соединения важен для sql_where Зависимости

В общем, Looker реализует объединения в правильном порядке, независимо от порядка, в котором объединения определены в LookML.Исключением является sql_where . Если вы ссылаетесь на поле из другого соединения в своем операторе sql_where , соединение, на которое вы ссылаетесь, должно быть определено перед оператором sql_where в LookML.

Например, вот оператор sql_where , который ссылается на поле inventory_items. id до того, как inventory_items было объединено:

explore: orders { скрыто: да присоединиться: order_items { sql_on: $ {order_items.order_id} = $ {orders.id} ;; sql_where: $ {inventory_items.id} НЕ НУЛЬ ;; } присоединиться: inventory_items { sql_on: $ {inventory_items.id} = $ {order_items.inventory_item_id} ;; } }

Если вы запустите запрос в этом обзоре, Looker вернет ошибку о том, что поле inventory_items.id не может быть найдено.

Однако вы можете решить эту проблему, переупорядочив свои объединения так, чтобы объединение, указанное в операторе sql_where , определялось перед оператором sql_where , например:

explore: orders { скрыто: да присоединиться: inventory_items { sql_on: $ {inventory_items.id} = $ {order_items.inventory_item_id} ;; } присоединиться: order_items { sql_on: $ {order_items.order_id} = $ {orders.id} ;; sql_where: $ {inventory_items. id} НЕ НУЛЬ ;; } }

Это предотвратит ошибку, поскольку соединение inventory_items определено до того, как на поле inventory_items.id будет сделана ссылка в операторе sql_where соединения order_items .

sql_where Ограничение запроса применяется, только если используется соединение

Ограничение запроса, указанное в sql_where , будет вставлено в предложение WHERE базового SQL, которое Looker генерирует тогда и только тогда, когда соединение используется в запросе.Если вы хотите, чтобы предложение where применялось, даже если соединение не использовалось, используйте вместо него sql_always_where .

Другие ресурсы

форум Сообщество

Форумы сообщества

Looker - отличное место для поиска примеров использования, обсуждения передовых методов, устранения уникальных проблем и общения с другими клиентами Looker.

Перейти в сообщество

школа Учиться

Learn - это песочница Looker, предназначенная в первую очередь для разработчиков.Он включает уроки, связанные с реальными наборами данных в реальном экземпляре Looker, чтобы вы могли понять влияние изменений, внесенных разработчиком.

Иди учиться

опора опора

Если вы застряли, попробуйте связаться с нашим отделом по работе с клиентами через функцию чата в Looker или отправьте запрос в службу поддержки, нажав «Связаться со службой поддержки» ниже.

Контактная поддержка верхний

Использование нескольких таблиц в запросе

Синтаксис оператора SELECT , приведенный в конце предыдущей главы, показывает, что В предложении FROM может быть указано несколько таблиц .Список таблиц, в котором не используется предложение WHERE, практически не используется, потому что это производит реляционную операцию декартова произведения из задействованных таблиц. То есть каждая запись в одной таблице сцепляется с каждой записью в другой таблице. Например, таблицы
А В
б с д
1 2 2 4
2 1 3 3

в запросе


даст следующий результат:
a б с д
1 2 2 4
1 2 3 3
2 1 2 4
2 1 3 3

Как правило, листинг таблицы используется с условием объединения записей из разных таблиц в разделе WHERE . Условие для приведенных выше таблиц может быть совпадение значений, скажем, в столбцах a и c :

ВЫБРАТЬ * ИЗ A, B, ГДЕ a = c;

Теперь набором результатов этого запроса является следующая таблица:

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

Несмотря на то, что в разных таблицах есть столбцы с одинаковыми именами, точечная нотация необходима для уникальность:

<имя таблицы>. <Имя столбца>

В случаях, когда двусмысленность недоступна, это обозначение использовать не нужно.

Пример. Найдите модель и производителя ПК стоимостью ниже 600 долларов:

SELECT DISTINCT PC. Модель, производитель
С ПК, Изделие
ГДЕ ПК.model = Product.model И цена <600;

В результате каждая модель одного производителя встречается в наборе результатов только один раз:
модель производитель
1232 А
1260 E

Иногда на таблицу в предложении FROM нужно указывать более одного раза.В этом случае переименование обязательно.

Пример. Найдите пары моделей с одинаковой ценой:

ВЫБРАТЬ ОТЛИЧИТЕЛЬНЫЙ A.model AS модель_1, B. model AS модель_2
С ПК AS A, PC B
ГДЕ A.price = B.price И A.model

Здесь условие A.model
model_1 модель_2
1232 1233
1232 1260

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

SELECT DISTINCT PC. Модель, производитель
С ПК,
(Производитель SELECT, модель
ИЗ ПРОДУКТА) AS prod
ГДЕ PC.model = prod.model И цена <600;

Обратите внимание, что в этом случае квалификатор Продукт уже не может использоваться в других пунктах. из инструкции SELECT . Это потому, что таблица Product просто вышла из употребления.Вместо этого имени используется псевдоним prod . Причем ссылки возможны только к тем столбцам таблицы Product , перечисленным в подзапросе.

Явная операция соединения для двух и более таблиц может присутствовать в ИЗ статьи . Среди серий операций соединения, описанных в стандарте SQL, операция соединения по предикату поддерживается только количеством серверов баз данных. Синтаксис соединения по предикату:

ИЗ [ ВНУТРЕННИЙ ]
| {{ ЛЕВЫЙ | ПРАВА | FULL } [ OUTER ]} JOIN
[ ON <предикат>]

Тип соединения может быть внутренний или один из внешних .Ключевые слова INNER и OUTER могут быть опущены, поскольку внешнее соединение однозначно определяется своим типом: LEFT , RIGHT или FULL , тогда как внутреннее соединение просто обозначается как JOIN .

Предикат определяет условие объединения строк из разных таблиц. При этом INNER JOIN означает, что набор результатов будет включать только эти комбинации строк в двух таблицах, для которых предикат принимает значение ИСТИНА.Как правило, предикат задает равное соединение для внешнего и первичного ключей объединяемых таблиц, хотя не должно быть так.

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

SELECT maker, Product.model AS model_1, PC.model AS model_2, цена
ОТ продукта ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПК НА ПК.model = Product.model
ЗАКАЗ ОТ производителя, ПК. Модель;

В этом примере запрос возвращает только комбинации строк из PC и Таблицы продукта с идентичными номерами моделей.
Для лучшего контроля результат включает номер модели как в таблице PC и в таблице Product :
maker модель_1 модель_2 цена
А 1232 1232 600. 0
А 1232 1232 400,0
А 1232 1232 350,0
А 1232 1232 350,0
А 1233 1233 600.0
А 1233 1233 950,0
А 1233 1233 980,0
B 1121 1121 850,0
B 1121 1121 850. 0
B 1121 1121 850,0
E 1260 1260 350,0

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

Пример. Найдите все модели ПК, производителей и цены:

SELECT maker, Product.model AS model_1, PC.model AS model_2, цена
ОТ ПРОДУКТА СЛЕВА ПРИСОЕДИНЯЙТЕСЬ К ПК НА ПК. model = Product.model
ГДЕ тип = 'ПК'
ЗАКАЗ ОТ производителя, ПК. Модель;

Важно, чтобы использование пункта WHERE было обязательным для выборки только производителей ПК. по сравнению с предыдущим примером.В противном случае модели ноутбуков и принтеров также получат в набор результатов. Это условие незначительно для приведенного выше примера, потому что только строки были объединены с одинаковыми номерами моделей, а таблица PC находилась между двумя соединенные таблицы. Вот результат:
maker модель_1 модель_2 цена
А 1232 1232 600. 0
А 1232 1232 400,0
А 1232 1232 350,0
А 1232 1232 350,0
А 1233 1233 600.0
А 1233 1233 950,0
А 1233 1233 980,0
B 1121 1121 850,0
B 1121 1121 850. 0
B 1121 1121 850,0
E 2111 ПУСТО ПУСТО
E 2112 ПУСТО ПУСТО
E 1260 1260 350.0

Поскольку модели 2111 и 2112 в таблице Product отсутствуют в PC таблицы, столбцы таблицы PC содержат NULL.
RIGHT JOIN - это обратное LEFT JOIN , т.е. набор результатов будет включить все строки из второй таблицы и только те строки из первой таблицы для которых выполняется условие соединения. В нашем случае левое соединение

Продукт ЛЕВОЕ СОЕДИНЕНИЕ ПК НА ПК.model = Product.model

будет эквивалентно следующему правому соединению

PC RIGHT JOIN Product НА PC.model = Product.model

Просто запрос

SELECT maker, Product.model AS model_1, PC.model AS model_2, цена
ИЗ продукта ПРАВО СОЕДИНИТЕ ПК НА ПК.model = Product.model
ЗАКАЗ ОТ производителя, ПК. Модель;

дает те же результаты, что и для внутреннего соединения, потому что правая таблица ( PC ) не содержит моделей, которые отсутствовали бы в левой таблице ( Продукт ), а именно разумно для типа отношения "один ко многим", которое возникает между PC и Продукт таблиц. Наконец, набор результатов с FULL JOIN будет включать не только совпадающие строки в обеих таблицах, но также и во всех возможных несовпадающих строках в исходных таблицах. Все несовпадающие значения столбцов в обеих таблицах возвращаются как нулевые значения. Полное соединение представляет собой комбинацию левого и правого внешних соединений.
Итак, для указанных выше таблиц A и B запрос
ВЫБОР A. *, B. *
ОТ ПОЛНОГО СОЕДИНЕНИЯ B
ПО A.a = B.c;

дает следующий набор результатов:
a б с д
1 2 ПУСТО ПУСТО
2 1 2 4
ПУСТО ПУСТО 3 3

Обратите внимание, что это соединение симметрично, т. е.е. «A FULL JOIN B» эквивалентно «B FULL JOIN A». Также следует отметить, что обозначение A. * означает «весь столбец из таблицы».

Предлагаемые упражнения: 6, 9, 13, 16, 19, 21, 34, 50, 55.

Руководство пользователя MySQLdb - документация MySQLdb 1.2.4b4

Если вы хотите писать приложения, переносимые между базами данных, используйте MySQLdb и избегайте использования этого модуля напрямую. MySQLdb._mysql предоставляет интерфейс, который в основном реализует MySQL C. API.За дополнительную информацию см. в документации MySQL. Документация для этого модуля намеренно слабый, потому что вам, вероятно, следует использовать модуль MySQLdb более высокого уровня. Если вам это действительно нужно, используйте стандартные документы MySQL и при необходимости транслитерируйте.

Перевод MySQL C API

MySQL C API обернут объектно-ориентированным способом. Единственный Реализованные структуры данных MySQL: MYSQL (дескриптор подключения к базе данных) и MYSQL_RES (дескриптор результата) типы. В общем, любая функция, которая принимает MYSQL * mysql как аргумент теперь является методом объекта подключения, а любая функция который принимает MYSQL_RES * результат в качестве аргумента является методом объект результата. Функции, не требующие структур данных MySQL реализованы как функции в модуле. Функции, требующие одного из другие структуры данных MySQL обычно не реализованы. Устаревшие функции не реализованы. Во всех случаях mysql_ префикс удаляется из имени.Большинство из перечисленных методов conn также доступны как методы объекта MySQLdb Connection. Их использование непереносной.

Отображение функций MySQL C API

C API _mysql
mysql_affected_rows () conn.affected_rows ()
mysql_autocommit () conn. autocommit ()
mysql_character_set_name () соедин.имя_набора_символов ()
mysql_close () замкнуть ()
mysql_commit () conn.commit ()
mysql_connect () _mysql.connect ()
mysql_data_seek () result.data_seek ()
mysql_debug () _mysql.отладка ()
mysql_dump_debug_info conn.dump_debug_info ()
mysql_escape_string () _mysql.escape_string ()
mysql_fetch_row () result.fetch_row ()
mysql_get_character_set_info ()

Подзапросы в SQL Server - Simple Talk

Некоторые элементы в операторе Transact-SQL столь же универсальны, как подзапрос . Подзапрос, также называемый внутренним запросом или внутренним выбором , представляет собой оператор SELECT, встроенный в оператор языка манипулирования данными (DML) или вложенный в другой подзапрос. Вы можете использовать подзапросы в операторах SELECT, INSERT, UPDATE и DELETE везде, где разрешены выражения. Например, вы можете использовать подзапрос как одно из выражений столбца в списке SELECT или как табличное выражение в предложении FROM.

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

  • Вы должны заключить подзапрос в круглые скобки.
  • Подзапрос должен включать предложение SELECT и предложение FROM.
  • Подзапрос может включать необязательные предложения WHERE, GROUP BY и HAVING.
  • Подзапрос не может включать предложения COMPUTE или FOR BROWSE.
  • Вы можете включить предложение ORDER BY, только если включено предложение TOP.
  • Вы можете вложить подзапросы до 32 уровней.

Существует несколько способов категоризации подзапросов: по количеству возвращаемых результатов, коррелирован ли они (связаны с внешним запросом) или где они используются в операторе DML. Для целей этой статьи я использую последний подход и объясняю, как можно реализовать подзапросы в предложениях SELECT, FROM и WHERE оператора SELECT. Хотя вы можете реализовать подзапросы в других предложениях и других типах операторов, приведенные мной примеры должны продемонстрировать основные принципы того, как подзапросы могут использоваться в любых обстоятельствах.(Все примеры возвращают данные из базы данных AdventureWorks2008 на локальном экземпляре SQL Server 2008.)

ПРИМЕЧАНИЕ. В документации Microsoft указано, что подзапросы работают примерно так же, как операторы, которые семантически эквивалентны, например, подзапросы и объединения. Однако, если необходимо проверить наличие (как будет описано позже в статье), соединение часто работает лучше, если подзапрос должен обрабатываться для каждой строки, возвращаемой внешним запросом.

Добавление подзапросов в предложение SELECT

Вы можете добавить подзапрос в предложение SELECT как выражение столбца в списке SELECT.Подзапрос должен возвращать скалярное (одно) значение для каждой строки, возвращаемой внешним запросом. Например, в следующем операторе SELECT я использую подзапрос для определения столбца TotalQuantity:

ВЫБРАТЬ

SalesOrderNumber,

SubTotal,

OrderDate,

(

SELECT SUM (OrderQty)

FROM Sales.SalesOrderDetail

000

000

000 FROM SalesOrder

000 FRE SalesOrder

000

000

000 FRE SalesOrder)SalesOrderHeader

ГДЕ

SalesOrderID = 43659;

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

ПродажиНомер заказа

Промежуточный итог

Дата заказа

Всего

SO43659

24643.9362

2001-07-01 00: 00: 00.000

26

Как показывают результаты, внешний оператор SELECT возвращает одну строку из таблицы SalesOrderHeader для заказа 43659, а сам столбец TotalQuantity возвращает значение 26.Если бы вы выполняли оператор SELECT подзапроса самостоятельно (без выполнения внешнего запроса), вы также получили бы значение 26. Однако, выполняя оператор SELECT как подзапрос во внешнем операторе SELECT, общее количество элементов sold теперь предоставляется как часть информации о заказе.

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

SELECT

SalesOrderNumber,

SubTotal,

OrderDate,

CASE WHEN

(

SELECT SUM (LineTotal)

FROM Sales.SalesOrderDetail

ГДЕ SalesOrderID = 43659

) = Промежуточный итог ТО «сбалансированный»

ELSE «несбалансированный»

END AS LineTotals

ИЗ

Sales.SalesOrderHeader

WHID =

WHID

Я включил выражение CASE как часть выражения четвертого столбца. Выражение CASE использует подзапрос для подсчета продаж отдельных позиций в таблице SalesOrderDetail для заказа 43659.Обратите внимание, что, как и в предыдущем примере, подзапрос заключен в круглые скобки и использует агрегатную функцию SUM для возврата одного значения. Затем я использую оператор равенства (=), чтобы сравнить результат подзапроса со столбцом SubTotal в таблице SalesOrderHeader. Если суммы равны, выражение CASE возвращает значение сбалансировано . Если значения не равны, CASE возвращает несбалансированное . В следующей таблице показаны результаты, возвращаемые внешним оператором SELECT.

ПродажиНомер заказа

Промежуточный итог

Дата заказа

Линия Итого

SO43659

24643.9362

2001-07-01 00: 00: 00.000

несбалансированная

Как видите, сумма продаж отдельных позиций в таблице SalesOrderDetail не соответствует промежуточной сумме в таблице SalesOrderHeader, по крайней мере, не для продажи 43659.Однако предположим, что вы хотите проверить все продажи, перечисленные в двух таблицах, чтобы увидеть, сбалансированы ли итоги. Для этого необходимо изменить и подзапрос, и внешний запрос, чтобы создать условие, необходимое для поддержки коррелированного подзапроса . Коррелированный подзапрос, также известный как повторяющийся подзапрос , - это тот, который зависит от внешнего запроса для определенных значений. Это особенно важно, если внешний запрос возвращает несколько строк.

Лучший способ понять, как работают коррелированные подзапросы, - это рассмотреть пример.В следующем операторе SELECT я включаю выражение CASE как одно из выражений столбца, как вы видели в предыдущем примере:

ВЫБРАТЬ

SalesOrderNumber,

SubTotal,

OrderDate,

CASE WHEN

(

SELECT SUM (LineTotal)

FROM Sales.SalesOrderDetail d

Detaild

SalesOrderID

) = h.SubTotal THEN «сбалансированный»

ELSE «несбалансированный»

END AS LineTotals

FROM

Sales.SalesOrderHeader h;

Как и раньше, выражение CASE включает подзапрос, который возвращает общую сумму продаж отдельных позиций. Однако обратите внимание, что предложение WHERE в подзапросе отличается от предыдущего примера. Вместо указания идентификатора заказа предложение WHERE ссылается на столбец SalesOrderID из внешнего запроса.Я делаю это, используя псевдонимы таблиц, чтобы различать два столбца - h для SalesOrderHeader и d для SalesOrderDetail - а затем указывал, что значения столбцов должны быть равны, чтобы условие WHERE оценивалось как истинное. Это означает, что для каждой строки в таблице SalesOrderHeader, возвращаемой внешним запросом, значение SalesOrderID, связанное с этой строкой, вставляется в подзапрос и сравнивается со значением SalesOrderID таблицы SalesOrderDetail. В результате подзапрос выполняется для каждой строки, возвращаемой внешним запросом.

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

ПродажиНомер заказа

Промежуточный итог

Дата заказа

Линия Итого

SO61168

1170.48

2003-12-31 00: 00: 00.000

сбалансированный

SO61169

619,46

2003-12-31 00:00: 00.000

сбалансированный

SO61170

607,96

2003-12-31 00:00: 00.000

сбалансированный

SO61171

553.97

2003-12-31 00:00: 00.000

сбалансированный

SO61172

2398,05

2003-12-31 00:00: 00.000

сбалансированный

SO61173

34851.8445

2004-01-01 00: 00: 00.000

несбалансированная

SO61174

8261.4247

2004-01-01 00: 00: 00.000

несбалансированная

SO61175

30966.9005

2004-01-01 00: 00: 00.000

несбалансированная

SO61176

1570,725

2004-01-01 00: 00: 00.000

несбалансированная

SO61177

25599.8392

2004-01-01 00: 00: 00.000

несбалансированная

SO61178

3227.0112

2004-01-01 00: 00: 00.000

несбалансированная

SO61179

47199.0054

2004-01-01 00: 00: 00.000

несбалансированная

SO61180

4208.8078

2004-01-01 00: 00: 00.000

несбалансированная

SO61181

36564.9023

2004-01-01 00: 00: 00.000

несбалансированная

SO61182

63162.5722

2004-01-01 00: 00: 00.000

несбалансированная

SO61183

35.0935

2004-01-01 00: 00: 00.000

несбалансированная

SO61184

113451.8266

2004-01-01 00: 00: 00.000

несбалансированная

SO61185

554.0328

2004-01-01 00: 00: 00.000

несбалансированная

SO61186

39441.4489

2004-01-01 00: 00: 00.000

несбалансированная

SO61187

65.988

2004-01-01 00: 00: 00.000

сбалансированный

SO61188

58992.9256

2004-01-01 00: 00: 00.000

несбалансированная

Как видите, некоторые итоги уравновешиваются, а другие нет.Опять же, при использовании коррелированных подзапросов важно помнить, что подзапрос выполняется для каждой строки, возвращаемой внешним запросом. Затем коррелированный подзапрос использует значение, предоставленное внешним запросом, для возврата результатов. Дополнительные сведения о коррелированных подзапросах см. В разделе « Correlated Subqueries » в электронной документации по SQL Server.

Добавление подзапросов в пункт FROM

Каждый из примеров подзапроса в предыдущем разделе возвращает одно значение, которое они должны сделать, чтобы его можно было использовать в предложении SELECT.Однако не все результаты подзапросов ограничены таким образом. Подзапрос также можно использовать в предложении FROM для возврата нескольких строк и столбцов. Результаты, возвращаемые таким подзапросом, называются производной таблицей . Производная таблица полезна, когда вы хотите работать с подмножеством данных из одной или нескольких таблиц без необходимости создавать представление или временную таблицу. Например, в следующем примере я создаю подзапрос, который извлекает информацию о подкатегориях продукта из таблицы ProductSubcategory, но только для тех продуктов, в названии которых есть слово «велосипед»:

ВЫБРАТЬ

стр.ProductID,

p.Name AS ProductName,

p.ProductSubcategoryID AS SubcategoryID,

ps. Name AS SubcategoryName

FROM

Production.Product p INNER JOIN

Production. Product p INNER JOIN

ProductSubcategory

ГДЕ Имя LIKE '% bikes%'

) AS ps

ON p.ProductSubcategoryID = ps.ProductSubcategoryID;

Первое, что следует заметить, это то, что подзапрос возвращает производную таблицу, которая включает два столбца и несколько строк.Поскольку подзапрос возвращает таблицу, я могу присоединить эту таблицу, которую я назвал p s, к результатам из таблицы Product (p ). Как демонстрирует соединение, вы обрабатываете подзапрос, используемый в предложении FROM, так же, как и любую таблицу. Я мог бы так же легко создать представление или временную таблицу - или даже добавить в базу данных обычную таблицу, - которая будет обращаться к тем же данным, что и доступ к подзапросу.

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

ProductID

PeoductName

SubcategoryID

Имя подкатегории

786

Mountain-300 Black, 40

1

Горные велосипеды

787

Mountain-300 Black, 44

1

Горные велосипеды

788

Гора-300 Черный, 48

1

Горные велосипеды

789

Дорога-250 Красная, 44

2

Шоссейные велосипеды

790

Дорога-250 Красная, 48

2

Шоссейные велосипеды

791

Дорога-250 Красная, 52

2

Шоссейные велосипеды

792

Дорога-250 Красная, 58

2

Шоссейные велосипеды

793

Road-250 Черный, 44

2

Шоссейные велосипеды

794

Road-250 Черный, 48

2

Шоссейные велосипеды

795

Дорога-250 Черная, 52

2

Шоссейные велосипеды

796

Road-250 Черный, 58

2

Шоссейные велосипеды

797

Road-550-W Желтый, 38

2

Шоссейные велосипеды

798

Road-550-W Желтый, 40

2

Шоссейные велосипеды

799

Road-550-W Желтый, 42

2

Шоссейные велосипеды

800

Road-550-W Желтый, 44

2

Шоссейные велосипеды

801

Road-550-W Желтый, 48

2

Шоссейные велосипеды

953

Туринг-2000 Синий, 60

3

Туристические велосипеды

954

Туринг-1000 Жёлтый, 46

3

Туристические велосипеды

955

Touring-1000 Желтый, 50

3

Туристические велосипеды

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

Добавление подзапросов в предложение WHERE

Другой распространенный способ реализации подзапросов в операторе DML - использовать их для определения условий в предложении WHERE. Например, вы можете использовать операторы сравнения для сравнения значения столбца со значением, возвращаемым подзапросом. В следующем примере я использую оператор равенства (=) для сравнения значения BusinessEntityID в таблице Person со значением, возвращаемым подзапросом:

ВЫБРАТЬ

BusinessEntityID,

Имя,

Фамилия

ОТ

Лиц.Person

WHERE

BusinessEntityID =

(

SELECT BusinessEntityID

FROM HumanResources.Employee

WHERE NationalIDNumber = '895209680'

);

Подзапрос извлекает значение BusinessEntityID из таблицы Employee для сотрудника, национальный идентификатор которого равен 895209680. Затем значение BusinessEntityID из подзапроса сравнивается со значением BusinessEntityID в таблице Person.Если два значения равны, возвращается строка, как показано в следующих результатах.

SELECT

p.BusinessEntityID,

p.FirstName,

p.LastName,

s.SalesQuota

FROM

Person.Person p INNER JOIN

sales ON.Sales s.BusinessEntityID

ГДЕ

s.SalesQuota НЕ НУЛЕВАЯ И

s.SalesQuota>

(

ВЫБРАТЬ СРЕДНЕЕ (SalesQuota)

FROM Sales.SalesPerson

);

В подзапросе я использую агрегатную функцию AVG, чтобы найти средний показатель квоты продаж. Таким образом, подзапрос возвращает только одно значение. Затем я могу сравнить это значение со столбцом SalesQuota. Если значение SalesQuota больше среднего, выражение WHERE принимает значение true, и строка возвращается внешним запросом.В противном случае выражение оценивается как ложное, и строка не возвращается. Как показано в следующей таблице, только три строки имеют значение SalesQuota больше среднего.

BusinessEntityID

Имя

Фамилия

Квота продаж

275

Михаил

Блайт

300000.00

279

Цви

Рейтер

300000,00

284

Тете

Менса-Аннан

300000,00

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

  • ALL: Значение столбца сравнивается со всеми значениями, возвращаемыми подзапросом.
  • ЛЮБОЙ: Значение столбца сравнивается с одним наиболее подходящим отличным значением.
  • НЕКОТОРЫЕ: Эквивалент ЛЮБОГО по ISO.

Лучший способ понять, как работают эти модификаторы, - это увидеть их в действии. В следующем примере я использую модификатор ANY вместе с оператором «больше» (>) для сравнения столбца SalesQuota со списком значений SalesQuota, возвращаемых подзапросом:

ВЫБРАТЬ

стр.BusinessEntityID,

p.FirstName,

p.LastName,

s.SalesQuota

FROM

Person.Person p INNER JOIN

Sales.SalesPerson s

ON p.BusinessEntity

ON p.BusinessEntity

ON p.BusinessEntity

s.SalesQuota НЕ НУЛЕВАЯ И

S.SalesQuota> ЛЮБОЙ

(

ВЫБРАТЬ Квоту продаж

ОТ Sales.SalesPerson

);

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

BusinessEntityID

Имя

Фамилия

Квота продаж

275

Михаил

Блайт

300000.00

279

Цви

Рейтер

300000,00

284

Тете

Менса-Аннан

300000,00

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

ВЫБРАТЬ

стр.BusinessEntityID,

p.FirstName,

p.LastName,

s.SalesQuota

FROM

Person.Person p INNER JOIN

Sales.SalesPerson s

ON p.BusinessEntity

ON p.BusinessEntity

ON p.BusinessEntity

ON p.BusinessEntity

s.SalesQuota НЕ НУЛЬ И

S.SalesQuota> ВСЕ

(

ВЫБРАТЬ Квоту продаж

ОТ Sales.SalesPerson

);

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

Другой оператор, позволяющий работать с подзапросом, возвращающим список, - это оператор IN. Значение столбца сравнивается со списком, и выражение WHERE оценивается как истина, если какое-либо из значений подзапроса соответствует значению столбца. Например, следующий оператор SELECT включает подзапрос, который возвращает список идентификаторов торговых представителей:

ВЫБРАТЬ

BusinessEntityID,

Имя,

Фамилия

ОТ

Лиц.Person

WHERE

BusinessEntityID IN

(

SELECT BusinessEntityID

FROM HumanResources.Employee

WHERE JobTitle = 'Торговый представитель'

);

Значение BusinessEntityID из внешнего запроса сравнивается со списком значений идентификаторов, возвращаемых подзапросом. Если значение BusinessEntityID совпадает с одним из значений в списке подзапроса, строка включается в результаты внешнего запроса, как показано в следующих результатах:

BusinessEntityID

Имя

Фамилия

275

Михаил

Блайт

276

Линда

Митчелл

277

Джиллиан

Карсон

278

Гаррет

Варгас

279

Цви

Рейтер

280

Памела

Ансман-Вулф

281

Шу

Ито

282

Хосе

Сарайва

283

Давид

Кэмпбелл

284

Тете

Менса-Аннан

286

Линн

Цофлиас

288

Рэйчел

Вальдес

289

Jae

Пак

290

Ранджит

Варки Чудукатил

Если вы хотите вернуть только те строки, значение BusinessEntityID которых не соответствует никаким значениям в списке, возвращаемом подзапросом, вы можете вместо этого использовать оператор NOT IN, как в следующем примере:

ВЫБРАТЬ

BusinessEntityID,

Имя,

Фамилия

ОТ

Лиц.Лицо

ГДЕ

BusinessEntityID НЕ В

(

ВЫБЕРИТЕ BusinessEntityID

ИЗ HumanResources.Employee

WHERE JobTitle = 'Торговый представитель'

);

Этот оператор точно такой же, как и в предыдущем примере, за исключением использования оператора NOT IN, но результаты совсем другие. Вместо того, чтобы возвращать 14 строк, по одной для каждого торгового представителя, оператор теперь возвращает почти 20 000 строк, по одной для каждого человека, который не является торговым представителем.

Еще один метод, который можно использовать при включении подзапроса в предложение WHERE, - это проверка его существования. В этом случае вы используете ключевое слово EXIST, чтобы проверить, возвращает ли подзапрос строку, соответствующую вашим критериям поиска. Подзапрос не производит никаких данных, а вместо этого возвращает значение true или false, в зависимости от того, существует ли строка. Например, в следующем операторе SELECT я использую коррелированный подзапрос, чтобы проверить имя подкатегории каждого продукта, чтобы определить, является ли это имя Mountain Bikes:

ВЫБЕРИТЕ ProductID, имя как ProductName FROM Production.Продукт p ГДЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * FROM Production.ProductSubcategory s WHERE p.ProductSubcategoryID = s.ProductSubcategoryID И s.Name = 'Mountain Bikes');

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

ProductID

Название продукта

771

Mountain-100 Silver, 38

772

Mountain-100 Silver, 42

773

Mountain-100 Silver, 44

774

Mountain-100 Silver, 48

775

Mountain-100 Черный, 38

776

Mountain-100 Черный, 42

777

Mountain-100 Черный, 44

778

Mountain-100 Черный, 48

779

Mountain-200 Silver, 38

780

Mountain-200 Silver, 42

781

Mountain-200 Silver, 46

782

Гора-200 Черный, 38

783

Гора-200 Черный, 42

784

Гора-200 Черный, 46

785

Гора-300 Черный, 38

786

Mountain-300 Black, 40

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

Вы также можете вернуть результаты для строк, проверка существования которых возвращает false, используя оператор NOT EXIST, как показано в следующем примере:

SELECT

ProductID,

Название AS ProductName

FROM

Production.Product p

ГДЕ НЕ СУЩЕСТВУЕТ

(

SELECT *

FROM Production.ProductSubcategory s

ГДЕ p.ProductSubcategoryID = s.ProductSubcategoryID

AND s.Name = 'Mountain Bikes'

);

Теперь инструкция возвращает только те строки, которые не являются частью подкатегории Mountain Bikes. Любая строка, проверка существования которой возвращает истину, не включается в результаты.

Заключение

Как показывают примеры в статье, подзапросы - гибкий и универсальный инструмент.Вы можете определить их везде, где разрешено выражение в операторах SELECT, INSERT, UPDATE или DELETE. Затем вы можете использовать данные, возвращаемые подзапросом, во внешнем запросе, чтобы сделать эти операторы более мощными и, в конечном итоге, более полезными для ваших различных приложений. Дополнительные сведения о подзапросах см. В разделе «Основы подзапросов», а также в других разделах, посвященных использованию подзапросов, в электронной документации по SQL Server.

Предложение Select, показывающее, как в них можно использовать скалярные подзапросы (полноразмерная версия PDF доступна для загрузки ниже.

.
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *