Команда 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, будет:
Скобки обязательны, если вы используете 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 000000 000 FROM SalesOrder 000 FRE SalesOrder 000 000000 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 DetaildSalesOrderID) = 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 доступна для загрузки ниже.
.