Оператор SQL IN: примеры, синтаксис
Оператор SQL IN позволяет определить, совпадает ли значение объекта со значением в списке.
Оператор SQL IN имеет следующий синтаксис:
expression [ NOT ] IN ( expression, [...] )
Примеры оператора SQL IN: Имеется следующая таблица Universities:
ID | UniversityName | Students | Faculties | Professores | Location | Site |
1 | Perm State National Research University | 12400 | 12 | 1229 | Perm | psu.ru |
2 | Saint Petersburg State University | 21300 | 24 | 13126 | Saint-Petersburg | spbu.ru |
3 | Novosibirsk State University | 7200 | 13 | 1527 | Novosibirsk | nsu.ru |
4 | Moscow State University | 35100 | 39 | 14358 | Moscow | msu.ru |
5 | Higher School of Economics | 20335 | 12 | 1615 | Moscow | hse.ru |
6 | Ural Federal University | 57000 | 19 | 5640 | Yekaterinburg | urfu.ru |
7 | National Research Nuclear University | 8600 | 10 | 936 | Moscow | mephi.ru |
Пример 1. Используя оператор SQL IN вывести записи университетов из Новосибирска и Перми:
SELECT * FROM Universities WHERE Location IN ('Novosibirsk', 'Perm')
Этот запрос аналогичен:
SELECT * FROM Universities WHERE Location = 'Novosibirsk' OR Location = 'Perm'
Но если значений много, то удобней перечислить их в операторе SQL IN
Результат:
ID | UniversityName | Students | Faculties | Professores | Location | Site |
1 | Perm State National Research University | 12400 | 12 | 1229 | Perm | psu.ru |
3 | Novosibirsk State University | 7200 | 13 | 1527 | Novosibirsk | nsu.ru |
MS SQL Server и T-SQL
Операторы фильтрации
Последнее обновление: 13.07.2017
Оператор IN
Оператор IN позволяет определить набор значений, которые должны иметь столбцы:
WHERE выражение [NOT] IN (выражение)
Выражение в скобках после IN определяет набор значений. Этот набор может вычисляться динамически на основании, например, еще одного запроса, либо это могут быть константные значения.
Например, выберем товары, у которых производитель либо Samsung, либо Xiaomi, либо Huawei:
SELECT * FROM Products WHERE Manufacturer IN ('Samsung', 'Xiaomi', 'Huawei')
Мы могли бы все эти значения проверить и через оператор OR:
SELECT * FROM Products WHERE Manufacturer = 'Samsung' OR Manufacturer = 'Xiaomi' OR Manufacturer = 'Huawei'
Но использование оператора IN гораздо удобнее, особенно если подобных значений очень много.
С помощью оператора NOT можно найти все строки, которые, наоборот, не соответствуют набору значений:
SELECT * FROM Products WHERE Manufacturer NOT IN ('Samsung', 'Xiaomi', 'Huawei')
Оператор BETWEEN
Оператор BETWEEN определяет диапазон значений с помощью начального и конечного значения, которому должно соответствовать выражение:
WHERE выражение [NOT] BETWEEN начальное_значение AND конечное_значение
Например, получим все товары, у которых цена от 20 000 до 40 000 (начальное и конечное значения также включаются в диапазон):
SELECT * FROM Products WHERE Price BETWEEN 20000 AND 40000
Если надо, наоборот, выбрать те строки, которые не попадают в данный диапазон, то применяется оператор NOT:
SELECT * FROM Products WHERE Price NOT BETWEEN 20000 AND 40000
Также можно использовать более сложные выражения. Например, получим товары, запасы которых на определенную сумму (цена * количество):
SELECT * FROM Products WHERE Price * ProductCount BETWEEN 100000 AND 200000
Оператор LIKE
Оператор LIKE принимает шаблон строки, которому должно соответствовать выражение.1-6]%’
Соответствует таким значениям как «iPhone 7», «iPhone 7S» и «iPhone 8». Но не соответствует значениям «iPhone 5», «iPhone 6» и «iPhone 6S»
Применим оператор LIKE:
SELECT * FROM Products WHERE ProductName LIKE 'iPhone [6-8]%'
Как используются и для чего нужны в SQL операторы and и or: примеры работы с условиями
От автора: SQL операторы AND и OR используются для более узкого поиска данных через инструкцию SQL. Эти два оператора называются связующими операторами.
Они предоставляют средства для выполнения нескольких сравнений с помощью разных операторов в одной и той же инструкции SQL.
Оператор AND
Оператор AND допускает существование множества условий в условии WHERE инструкции SQL.
Синтаксис
Основной синтаксис оператора AND с условием WHERE выглядит следующим образом:
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!SELECT cтолбец1, cтолбец2, cтолбецN FROM имя_таблицы WHERE [условие1] AND [условие2]…AND [условиеN];
SELECT cтолбец1, cтолбец2, cтолбецN FROM имя_таблицы WHERE [условие1] AND [условие2]…AND [условиеN]; |
С помощью оператора AND вы можете комбинировать N-ное количество условий. Для действия, которое должен выполнить оператор SQL, будь то транзакция или запрос, все условия, разделенные AND, должны выполняться.
Пример
Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:
Приведенный ниже код отображает поля ID, Name и Salary из таблицы CUSTOMERS, для которых зарплата превышает 2000, а возраст составляет менее 25 лет:
SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000 AND age < 25;
SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000 AND age < 25; |
Этот код дает следующий результат —
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Оператор OR
Оператор OR используется для объединения нескольких условий в условии WHERE инструкции SQL.
Синтаксис
Основной синтаксис оператора OR с условием WHERE выглядит следующим образом:
SELECT cтолбец1, cтолбец2, cтолбецN FROM имя_таблицы WHERE [условие1] OR [условие2]…OR [условиеN]
SELECT cтолбец1, cтолбец2, cтолбецN FROM имя_таблицы WHERE [условие1] OR [условие2]…OR [условиеN] |
Вы можете комбинировать N-ное количество условий, используя оператор OR. Для действия, выполняемого инструкцией SQL, будь то транзакция или запрос, должно выполняться одно и ТОЛЬКО одно из условий, разделенных OR.
Пример
Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:
Следующий код содержит запрос, который будет извлекать поля ID, Name и Salary из таблицы CUSTOMERS, для которых зарплата больше 2000, а возраст составляет менее 25 лет.
SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000 OR age < 25;
SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY > 2000 OR age < 25; |
Этот код дает следующий результат —
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Хотите изучить MySQL?
Посмотрите курс по базе данных MySQL!
СмотретьSQL — операторы — CoderLessons.com
Оператор — это зарезервированное слово или символ, используемый в основном в предложении WHERE оператора SQL для выполнения операций, таких как сравнения и арифметические операции. Эти операторы используются для указания условий в операторе SQL и в качестве союзов для нескольких условий в операторе.
- Арифметические операторы
- Операторы сравнения
- Логические операторы
- Операторы, используемые для отрицания условий
SQL арифметические операторы
Предположим, что «переменная a» содержит 10, а «переменная b» содержит 20, тогда —
Показать примеры
оператор | Описание | пример |
---|---|---|
+ (Дополнение) | Добавляет значения по обе стороны от оператора. | а + б даст 30 |
— (вычитание) | Вычитает правый операнд из левого операнда. | а — б даст -10 |
* (Умножение) | Умножает значения по обе стороны от оператора. | а * б даст 200 |
/ (Отдел) | Делит левый операнд на правый операнд. | б / у даст 2 |
% (Модуль) | Делит левый операнд на правый и возвращает остаток. | б% а даст 0 |
Операторы сравнения SQL
Предположим, что «переменная a» содержит 10, а «переменная b» содержит 20, тогда —
Показать примеры
оператор | Описание | пример |
---|---|---|
знак равно | Проверяет, равны ли значения двух операндов или нет, если да, тогда условие становится истинным. | (а = б) не соответствует действительности. |
знак равно | Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. | (a! = b) верно. |
<> | Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. | (а <> б) верно. |
> | Проверяет, больше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. | (а> б) не соответствует действительности. |
< | Проверяет, меньше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. | (а <б) верно. |
> = | Проверяет, больше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. | (a> = b) не соответствует действительности. |
<= | Проверяет, меньше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. | (a <= b) верно. |
<! | Проверяет, является ли значение левого операнда не меньше, чем значение правого операнда, если да, тогда условие становится истинным. | (a! <b) ложно. |
!> | Проверяет, не превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным. | (а!> б) это правда. |
Логические операторы SQL
Вот список всех логических операторов, доступных в SQL.
Показать примеры
ВСЕ
Оператор ALL используется для сравнения значения со всеми значениями в другом наборе значений.
А ТАКЖЕ
Оператор AND допускает существование нескольких условий в предложении WHERE оператора SQL.
ЛЮБОЙ
ЛЮБОЙ оператор используется для сравнения значения с любым применимым значением в списке согласно условию.
МЕЖДУ
Оператор BETWEEN используется для поиска значений, которые находятся в пределах набора значений, учитывая минимальное значение и максимальное значение.
СУЩЕСТВУЕТ
Оператор EXISTS используется для поиска наличия строки в указанной таблице, которая соответствует определенному критерию.
В
Оператор IN используется для сравнения значения со списком литеральных значений, которые были указаны.
ЛАЙК
Оператор LIKE используется для сравнения значения с аналогичными значениями с использованием подстановочных операторов.
НЕ
Оператор NOT меняет значение логического оператора, с которым он используется. Например: НЕ СУЩЕСТВУЕТ, НЕ МЕЖДУ, НЕ В и т. Д. Это оператор отрицания.
ИЛИ ЖЕ
Оператор OR используется для объединения нескольких условий в предложении WHERE оператора SQL.
НУЛЕВОЙ
Оператор NULL используется для сравнения значения со значением NULL.
УНИКАЛЬНАЯ
Оператор UNIQUE ищет в каждой строке указанной таблицы уникальность (без дубликатов).
Оператор SELECT с примерами в SQL
Доброго времени суток, уважаемые читатели. Сегодня мы перейдем к изучению оператора SELECT, который является очень важным в языке SQL. Помимо общей информации, на этот раз будет больше примеров, чем ранее. И в будущем количество примеров будет увеличиваться.
В первом уроке по языку SQL мы создали базу данных и три таблицы, с помощью оператора CREATE, а во втором уроке — для заполнения таблиц данными мы использовали оператор INSERT.
Общие сведения
Итак, оператор SELECT необходим для выборки данных из таблиц. С помощью этого оператора SQL, вы можете выбрать всю таблицу, например сделав такой запрос:
SELECT * FROM имя_таблицы
Соответственно имя таблицы вы укажете свое. Такой запрос вернет все колонки в таблице, и в том порядке, в котором они записаны в базе данных.
Зачастую нужно выбирать определенные данные из таблицы. Это можно сделать большим количеством способов, в зависимости от того, что вы хотите получить. Например если вам необходимо получить только 2 колонки из таблицы, то запрос примет такой вид:
SELECT имя_колонки_1, имя_колонки_2 FROM имя_таблицы
И в этом примере порядок отображения будет таким, каким его зададут в самом запросе, это значит, что порядок можно контролировать.
Использование условия WHERE
До этого были примеры самых простых запросов, но если вам необходимо выбрать более точечные данные, например строки с определенным значением, то в таком случае можно воспользоваться условием. Это условие задается с помощью ключевого слова WHERE в блоке запроса SELECT SQL, после которого задается само условие.
Разберем небольшой пример на таблице salespeople, созданной ранее, но для начала напомним ее структуру.
snum | sname | city | comm |
---|---|---|---|
1 | Колованов | Москва | 10 |
2 | Петров | Тверь | 25 |
3 | Плотников | Москва | 22 |
4 | Кучеров | Санкт-Петербург | 28 |
5 | Малкин | Санкт-Петербург | 18 |
6 | Шипачев | Челябинск | 30 |
7 | Мозякин | Одинцово | 25 |
8 | Проворов | Москва | 25 |
Теперь для примера выведем информацию о тех продавцах, которые проживают в Москве. Это сделается таким запросом:
SELECT * FROM salespeople WHERE city = 'Москва'
Достаточно простой для понимания запрос, который вернет такой результат:
snum | sname | city | comm |
---|---|---|---|
1 | Колованов | Москва | 10 |
3 | Плотников | Москва | 22 |
8 | Проворов | Москва | 25 |
Здесь, отлично видно, что мы выбрали все колонки для отображения. Теперь давайте выведем только имена продавцов, у которых комиссия составляет менее 20%. Следующий запрос сделает это:
SELECT sname, comm FROM salespeople WHERE comm < 20
И сразу же результат:
sname | comm |
---|---|
Колованов | 10 |
Малкин | 18 |
Обратите внимания, что какие именно колонки выводить, мы задали после слова SELECT. В языке SQL такие запросы — самые распространенные.
SELECT WHERE с несколькими условиями
Очевидно, что пока мы рассмотрели запросы с одиночным условием. Но также в языке SQL, в запросе SELECT возможно использовать несколько условий. Эти условия могут быть объединены с помощью булевых операторов: AND, OR, NOT.
Перейдем сразу к примеру, чтобы лучше понять, выведем информацию о всех продавцах из Москвы или Твери, а также имеющих сумму комиссии равную 25%.
SELECT * FROM salespeople WHERE (city = 'Москва' or city = 'Тверь') and comm = 25
Результат такого запроса:
snum | sname | city | comm |
---|---|---|---|
2 | Петров | Тверь | 25 |
8 | Проворов | Москва | 25 |
Стоит отметить, что правила булевой алгебры здесь работают точно так же, как и всегда. Также важно сказать, что такой запрос можно упростить использовав ключевое слово языка SQL — IN. Тогда запрос SELECT может принять вид:
SELECT * FROM salespeople WHERE city IN ('Москва', 'Тверь') and comm = 25
Всегда важно оптимизировать свои запросы.
Ключевое слово DISTINCT
Существует такое понятие как избыточность данных, которое описывает случай представления данных в том или ином виде несколько раз. Например исполнив запрос на вывод городов продавцов из нашей таблицы:
SELECT city FROM salespeople
Как мы уже выучили, этот запрос выведет колонку с названием городов. Но в этом запросе есть неточность — данные повторяются и не представляют собой ценности. Для устранения избыточности данных предусмотрели ключевое слово — DISTINCT.
В качестве примера выведем список городов из нашей таблицы:
SELECT DISTINCT city FROM salespeople
Результат:
city |
---|
Москва |
Тверь |
Санкт-Петербург |
Челябинск |
Одинцово |
При таком использовании, данные не дублируются.
Примеры на SELECT SQL
Теперь, разберем коротко несколько примеров для всех таблиц в нашей базе данных.
1. Напишите команду SELECT, которая бы вывела номер Заказа, сумму, и дату для всех строк из таблицы Заказов.
SELECT onum, amt, odate FROM orders
2. Напишите запрос, который вывел бы все строки из таблицы Заказчиков, для которых номер продавца = 1.
SELECT * FROM customers WHERE snum = 1
3. Напишите команду SELECT, которая вывела бы оценку (rating), сопровождаемую именем каждого заказчика в Москве.
SELECT rating, cname FROM customers WHERE city = 'Москва'
4. Напишите запрос, который может выдать вам все заказы со значениями суммы выше 1000.
SELECT * FROM orders WHERE amt > 1000
5. Напишите запрос, который может выдать вам поля sname и city для всех продавцов в Москве с комиссионными выше 10%.
SELECT sname, city FROM salespeople WHERE comm > 10
6. Напишите запрос к таблице Заказчиков, чей вывод включит всех заказчиков с оценкой =
SELECT * FROM customers WHERE rating <= 100 AND city != 'Тула'
Заключение
В заключении этой статьи скажем, что мы изучили основные конструкции для оператора SELECT SQL. Также познакомились с ключевыми словами WHERE и DISTINCT, которые часто используются в практике. На этом сегодня все, если у вас возникли вопросы или пожелания, то оставляйте их в комментариях.
Поделиться ссылкой:
ПохожееSQL операторы | IT-блог о веб-технологиях, серверах, протоколах, базах данных, СУБД, SQL, компьютерных сетях, языках программирования и создание сайтов.
Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3. В этой записи мы поговорим про SQL операторы без привязки к какой-либо СУБД, посмотрим, на какие группы делятся SQL операторы, а так же для чего нужен тот или иной оператор. Данную запись вы можете рассматривать, как справочник SQL операторов. В принципе в большинстве СУБД операторы реализованы так, как написано в данной записи (этакая шпаргалка по SQL операторам, которая всегда под рукой).
Здесь мы рассмотрим только стандартные операторы языка SQL, которые должны быть реализованы во всех СУБД, но это не означает, что они реализованы во всех СУБД. В дальнейшем мы рассмотрим SQL операторы, которые есть в рассматриваемой СУБД. Операторы SQL делятся на три больших группы:
- арифметические операторы SQL;
- SQL операторы сравнения;
- логические операторы SQL.
Замечу, что набор операторов может различаться не только от производителя СУБД, но и от версии СУБД, поэтому, перед использованием SQL операторов, неплохо было бы ознакомиться с документацией, иначе результаты могут быть самыми неожиданными.
Арифметические операторы SQLСодержание статьи:
Арифметические операторы SQL – самые простые и знакомые нам еще со школы операторы.
Оператор | Описание | Пример |
+ | Бинарный оператор сложения | a + b = c |
— | Бинарный оператор вычитания | a — b = с |
* | Бинарный оператор умножения | a * b = с |
/ | Бинарный оператор деления | b / a = с |
% | Оператор деления по модулю. Результатом будет целочисленный остаток. | b % a = с |
Приведу пример арифметических SQL операторов:
SELECT 10+20; +———+ | 10+20 | +———+ | 30 | +———+ SELECT 10 * 20; +———+ | 10 * 20 | +———+ | 200 | +———+ SELECT 10 / 5; +———+ | 10 / 5 | +———+ | 2.0000 | +———+ SELECT 12 % 5; +———+ | 12 % 5 | +———+ | 2 | +———+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
SELECT 10+20;
+———+
| 10+20 |
+———+
| 30 |
+———+
SELECT 10 * 20;
+———+
| 10 * 20 |
+———+
| 200 |
+———+
SELECT 10 / 5;
+———+
| 10 / 5 |
+———+
| 2.0000 |
+———+
SELECT 12 % 5;
+———+
| 12 % 5 |
+———+
| 2 |
+———+ |
Как видите, ничего сложного в арифметических операторах SQL нет, прошу обратить внимание на то, что все они бинарные. По-другому: и слева, и справа от оператора должно находиться какое-то число.
Операторы сравненияОператоры сравнения в SQL в качестве результата выдают два значения: true или false.
Оператор | Описание | Пример |
= | Этот SQL оператор не арифметическое «равно», известное со школы, а сравнение на равенство. Если равенство верное, то результат TRUE, если нет – FALSE. | (4 = 2 + 2) результат TRUE |
!= | SQL оператор не равно или сравнение на неравенство, TRUE мы получим тогда, когда значения будут не равны | (6 != 12) результат TRUE |
<> | SQL оператор не равно или сравнение на неравенство, TRUE мы получим тогда, когда значения будут не равны | (6 != 12) результат TRUE |
> | SQL оператор больше. Если левая часть (левый операнд) больше правой, то результат TRUE. | (5 > 1) результат TRUE |
< | SQL оператор меньше. Принимает значение TRUE, когда правый операнд больше левого. | (12 < 1) результат FALSE |
>= | SQL оператор больше, либо равно принимает значение TRUE, когда правая часть больше, либо равная левой. | (17 >= 17) результат TRUE |
<= | SQL оператор меньше, либо равно принимает значение TRUE, когда правая часть больше, либо равна левой. | (12<=100) результат TRUE |
!< | SQL оператор не меньше принимает значение TRUE, когда правая часть не меньше левой. | (12!<10) результат FALSE |
!> | SQL оператор не больше принимает значение TRUE, когда левая часть не больше правой. | (12 !> 10) результат FALSE |
Приведем пример операторов сравнения в SQL.
Для начала соединимся с тестовой базой данных World и выведем первых пятнадцать записей из таблицы City:
Выведем 15 городов из таблицы City базы данных World
Затем мы посмотрим при помощи оператора больше пятнадцать городов с населением больше миллиона:
Воспользовавшись SQL оператором сравнения, выведем 15 городов с населением больше одного миллиона
В SQL операторах сравнения ничего сложного нет, главное понять, что результат сравнения – это значение TRUE или FALSE, хочу обратить ваше внимание, что СУБД сверяет все значения выбранного столбца с заданным и, если результат сравнения положительный – выводит вам результат на экран.
Логические операторыДалее приведу список логических SQL операторов, почему данные SQL операторы называются логическими – поймете из их описания.
Оператор | Описание |
ALL | SQL оператор ALL позволяет выводить все значения из таблицы |
AND | SQL оператор AND или логическое «И», позволяет накладывать на выборку два условия, только при соблюдении двух условий мы будем видеть результат. |
ANY | SQL оператор ANY (любой). Используется в подзапросах вместе с операторами сравнения для сравнения текущего значения с подзапросом. |
BETWEEN | SQL оператор BETWEEN. данный SQL оператор позволяет сделать выборку в диапазоне значений. Можно задать максимум и минимум. |
EXISTS | SQL оператор EXISTS используется для указания того, нужно ли выводить результат подзапроса. |
IN | Простой SQL оператор IN указывает с какими значениями нужно вывести строки. |
LIKE | Любимый многими SQL оператор LIKE. Данный оператор позволяет нам находить в тексте подстроку, если подстрока найдена, то она выводится. |
NOT | SQL оператор отрицания NOT. Инвертирует любой условия. |
OR | SQL оператор логическое «ИЛИ». Выводит результат в том случае, когда значение TRUE есть хотя бы в одном из операндов. |
IS NULL | SQL оператор IS NULL позволяет проверить значение поля на NULL |
UNIQUE | SQL оператор UNIQUE позволяет проверить каждую строку на уникальность. |
Работа всех SQL операторов зависит от реализации СУБД. Знакомиться с тем, как реализованы и как работают логические операторы в SQLite3 мы будем в следующих темах.
Соединение таблиц или действие оператора SQL JOIN на примерах : WEBCodius
Оператор JOIN используется для соединения двух или нескольких таблиц. Соединение таблиц может быть внутренним (INNER) или внешним (OUTER), причем внешнее соединение может быть левым (LEFT), правым (RIGHT) или полным (FULL). Далее на примере двух таблиц рассмотрим различные варианты их соединения.
Синтаксис соединения таблиц оператором JOIN имеет вид:
FROM <таблица 1> [INNER] {{LEFT | RIGHT | FULL } [OUTER]} JOIN <таблица 2> [ON <предикат>]
Предикат в этой конструкции определяет условие соединения строк из разных таблиц.
Допустим есть две таблицы (Auto слева и Selling справа), в каждой по четыре записи. Одна таблица содержит названия марок автомобилей (Auto), вторая количество проданных автомобилей (Selling):
id name id sum -- ---- -- ---- 1 bmw 1 250 2 opel 5 450 3 kia 3 300 4 audi 6 400
Далее соединим эти таблицы по полю id несколькими различными способами. Совпадающие значения выделены красным для лучшего восприятия.
1. Внутреннее соединение (INNER JOIN) означает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Обычно используется для объединения записей, которые есть и в первой и во второй таблице, т. е. получения пересечения таблиц:
Красным выделена область, которую мы должны получить.
Итак, сам запрос:
SELECT * FROM 'Auto' INNER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id
И результат:
id name id sum -- ---- -- ---- 1 bmw 1 250 3 kia 3 300
Ключевое слово INNER в запросе можно опустить.
В итоге запрос отбирает и соединяет те записи, у которых значение поля id в обоих таблицах совпадает.
2. Внешнее соединение (OUTER JOIN) бывает нескольких видов. Первым рассмотрим полное внешнее объединение (FULL OUTER JOIN), которое объединяет записи из обоих таблиц (если условие объединения равно true) и дополняет их всеми записями из обоих таблиц, которые не имеют совпадений. Для записей, которые не имеют совпадений из другой таблицы, недостающее поле будет иметь значение NULL. Граф выборки записей будет иметь вид:
Переходим к запросу:
SELECT * FROM 'Auto' FULL OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id
Результат:
id name id sum -- ---- -- ---- 1 bmw 1 250 2 opel NULL NULL 3 kia 3 300 4 audi NULL NULL NULL NULL 5 450 NULL NULL 6 400
То есть мы получили все записи, которые есть в обоих таблицах. Записи у которых значение поля id совпадает соединяются, а у записей для которых совпадений не найдено недостающие поля заполняются значением NULL.
Ключевое слово OUTER можно опустить.
3. Левое внешнее объединение (LEFT OUTER JOIN). В этом случае получаем все записи удовлетворяющие условию объединения, плюс все оставшиеся записи из внешней таблицы, которые не удовлетворяют условию объединения. Граф выборки:
Запрос:
SELECT * FROM 'Auto' LEFT OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id
Результат:
id name id sum -- ---- -- ---- 1 bmw 1 250 2 opel NULL NULL 3 kia 3 300 4 audi NULL NULL
Запрос также можно писать без ключевого слова OUTER.
В итоге здесь мы получили все записи таблицы Auto. Записи для которых были найдены совпадения по полю id в таблице Selling соединяются, для остальных недостающие поля заполняются значением NULL.
Еще существует правое внешнее объединение (RIGHT OUTER JOIN). Оно работает точно также как и левое объединение, только в качестве внешней таблицы будет использоваться правая (в нашем случае таблица Selling или таблица Б на графе).
Далее рассмотрим остальные возможные выборки с использованием объединения двух таблиц.
4. Получить все записи из таблицы А, которые не имеют объединения из таблицы Б. Граф:
То есть в нашем случае, нам надо получить все автомобили из таблицы Auto, которые не имеют продаж в таблице Selling.
Запрос:
SELECT * FROM 'Auto' LEFT OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id WHERE 'Selling'.id IS null
Результат:
id name id sum -- ---- -- ---- 2 opel NULL NULL 4 audi NULL NULL
5. И последний вариант, получить все записи из таблицы А и Таблицы Б, которые не имеют объединений. Граф:
В нашем случае мы должны получить все записи из таблицы Auto, которые не связаны с таблицей Selling, и все записи из таблицы Selling, которые не имеют сопоставления из таблицы Auto.
Запрос:
SELECT * FROM 'Auto' FULL OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id WHERE 'Auto'.id IS null OR 'Selling'.id IS null
Результат:
id name id sum -- ---- -- ---- 2 opel NULL NULL 4 audi NULL NULL NULL NULL 5 450 NULL NULL 6 400
На этом все, до новых встреч на страницах блога.
SQL WHERE IN, SELECT WHERE IN Список или подзапрос — с примерами
Что возвращает SQL IN?
WHERE IN возвращает значения, соответствующие значениям в списке или подзапросе.
Предложение WHERE IN является сокращением для нескольких условий OR.
Синтаксис SQL WHERE IN
Общий синтаксис:
ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ имя-столбца IN (значения)
ПОСТАВЩИК |
---|
Идентификатор |
Название компании |
Контактное имя |
Город |
Страна |
Телефон |
Факс |
SQL WHERE IN Примеры
Проблема : Список всех поставщиков из США, Великобритании или Японии
ВЫБЕРИТЕ Id, CompanyName, City, Country ОТ поставщика ГДЕ Страна В (США, Великобритания, Япония)
Результат: 8 записей.
Идентификатор | Название компании | Город | Страна |
---|---|---|---|
1 | Экзотические жидкости | Лондон | Великобритания |
2 | Новый Орлеан Cajun Delights | Новый Орлеан | США |
3 | Усадьба бабушки Келли | Анн-Арбор | США |
4 | Tokyo Traders | Токио | Япония |
6 | Маюми | Осака | Япония |
8 | Specialty Biscuits, Ltd. | Манчестер | Великобритания |
16 | Пивоваренный завод Bigfoot | Колено | США |
19 | Консервный завод морепродуктов Новой Англии | Бостон | США |
ПРОДУКТ |
---|
Идентификатор |
Название продукта |
Идентификатор поставщика |
Цена единицы |
Упаковка |
Снято с производства |
Проблема : Перечислите все продукты, которые не стоят точно 10, 20, 30, 40 или 50 долларов.
ВЫБЕРИТЕ Id, ProductName, UnitPrice ОТ ПРОДУКТА ГДЕ UnitPrice НЕ ВХОДИТ (10,20,30,40,50)
Результат: 72 записи.
Id | Название продукта | Цена за единицу |
---|---|---|
1 | Чай | 18,00 |
2 | Чанг | 19,00 |
4 | Приправа для каджуна от шеф-повара Антона | 22.00 |
5 | Chef Anton’s Gumbo Mix | 21,35 |
6 | Бабушкины спреды с ягодами | 25,00 |
ПОСТАВЩИК |
---|
Идентификатор |
Название компании |
Контактное имя |
Город |
Страна |
Телефон |
Факс |
КЛИЕНТ | Id
---|
Имя |
Фамилия |
Город |
Страна |
Телефон |
Проблема : Список всех клиентов из
те же страны, где находятся поставщики.
ВЫБЕРИТЕ Id, FirstName, LastName, Country ОТ Заказчика ГДЕ Страна В (Выберите страну ОТ поставщика)
Результат: 91 запись.
Id | Имя | Фамилия | Страна | |
---|---|---|---|---|
1 | Мария | Андерс | Германия | |
4 | Томас | Харди | Великобритания | |
5 | Кристина | Berglund | Швеция | |
6 | Ханна | Моос | Германия | |
7 | Frédérique | Сито | Франция | |
— SQL IN () по сравнению с OR
Я работал с запросом, который я написал сегодня, и мне пришлось изменить код из предложения WHERE
, чтобы использовать фильтр IN (список материалов) вместо использования чего-то вроде
item_desc = 'элемент 1'
ИЛИ item_desc = 'предмет 2'
ИЛИ item_desc = 'элемент 3'
ИЛИ item_desc = 'предмет 4'
Вышеупомянутое работало в течение 15 минут и ничего не вернуло, но следующее дало мне мой набор результатов в 1.5 минут
item_desc IN (
'элемент 1'
, 'элемент 2'
, 'элемент 3'
, 'элемент 4'
)
Я сделал это в SQL, и мне интересно, почему IN (список элементов) работает намного быстрее, чем оператор OR.
— РЕДАКТИРОВАТЬ — SQL Server 2008, я прошу прощения за то, что не поместил эту информацию в первую очередь.
Вот весь запрос с использованием операторов OR
:
ОБЪЯВИТЬ @SD DATETIME
ОБЪЯВИТЬ @ED DATETIME
НАБОР @SD = '2013-06-01';
НАБОР @ED = '2013-06-15';
- ВЫБОР КОЛОННЫ
ВЫБЕРИТЕ PV.PtNo_Num AS 'VISIT ID'
, PV.Med_Rec_No AS 'MRN'
, PV.vst_start_dtime AS 'ADMIT'
, PV.vst_end_dtime AS 'DISC'
, PV.Days_Stay AS 'LOS'
, PV.pt_type AS 'PT TYPE'
, PV.hosp_svc AS 'HOSP SVC'
, SO.ord_no КАК 'НОМЕР ЗАКАЗА'
-, SO.ent_dtime AS 'ВРЕМЯ ВХОДА ЗАКАЗА'
-, DATEDIFF (ЧАС, PV.vst_start_dtime, SO.ent_dtime) КАК 'ADM TO ENTRY HOURS'
, SO.svc_desc AS "ОПИСАНИЕ ЗАКАЗА"
, OSM.ord_sts КАК 'СТАТУС ЗАКАЗА'
, SOS.prcs_dtime КАК "ВРЕМЯ СТАТУСА ЗАКАЗА"
, DATEDIFF (ДЕНЬ, PV.vst_start_dtime, SOS.prcs_dtime) КАК 'ADM ДЛЯ ЗАКАЗА STS В ДНЯХ'
- БД (И) ИСПОЛЬЗУЕМЫЕ
ОТ smsdss.BMH_PLM_PtAcct_V PV
ПРИСОЕДИНЯЙТЕСЬ к smsmir.sr_ord ТАК
ON PV.PtNo_Num = SO.episode_no
ПРИСОЕДИНЯЙТЕСЬ к smsmir.sr_ord_sts_hist SOS
ВКЛ SO.ord_no = SOS.ord_no
ПРИСОЕДИНЯЙТЕСЬ к smsmir.ord_sts_modf_mstr OSM
НА SOS.hist_sts = OSM.ord_sts_modf_cd
- ФИЛЬТР (S)
ГДЕ PV.Adm_Date МЕЖДУ @SD И @ED
И SO.svc_cd = 'PCO_REMFOLEY'
ИЛИ SO.svc_cd = 'PCO_INSRTFOLEY'
ИЛИ SO.svc_cd = 'PCO_INSTFOLEY'
ИЛИ SO.svc_cd = 'PCO_URIMETER'
И ТАК.ord_no НЕ В (
ВЫБЕРИТЕ SO.ord_no
ИЗ smsdss.BMH_PLM_PtAcct_V PV
ПРИСОЕДИНЯЙТЕСЬ к smsmir.sr_ord ТАК
НА PV.PtNo_Num = SO.Episode_no
ПРИСОЕДИНЯЙТЕСЬ к smsmir.sr_ord_sts_hist SOS
ВКЛ SO.ord_no = SOS.ord_no
ПРИСОЕДИНЯЙТЕСЬ к smsmir.ord_sts_modf_mstr OSM
НА SOS.hist_sts = OSM.ord_sts_modf_cd
ГДЕ OSM.ord_sts = 'DISCONTINUE'
И SO.svc_cd = 'PCO_REMFOLEY'
ИЛИ SO.svc_cd = 'PCO_INSRTFOLEY'
ИЛИ SO.svc_cd = 'PCO_INSTFOLEY'
ИЛИ SO.svc_cd = 'PCO_URIMETER'
)
ЗАКАЗ ПО PV.PtNo_Num, SO.ord_no, SOS.prcs_dtime
Спасибо,
Выбор значения в наборе значений с помощью SQL IN Opeartor
Резюме : в этом руководстве вы узнаете, как использовать оператор SQL IN для выбора строк, значения столбцов которых находятся в наборе значений.
Оператор IN
используется в предложении WHERE для выбора строк, значения которых входят в набор значений. Вы можете использовать оператор IN
в любом операторе SQL, который принимает предложение WHERE
, например SELECT, UPDATE или DELETE.
Ниже показано, как использовать оператор IN
в операторе SELECT
:
SELECT column1, column2, … FROM table_name WHERE 9000pr6 | столбец) IN (значение1; значение2;…); |
Оператор IN
возвращает ИСТИНА
, если выражение или значение столбца соответствует одному из значений в списке, то есть значению 1, значению 2 и т. Д., В противном случае он возвращает ЛОЖЬ
.
Примеры оператора SQL IN
Например, чтобы выбрать продукт, цена за единицу которого составляет 18, 19 или 20 долларов, вы можете выполнить следующий запрос:
SELECT productName, unitPrice ИЗ продуктов ГДЕ Цена IN (18, 19, 20) |
IN vs.OR
Оператор IN
помогает избежать использования нескольких операторов OR
в предложении WHERE. Вы можете переписать приведенный выше запрос, используя несколько операторов OR
, как следующий запрос:
SELECT productName, unitPrice FROM продуктов WHERE unitPrice = 18 OR unit ORunitPrice = 20; |
Когда список значений увеличивается, запрос, в котором используются операторы OR
, становится трудно читать.Поэтому всякий раз, когда вы пишете запрос, содержащий несколько операторов OR
, вы можете использовать оператор IN
, чтобы сделать ваш запрос более читабельным.
Оператор SQL IN с оператором NOT
Оператор IN
может сочетаться с оператором NOT
для выбора строк, значения столбцов которых не входят в набор значений. Например, вы можете выбрать продукты, цена за единицу которых не равна 18, 19 и 20, используя следующий запрос:
SELECT productName, unitPrice FROM product WHERE unitPrice NOT IN (18, 19, 20); |
Оператор IN
также часто используется в подзапросах SQL, о которых вы узнаете позже в учебнике по подзапросам SQL.
В этом руководстве вы узнали, как использовать оператор SQL IN
для выбора строк, значения столбцов которых входят в набор значений.
- Было ли это руководство полезным?
- Да Нет
sql server — Есть ли в SQL комбинация LIKE и IN?
Я знаю, что это очень поздно, но у меня была похожая ситуация. Мне нужен был оператор «Like In» для набора хранимых процедур, который у меня есть, который принимает множество параметров, а затем использует эти параметры для агрегирования данных из нескольких систем РСУБД, поэтому никакие приемы, специфичные для РСУБД, не будут работать, однако хранимая процедура и любые функции будет работать на MS SQL Server, поэтому мы можем использовать T-SQL для функциональности генерации полных операторов SQL для каждой СУБД, но выходные данные должны быть в значительной степени независимыми от СУБД.
Это то, что я придумал на данный момент, чтобы превратить строку с разделителями (например, параметр, входящий в хранимую процедуру) в блок SQL. Я называю это «Лишайник» от «НРАВИТСЯ». Возьми?
Lichen.sql
УСТАНОВИТЬ ANSI_NULLS ВКЛ.
ИДТИ
ВКЛЮЧИТЬ QUOTED_IDENTIFIER
ИДТИ
- ================================================ =======================
- Лишайник - функция со скалярным значением
- Возвращает nvarchar (512) результатов типа "LIKE IN". См. Дополнительную документацию.- СОЗДАТЕЛЬ: Норман Дэвид Кук
- СОЗДАНО: 2020-02-05
- ОБНОВЛЕНО:
- ================================================ =======================
СОЗДАТЬ ИЛИ ИЗМЕНИТЬ ФУНКЦИЮ Lichen
(
- Добавьте сюда параметры функции
@leadingAnd bit = 1,
@delimiter nchar (1) = ';',
@colIdentifier nvarchar (64),
@argString nvarchar (256)
)
ВОЗВРАТ nvarchar (512)
В ВИДЕ
НАЧИНАТЬ
- Объявите здесь возвращаемую переменную
ОБЪЯВИТЬ @result nvarchar (512)
- установить разделитель для обнаружения (добавьте сюда больше, чтобы обнаружить разделитель, если он не указан)
ОБЪЯВЛЕНИЕ @delimit nchar (1) = ';'
ЕСЛИ НЕ @delimiter = @delimit
УСТАНОВИТЬ @delimit = @delimiter
- проверьте, есть ли у нас какие-либо разделители во входном шаблоне
IF CHARINDEX (@delimit, @argString)> 1 - проверить наличие подобного в разделителе
BEGIN - начать ветку как в, найдя разделитель
- установить табличную переменную и разделить на нее предоставленный шаблон string_split.DECLARE @lichenTable TABLE ([id] [int] IDENTITY (1,1) NOT NULL, строка NVARCHAR (32))
ВСТАВИТЬ В @lichenTable SELECT * FROM STRING_SPLIT (@argString, ';')
- настроить итераторы цикла и определить, сколько строк было вставлено в таблицу лишайников
ОБЪЯВИТЬ @loopCount int = 1
ОБЪЯВИТЬ @lineCount int
ВЫБЕРИТЕ @lineCount = COUNT (*) из @lichenTable
- выберите временную таблицу (чтобы увидеть, что внутри для отладки)
--select * из @lichenTable
- BEGIN AND блок-оболочка для LIKE IN, если бит установлен
ЕСЛИ @leadingAnd = 1
НАБОР @result = 'И ('
ЕЩЕ
НАБОР @result = '('
- пройти через временную таблицу для создания нескольких блоков «LIKE 'x' OR» внутри внешнего блока-оболочки AND
ПОКА ((@loopCount НЕ НУЛЕВО) И (@loopCount <= @lineCount))
НАЧАТЬ - начать цикл через @lichenTable
IF (@loopcount = 1) - первый цикл не получает OR впереди
ВЫБЕРИТЕ @result = CONCAT (@result, '', @colIdentifier, 'LIKE' '', line, '' '') FROM @lichenTable WHERE id = @loopCount
ИНАЧЕ - но все последующие петли делают
ВЫБЕРИТЕ @result = CONCAT (@result, 'OR', @colIdentifier, 'LIKE' '', line, '' '') FROM @lichenTable WHERE id = @loopCount
SET @loopcount = @loopCount + 1 - увеличить цикл
END - завершить цикл через @lichenTable
- установить финальные скобки после цикла lichenTable
НАБОР @result = СЦЕПИТЬ (@result, ')')
END - завершить ветку как в, найдя разделитель
ИНАЧЕ - разделитель не указан
BEGIN - начало ветки "разделитель не найден"
ЕСЛИ @leadingAnd = 1
SET @result = CONCAT ('И', @colIdentifier, 'LIKE' '' + @argString + '' '')
ЕЩЕ
НАБОР @result = CONCAT ('', @colIdentifier, 'LIKE' '' + @argString + '' '')
END - конец ветки "разделитель не найден"
- Вернуть результат функции
ВОЗВРАТ @result
КОНЕЦ - завершение функции лишайника
ИДТИ
Обнаружение разделителя, возможно, запланировано, но на данный момент по умолчанию используется точка с запятой, поэтому вы можете просто поместить туда по умолчанию
.Вероятно, в этом есть ошибки. Параметр @leadingAnd
- это просто битовое значение, определяющее, хотите ли вы, чтобы перед блоком было помещено ведущее «И», чтобы оно хорошо вписывалось в другие дополнения предложения WHERE.
Пример использования (с разделителем в argString)
SELECT [dbo]. [Lichen] (
по умолчанию - @leadingAND, бит, по умолчанию: 1
, по умолчанию - @delimiter, nchar (1), по умолчанию: ';'
, 'foo.bar' - @colIdentifier, nvarchar (64), это идентификатор столбца
, '01%; 02%;% 03% '- @argString, nvarchar (256), это входная строка для синтаксического анализа "LIKE IN" из
)
ИДТИ
вернет nvarchar (512), содержащий:
И (foo.bar КАК '01% 'ИЛИ foo.bar КАК '02%' ИЛИ foo.bar КАК '% 03%')
Он также пропустит блок, если ввод не содержит разделителя:
Пример использования (без разделителя в argString)
SELECT [dbo]. [Lichen] (
по умолчанию - @leadingAND, бит, по умолчанию: 1
, по умолчанию - @delimiter, nchar (1), по умолчанию: ';'
, 'foo.bar' - @colIdentifier, nvarchar (64), это идентификатор столбца
, '01% '- @argString, nvarchar (256), это входная строка для синтаксического анализа "LIKE IN" из
)
ИДТИ
вернет nvarchar (512), содержащий:
И foo.bar LIKE '01% '
Я собираюсь продолжить работу над этим, поэтому, если я что-то упустил (явно очевидное или иное), пожалуйста, не стесняйтесь комментировать или обращаться.
ЗаявлениеCASE в SQL
Оператор case в SQL возвращает значение по указанному условию. Мы можем использовать оператор Case в запросах select вместе с предложениями Where, Order By и Group By. Его также можно использовать в операторе Insert. В этой статье мы рассмотрим оператор CASE и различные варианты его использования.
Предположим, у вас есть таблица, в которой хранятся ProductID для всех продуктов в мини-магазине. Вы хотите получить Productname для определенного ProductID.
Взгляните на следующий пример; Мы объявили переменную @ProductID и указали для нее значение 1. В заявлении Case мы определили условия. Как только условие удовлетворяется, возвращается соответствующее ему значение.
Точно так же, если мы изменим условие в инструкции Case в SQL, она вернет соответствующее выражение.В следующем примере мы хотим получить название продукта для ProductID 4. он не удовлетворяет условию оператора Case; следовательно, он давал результат из выражения Else.
Давайте рассмотрим несколько примеров оператора Case в SQL. Прежде чем продолжить, создайте образец таблицы и вставьте в нее несколько записей.
1 2 3 4 5 6 7 8 9 10 11 12 13 140004 14 18 19 20 21 22 23 24 25 26 27 28 29 30 3435 36 37 | ИСПОЛЬЗОВАТЬ [SQLShackDemo] GO СОЗДАТЬ ТАБЛИЦУ dbo.Сотрудник ( EmployeeID INT IDENTITY PRIMARY KEY, EmployeeName VARCHAR (100) NOT NULL, Gender VARCHAR (1) NOT NULL, StateCode VARCHAR (20) NOT NULL, Salary) ) GO USE [SQLShackDemo] GO SET IDENTITY_INSERT [dbo]. [Сотрудник] ON GO INSERT [dbo]. [Сотрудник Сотрудник] ([EmployeeID], [EmployeeName] ], [StateCode], [Salary]) ЗНАЧЕНИЯ (201, N'Jerome ', N'M', N'FL ', 83000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) ЗНАЧЕНИЯ (202, N'Ray ', N'M', N'AL ', 88000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) »ЗНАЧЕНИЯ (203, N'Stella', N'F ', N'AL', 76000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) ЗНАЧЕНИЯ (204, N'Gilbert ', N'M', N'Ar ', 42000.0000) GO INSERT [dbo].[Сотрудник] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) ЗНАЧЕНИЯ (205, N'Edward ', N'M', N'FL ', 93000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) ЗНАЧЕНИЯ (206, N'Ernest ', N'F', N'Al ', 64000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) ЗНАЧЕНИЯ (207, N'Jorge ', N'F', N ' IN ', 75000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) »ЗНАЧЕНИЯ (208, N'Nicholas', N ' F ', N'Ge', 71000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) ЗНАЧЕНИЯ (209, N'Lawrence ', N'M', N'IN ', 95000.0000) GO INSERT [dbo]. [Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) »ЗНАЧЕНИЯ (210, N'Salvador', N'M ', N'Co', 75000.0000) GO SET IDENTITY_INSERT [dbo]. [Employee] OFF GO |
У нас есть следующие записи в таблице сотрудников.
Различные форматы операторов CASE
Простое выражение оператора CASE
В этом формате мы сравниваем одно выражение с несколькими значениями. В простом операторе case он оценивает условия одно за другим. После совпадения условия и выражения возвращается выражение, указанное в предложении THEN.
У нас есть следующий синтаксис для оператора case в SQL с простым выражением
SELECT CASE Expression When expression1 Then Result1 When expression2 Then Result2 ... ELSE Результат END |
Обычно мы храним сокращения в таблице, а не в ее полной форме. Например, в моей таблице «Сотрудник» я использовал сокращения в полях и коде штата. Я хочу использовать оператор Case для возврата значений как Male и Female на выходе вместо M и F .
Выполните следующий код и обратите внимание, что мы хотим оценить CASE Gender в этом запросе.
На следующем изображении вы можете заметить разницу в выводе с помощью оператора Case в SQL.
Оператор CASE и оператор сравнения
В этом формате оператора CASE в SQL мы можем оценить условие, используя операторы сравнения. Как только это условие выполнено, мы получаем выражение из соответствующего THEN в выходных данных.
Мы можем увидеть следующий синтаксис для оператора Case с оператором сравнения.
CASE WHEN ComparsionCondition THEN результат WHEN ComparsionCondition THEN результат ELSE other END |
Предположим, у нас есть диапазон заработной платы для каждого обозначения. Если зарплата сотрудника находится в пределах определенного диапазона, мы хотим получить обозначение с помощью оператора Case.
В следующем запросе мы используем оператор сравнения и оцениваем выражение.
Select EmployeeName, CASE WHEN Salary> = 80000 AND Salary <= 100000 THEN «Director» WHEN Salary> = 50000 AND Salary <80000 THEN «Senior Consultant» Else «Director» END AS Обозначение от сотрудника |
На следующем изображении вы можете видеть, что мы получаем обозначение в соответствии с условием, указанным в заявлении CASE.
Заявление о случаес заказом по пункту
Мы также можем использовать оператор Case с предложением order by. В SQL мы используем предложение Order By для сортировки результатов в порядке возрастания или убывания.
Предположим в следующем примере; мы хотим отсортировать результат следующим способом.
- Для сотрудницы-женщины заработная плата сотрудников должна указываться в порядке убывания.
- Для сотрудника-мужчины мы должны получать зарплаты сотрудников в порядке возрастания.
Мы можем определить это условие с помощью комбинации оператора Order by и Case.В следующем запросе вы можете видеть, что мы указали Order By и Case вместе. Мы определили условия сортировки в case-выражении.
Выберите имя сотрудника, пол, зарплату от сотрудника ЗАКАЗАТЬ ПО СЛУЧАЮ Пол КОГДА «F» ТОГДА Зарплата Конец УДАЛ, Случай КОГДА Пол = «M» ТО Заработная плата КОНЕЦ |
На выходе мы выполнили наше требование сортировки в порядке возрастания или убывания.
- Для сотрудницы-женщины зарплата отображается в порядке убывания.
- Для сотрудника-мужчины зарплата отображается в порядке возрастания.
в SQL с условием Group by
Мы также можем использовать оператор Case с предложением Group By.Предположим, мы хотим сгруппировать сотрудников по их зарплате. Далее мы хотим рассчитать минимальную и максимальную заработную плату для определенного круга сотрудников.
В следующем запросе вы можете увидеть, что у нас есть предложение Group By и оно содержит i с условием получения требуемого вывода.
Выберите CASE WHEN Salary> = 80000 AND Salary <= 100000 THEN «Директор» WHEN Salary> = 50000 AND Salary <80000 THEN «Senior Consultant» Else «Director» END AS Обозначение, Минимум (зарплата) как минимальная зарплата, Макс (зарплата) как максимальная зарплата от сотрудника Группа по КЕЙС КОГДА Заработная плата> = 80000 И Заработная плата <= 100000 ТОГДА 'Директор' КОГДА Заработная плата> 50000 И Заработная плата <80000 ТОГДА «Старший консультант» Иное «Директор» КОНЕЦ |
У нас есть следующий результат этого запроса.В этом выводе мы получаем минимальную и максимальную зарплату для определенного назначения.
Оператор обновления с оператором CASE
Мы также можем использовать оператор Case в SQL с обновлением DML. Предположим, мы хотим обновить Statecode сотрудников на основе условий оператора Case.
В следующем коде мы обновляем код состояния с учетом следующего условия.
- Если код штата сотрудника - AR, , то обновите его до FL .
- Если код штата сотрудника - GE, , тогда обновите до AL
- Для всех остальных кодов состояния обновите значение до IN
Выполните следующую команду обновления, чтобы выполнить наше требование, используя оператор Case.
UPDATE сотрудник SET StateCode = CASE StateCode WHEN 'Ar' THEN 'FL' WHEN 'GE' THEN 'AL' ELSE 'IN' END |
В следующем выводе вы можете увидеть старый код Statcode (слева) и обновленный Statecode для сотрудников на основе наших условий в заявлении Case.
Вставить оператор с оператором CASE
Мы также можем вставлять данные в таблицы SQL с помощью оператора Case в SQL.Предположим, у нас есть приложение, которое вставляет данные в таблицу «Сотрудники». Получаем следующие значения для пола.
Значение | Описание | Требуемое значение в таблице сотрудников |
0 | Сотрудник мужского пола | M |
6 | 1 Сотрудник | Ф |
Мы не хотим вставлять значения 0 и 1 для сотрудников мужского и женского пола.Нам нужно вставить необходимые значения M и F для пола сотрудника.
В следующем запросе мы указали переменные для хранения значений столбцов. В операторе вставки вы можете использовать оператор Case для определения соответствующего значения для вставки в таблицу сотрудников. В операторе Case он проверяет наличие требуемых значений и вставляет значения из выражения THEN в таблицу.
1 2 3 4 5 6 7 8 9 10 11 12 13 140004 14 18 | Объявить @EmployeeName varchar (100) Объявить @Gender int Объявить @Statecode char (2) Объявить @salary money Установить @ EmployeeName = 'Raj' Установить @ Установить @ Установить @ Statecode = 'FL' set @ salary = 52000 Insert into employee values (@EmployeeName, CASE @Gender WHEN 0 THEN 'M' WHEN 1 THEN 'F' end , @Statecode, @ зарплата) |
На следующем снимке экрана мы видим, что недавно вставленная строка содержит пол M вместо значения 0.
Ограничения в описании случая
- Мы не можем контролировать поток выполнения хранимых процедур, функций с помощью оператора Case в SQL.
- В заявлении Case может быть несколько условий; однако он работает в последовательной модели. Если одно условие выполнено, проверка дальнейших условий прекращается.
- Мы не можем использовать оператор Case для проверки значений NULL в таблице
Заключение
Оператор Case в SQL обеспечивает гибкость при написании t-SQL для запросов DDL и DML.Это также добавляет гибкости запросам SQL Server. Вам следует практиковать оператор Case в своих запросах.
Как сертифицированный MCSA и сертифицированный инструктор Microsoft в Гургаоне, Индия, с 13-летним опытом работы, Раджендра работает в различных крупных компаниях, специализируясь на оптимизации производительности, мониторинге, высокой доступности и стратегиях и внедрении аварийного восстановления. Он является автором сотен авторитетных статей о SQL Server, Azure, MySQL, Linux, Power BI, настройке производительности, AWS / Amazon RDS, Git и связанных технологиях, которые на сегодняшний день просмотрели более 10 миллионов читателей.Он является создателем одного из крупнейших бесплатных онлайн-сборников статей по одной теме с его серией из 50 статей о группах доступности SQL Server Always On. Основываясь на своем вкладе в сообщество SQL Server, он был отмечен различными наградами, включая престижную награду «Лучший автор года» в 2020 и 2021 годах на SQLShack.
Радж всегда заинтересован в новых задачах, поэтому, если вам нужна помощь консультанта по любому вопросу, затронутому в его трудах, с ним можно связаться в Раджендре[email protected]
Посмотреть все сообщения от Rajendra Gupta
Последние сообщения от Rajendra Gupta (посмотреть все)Понимание оператора SQL CASE и его многочисленных применений - Управление базами данных - Блоги
Оператор SQL CASE оценивает и возвращает результаты на основе определенных значений, предикатов и условий в соответствии с определенной логикой. Например, предположим, что у вас есть таблица избирателей со следующими данными:
Если вы искали логику относительно права голоса, это зависело бы от значений в столбце DOB.
Если избиратель старше 18 лет, он имеет право голосовать.
Давайте посмотрим на другой пример. Часто мы сохраняем значения столбцов в битах 1 или 0. Допустим, вы сохраняете значения доступности продукта как 1 или 0. Например:
- 1 = Товар есть в наличии
- 0 = Товара нет в наличии
Если мы посмотрим с точки зрения базы данных, рекомендуется использовать сокращения или биты везде, где это возможно.Это полезно для оптимизатора запросов SQL Server при подготовке оптимизированного плана выполнения. Но с точки зрения приложения конечному пользователю эти значения не нужны. Клиентам просто нужно посмотреть, доступен ли товар или нет.
На изображении ниже мы видим перспективу как базы данных, так и приложения.
Что делает оператор SQL CASE?
Оператор CASE в SQL Server оценивает выражение и возвращает значение на основе определенных условий.Поэтому в предыдущем примере операторы CASE работают, как показано ниже.
На высоком уровне синтаксис оператора SQL CASE показан ниже. Здесь мы указали несколько условий. SQL Server оценивает условия последовательно. После успешной оценки условия оценка оставшихся условий прекращается. Если ни одно из условий не выполнено, мы можем использовать необязательный оператор ELSE, чтобы вернуть значение по умолчанию. Например, если у нас есть значение, отличное от 0 и 1 в столбце доступности, вы получите результат из блока кода ELSE.Для этого требуется как минимум один набор блоков WHEN и THEN. Оператор CASE должен заканчиваться блоком END.
Давайте рассмотрим оператор SQL CASE на различных примерах.
Примечание. В этой статье мы используем образец базы данных Microsoft AdventureWorks. Вы можете скачать его резервную копию из Microsoft Docs.
Оператор SELECT с простым выражением CASE
В этом типе оператора CASE мы используем выражения проверки равенства. Следующий запрос реализует простое выражение CASE.
- Если значение в [SalariedFlag] равно 1, то отображается Активный сотрудник
- Для всех остальных значений вывод отображается как Inactive Employee
SELECT TOP 5 Национальный номер, CASE salariedflag КОГДА 1 ТО "Активный сотрудник" ELSE "Неактивный сотрудник" КОНЕЦ КАК [Salaried Flag] ОТ [AdventureWorks2019]. [HumanResources]. [Сотрудник]
Мы можем указать несколько условий для оператора CASE.
SELECT TOP 5 Национальный номер, CASE salariedflag КОГДА 1 ТО "Активный сотрудник" КОГДА 0 ТОГДА "Неактивный сотрудник" ELSE 'Недействительное значение' КОНЕЦ КАК [Salaried Flag] ОТ [AdventureWorks2019]. [HumanResources]. [Сотрудник]
Стандартизация данных с использованием операторов SQL CASE
Обычно мы используем сокращения для хранения значений в таблицах SQL. Стандартные сокращения - это пол, коды стран, статус брака, популярные названия продуктов и т. Д.
Предположим, мы указываем сокращения для хранения гендерных данных сотрудников. Теперь наше приложение должно отображать результаты без сокращений.
ОператорыSQL CASE помогают стандартизировать вывод для определенных критериев. В приведенном ниже запросе мы используем следующие условия:
- Если значение пола - M , отобразить его как Male
- Если значение пола - F , отобразить его как Female
- Для любых других значений отобразить Недействительное значение Значение
SELECT DISTINCT CASE пол КОГДА "M" ТОГДА "Мужской" КОГДА 'F' ТОГДА 'Женский' ELSE 'Недействительное значение' КОНЕЦ КАК Пол ОТ AdventureWorks2019.HumanResources.Employee
Найденные операторы CASE
В искомом операторе CASE мы указываем выражение CASE вместо прямых значений. Как только значение выражения оценивается и удовлетворяет условию в предложении WHEN, возвращается соответствующее ему значение.
Посмотрите на приведенный ниже запрос SQL. Здесь мы определили выражения в предложении WHEN для [ListPrice]. В нем указано, что стоимость продукта составляет 250 долларов, и он помечен как «Электроника».
ВЫБЕРИТЕ ProductNumber, Name, [Категория продукта] = ДЕЛО КОГДА ListPrice = 0 ТОГДА "Товары, которых нет в наличии" КОГДА ListPrice> 0 и ListPrice <= 100, ТО 'Потребительские товары' КОГДА ListPrice> 100 и ListPrice <= 500, ТО 'Элементы электроники' КОГДА ListPrice> 500 и ListPrice <1500 ТОГДА "Предметы роскоши" ELSE 'Дополнительные элементы' КОНЕЦ ИЗ ПРОИЗВОДСТВА. Заказ продукции по спискуЦена по убыванию
Для упомянутого ранее гендерного примера мы можем переписать оператор SQL CASE для сокращений пола, используя искомые операторы case.
ВЫБЕРИТЕ ОТЛИЧНЫЙ КОРПУС КОГДА Gender = 'M' THEN 'Male' КОГДА Gender = 'F' ТОГДА 'Женский' ELSE 'Недействительное значение' КОНЕЦ КАК Пол ОТ AdventureWorks2019.HumanResources.Employee
Использование операторов CASE с предложением ORDER BY
SQL-запросы используют предложение ORDER BY для сортировки данных в возрастающем или убывающем порядке. Вы можете использовать операторы CASE вместе с предложением ORDER BY.Предположим, из таблицы продуктов мы извлекаем [ProductName] и [ListPrice]. Мы хотим отсортировать результаты следующим образом:
- Если прайс-лист продукта меньше 2000, вы хотите получить результат в порядке сортировки по умолчанию, т. Е. По возрастанию
- Если прайс-лист продукта превышает 2000, сортировка предложения ORDER BY приводит к убыванию
В этом запросе мы используем два оператора SQL CASE для реализации логики.
ВЫБРАТЬ Имя, Список цен ОТ ПРОИЗВОДСТВА.Продукт ЗАКАЗАТЬ ПО СЛУЧАЮ КОГДА ListPrice <= 2000 ТОГДА ListPrice END , СЛУЧАЙ, КОГДА ListPrice> 2000 THEN ListPrice END DESC
В приведенных ниже выходных данных запроса вы можете проверить сортировку данных, отображаемую как в порядке убывания, так и в порядке возрастания.
В другом примере предположим, что мы хотим отсортировать данные в таблице сотрудников на основе следующего условия:
- Для активных сотрудников (текущий флаг = 1) данные должны отсортировать столбец даты найма
- Для неактивных сотрудников данные следует отсортировать по значениям в столбце даты рождения
ВЫБЕРИТЕ NationalIDNumber, JobTitle, Hiredate, BirthDate, currentflag
ОТ AdventureWorks2019.HumanResources.Employee
СОРТИРОВАТЬ ПО
CASE CURRENTFLAG КОГДА 1 ТО HireDate
еще дата рождения
конец
В выводе запроса мы можем проверить порядок сортировки данных, определенный предложением ORDER BY и операторами CASE.
Оператор CASE в SQL и агрегатные функции
Агрегатные функции в SQL Server выполняют вычисления и возвращают одно значение.Примеры агрегатных функций: MIN, MAX, COUNT, ABG и CHECKSUM.
Предположим, мы хотим получить количество найма сотрудников за каждый год с 2007 по 2010 год. Он должен отображать результаты в следующем формате:
Для этой цели мы используем агрегатную функцию COUNT в SQL Server.
- Во-первых, функция SQL DATEPART фильтрует данные по году. Например, DATEPART (YY, Hiredate) = 2007, фильтрует данные за 2007 год.
- Затем мы используем оператор CASE, чтобы вернуть 1, если год 2007.
- Агрегатная функция count подсчитывает записи и отображает результаты.
- Аналогичным образом запрос работает для остальных лет.
ВЫБРАТЬ Счетчик (СЛУЧАЙ КОГДА Datepart (гг, нанятый) = 2007 ТО 1 ELSE NULL КОНЕЦ) AS [2007Hires], Подсчет (CASE КОГДА Datepart (гг, нанятый) = 2008 ТО 1 ELSE NULL КОНЕЦ) AS [2008Hires], Подсчет (CASE КОГДА Datepart (гг, нанятый) = 2009 ТО 1 ELSE NULL КОНЕЦ) AS [2009Hires], Подсчет (CASE КОГДА Datepart (гг, нанятый) = 2009 ТО 1 ELSE NULL КОНЕЦ) AS [2010Hires] ОТ AdventureWorks2019.HumanResources.Employee
Аналогично, предположим, мы хотим использовать агрегатную функцию GROUP BY для группировки строк, имеющих одну и ту же категорию продукта. Мы можем указать оператор CASE в SQL для сортировки данных из сгруппированного набора результатов.
SELECT [Категория продукта] = CASE КОГДА listprice = 0 ТОГДА 'Товары, которых нет в наличии' КОГДА listprice> 0 И listprice <= 100 ЗАТЕМ "Потребительские товары" КОГДА цена списка> 100 И listprice <= 500 ЗАТЕМ "Электроника" КОГДА цена списка> 500 И listprice <1500 ЗАТЕМ "Предметы роскоши" ELSE 'Дополнительные элементы' КОНЕЦ, Min (listprice) AS MinPrice, Макс (listprice) AS MaxPrice, Подсчет (listprice) КАК Количество продуктов ОТ ПРОИЗВОДСТВА.продукт ГРУППА ПО СЛУЧАЮ КОГДА listprice = 0 ТОГДА 'Товары, которых нет в наличии' КОГДА listprice> 0 И listprice <= 100 ЗАТЕМ "Потребительские товары" КОГДА цена списка> 100 И listprice <= 500 ЗАТЕМ "Электроника" КОГДА цена списка> 500 И listprice <1500 ЗАТЕМ "Предметы роскоши" ELSE 'Дополнительные элементы' КОНЕЦ ЗАКАЗАТЬ ПО КОЛИЧЕСТВУ ТОВАРОВ УДАЛИТЬ
В приведенном выше запросе мы используем два оператора SQL CASE.
- Первый оператор CASE классифицирует данные на основе выражения, определенного в прейскуранте. Используя этот оператор CASE, мы делим продукты на следующие категории:
- Товаров нет на складе
- Товары народного потребления
- Электронные элементы
- Предметы роскоши
- Во втором операторе case мы используем агрегатную функцию GROUP BY для группировки результата по категории
- Далее сортируем результаты по NumberOfProducts в порядке убывания
Предотвращение ошибки деления на ноль с помощью операторов SQL CASE
Ошибка деления на ноль возникает, если знаменатель равен нулю.Если вы сделаете эти дроби в SQL Server, это даст вам ошибку деления на ноль, как показано ниже.
Это отличный способ писать запросы так, чтобы избежать этих распространенных ошибок. Чтобы избежать этого, мы используем логику дроби внутри оператора CASE.
ЗАЯВИТЬ @ Student1 INT ОБЪЯВИТЬ @ Student2 INT НАБОР @ Student1 = 100 НАБОР @ Студент2 = 0 Выбрать СЛУЧАЙ, КОГДА @ Student2 = 0 ТОГДА NULL ELSE @ Student1 / @ Student2 end as StudentMarksRatio
Мы уберегли наш запрос от ошибки деления на ноль.Теперь, с измененной логикой, если мы получим ноль в знаменателе, вы получите NULL на выходе, как показано ниже.
Полезные напоминания об операторе SQL CASE
- Операторы SQL CASE поддерживают до 10 уровней вложенности
- Вы не можете контролировать поток выполнения операторов, функций или процедур, используя выражения CASE
- Вы всегда должны использовать блок ELSE, чтобы в случае невыполнения каких-либо условий вы получали значение по умолчанию
- Следует избегать использования конфликтующих условий в операторе SQL CASE.Оператор CASE работает последовательно и прекращает выполнение с первым успешным условием
SQL CASE | Средний уровень SQL
Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.
В этом уроке мы рассмотрим:
В следующих нескольких уроках вы будете работать с данными об игроках в американский футбол. Эти данные были собраны с ESPN 15 января 2014 года из списков, перечисленных на этой странице, с помощью скребка Python, доступного здесь.В этом конкретном уроке вы будете придерживаться информации о составе. Эта таблица довольно понятна - по одной строке на игрока со столбцами, описывающими атрибуты этого игрока. Запустите этот запрос, чтобы проверить необработанные данные:
ВЫБРАТЬ * ОТ benn.college_football_players
Оператор SQL CASE
Оператор CASE
- это способ SQL для обработки логики «если / то». За оператором CASE
следует по крайней мере одна пара операторов WHEN
и THEN
- эквивалент IF / THEN в Excel в SQL.Из-за этого сочетания у вас может возникнуть соблазн назвать этот SQL CASE WHEN
, но CASE
является приемлемым термином.
Каждый оператор CASE
должен заканчиваться оператором END
. Оператор ELSE
является необязательным и обеспечивает способ захвата значений, не указанных в операторах WHEN
/ THEN
. CASE
проще всего понять в контексте примера:
ВЫБЕРИТЕ player_name,
год,
СЛУЧАЙ, КОГДА год = 'SR' ТОГДА 'да'
ELSE NULL END AS is_a_senior
ОТ Бенна.College_football_players
Проще говоря, вот что происходит:
- Оператор
CASE
проверяет каждую строку, чтобы узнать, истинно ли условное выражение -year = 'SR'
. - Для любой данной строки, если это условное выражение истинно, слово «да» печатается в столбце, который мы назвали
is_a_senior
. - В любой строке, для которой условное выражение ложно, в этой строке ничего не происходит, оставляя нулевое значение в столбце
is_a_senior
. - В то же время, когда все это происходит, SQL извлекает и отображает все значения в столбцах
player_name
иyear
.
Приведенный выше запрос позволяет довольно легко увидеть, что происходит, потому что мы включили оператор CASE
вместе с самим столбцом года
. Вы можете проверить каждую строку, чтобы увидеть, соответствует ли год
условию год = 'SR'
, а затем увидеть результат в столбце, созданном с помощью оператора CASE
.
Но что, если вам не нужны нулевые значения в столбце is_a_senior
? Следующий запрос заменяет эти нули на «нет»:
ВЫБЕРИТЕ player_name,
год,
СЛУЧАЙ, КОГДА год = 'SR' ТОГДА 'да'
ИНАЧЕ 'нет' КОНЕЦ КАК is_a_senior
ОТ benn.college_football_players
Практическая задача
Напишите запрос, который включает столбец с отметкой «да», если игрок из Калифорнии, и сначала отсортируйте результаты с этими игроками.
Попробуй это Посмотреть ответДобавление нескольких условий в оператор CASE
Вы также можете определить количество результатов в операторе CASE
, включив столько операторов WHEN
/ THEN
, сколько хотите:
ВЫБЕРИТЕ player_name,
масса,
СЛУЧАЙ, КОГДА вес> 250, ЗАТЕМ "более 250"
КОГДА вес> 200 ТОГДА '201-250'
КОГДА вес> 175, ТО "176-200"
ИНАЧЕ '175 или меньше' КОНЕЦ AS weight_group
ОТ Бенна.College_football_players
В приведенном выше примере операторы WHEN
/ THEN
будут оцениваться в том порядке, в котором они написаны. Таким образом, если значение в столбце веса
данной строки равно 300, оно даст результат «более 250». Вот что произойдет, если значение в столбце веса
равно 180, SQL сделает следующее:
- Убедитесь, что вес
КОГДА
/ТО
- Проверьте, не превышает ли вес
КОГДА
/ТО
- Проверьте, не превышает ли вес
weight_group
.
Хотя вышеперечисленное работает, лучше всего создавать операторы, которые не перекрываются. КОГДА вес> 250
и КОГДА вес> 200
перекрываются для каждого значения больше 250, что немного сбивает с толку.Лучше написать это:
ВЫБЕРИТЕ player_name,
масса,
СЛУЧАЙ, КОГДА вес> 250, ЗАТЕМ "более 250"
КОГДА вес> 200 И вес <= 250, ТО '201-250'
КОГДА вес> 175 И вес <= 200, ТО '176-200'
ИНАЧЕ '175 или меньше' КОНЕЦ AS weight_group
ОТ benn.college_football_players
Практическая задача
Напишите запрос, который включает имена игроков и столбец, который классифицирует их по четырем категориям в зависимости от роста.Имейте в виду, что ответ, который мы даем, - это только один из многих возможных ответов, поскольку вы можете разделить рост игроков разными способами.
Попробуй это Посмотреть ответ Вы также можете объединить несколько условных операторов с И
и ИЛИ
так же, как и в предложении WHERE
:
ВЫБЕРИТЕ player_name,
СЛУЧАЙ, КОГДА год = 'FR' И позиция = 'WR' ТОГДА 'frosh_wr'
ELSE NULL END AS sample_case_statement
ОТ Бенна.College_football_players
Краткий обзор основ CASE:
- Оператор
CASE
всегда входит в предложениеSELECT
-
КОРПУС
должен включать следующие компоненты:КОГДА
,ТОГДА
иКОНЕЦ
.ELSE
- дополнительный компонент. - Вы можете сделать любой условный оператор, используя любой условный оператор (например,
WHERE
) междуWHEN
иTHEN
.Это включает объединение нескольких условных операторов в цепочку с использованиемИ
иИЛИ
. - Вы можете включить несколько операторов
WHEN
, а также операторELSE
для работы с любыми невыполненными условиями.
Практическая задача
Напишите запрос, который выбирает все столбцы из benn.college_football_players
и добавляет дополнительный столбец, в котором отображается имя игрока, если этот игрок младший или старший.
Использование CASE с агрегатными функциями
CASE
- немного более сложная и существенно более полезная функциональность, возникающая в результате объединения его с агрегатными функциями. Например, предположим, что вы хотите подсчитать только те строки, которые удовлетворяют определенному условию. Поскольку COUNT
игнорирует нули, вы можете использовать оператор CASE
для оценки условия и получения нулевых или ненулевых значений в зависимости от результата:
ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
ELSE 'Not FR' END AS год_группа,
COUNT (1) AS count
ОТ Бенна.College_football_players
ГРУППИРОВКА ПО ДЕЛУ, КОГДА год = 'FR' THEN 'FR'
ELSE 'Not FR' END
Теперь вы можете подумать: «Почему бы мне просто не использовать предложение WHERE
для фильтрации строк, которые я не хочу подсчитывать?» Вы могли бы это сделать - это будет выглядеть так:
ВЫБРАТЬ СЧЕТЧИК (1) КАК fr_count
ОТ benn.college_football_players
ГДЕ год = 'FR'
Но что, если вы захотите посчитать еще пару условий? Использование предложения WHERE
позволяет подсчитать только одно условие.Вот пример подсчета нескольких условий в одном запросе:
ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
КОГДА год = 'ТАК' ТОГДА 'ТАК'
КОГДА год = 'JR' ТОГДА 'JR'
КОГДА год = 'SR' ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT (1) AS count
ОТ benn.college_football_players
ГРУППА ПО 1
Приведенный выше запрос - отличное место для использования чисел вместо столбцов в предложении GROUP BY
, поскольку повторение оператора CASE
в предложении GROUP BY
сделало бы запрос слишком длинным.В качестве альтернативы вы можете использовать псевдоним столбца в предложении GROUP BY
следующим образом:
ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
КОГДА год = 'ТАК' ТОГДА 'ТАК'
КОГДА год = 'JR' ТОГДА 'JR'
КОГДА год = 'SR' ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT (1) AS count
ОТ benn.college_football_players
ГРУППА ПО year_group
Обратите внимание, что если вы решите повторить весь оператор CASE
, вам следует удалить имя столбца AS year_group
при копировании / вставке в предложение GROUP BY
:
ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
КОГДА год = 'ТАК' ТОГДА 'ТАК'
КОГДА год = 'JR' ТОГДА 'JR'
КОГДА год = 'SR' ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT (1) AS count
ОТ Бенна.College_football_players
ГРУППИРОВКА ПО ДЕЛУ, КОГДА год = 'FR' THEN 'FR'
КОГДА год = 'ТАК' ТОГДА 'ТАК'
КОГДА год = 'JR' ТОГДА 'JR'
КОГДА год = 'SR' ТОГДА 'SR'
ИНАЧЕ «Нет данных за год» КОНЕЦ
Поначалу может быть сложно объединить операторы CASE
с агрегатами. Часто бывает полезно сначала написать запрос, содержащий оператор CASE
, и запустить его самостоятельно. Используя предыдущий пример, вы можете сначала написать:
ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
КОГДА год = 'ТАК' ТОГДА 'ТАК'
КОГДА год = 'JR' ТОГДА 'JR'
КОГДА год = 'SR' ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
*
ОТ Бенна.College_football_players
Приведенный выше запрос покажет все столбцы в таблице benn.college_football_players
, а также столбец, показывающий результаты оператора CASE
. Оттуда вы можете заменить *
агрегацией и добавить предложение GROUP BY
. Попробуйте этот процесс, если вы боретесь с одной из следующих практических проблем.
Практическая задача
Напишите запрос, который подсчитывает количество игроков весом более 300 фунтов для каждого из следующих регионов: Западное побережье (Калифорния, Орегон, Вашингтон), Техас и другие (везде).
Попробуй это Посмотреть ответПрактическая задача
Напишите запрос, который вычисляет общий вес всех игроков низшего класса (FR / SO) в Калифорнии, а также общий вес всех игроков высшего класса (JR / SR) в Калифорнии.
Попробуй это Посмотреть ответИспользование CASE внутри агрегатных функций
В предыдущих примерах данные отображались вертикально, но в некоторых случаях вы можете захотеть отобразить данные горизонтально.Это называется «поворотным» (как сводная таблица в Excel). Возьмем следующий запрос:
ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
КОГДА год = 'ТАК' ТОГДА 'ТАК'
КОГДА год = 'JR' ТОГДА 'JR'
КОГДА год = 'SR' ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT (1) AS count
ОТ benn.college_football_players
ГРУППА ПО 1
И переориентируем по горизонтали:
ВЫБРАТЬ СЧЕТЧИК (СЛУЧАЙ, КОГДА год = 'FR' THEN 1 ELSE NULL END) AS fr_count,
COUNT (CASE WHEN year = 'SO' THEN 1 ELSE NULL END) AS so_count,
COUNT (CASE WHEN year = 'JR' THEN 1 ELSE NULL END) КАК jr_count,
COUNT (CASE WHEN year = 'SR' THEN 1 ELSE NULL END) КАК sr_count
ОТ Бенна.College_football_players
Стоит отметить, что переход от горизонтальной к вертикальной ориентации может быть значительно более сложной задачей в зависимости от обстоятельств и более подробно рассматривается на следующем уроке.
Отточите свои навыки работы с SQL
Практическая задача
Напишите запрос, который отображает количество игроков в каждом штате, с игроками FR, SO, JR и SR в отдельных столбцах и еще в одном столбце для общего количества игроков.Упорядочивайте результаты таким образом, чтобы на первом месте стояли государства с наибольшим количеством игроков.
Попробуй это Посмотреть ответПрактическая задача
Напишите запрос, который показывает количество игроков в школах с именами, начинающимися с A по M, и количество игроков в школах с именами, начинающимися с N - Z.
Попробуй это Посмотреть ответ .