Как в where написать несколько условий sql
SQL оператор WHERE
В этом учебном материале вы узнаете, как использовать SQL оператор WHERE с синтаксисом и примерами.
Описание
SQL оператор WHERE используется для фильтрации результатов и применения условий в операторе SELECT, INSERT, UPDATE или DELETE.
Синтаксис
Синтаксис для оператора WHERE в SQL.
Параметры или аргумент
Пример — одно условие в операторе WHERE
Сложно объяснить синтаксис для SQL оператора WHERE, поэтому давайте начнем с примера, в котором для применения условия 1 используется WHERE.
В этом примере у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Введите следующий SQL оператор.
Будет выбрано 3 записи. Вот результаты, которые вы должны получить.
supplier_id | supplier_name | city | state |
---|---|---|---|
300 | Oracle | Redwood City | California |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
В этом примере мы использовали SQL оператор WHERE, чтобы отфильтровать результаты из таблицы suppliers . Приведенный выше SQL оператор вернул бы все строки из таблицы suppliers , где state — ‘California’. Поскольку в SELECT используется * , то все поля из таблицы suppliers будут отображаться в наборе результатов.
Пример — два условия в операторе WHERE (условие AND)
Вы можете использовать условие AND в операторе WHERE, чтобы указать более 1 условия, которое должно быть выполнено для выбора записи. Давайте рассмотрим, как это сделать.
В этом примере у нас есть таблица customers со следующими данными:
Как в where написать несколько условий sql
Проверка нескольких условий (операторы OR и AND)
Если в предложение WHERE нужно проверить несколько условий, то для их соединения можно использовать логические операторы AND, OR и NOT.
Оператор AND объединяет два и более условий и возвращает истинное значение только при выполнении всех условий.
Найти в таблице tbl_clients данные о Bennett Sherry.
SQL:
SELECT * FROM tbl_clients
WHERE lastname=’Bennett’ AND name=’Sherry’
Найти данные о клиентах проживающих в Сиэтле и имеющих семьи численностью более 3-х человек:
SQL:
SELECT * FROM tbl_clients
WHERE region=’Seattle’ AND fam_size>3
SQL:
SELECT * FROM tbl_clients
WHERE region = ‘Seattle’ OR region=’Los Angeles’
Получить список всех клиентов, кроме тех, кто проживает Лос-Анджелесе.
SQL:
SELECT * FROM tbl_clients WHERE region != ‘Los Angeles’
SQL:
SELECT * FROM tbl_clients WHERE NOT region = ‘Los Angeles’
Аналогично арифметическим операторам, логические операторы также выполняются в строго определенной последовательности. Если в выражении используется несколько логических операторов, они выполняются в следующей последовательности: сначала NOT, затем AND и, наконец, OR.
Вывести данные о всех клиентах, проживающих в Сиэтле и только о тех клиентах из Лос-Анджелеса, численность семьи которых превышает 3-х человек.
SQL:
SELECT lastname, name, region, fam_size
FROM tbl_clients
WHERE region= ‘Seattle’ OR region = ‘Los Angeles’ AND fam_size>3
Ограничение на количество членов семьи в предыдущем запросе применяется только к клиентам из Лос-Анджелеса, так как оператор AND выполняется перед оператором OR. Чтобы первым выполнялся оператор OR, в запросе нужно использовать скобки.
В результате выполнения следующего запроса будут данные о всех клиентах из Сиэтла и Лос-Анджелеса, имеющих семьи численностью больше 3 человек:
SQL:
SELECT lastname, name, region, fam_size
FROM tbl_clients
WHERE (region= ‘Seattle’ OR region = ‘Los Angeles’) AND fam_size>3
Указание нескольких условий поиска для одного столбца (визуальные инструменты для баз данных)
Иногда может понадобиться сочетание нескольких условий поиска для одного столбца. Например, можно сделать следующее:
Найти несколько разных имен сотрудников в таблице employee , находящихся в разных группах по уровню зарплаты. Такой тип поиска требует использования условия OR (или).
Найти книгу, название которой начинается со слова «The» и содержит слово «Cook». Такой тип поиска требует использования условия AND (и).
Сведения, приведенные в этом подразделе, применимы к условиям поиска как в предложении WHERE, так и в предложении HAVING запроса. В примерах в основном используется предложение WHERE, но рассматриваемые принципы применимы к обоим типам задания условий поиска.
Для поиска альтернативных значений в одном столбце данных используется условие OR. Для поиска значений, удовлетворяющих одновременно нескольким условиям, используется условие AND.
Указание условия OR
Использование условия OR позволяет указать несколько альтернативных значений для поиска в столбце. Этот параметр расширяет пространство поиска и может вернуть больше записей, чем при поиске одного значения.
Часто можно использовать оператор IN вместо того, чтобы искать несколько значений в одном столбце.
Указание условия OR
На панели критериевдобавьте столбец для поиска.
Укажите первое условие в столбце Фильтр только что добавленного столбца данных.
Укажите второе условие в столбце Или. этого столбца данных.
Конструктор запросов и представлений создает предложение WHERE, содержащее условие OR, подобное следующему:
Указание условия AND
Использование оператора AND позволяет задать такие условия поиска, при которых результирующий набор удовлетворяет сразу двум (или более) критериям поиска. При использовании этого параметра пространство поиска сужается и обычно возвращается меньше записей, чем при поиске по одному значению.
Для поиска в диапазоне значений можно использовать оператор BETWEEN вместо двух условий, объединенных оператором AND.
Указание условия AND
На панели критериев добавьте столбец для поиска.
Укажите первое условие в столбце Фильтр только что добавленного столбца данных.
Добавьте тот же столбец на панель критериев еще раз, поместив его в пустую строку сетки.
В столбце Фильтр второй строки укажите второе условие.
Конструктор запросов создает предложение WHERE, которое содержит условие AND, подобное следующему:
оператор case в SQL, как вернуть несколько переменных?
Я хотел бы вернуть несколько значений, в моем высказывании, например :
SELECT CASE WHEN <condition 1> THEN <value1=a1, value2=b1> WHEN <condition 2> THEN <value1=a2, value2=b2> ELSE <value1=a3, value3=b3> END FROM <table>
конечно, я могу написать условие case несколько раз, каждый раз возвращая одно значение. Однако, как я уже много условий нужно, скажем 100. Нехорошо повторять состояние случая снова и снова.
еще один вопрос, который я хотел бы задать, Что произойдет, если одна запись соответствует нескольким условиям? значит ли это, что он вернет их все, или только последний? например, условие 1 может стать подмножеством условия 2. что будет?
основной способ, к сожалению, повторяться.
SELECT CASE WHEN <condition 1> THEN <a1> WHEN <condition 2> THEN <a2> ELSE <a3> END, CASE WHEN <condition 1> THEN <b1> WHEN <condition 2> THEN <b2> ELSE <b3> END FROM <table>
к счастью, большинство РСУБД достаточно умны, чтобы не оценивать условия несколько раз. Это просто избыточный набор текста.
В MS SQL Server (2005+) вы можете использовать CROSS APPLY в качестве альтернативы этому. Хотя я понятия не имею, насколько он эффективен…
SELECT * FROM <table> CROSS APPLY ( SELECT a1, b1 WHERE <condition 1> UNION ALL SELECT a2, b2 WHERE <condition 2> UNION ALL SELECT a3, b3 WHERE <condition 3> ) AS case_proxy
заметным недостатком здесь является то, что нет другого эквивалента и как все условия
редактировать
Если ответ Yuck изменен на UNION, а не на JOIN, он становится очень похожим на это. Основное отличие, однако, заключается в том, что это только сканирует входной набор данных один раз, а не один раз за условие (100 раз в вашем случай.)
редактировать
Я также заметил, что вы мая означает, что значения, возвращаемые операторами CASE, фиксированы. Все записи, соответствующие одному и тому же условию get
WITH checked_data AS ( SELECT CASE WHEN <condition1> THEN 1 WHEN <condition2> THEN 2 WHEN <condition3> THEN 3 ... ELSE 100 END AS condition_id, * FROM <table> ) , results (condition_id, value1, value2) AS ( SELECT 1, a1, b1 UNION ALL SELECT 2, a2, b2 UNION ALL SELECT 3, a3, b3 UNION ALL ... SELECT 100, a100, b100 ) SELECT * FROM checked_data INNER JOIN results ON results.condition_id = checked_data.condition_id
13
поделиться
автор: MatBailie
A CASE
утверждение может возвращать только одно значение.
вы можете превратить это в подзапрос, а затем JOIN
в других отношениях вы работаете. Например (с помощью SQL Server 2K5+ CTEs):
WITH C1 AS ( SELECT a1 AS value1, b1 AS value2 FROM table WHERE condition1 ), C2 AS ( SELECT a2 AS value1, b2 AS value2 FROM table WHERE condition2 ), C3 AS ( SELECT a3 AS value1, b3 AS value2 FROM table WHERE condition3 ) SELECT value1, value2 FROM -- some table, joining C1, C2, C3 CTEs to get the cased values ;
6
поделиться
автор: Yuck
CASE
по определению возвращает только одно значение. Когда-либо.
это также (почти всегда) короткие замыкания, что означает, что если ваше первое условие выполнено, никакие другие проверки не выполняются.
5
поделиться
автор: JNK
в вашем случае вы бы использовали два случая staements, по одному для каждого значения, которое вы хотите вернуть.
2
поделиться
автор: HLGEM
в предложении SQL CASE применяется первое успешно сопоставленное условие, а все последующие условия сопоставления игнорируются.
0
поделиться
автор: Josef K
вы можете использовать подвыбор в сочетании с объединением. Всякий раз, когда вы можете вернуть те же поля для более чем одного Условия использования или с круглой скобкой, как в этом примере:
SELECT * FROM (SELECT val1, val2 FROM table1 WHERE (condition1 is true) OR (condition2 is true)) UNION SELECT * FROM (SELECT val5, val6 FROM table7 WHERE (condition9 is true) OR (condition4 is true))
0
поделиться
автор: Angelo Fuchs
Порядок выполнения SQL-операций | Techrocks
Перевод статьи «SQL Order of Operations».
Мы привыкли, что компьютер выполняет команды программиста последовательно, в том порядке, который указал автор кода. Однако SQL относится к декларативным языкам, то есть SQL-запрос описывает ожидаемый результат, а не способ его получения.
Давайте разберём, в какой последовательности выполняются шесть операций в SQL: SELECT, FROM, WHERE, GROUP BY, HAVING и ORDER BY.
Photo by Akua Sencherey on UnsplashБаза данных выполняет команды в строгой очерёдности, о которой полезно знать любому разработчику. Залог оптимального запроса тот же, что и залог успеха в приготовлении вкусного блюда: важно знать не только ингредиенты, но и когда каждый из них должен попасть в блюдо. Если база данных отойдет от стандартного сценария выполнения команд, то ее производительность может сильно пострадать.
База данных сотрудников
В этой статье мы поработаем с типичной базой сотрудников, относящихся к разным отделам. По каждому сотруднику известны его ID, имя, фамилия, зарплата и отдел:
Таблица EMPLOYEE:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING |
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
Таблица DEPARTMENT:
DEPT_NAME | MANAGER | BUDGET |
---|---|---|
ACCOUNTING | 100 | 300,000 |
IT | 101 | 250,000 |
SALES | 104 | 700,000 |
Проанализировать порядок выполнения команд в запросах помогут типичные задачи:
- Найти имена сотрудников отдела IT
- Посчитать количество сотрудников каждого отдела с зарплатой выше 80 000.
Начнем с получения имён сотрудников отдела IT:
SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEE WHERE DEPARTMENT = 'IT'
В первую очередь выполняется FROM EMPLOYEE:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING |
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
Затем наступает очередь WHERE DEPARTMENT = ‘IT’, который фильтрует колонку DEPARTMENT:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
101 | Mary | 82,000 | IT | |
103 | Agnes | Miller | 95,000 | IT |
Наконец, SELECT FIRST_NAME, LAST_NAME скрывает ненужные колонки и возвращает финальный результат:
FIRST_NAME | LAST_NAME |
---|---|
Mary | Sexton |
Agnes | Miller |
Отлично! После первого препарирования выяснилось, что простой запрос с операторами SELECT, FROM, и WHERE выполняется по следующей схеме:
- FROM (выбор таблицы)
- WHERE (фильтрация строк)
- SELECT (возврат результирующего датасета).
Влияние ORDER BY на план выполнения запроса
Допустим, что начальнику не понравился отчет, основанный на предыдущем запросе, потому что он хочет видеть имена в алфавитном порядке. Исправим это с помощью ORDER BY:
SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEE WHERE DEPARTMENT = 'IT' ORDER BY FIRST_NAME
Выполняться такой запрос будет так же, как и предыдущий. Только в конце ORDER BY отсортирует строки в алфавитном порядке по колонке FIRST_NAME:
FIRST_NAME | LAST_NAME |
---|---|
Agnes | Miller |
Mary | Sexton |
Таким образом, команды SELECT, FROM, WHERE и ORDER BY выполняются в следующей последовательности:
- FROM (выбор таблицы)
- WHERE (фильтрация строк)
- SELECT (возврат результирующего датасета)
- ORDER BY (сортировка)
GROUP BY и HAVING
Усложним задачу. Посчитаем количество сотрудников каждого отдела с зарплатой выше 80 000 и остортируем результат по убыванию. Нам подойдёт следующий запрос:
SELECT DEPARTMENT, COUNT(*) FROM EMPLOYEES WHERE SALARY > 80000 GROUP BY DEPARTMENT ORDER BY COUNT(*) DESC
Как обычно, в первую очередь выполнится FROM EMPLOYEE и вернет сырые данные:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING |
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
После выполнения WHERE SALARY > 80000 выборка сузится:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
Затем применяется GROUP BY. При этом генерируется по одной записи для каждого отдельного значения в указанной колонке. В нашем примере мы создаем по одной записи для каждого отдельного значения колонки DEPARTMENT:
DEPARTMENT |
---|
ACCOUNTING |
IT |
SALES |
После этого применяется SELECT с COUNT(*), производя промежуточный результат:
DEPARTMENT | COUNT(*) |
---|---|
ACCOUNTING | 1 |
IT | 2 |
SALES | 1 |
Применение ORDER BY завершает выполнение запроса и возвращает конечный результат:
DEPARTMENT | COUNT(*) |
---|---|
IT | 2 |
ACCOUNTING | 1 |
SALES | 1 |
План выполнения данного запроса следующий:
- FROM (выбор таблицы)
- WHERE (фильтрация строк)
- GROUP BY (агрегирование данных)
- SELECT (возврат результирующего датасета)
- ORDER BY (сортировка).
Добавим выражение HAVING
HAVING — это аналог WHERE для GROUP BY. С его помощью можно фильтровать агрегированные данные.
Давайте применим HAVING и определим, в каких отделах (за исключением отдела продаж) средняя зарплата сотрудников больше 80 000.
SELECT DEPARTMENT FROM EMPLOYEES WHERE DEPARTMENT <> 'SALES' GROUP BY DEPARTMENT HAVING AVG(SALARY) > 80000
По уже известной нам схеме сначала выберем все данные из таблицы при помощи FROM EMPLOYEE:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING |
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
Затем конструкция WHERE избавит нас от данных по отделу SALES:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING |
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
GROUP BY сгенерирует следующие записи:
DEPARTMENT | AVG(SALARY) |
---|---|
ACCOUNTING | 79,250 |
IT | 88,500 |
HAVING AVG(SALARY) > 80000 ограничит список:
DEPARTMENT | AVG(SALARY) |
---|---|
IT | 88,500 |
А SELECT вернет финальный результат:
DEPARTMENT |
---|
IT |
Порядок выполнения для данного запроса следующий:
- FROM (выбор таблицы)
- WHERE (фильтрация строк)
- GROUP BY (агрегирование данных)
- HAVING (фильтрация агрегированных данных)
- SELECT (возврат результирующего датасета).
Новый оператор — JOIN
До этого момента мы имели дело с одной таблицей. А что если воспользоваться JOIN и добавить ещё одну? Выясним фамилии и ID сотрудников, работающих в отделе с бюджетом более 275 000:
SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES JOIN DEPARTMENT ON DEPARTMENT = DEPT_NAME WHERE BUDGET > 275000
FROM EMPLOYEE как обычно запрашивает данные из таблицы EMPLOYEES:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING |
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
А теперь JOIN запросит сырые данные из DEPARTMENT и скомбинирует данные двух таблиц по условию ON DEPARTMENT = DEPT_NAME:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT | DEPT_NAME | MANAGER | BUDGET |
---|---|---|---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
101 | Mary | Sexton | 82,000 | IT | IT | 101 | 250,000 |
102 | Chun | Yen | 80,500 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
103 | Agnes | Miller | 95,000 | IT | IT | 101 | 250,000 |
104 | Dmitry | Komer | 120,000 | SALES | SALES | 104 | 700,000 |
Потом применяем WHERE BUDGET > 275000:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT | DEPT_NAME | MANAGER | BUDGET |
---|---|---|---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
102 | Chun | Yen | 80,500 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
104 | Dmitry | Komer | 120,000 | SALES | SALES | 104 | 700,000 |
SELECT EMPLOYEE_ID, LAST_NAME покажет финальный результат:
EMPLOYEE_ID | LAST_NAME |
---|---|
100 | Smith |
102 | Yen |
104 | Komer |
Для этого запроса план выполнения следующий:
- FROM (выбор таблицы)
- JOIN (комбинация с подходящими по условию данными из второй таблицы)
- WHERE (фильтрация строк)
- SELECT (возврат результирующего датасета).
Итог
Примеры разных запросов убедительно продемонстрировали, что существует строгий порядок выполнения операций. Но этот порядок может меняться в зависимости от набора команд в запросе. Вот универсальная шпаргалка по очередности выполнения операций в SQL-запросах:
- FROM (выбор таблицы)
- JOIN (комбинация с подходящими по условию данными из других таблиц)
- WHERE (фильтрация строк)
- GROUP BY (агрегирование данных)
- HAVING (фильтрация агрегированных данных)
- SELECT (возврат результирующего датасета)
- ORDER BY (сортировка).
Помните, что если исключить из этого списка один из операторов, то план выполнения может измениться.
Оператор 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, которые часто используются в практике. На этом сегодня все, если у вас возникли вопросы или пожелания, то оставляйте их в комментариях.
T-SQL. Почему пишут WHERE 1=1?
T-SQL. Почему пишут WHERE 1=1?
Новичков часто ставит в тупик конструкция типа:
SELECT *
FROM [dbo].[bkp_product]
WHERE 1=1
AND [model] = ‘Product 1’
AND [quantity] = 939
Зачем пишут в коде 1=1?
Ответ — для удобства при отладке кода.
Покажу на примере. Напишем простой селект
SELECT *
FROM [Table_1] c
[c].[id] = 1
AND [c].[v_sm] <> ‘d’
AND [c].[qty] >= 1000
Допустим при отладке кода, нам нужно из условия WHERE убрать [c].[id] = 1
Что мы делаем, комментируем условие [c].[id] = 1 и AND
SELECT *
FROM [Table_1] c
—[c].[id] = 1
[c].[v_sm] <> ‘d’
AND [c].[qty] >= 1000
А если у нас изначально было написано
SELECT *
FROM [Table_1] c
WHERE 1=1
AND [c]. [id] = 1
AND [c].[v_sm] <> ‘d’
AND [c].[qty] >= 1000
То нам нужно будет закомментировать всего одну строку
SELECT *
FROM [Table_1] c
WHERE 1=1
—AND [c].[id] = 1
AND [c].[v_sm] <> ‘d’
AND [c].[qty] >= 1000
А теперь представьте, что нам нужно вывести 0 строк (pl/sql: rownum<=0)
SELECT TOP 0 *
FROM [Table_1] c
[c].[id] = 1
AND [c].[v_sm] <> ‘d’
AND [c].[qty] >= 1000
А в случае с WHERE 1=1 — лишь изменить один символ:
SELECT *
FROM [Table_1] c
WHERE 1=0
AND [c]. [id] = 1
AND [c].[v_sm] <> ‘d’
AND [c].[qty] >= 1000
Поэтому не пугайтесь такой конструкции, а берите ее на вооружение 🙂
Популярные сообщения из этого блога
PL/SQL. Oracle shrink tablespace — сжатие табличного пространства
Привожу простой пример заполнения и последующего сжатия tablespace . Пример привожу на системе, которую настроили в этом посте О том, как хранятся данные хорошо показано здесь И так в чем нюансы при сжатии табличного пространства. Создадим табличное пространство – MGMT ( CREATE TABLESPACE MGMT DATAFILE ‘ C :\ ORACLEXE \ APP \ ORACLE \ ORADATA \ XE \ MGMT . DBF ‘ . .. ) Табличное пространство ограничим по размеру – 100 мб. Первоначальное оно не заполнено. Файл: В табличном пространстве всего одна таблица. В таблицу можно загрузить всего 100 строк. Загружаем построчно в таблицу с 1 по 100 строки. Табличное пространство заполнено под завязку. Файл стал 100 Мб. Теперь удалим с 1 по 50 строку. Осталось половина — 50 строк. Смотрим на размер файла, а он остался те же 100 мб. Т.е. при заполнении таблицы (и соответственно табличного пространства) файл увеличивается, но не уменьшается при их удалении. Для того что бы уменьши
Далее…
PL/SQL. Установка Oracle на Windows
Минимально необходимые действия, что бы установить Oracle на windows. Пошаговая инструкция. Пример привожу на Windows 7 32bit 1. Заходим на сайт www.oracle.com 2. Регистрируемся 3. В разделе Downloads скачиваем Oracle Database Express Edition 4. Распаковываем архив 5. Запускаем установку. Задаем пароль 6. Базу данных мы установили. Теперь запустим SQL Developer. Скачиваем 7. Распаковываем 8. Запускаем 9. Для работы SQL Developer необходима Java JDK. Если данное поле автоматически не заполнилось, устанавливаем Java 10. В разделе Downloads находим Java. Версий несколько нам Java SE хватит с лихвой Скачиваем 11. Запускаем установку 12. Открываем папку куда установлена Java JDK, копируем путь 13. Возвращаемся к установке SQL Developer. Вставляем путь Java JDK 14. SQL Developer установлена, проверим работоспособность 15. Создаем подключение с базе данных Oracle Заполняем поля
Далее…
sql — Условие в JOIN или WHERE
Лучший ответ
Реляционная алгебра допускает взаимозаменяемость предикатов в предложении WHERE
и INNER JOIN
, поэтому даже запросы INNER JOIN
с предложениями WHERE
могут иметь предикаты, переупорядоченные оптимизатором таким образом, чтобы они могут быть уже исключены в процессе JOIN
.
Я рекомендую вам писать запросы в максимально удобочитаемом виде.
Иногда это включает в себя создание INNER JOIN
относительно «неполного» и включение некоторых критериев в WHERE
просто для того, чтобы упростить сопровождение списков критериев фильтрации.
Например, вместо:
SELECT * FROM Customers c INNER JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID AND c.State = 'NY' INNER JOIN Accounts a ON ca.AccountID = a.AccountID AND a.Status = 1
Напишите:
SELECT * FROM Customers c INNER JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID INNER JOIN Accounts a ON ca.AccountID = a.AccountID WHERE c.State = 'NY' AND a.Status = 1
Но это, конечно, зависит от обстоятельств.
Для внутренних соединений я действительно не заметил разницы (но, как и при любой настройке производительности, вам нужно сверяться с вашей базой данных в ваших условиях).
Однако то, где вы помещаете условие, имеет огромное значение, если вы используете левое или правое соединение. Например, рассмотрим эти два запроса:
SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD.CustomerID WHERE ORD.OrderDate >'20090515' SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD.CustomerID AND ORD.OrderDate >'20090515'
Первый предоставит вам только те записи, заказ которых датирован позднее 15 мая 2009 г., таким образом, левое соединение будет преобразовано во внутреннее соединение.
Второй предоставит эти записи плюс всех клиентов без заказов. Набор результатов сильно различается в зависимости от того, где вы поставили условие. (Выберите * только для примера, конечно, вы не должны использовать это в производственном коде.)
Исключение составляют случаи, когда вы хотите видеть только записи в одной таблице, а не другую. Затем вы используете предложение where для условия, а не соединения.
SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD. CustomerID WHERE ORD.OrderID is null
Большинство продуктов СУБД оптимизируют оба запроса одинаково. В «Настройка производительности SQL» Питера Гулуцана и Труди Пельцер они протестировали несколько марок СУБД и не обнаружили разницы в производительности.
Я предпочитаю хранить условия соединения отдельно от условий ограничения запросов.
Если вы используете OUTER JOIN
, иногда необходимо указать условия в предложении соединения.
Я предпочитаю, чтобы JOIN объединял полные таблицы / представления, а затем использовал WHERE, чтобы ввести предикат результирующего набора.
Он кажется синтаксически чище.
Обычно я наблюдаю повышение производительности при фильтрации соединения. Особенно, если вы можете объединить индексированные столбцы для обеих таблиц. Вы должны иметь возможность сократить количество логических чтений, при этом большинство запросов тоже делают это, что в среде с большим объемом данных является гораздо лучшим показателем производительности, чем время выполнения.
Меня всегда слегка забавляет, когда кто-то демонстрирует результаты своих тестов SQL, и они выполнили обе версии sproc 50 000 раз в полночь на сервере разработки и сравнивают среднее время.
Помещение условия в соединение кажется мне «семантически неправильным», поскольку JOIN не для этого предназначены. Но это очень качественно.
Дополнительная проблема: если вы решите переключиться с внутреннего соединения на, скажем, правильное соединение, наличие условия внутри JOIN может привести к неожиданным результатам.
На мой взгляд, присоединение происходит быстрее, когда у вас большой стол. На самом деле это не такая уж большая разница, особенно если вы имеете дело с довольно маленьким столом. Когда я впервые узнал о соединениях, мне сказали, что условия в соединениях точно такие же, как условия предложения where, и что я мог бы использовать их взаимозаменяемо, если бы предложение where было конкретно о том, для какой таблицы выполнять условие.
Согласитесь со вторым по количеству голосов ответом, который будет иметь большое значение при использовании LEFT JOIN
или RIGHT JOIN
. Фактически, два приведенных ниже утверждения эквивалентны. Итак, вы можете видеть, что предложение AND
выполняет фильтр перед JOIN
, а предложение WHERE
выполняет фильтр после JOIN
.
SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD.CustomerID AND ORD.OrderDate >'20090515' SELECT * FROM dbo.Customers AS CUS LEFT JOIN (SELECT * FROM dbo.Orders WHERE OrderDate >'20090515') AS ORD ON CUS.CustomerID = ORD.CustomerID
Лучше добавить условие в Join. Производительность важнее читабельности. Для больших наборов данных это важно.
ГДЕ будет фильтровать после того, как СОЕДИНЕНИЕ произошло.
Отфильтруйте JOIN, чтобы предотвратить добавление строк в процессе JOIN.
Введение и обзор инструкции SQL IF
В этой статье рассматривается полезная функция оператора SQL IF в SQL Server.
Введение
В реальной жизни мы принимаем решения, исходя из условий. Например, посмотрите на следующие условия.
- Если я получу премию за результативность в этом году, я поеду в отпуск за границу или в отпуск по стране.
- Если погода станет хорошей, я планирую отправиться в путешествие на велосипеде, иначе я не буду
В этих примерах мы решаем в соответствии с условиями. Например, если я получу бонус, то только я поеду в отпуск за границу, в противном случае я поеду в отпуск внутри страны. Нам также необходимо включить эти основанные на условиях решения в логику программирования. SQL Server предоставляет возможность выполнять логику программирования в реальном времени с помощью инструкции SQL IF.
Синтаксис
В следующем операторе SQL IF он оценивает выражение, и если условие истинно, то он выполняет оператор, указанный в блоке IF, в противном случае выполняются операторы в предложении ELSE.
1 2 3 4 5 6 7 8 10 11 | IF (Expression ) BEGIN — Если условие истинно, выполните следующую инструкцию True Statements; END
ELSE BEGIN — Если условие ложно, выполните следующую инструкцию Ложные утверждения КОНЕЦ |
Мы можем понять оператор SQL IF, используя следующую блок-схему.
- Условие в операторе SQL IF должно возвращать логическое значение для оценки.
- Мы также можем указать оператор Select в логическом выражении, но он должен заключаться в круглые скобки.
- Мы можем использовать BEGIN и END в операторе IF для идентификации блока операторов.
- Условие ELSE необязательно для использования
Давайте рассмотрим оператор SQL IF на примерах.
Пример 1. Оператор IF с числовым значением в логическом выражении
В следующем примере мы указали числовое значение в логическом выражении, которое всегда равно TRUE. Он печатает оператор для оператора If, потому что условие истинно.
IF(1 = 1) PRINT ‘Выполнен оператор, поскольку условие ИСТИННО’; ELSE PRINT ‘Выполнен оператор, поскольку условие FALSE’; |
Если мы изменим условие в логическом выражении, чтобы оно возвращало FALSE, оно напечатает оператор внутри ELSE.
IF(2<=0) PRINT ‘Выполнен оператор, поскольку условие ИСТИННО’; ELSE PRINT ‘Выполнен оператор, поскольку условие FALSE’; |
Пример 2. Оператор IF с переменной в логическом выражении
В следующем примере мы используем переменную в логическом выражении для выполнения оператора на основе условия. Например, если студент набрал более 80% баллов, он сдает экзамен, иначе он не зачет.
DECLARE @StudentMarks INT= 91; IF @StudentMarks >= 80 PRINT ‘Зачетно, поздравляем!!’; ELSE PRINT ‘Ошибка, повторите попытку’; |
Пример 3. Множественный оператор IF с переменной в логическом выражении
Мы можем указать несколько операторов SQL IF и выполнить оператор соответствующим образом. Посмотрите на следующий пример
- Если учащийся получает более 90% оценок, он должен отображать сообщение из первого оператора IF.
- Если учащийся получает более 80% оценок, он должен отображать сообщение из второго оператора IF.
- В противном случае он должен напечатать сообщение, указанное в операторе ELSE.
1 2 3 4 5 6 7 | DECLARE @StudentMarks INT= 91; IF @StudentMarks >= 90 PRINT ‘Поздравляем, вы в списке заслуг!’; IF @StudentMarks >= 80 PRINT ‘Поздравляем, вы в первом дивизионе!’; ELSE PRINT ‘Ошибка, повторите попытку’; |
В этом примере оценки учащихся на 91 % удовлетворяют условиям для обоих операторов SQL IF, и он печатает сообщение для обоих операторов SQL IF.
Мы не хотим, чтобы условие удовлетворяло обоим операторам SQL IF. Мы должны правильно определить условие.
1 2 3 4 5 6 7 | DECLARE @StudentMarks INT= 91; IF @StudentMarks >= 90 PRINT ‘Поздравляем, вы в списке заслуг!’; ЕСЛИ @StudentMarks >= 80 и @StudentMarks < 90 PRINT ‘Поздравляем, вы попали в список Первого дивизиона!’; ELSE PRINT ‘Ошибка, повторите попытку’; |
На следующем снимке экрана мы видим, что второе условие ЕСЛИ является ИСТИННЫМ, если оценки учащихся больше или равны 80% и меньше 90%.
В выводе мы видим следующее
- Во-первых, условие оператора IF равно TRUE. Он печатает сообщение внутри блока операторов IF.
- Во-вторых, условие оператора IF равно FALSE, оно не печатает сообщение внутри блока оператора IF.
- Он выполняет оператор ELSE и печатает для него сообщение. В этом случае у нас есть два оператора SQL IF. Второй оператор IF оценивается как ложный, поэтому он выполняет соответствующий оператор ELSE.
Нам нужно быть осторожными при указании условий в нескольких операторах SQL IF. Мы можем получить неожиданный результирующий набор без надлежащего использования инструкции SQL IF.
Пример 4. Оператор IF без оператора ELSE
Выше мы указали, что оператор Else не является обязательным. Мы также можем использовать оператор SQL IF без ELSE.
Далее выражение оценивается как ИСТИНА; поэтому он печатает сообщение.
DECLARE @StudentMarks INT= 95; IF @StudentMarks >= 90 PRINT ‘Поздравляем, вы в списке заслуг!’; |
Если выражение оценивается как FALSE, оно не возвращает никакого вывода. Мы должны использовать оператор ELSE, чтобы, если оценка не ИСТИНА, мы могли установить вывод по умолчанию.
Пример 5. Оператор IF для выполнения сценариев
В приведенных выше примерах мы печатаем сообщение, если условие либо ИСТИНА, либо ЛОЖЬ. Мы могли бы также захотеть выполнить сценарии, как только условие будет выполнено.
В следующем примере, если количество продаж превышает 100000000, необходимо выбрать записи из таблицы SalesOrderDtails.
Если количество продаж меньше 100000000, следует выбирать записи из таблицы SalesOrderHeader.
1 2 3 4 5 6 7 8 9 | DECLARE @sales INT; SELECT @sales = SUM(OrderQty * UnitPrice) FROM [AdventureWorks2017].[Sales].[SalesOrderDetail]; IF @sales > 100000000 SELECT * FROM [AdventureWorks2017].[Sales]. [SalesOrderDetail]; ELSE SELECT * FROM [AdventureWorks2017].[Sales].[SalesOrderHeader]; |
Пример 6: IF с блоком BEGIN и END
Мы можем использовать блок операторов BEGIN и END в операторе SQL IF. Как только условие выполнено, он выполняет код внутри соответствующих блоков BEGIN и End.
1 2 3 4 5 6 7 8 9 | DECLARE @StudentMarks INT= 70; IF @StudentMarks >= 90 BEGIN PRINT ‘Поздравляем, вы в списке заслуг!!’; КОНЕЦ; ELSE BEGIN PRINT ‘Ошибка, повторите попытку’; КОНЕЦ; |
Мы также можем указать несколько операторов с оператором SQL IF и блоками BEGIN END. В следующем запросе мы хотим напечатать сообщение из двух операторов печати после выполнения условия.
- Примечание : У нас должен быть оператор END с соответствующим блоком BEGIN.
1 2 3 4 5 6 7 8 9 10 11 | DECLARE @StudentMarks INT= 70; IF @StudentMarks >= 90 BEGIN PRINT ‘Поздравляем, вы в списке заслуг!!’; Выведите «Второй оператор». КОНЕЦ; ELSE BEGIN PRINT ‘Ошибка, повторите попытку’; Print ‘Второй оператор ELSE’ END; |
Заключение
В этой статье мы рассмотрели оператор SQL IF и его использование с примерами. Мы можем писать код на основе условий в реальном времени, используя операторы SQL IF. Если у вас есть комментарии или вопросы, не стесняйтесь оставлять их в комментариях ниже.
- Автор
- Последние сообщения
Раджендра Гупта
Привет! Я Раджендра Гупта, специалист по базам данных и архитектор, помогаю организациям быстро и эффективно внедрять решения Microsoft SQL Server, Azure, Couchbase, AWS, устранять связанные проблемы и настраивать производительность с более чем 14-летним опытом.
Я автор книги «DP-300 Administering Relational Database on Microsoft Azure». Я опубликовал более 650 технических статей о MSSQLTips, SQLShack, Quest, CodingSight и MultipleNines.
Я создатель одной из крупнейших бесплатных онлайн-коллекций статей по одной теме, включая его серию из 50 статей о группах доступности SQL Server Always On.
На основании моего вклада в сообщество SQL Server я был признан престижным лучшим автором года непрерывно в 2019, 2020 и 2021 годах (2-й ранг) в SQLShack и награждение чемпионов MSSQLTIPS в 2020 году.
Личный блог: https://www.dbblogger.com
помогите, свяжитесь со мной по адресу [email protected]
Просмотреть все сообщения Раджендры Гупты
Последние сообщения Раджендры Гупты (посмотреть все)
Условие поиска (Transact-SQL) — SQL Server
- Статья
- 8 минут на чтение
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр Azure SQL Аналитика синапсов Azure Analytics Platform System (PDW)
Комбинация одного или нескольких предикатов, использующих логические операторы И, ИЛИ и НЕ.
Синтаксические соглашения Transact-SQL
Синтаксис
-- Синтаксис для SQL Server и базы данных SQL Azure <условие_поиска> ::= ПОИСКПОЗ (<шаблон_поиска_графика>) | <условие_поиска_без_совпадения> | <условие_поиска> И <условие_поиска> <условие_поиска_без_совпадения> ::= { [ НЕ ] <предикат> | ( <условие_поиска_без_совпадения> ) } [ { И | ИЛИ } [ НЕ ] { <предикат> | ( <условие_поиска_без_совпадения> ) } ] [...н] <предикат> ::= { выражение { = | < > | ! = | > | > = | ! > | < | < = | ! < } выражение | строковое_выражение [ НЕ ] НРАВИТСЯ строковое_выражение [ ESCAPE 'escape_character' ] | выражение [ НЕ ] МЕЖДУ выражением И выражением | выражение IS [ НЕ ] NULL | выражение IS [ NOT ] DISTINCT FROM | СОДЕРЖИТ ( { столбец | * } , '<содержит_условие_поиска>' ) | FREETEXT ({столбец | *}, 'свободная_текстовая_строка') | выражение [НЕ] В (подзапрос | выражение [. ..n]) | выражение { = | < > | ! = | > | > = | ! > | < | < = | ! < } { ВСЕ | НЕКОТОРЫЕ | ЛЮБОЙ} (подзапрос) | СУЩЕСТВУЕТ (подзапрос) }::= { { { <-( )- } | {-( )->} } } ::= имя_таблицы_узла | node_table_alias ::= край_таблица_имя | edge_table_alias
-- Синтаксис для Azure Synapse Analytics и хранилища параллельных данных <условие_поиска> ::= { [ НЕ ] <предикат> | ( <условие_поиска> ) } [ { И | ИЛИ } [ НЕ ] { <предикат> | ( <условие_поиска> ) } ] [...н] <предикат> ::= { выражение { = | < > | ! = | > | > = | < | < = } выражение | строковое_выражение [ НЕ ] НРАВИТСЯ строковое_выражение | выражение [ НЕ ] МЕЖДУ выражением И выражением | выражение IS [ НЕ ] NULL | выражение [ NOT ] IN (подзапрос | выражение [ ,...n ] ) | выражение [ НЕ ] СУЩЕСТВУЕТ (подзапрос) }
Примечание
Для просмотра синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий см. документацию по предыдущим версиям.
Аргументы
Указывает условия для строк, возвращаемых в результирующем наборе для инструкции SELECT, выражения запроса или подзапроса. Для оператора UPDATE указывает строки, которые необходимо обновить. Для инструкции DELETE задает удаляемые строки. Количество предикатов, которые можно включить в условие поиска инструкции Transact-SQL, не ограничено.
Указывает шаблон сопоставления графа. Дополнительные сведения об аргументах для этого предложения см. в разделе MATCH (Transact-SQL)
NOT
Отменяет логическое выражение, заданное предикатом. Дополнительные сведения см. в разделе НЕ (Transact-SQL).
И
Объединяет два условия и оценивается как ИСТИНА, если оба условия ИСТИННЫ. Дополнительные сведения см. в разделе AND (Transact-SQL).
ИЛИ
Объединяет два условия и оценивается как ИСТИНА, если одно из условий истинно. Дополнительные сведения см. в разделе ИЛИ (Transact-SQL).
< предикат >
Выражение, возвращающее значение ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО.
выражение
Имя столбца, константа, функция, переменная, скалярный подзапрос или любая комбинация имен столбцов, констант и функций, связанных оператором или операторами, или подзапросом. Выражение также может содержать выражение CASE.
Примечание
Строковые константы и переменные, отличные от Unicode, используют кодовую страницу, соответствующую параметрам сортировки по умолчанию в базе данных. Преобразования кодовых страниц могут происходить при работе только с символьными данными, отличными от Unicode, и при обращении к символьным типам данных, отличным от Unicode char , varchar и text . SQL Server преобразовывает строковые константы и переменные, отличные от Unicode, в кодовую страницу, соответствующую порядку сортировки столбца, на который указывает ссылка, или указанную с помощью COLLATE, если эта кодовая страница отличается от кодовой страницы, соответствующей сортировке по умолчанию в базе данных. Любые символы, не найденные в новой кодовой странице, будут переведены в аналогичный символ, если будет найдено наиболее подходящее сопоставление, или же будут преобразованы в символ замены по умолчанию "?".
При работе с несколькими кодовыми страницами символьные константы могут начинаться с прописной буквы «N» и могут использоваться переменные Unicode, чтобы избежать преобразования кодовых страниц.
=
Используется ли оператор для проверки равенства между двумя выражениями.
<>
Используется ли оператор для проверки условия двух выражений, не равных друг другу.
!=
Используется ли оператор для проверки условия двух выражений, не равных друг другу.
>
Используется ли оператор для проверки условия того, что одно выражение больше другого.
>=
Оператор, используемый для проверки условия того, что одно выражение больше или равно другому выражению.
!>
Используется ли оператор для проверки условия того, что одно выражение не больше другого выражения.
<
Оператор, используемый для проверки того, что одно выражение меньше другого.
<=
Используется ли оператор для проверки условия того, что одно выражение меньше или равно другому выражению.
!<
Используется ли оператор для проверки условия того, что одно выражение не меньше другого выражения.
string_expression
Строка символов и подстановочных знаков.
[ NOT ] LIKE
Указывает, что последующая строка символов должна использоваться при сопоставлении с образцом. Дополнительные сведения см. в разделе LIKE (Transact-SQL).
ESCAPE ' escape_ символ '
Позволяет искать подстановочный знак в строке символов вместо использования подстановочного знака. escape_character — это символ, который ставится перед подстановочным знаком, чтобы указать на это специальное использование.
[ НЕ ] МЕЖДУ
Указывает включающий диапазон значений. Используйте И, чтобы разделить начальное и конечное значения. Дополнительные сведения см. в разделе МЕЖДУ (Transact-SQL).
IS [ NOT ] NULL
Задает поиск нулевых значений или значений, которые не являются нулевыми, в зависимости от используемых ключевых слов. Выражение с побитовым или арифметическим оператором оценивается как NULL, если любой из операндов имеет значение NULL.
IS [НЕ ] ОТЛИЧАЕТСЯ ОТ
Сравнивает равенство двух выражений и гарантирует истинный или ложный результат, даже если один или оба операнда равны NULL. Дополнительные сведения см. в разделе IS [NOT] DISTINCT FROM (Transact-SQL).
СОДЕРЖИТ
Ищет в столбцах, содержащих символьные данные, точные или менее точные ( fuzzy ) совпадения с отдельными словами и словосочетаниями, близость слов на определенном расстоянии друг от друга и взвешенные совпадения. Этот параметр можно использовать только с операторами SELECT. Дополнительные сведения см. в разделе CONTAINS (Transact-SQL).
FREETEXT
Обеспечивает простую форму запроса на естественном языке путем поиска в столбцах, содержащих символьные данные, значений, соответствующих смыслу, а не точных слов в предикате. Этот параметр можно использовать только с операторами SELECT. Дополнительные сведения см. в разделе FREETEXT (Transact-SQL).
[ НЕ ] IN
Задает поиск выражения на основе того, включено ли выражение в список или исключено из него. Выражение поиска может быть константой или именем столбца, а список может быть набором констант или, что более типично, подзапросом. Заключите список значений в круглые скобки. Дополнительные сведения см. в разделе IN (Transact-SQL).
подзапрос
Может рассматриваться как ограниченный оператор SELECT и подобен <выражению_запроса> в операторе SELECT. Предложение ORDER BY и ключевое слово INTO не допускаются. Дополнительные сведения см. в разделе SELECT (Transact-SQL).
ВСЕ
Используется с оператором сравнения и подзапросом. Возвращает TRUE для
{ НЕКОТОРЫЕ | ANY }
Используется с оператором сравнения и подзапросом. Возвращает TRUE для
EXISTS
Используется с подзапросом для проверки существования строк, возвращаемых подзапросом. Дополнительные сведения см. в разделе EXISTS (Transact-SQL).
Порядок приоритета логических операций НЕ (самый высокий), за которым следует И, за которым следует ИЛИ. Скобки можно использовать для переопределения этого приоритета в условии поиска. Порядок оценки логических операторов может варьироваться в зависимости от выбора, сделанного оптимизатором запросов. Дополнительные сведения о том, как логические операторы работают с логическими значениями, см. в разделах AND (Transact-SQL), OR (Transact-SQL) и NOT (Transact-SQL).
Примеры
A. Использование WHERE с синтаксисом LIKE и ESCAPE
В следующем примере выполняется поиск строк, в которых столбец LargePhotoFileName
содержит символы green_
, и используется параметр ESCAPE 6095 a3 is 906 подстановочный знак. Без указания параметра
символов. ESCAPE
запрос будет искать любые значения описания, содержащие слово зеленый
, за которым следует любой одиночный символ, кроме 9.0635 _
ИСПОЛЬЗОВАТЬ AdventureWorks2012 ; ИДТИ ВЫБРАТЬ * ОТ Production.ProductPhoto WHERE LargePhotoFileName LIKE '%greena_%' ESCAPE 'a' ;
B. Использование синтаксиса WHERE и LIKE с данными Unicode
В следующем примере используется предложение WHERE
для получения почтового адреса любой компании, которая находится за пределами США ( US
) и находится в городе, название которого начинается с Па
.
ИСПОЛЬЗОВАТЬ AdventureWorks2012 ; ИДТИ ВЫБЕРИТЕ AddressLine1, AddressLine2, город, почтовый индекс, CountryRegionCode ОТ Person.Address КАК ПРИСОЕДИНЯЙТЕСЬ к Person.StateProvince AS s ON a.StateProvinceID = s.StateProvinceID ГДЕ CountryRegionCode НЕ В ('США') И город НРАВИТСЯ N'Pa%' ;
Примеры: Azure Synapse Analytics and Analytics Platform System (PDW)
C. Использование WHERE с LIKE
В следующем примере выполняется поиск строк, в которых столбец LastName
содержит символы и
.
-- Использует AdventureWorks ВЫБЕРИТЕ Ключ Сотрудника, Фамилия ОТ DimEmployee ГДЕ Фамилия КАК '%и%';
D. Использование синтаксиса WHERE и LIKE с данными Unicode
В следующем примере используется WHERE
для выполнения поиска Unicode в столбце LastName
.
-- Использует AdventureWorks ВЫБЕРИТЕ Ключ Сотрудника, Фамилия ОТ DimEmployee ГДЕ Фамилия НРАВИТСЯ N'%and%';
См.
также- Агрегированные функции (Transact-SQL)
- СЛУЧАЙ (Transact-SQL)
- CONTAINSTABLE (Transact-SQL)
- Курсоры (Transact-SQL)
- УДАЛИТЬ (Transact-SQL)
- Выражения (Transact-SQL)
- FREETEXTTABLE (Transact-SQL)
- ОТ (Transact-SQL)
- Операторы (Transact-SQL) ОБНОВЛЕНИЕ
- (Transact-SQL)
Заявление о ситуации с использованием SQL (включая примеры)
6 августа 2021 г.
Вот 3 различных способа применения оператора case с помощью SQL:
(1) Для одного условия:
CASE WHEN условие_1 THEN result_1 ELSE result_2 END AS new_field_name
(2) Для нескольких условий с использованием И:
СЛУЧАЙ, КОГДА условие_1 И условие_2, ТОГДА результат_1 ИНАЧЕ результат_2 КОНЕЦ КАК новое_имя_поля
(3) Для нескольких условий и результатов:
СЛУЧАЙ, КОГДА условие_1, ТОГДА результат_1 КОГДА условие_2, ТОГДА результат_2 КОГДА условие_3, ТОГДА результат_3 . .. ИНАЧЕ результат КОНЕЦ КАК новое_имя_поля
Давайте рассмотрим несколько примеров с инструкциями по применению операторов case с помощью SQL.
Действия по применению операторов Case с использованием SQL
Шаг 1: Создайте таблицу
Если вы еще этого не сделали, создайте таблицу в своей базе данных.
Например, давайте создадим таблицу с именем « человек », которая включает следующие данные и поля:
имя | возраст | член |
Домкрат | 28 | № |
Бен | 67 | Да |
Джилл | 33 | № |
Мария | 72 | Да |
Билл | 17 | № |
Шаг 2. Определите правила
Затем определите правила для оператора case.
Например, давайте определим следующие правила:
- Когда возраст человека равен или превышает 60 лет, затем человек имеет право на «скидку для пенсионеров»
- Иначе , не должно быть скидки
Шаг 3. Применение оператора Case с помощью SQL
Наконец, вы можете использовать следующий шаблон для одного условия :
CASE WHEN condition_1 THEN result_1 ELSE result_2 END AS new_field_name
Для нашего примера:
- условие_1: возраст >= 60
- result_1: «Скидка для пожилых»
- результат_2: ‘без скидки’
- new_field_name: скидка
Таким образом, полный синтаксис будет выглядеть так:
SELECT имя, возраст, CASE WHEN age >= 60 THEN 'Скидка для пенсионеров' ELSE 'без скидки' END AS со скидкой ОТ людей
Запустите запрос, и вы получите следующий результат:
имя | возраст | скидка |
Домкрат | 28 | без скидки |
Бен | 67 | пенсионер скидка |
Джилл | 33 | без скидки |
Мария | 72 | пенсионер скидка |
Билл | 17 | без скидки |
Дополнительные примеры операторов Case
Пример 1: Несколько условий с использованием И
Теперь рассмотрим пример с несколькими условиями, где правила следующие:
- Когда возраст человека равен или превышает 60 лет, и человек является участником, затем человек имеет право на «членский подарок»
- В противном случае не должно быть «подарка членства»
Вы можете использовать этот шаблон для нескольких условий, используя И:
СЛУЧАЙ, КОГДА условие_1 И условие_2, ТОГДА результат_1 ИНАЧЕ результат_2 END AS new_field_name
Для нашего примера:
- условие_1 И условие_2: возраст >= 60 И член = «Да»
- result_1: ‘подарок членства’
- result_2: ‘нет членского подарка’
- new_field_name: подарок
Таким образом, полный синтаксис для нашего примера будет выглядеть так:
SELECT имя, возраст, член, СЛУЧАЙ, КОГДА возраст >= 60 И участник = 'Да', ТОГДА 'подарок членства' ELSE 'нет подарка членства' КОНЕЦ КАК подарок ОТ людей
Запустите запрос, и вы получите следующий результат:
имя | возраст | член | подарок |
Домкрат | 28 | № | без подарка членства |
Бен | 67 | Да | членский подарок |
Джилл | 33 | № | нет членского подарка |
Мария | 72 | Да | членский подарок |
Билл | 17 | № | без подарка членства |
Пример 2: несколько условий и результатов
В последнем разделе этого руководства рассмотрим пример с несколькими условиями и результатами, где действуют следующие правила:
- Когда возраст человека равен или превышает 60 лет , затем человек имеет право на «скидку для пенсионеров»
- Когда возраст человека равен или превышает 18 лет, и меньше 60 лет, затем не должно быть скидки
- Еще человек имеет право на «скидку для подростков»
Затем вы можете использовать следующий шаблон для нескольких условий и результатов:
СЛУЧАЙ, КОГДА условие_1, ТОГДА результат_1 КОГДА условие_2, ТОГДА результат_2 КОГДА условие_3, ТОГДА результат_3 . .. ИНАЧЕ результат КОНЕЦ КАК новое_имя_поля
А вот полный синтаксис для нашего примера:
SELECT имя, возраст, CASE WHEN age >= 60 THEN 'Скидка для пенсионеров' КОГДА возраст >= 18 И возраст < 60, ТОГДА "без скидки" ELSE 'детская скидка' КОНЕЦ КАК скидка ОТ людей
Запустите запрос, и вы получите:
имя | возраст | скидка |
Домкрат | 28 | без скидки |
Бен | 67 | пенсионер скидка |
Джилл | 33 | без скидки |
Мария | 72 | пенсионер скидка |
Билл | 17 | юниорская скидка |
Вы также можете посетить следующую страницу для получения дополнительных руководств по SQL.
Фильтрация по нескольким условиям в SQL — Видеоурок по SQL
Из курса: SQL для непрограммистов
Фильтрация по нескольким условиям в SQL
“
- [Преподаватель] При анализе часто полезно учитывать более одной точки данных одновременно, и для этого в SQL используются логические операторы «и» и «или» в предложении «где». Основные правила логических операторов в других контекстах, таких как математика, применимы и здесь, в SQL. Когда вы используете «и», обе части уравнения должны быть истинными, чтобы вернуть эти результаты. А с «или» хотя бы одно из них должно быть истинным. Хотя хорошо, если оба условия соблюдены. Итак, прежде чем я начну нашу демонстрацию, я собираюсь показать вам один маленький трюк, который вы можете использовать, если используете SSMS. Итак, если вы пойдете сюда, в верхний правый угол, прямо здесь, в углу, есть маленькая стрелка вверх и вниз. И если я нажму на нее и перетащу вниз, я смогу использовать ее, чтобы заморозить эту верхнюю панель моего экрана. Так что я могу прокрутить здесь, и это будет полезно для меня в этой демонстрации, потому что этот оператор «выбрать» в верхней части будет иметь отношение ко всем нашим примерам. Поэтому я хочу, чтобы это было здесь, чтобы я мог легко копировать и вставлять его снова и снова. Итак, для нашего первого примера мы хотим найти все строки для служб, требующих не более шести участников и стоящих не более 25 долларов США на человека. Итак, начнем с нашего базового запроса, и скажем, где минимальное количество участников не больше шести. Так что это меньше или равно, потому что мы хотим включить шесть. И цена на человека не более 25$. Итак, опять же, меньше или равно 25, потому что это включено. Итак, если мы запустим это, мы получим строки, в которых оба условия верны, где минимальное количество участников не превышает шести, а цена на человека не превышает 25 долларов. Но важно отметить, что на самом деле вы можете добавить в свой запрос столько логических операторов, сколько захотите. Итак, если мы хотим рассмотреть три условия, мы начнем с этого запроса, который у нас был раньше, и теперь мы собираемся добавить дополнительный фактор, чтобы просто показать услуги общественного питания. Итак, мы снова посмотрим на этот набор результатов. Должен получиться только один результат. Итак, если мы добавим и название услуги, как кейтеринг. Выделите это, чтобы запустить это. И я просто использую здесь сочетание клавиш, поэтому вы не видите, как я нажимаю кнопку «Выполнить». Я просто возвращаю свою одну строку, где все три условия выполнены. Итак, как я уже сказал, в начале этого видео у нас есть оператор «и», где должны быть выполнены все условия. Но тогда мы также должны увидеть, как выглядит условие «или», где должно быть выполнено хотя бы одно из условий. Итак, снова возьмем наш базовый запрос. Итак, мы ищем ряды, которые либо кейтеринговые услуги, либо подарочные корзины, либо дегустационную вечеринку двух деревьев. Итак, мы скажем, где название услуги похоже на кейтеринг или название услуги похоже на подарок или название услуги равно дегустации двух деревьев. Итак, я буду запускать эту строку по очереди, чтобы продемонстрировать, как работает оператор «или». Итак, здесь у нас есть только ряды, которые похожи на общепит. Если мы добавим или это будет похоже на подарок, мы просто добавим эти строки в наш набор результатов, потому что любой из них верен для каждой из этих строк. А затем мы включим еще один с дегустационной вечеринкой двух деревьев. Таким образом, если какое-либо из этих условий выполняется в строке, мы возвращаем одну из этих строк. И, наконец, будут ситуации, когда нам придется смешивать «и» и «или». Так что теперь мы ищем услуги, которые стоят менее 30 долларов, и это либо услуги общественного питания, либо подарочные наборы. Мы делаем это. Итак, мы хотим найти строки для услуг, которые стоят менее 30 долларов США и относятся либо к услугам общественного питания, либо к подарочным корзинам. Итак, мы продолжим и добавим, где цена на человека меньше 30, а название услуги похоже на питание или название услуги похоже на подарок. Итак, давайте продолжим и запустим это строка за строкой. Так что я знаю, что ищу вещи, которые меньше 30. Поэтому я фильтрую здесь. А то я как раз ищу кейтеринг или подарочные корзины. Так что я ожидаю, что вернется только одна строка, этот последний результат. Когда я запускаю это, я фактически получаю четыре строки назад. И причина этого связана с порядком, в котором запрос будет разрешать мои условия. Итак, что я на самом деле хочу сказать здесь, так это то, что мне нужны строки, в которых это условие верно, где цена меньше 30 долларов, и одно из этих условий верно, либо это питание, либо подарочная корзина. Что я на самом деле прошу прямо сейчас, так это условия, при которых цена меньше 30 и это питание, или дайте мне любые ряды, которые являются подарочной корзиной. Поэтому, чтобы исправить это, я собираюсь использовать круглые скобки, чтобы SQL Server действительно понял, как я хочу сгруппировать эти условия вместе. Итак, я собираюсь сказать, что название услуги похоже на кейтеринг или название услуги похоже на подарок. И теперь, когда я запустил его, я ясно дал понять, что это условие должно быть истинным, и любое из этих условий может быть истинным. И я запускаю его, и я просто получаю одну строку, которую я ожидал. Поэтому всякий раз, когда вы смешиваете «и» и «или» в своем предложении where, я определенно рекомендую вам добавлять круглые скобки, даже если они у вас есть в правильном порядке, чтобы заставить их оценивать так, как вы хотите, просто потому, что это делает Четкий и понятный код — это всегда хорошо. Теперь у вас есть множество инструментов в вашем наборе инструментов SQL Server, чтобы начать писать действительно полезные запросы, просто используя выбор, откуда и где. В следующей главе мы начнем рассматривать, как мы можем читать из нескольких таблиц в одном запросе.
Содержание
Условия в SQL - IF/ELSE
Запись условий IF и ELSE в SQL
Вы можете использовать оператор IF для проверки условий в SQL — в этом блоге объясняется, как это сделать, а также объясняется, почему вместо этого вы можете предпочесть использовать CASE WHEN.
Этот блог является частью нашей серии интерактивных руководств по SQL. В основном мы проводим учебные курсы по SQL для предприятий, а также курсы по службам Reporting Services, Analysis Services и Integration Services.
Сообщение от Энди Браун 29 января 2013 г.
Для просмотра наших блогов необходимо минимальное разрешение экрана около 700 пикселей в ширину. Это связано с тем, что они содержат диаграммы и таблицы, которые невозможно легко просмотреть на мобильном телефоне или маленьком ноутбуке. Пожалуйста, используйте планшет, ноутбук или настольный компьютер большего размера или измените настройки разрешения экрана.
Все программисты, следившие за этим руководством, сейчас, наверное, текут слюнки от перспективы застрять в каком-нибудь приличном программирование. Слюни нет, потому что...
Условия IF не так часто используются в SQL; Если ты найдешь сами захламляя свой SQL условиями, вы наверняка что-то делаете неправильный. Вы могли бы сделать хуже, чем забронировать место на одном из наших вводных или продвинутые курсы SQL, которые мы теперь предлагаем онлайн также.
Несмотря на подсказку выше, есть место для IF операторы в SQL. Давайте сначала посмотрим на синтаксис, а затем рассмотрим Некоторые примеры.
Синтаксис простого оператора IF
Вы можете написать оператор IF в SQL следующим образом:
-- проверить, верно ли условие
IF (условие истинно)
СДЕЛАТЬ ЧТО-ТО яснее, что происходит (и чтобы вы могли запустить ряд различные операторы, если условие истинно), используйте BEGIN и КОНЕЦ в виде закладок:
-- проверка выполнения условия
ЕСЛИ (условие истинно)
НАЧАТЬ
СДЕЛАТЬ ОДНО
СДЕЛАТЬ ДРУГОЕ
КОНЕЦ
Мой совет всегда использовать НАЧАТЬ / КОНЕЦ , особенно если ты придешь из фона ВБ. О, и не поддавайтесь искушению сказать слово ЗАТЕМ после условия!
Множественные условия ЕСЛИ с использованием ELSE
Предположим, вы хотите сказать: если что-то верно, сделайте это; в противном случае сделайте это. Для этого вам нужно использовать ИНАЧЕ ключевое слово. Синтаксис IS:
- Проверьте, верно ли условие
, если (условие верно)
Начало
DO
DO Thing B
END
ELS THING D
DO THING E
END
Если вы хотите проверить более двух условий, вам придется вложить ваши операторы ЕСЛИ. Например:
-- проверить, верно ли одно из 3 условий
IF (условие верно)
BEGIN
DO
END
ELSE
IF (СОСТОЯНИЕ 2 верно)
BEGIN
DO
END
ELSE
Begin
DO THING C
END
Вероятно, стоит добавить, что за всю мою карьеру программиста SQL я никогда не построил этот комплекс IF заявление; ты должен быть вместо этого используйте операторы CASE!
Важность отступа
Допустим следующий SQL: он напечатает подходящее сообщение в соответствии с день недели:
День недели | Номер | Сообщение |
---|---|---|
суббота, воскресенье | 7, 1 | Выходные! |
пятница | 6 | Сегодня пятница. .. |
В любой другой день | от 2 до 5 | Сегодня будний день... / Время работать... |
Вот SQL без отступов - читать почти невозможно:
-- печатать разные сообщения в зависимости от 7)
ПЕЧАТЬ 'Это выходные!'
ДРУГОЕ
IF DatePart(weekday,GetDate()) = 6
PRINT 'Сегодня пятница...'
ELSE
BEGIN
PRINT 'Сегодня будний день...'
PRINT 'Пора работа...'
END
Если мы добавим правильный отступ, все вдруг станет намного яснее:
-- печатать разные сообщения в соответствии с
-- день недели
IF DatePart(weekday,GetDate() ) IN (1,7)
ПЕЧАТЬ 'Это выходные!'
ДРУГОЕ
IF DatePart(weekday,GetDate()) = 6
PRINT 'Сегодня пятница...'
ELSE
BEGIN
PRINT 'Сегодня будний день...'
PRINT 'Пора работа...'
КОНЕЦ
ОК - посмотрев синтаксис оператора IF , давайте посмотрите на некоторые примеры.
Пример — использование EXISTS для проверки существования записей
Следующий запрос выводит подходящее сообщение, если SQL Server может найти фильмы, получившие десять и более Оскаров:
-- посмотреть, есть ли фильмы, выигравшие
-- десять или более Оскаров
ЕСЛИ СУЩЕСТВУЕТ (
SELECT * из TBLFILM
, где Filmoscarwins> = 10
)
BEGIN
Печать 'Двойные победители OSCAR обнаружили
END
- Использование переменных для сравнения двух счетов
Следующий пример создает пример. две переменные для хранения:
- количество фильмов продолжительностью 3 часа и более; и
- количество фильмов, получивших не менее 1 Оскара.
Затем SQL сравнивает два числа и выводит подходящее сообщение:
-- посмотреть, есть ли еще оскароносные или длинные фильмы
DECLARE @LongFilms int
DECLARE @OscarWinners int
-- найти
количество фильмов продолжительностью 3 часаSET @LongFilms = (
SELECT COUNT(*) FROM tblFilm
WHERE FilmRunTimeMinutes >=180
)
- Найдите количество фильмов, выигравших Оскар
SET @oscarwinners = (
SELECT COUNT (*) от TBLFILM
, где Filmoscarwins> 0
)
- SHOW, которое больше
, если @longfilms. > @OscarWinners
PRINT 'Больше длинных фильмов'
ELSE
IF @LongFilms
PRINT 'Больше победителей Оскара'
ELSE
PRINT 'Одинаковое число каждого'
CASE WHEN почти всегда лучше
Если возможно, используйте СЛУЧАЙ, КОГДА вместо ЕСЛИ для проверки нескольких условий, так как он создает SQL, который намного проще прочти и напиши). Вот как вы могли бы написать некоторые из запросов выше. Во-первых, пример дня недели:
-- вывести разные сообщения в соответствии с
-- день недели
CASE DatePart(weekday,GetDate())
WHEN 1 THEN 'It'' выходные!
КОГДА 7 ТОГДА 'Сегодня выходные!'
КОГДА 6 ТОГДА 'Это' пятница...'
ELSE 'Это' будний день...'
КОНЕЦ
Вы можете написать последнее утверждение полнометражных фильмов / запрос победителей Оскара выше как:
CASE
WHEN @LongFilms > @OscarWinners THEN 'Больше длинных фильмов'
WHEN @LongFilms
ELSE 'Один и тот же номер каждого'
END
Короче говоря, если вы используете IF заявление, то есть хороший шанс, что вы должны использовать CASE WHEN вместо этого.
В этом блоге 0 тем Добавить сообщение
Понимание оператора 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, отображается Активный сотрудник
- Для всех остальных значений вывод отображается как Неактивный сотрудник
ВЫБЕРИТЕ 5 первых национальных номеров , ДЕЛО WHEN 1 THEN 'Активный сотрудник' ELSE 'Неактивный сотрудник' КОНЕЦ КАК [Флаг оклада] FROM [AdventureWorks2019].[HumanResources].[employee]
Мы можем указать несколько условий для оператора CASE.
ВЫБЕРИТЕ 5 первых национальных номеров , ДЕЛО WHEN 1 THEN 'Активный сотрудник' WHEN 0 THEN 'Неактивный сотрудник' ИНАЧЕ 'Недопустимое значение' КОНЕЦ КАК [Флаг оклада] ИЗ [AdventureWorks2019].[HumanResources].[employee]
Стандартизация данных с помощью операторов SQL CASE
Обычно мы используем сокращения для хранения значений в таблицах SQL. Стандартные аббревиатуры: пол, код страны, статус брака, популярные названия продуктов и т. д.
Допустим, мы указываем аббревиатуры для хранения полов сотрудников. Теперь наше приложение должно отображать результаты без каких-либо сокращений.
Операторы SQL CASE помогают стандартизировать вывод для определенных критериев. В приведенном ниже запросе мы используем следующие условия:
- Если значение пола M , отобразите его как Мужской
- Если значение пола F , отобразите его как Женский
- Для любых других значений отображать Недействительно Значение
ВЫБЕРИТЕ РАЗЛИЧНЫЙ СЛУЧАЙ пол КОГДА "М", ТОГДА "Мужской" КОГДА "F", ТОГДА "Женщина" ИНАЧЕ 'Недопустимое значение' КОНЕЦ КАК Пол FROM AdventureWorks2019. HumanResources.Employee
Искомые операторы CASE
В искомом операторе CASE мы указываем выражение CASE вместо прямых значений. Как только значение выражения оценивается и удовлетворяет условию в предложении WHEN, возвращается соответствующее значение.
Посмотрите на приведенный ниже SQL-запрос. Здесь мы определили выражения в предложении WHEN для [ListPrice]. В нем указано, что стоимость продукта составляет 250 долларов США, и он помечен как элемент электроники.
ВЫБЕРИТЕ ProductNumber, Имя, [Категория продукта] = КЕЙС КОГДА ListPrice = 0, ТО 'Товаров нет в наличии' КОГДА ListPrice > 0 и ListPrice<=100, ТО 'Потребительские товары' КОГДА ListPrice > 100 и ListPrice <= 500, ТО 'Элементы электроники' КОГДА ListPrice > 500 и ListPrice < 1500, ТО "Предметы роскоши" ELSE 'Дополнительные элементы' КОНЕЦ ОТ Производство.Заказ товара по ListPrice desc
Для упомянутого выше примера пола мы можем переписать оператор SQL CASE для сокращений пола, используя искомые операторы case.
ВЫБЕРИТЕ ОТЛИЧНЫЙ СЛУЧАЙ КОГДА Пол = «М», ТОГДА «Мужской» КОГДА Пол = 'F', ТО 'Женщина' ИНАЧЕ 'Недопустимое значение' КОНЕЦ КАК Пол FROM AdventureWorks2019.HumanResources.Employee
Использование операторов CASE с предложением ORDER BY
SQL-запросы используют предложение ORDER BY для сортировки данных в порядке возрастания или убывания. Вы можете использовать операторы CASE в сочетании с предложением ORDER BY. Предположим, из таблицы продуктов мы получаем [ProductName] и [ListPrice]. Мы хотим отсортировать результаты следующим образом:
- Если прейскурантная цена продукта меньше 2000, вы хотите получить результат в порядке сортировки по умолчанию, т. е. по возрастанию
- Если прейскурантная цена продукта превышает 2000, сортировка предложения ORDER BY приводит к убыванию
В этом запросе мы используем две инструкции SQL CASE для реализации логики.
ВЫБЕРИТЕ Имя, Список цен ОТ Производство.Продукт ЗАКАЗАТЬ ПО СЛУЧАЮ КОГДА ListPrice<=2000, ТО ListPrice КОНЕЦ ,CASE WHEN ListPrice >2000 THEN ListPrice END DESC
В приведенном ниже выводе запроса вы можете проверить сортировку данных как в порядке убывания, так и в порядке возрастания.
В другом примере предположим, что мы хотим отсортировать данные в таблице сотрудников на основе следующего условия:
- Для активных сотрудников (Текущий флаг = 1) данные должны сортироваться по столбцу даты приема на работу
- Для неактивных сотрудников он должен сортировать данные в соответствии со значениями в столбце даты рождения
ВЫБЕРИТЕ NationalIDNumber, JobTitle, Hiredate, BirthDate, currentflag ОТ AdventureWorks2019.HumanResources.Сотрудник СОРТИРОВАТЬ ПО CASE CURRENTFLAG WHEN 1 THEN HireDate еще Дата рождения end
В выводе запроса мы можем проверить порядок сортировки данных, определенный предложением 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.
- Агрегатная функция подсчета подсчитывает записи и отображает результаты.
- Аналогично запрос работает и для остальных лет.
ВЫБРАТЬ Счетчик(СЛУЧАЙ КОГДА Датапарт(гг, дата найма) = 2007 ТОГДА 1 ИНАЧЕ НОЛЬ КОНЕЦ) КАК [2007Hires], Подсчет(СЛУЧАЙ КОГДА Датапарт(гг, дата найма) = 2008 ТОГДА 1 ИНАЧЕ НОЛЬ КОНЕЦ) КАК [2008Hires], Подсчет(СЛУЧАЙ КОГДА Датапарт(гг, дата найма) = 2009 ТОГДА 1 ИНАЧЕ НОЛЬ КОНЕЦ) КАК [2009Hires], Подсчет(СЛУЧАЙ КОГДА Датапарт(гг, дата найма) = 2009 ТОГДА 1 ИНАЧЕ НОЛЬ КОНЕЦ) КАК [2010Hires] FROM AdventureWorks2019.HumanResources.Employee
Аналогично, допустим, мы хотим использовать агрегатную функцию GROUP BY для группировки строк, имеющих одну и ту же категорию продуктов. Мы можем указать оператор CASE в SQL для сортировки данных из сгруппированного набора результатов.
ВЫБЕРИТЕ [Категория продукта] = СЛУЧАЙ КОГДА listprice = 0, ТО "Нет в наличии" КОГДА прейскурант > 0 AND listprice <= 100 THEN 'Потребительские товары' КОГДА прейскурант > 100 AND listprice <= 500 THEN 'Элементы электроники' КОГДА прейскурант > 500 И прейскурантная цена < 1500, ТОГДА «Предметы роскоши» ELSE 'Дополнительные элементы' КОНЕЦ, Min(listprice) AS MinPrice, Макс(прейскурант) AS MaxPrice, Count(listprice) AS Numberofproducts С производства.продукт СГРУППИРОВАТЬ ПО ДЕЛУ КОГДА listprice = 0, ТО "Нет в наличии" КОГДА прейскурант > 0 AND listprice <= 100 THEN 'Потребительские товары' КОГДА прейскурант > 100 AND listprice <= 500 THEN 'Элементы электроники' КОГДА прейскурант > 500 И прейскурантная цена < 1500, ТОГДА «Предметы роскоши» ELSE 'Дополнительные элементы' КОНЕЦ ЗАКАЗАТЬ ПО КОЛИЧЕСТВУ ТОВАРОВ DESC
В приведенном выше запросе мы используем два оператора SQL CASE.
- Первый оператор CASE классифицирует данные на основе выражения, определенного в прейскурантной цене. Используя этот оператор CASE, мы делим продукты на следующие категории:
- Товары, которых нет в наличии
- Товары народного потребления
- Электронные изделия
- Предметы роскоши
- Во втором операторе case мы используем агрегатную функцию GROUP BY, чтобы сгруппировать результат по категории
- Далее сортируем результаты по NumberOfProducts в порядке убывания
Предотвращение ошибки деления на ноль с помощью операторов SQL CASE
Ошибка деления на ноль возникает, если значение знаменателя равно нулю. Если вы сделаете эти дроби в SQL Server, это даст вам ошибку деления на ноль, как показано ниже.
Рекомендуется составлять запросы таким образом, чтобы избежать этих распространенных ошибок. Чтобы избежать этого, мы используем дробную логику внутри оператора CASE.