MySQL-инструкция WHERE
используется для ограничения количества строк, затронутых запросом SELECT
, UPDATE
или DELETE
.
Обобщенные примеры использования WHERE
:
-- SELECT SELECT col1, col2 FROM table WHERE [NOT] condition -- UPDATE UPDATE table SET col1 = 'val1', col1 = 'val1' WHERE [NOT] condition -- DELETE DELETE FROM table WHERE [NOT] condition
Инструкция WHERE
, если она задана, указывает условие или условия, которым должны удовлетворять итоговая выборка. Условие condition
- это выражение, которое оценивается как ИСТИННОЕ для каждой выбранной строки.
В предложении WHERE
можно использовать результаты выполнения встроенных или пользовательских функций и процедур, которые например, что-то делают со значением записи столбца и возвращают логическое значение (TRUE
или 1, FALSE
или 0). Пример с функцией REGEXP_LIKE()
.
-- отберет все записи из `str_col`, которые соответствуют -- регулярному выражению `regexp_pattern` SELECT col1, col2, col3 FROM table WHERE REGEXP_LIKE(str_col, "regexp_pattern", "c");
Условия condition
будут выдавать противоположный результат, если перед ним стоит отрицание NOT condition
.
Несколько выражений/условий condition
могут соединяться логическими операторами OR
и/или AND
. Операторы OR
, AND
и NOT
можно выстраивать в логические цепочки, например:
SELECT col1, col2, col3 FROM table WHERE NOT ((a > x) OR ((a = x) AND (b > y)))
WHERE
.=, >, <, >=, <=, <>
операторы сравнения;condition OR condition
логическое ИЛИ;condition AND condition
логическое И;IN (sequence)
вхождение в последовательность;expr BETWEEN min AND max
эквивалентно выражению (min <= expr AND expr <= max)
;col IS NULL
выберет все записи, где col
равна NULL
или ''
;col LIKE 'pattern'
отбирает записи по заданному шаблону;col RLIKE 'regexp'
отбирает записи по регулярному выражению;col REGEXP 'regexp'
отбирает записи по регулярному выражению.=, >, <, >=, <=, <>
Операторы сравнения =, >, <, >=, <=, <>
можно использовать с любыми типами данных. Колонки, имеющие числовые типы и типы связанные с датой и временем, сравниваются как и ожидает пользователь. Строковые типы колонок сравниваются согласно правилам сортировки и указанному значению COLLATE
при создании таблицы. Если сравниваемые данные имеют разный тип, то происходит неявное преобразование типов в соответствии с правилами, описанными в разделе "Неявные преобразования типов БД MySQL при вычислении/сравнении".
Следующий сценарий получает всех членов женского пола из колонки gender
таблицы members
.
SELECT col1, col2, col3 FROM members WHERE gender = 'Female';
Использование оператора NOT
или оператор <>
возвратит противоположные результаты:
-- использование оператора сравнения `<>` SELECT col1, col2, col3 FROM members WHERE gender <> 'Female'; -- использование оператора `NOT` SELECT col1, col2, col3 FROM members WHERE NOT (gender = 'Female');
Следующий запрос выбирает все строки со значением date_col
за последние 30 дней:
SELECT col1, col2, col3 FROM tbl_name WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
condition OR condition
:Оператор OR
представляет собой логическое ИЛИ, при использовании которого должны выполняются КАКИЕ-ЛИБО или ВСЕ указанные критерии фильтрации.
SELECT col1, col2, col3 FROM movies WHERE category_id=2 OR year>2008;
Использование оператора NOT
возвратит противоположные результаты:
SELECT col1, col2, col3 FROM movies WHERE NOT (category_id=2 OR year>2008);
condition AND condition
:Оператор AND
представляет собой логическое логическое И, при использовании которого должны выполняются ВСЕ указанные критерии фильтрации.
SELECT col1, col2, col3 FROM movies WHERE category_id=2 AND year<>2008;
Использование оператора NOT
возвратит противоположные результаты:
SELECT col1, col2, col3 FROM movies WHERE NOT (category_id=2 AND year<>2008);
IN (sequence)
:Оператор IN (sequence)
отбирает только те строки, значения которых соответствуют списку значений sequence
. Оператор IN
помогает уменьшить количество предложений OR
.
SELECT col1, col2, col3 FROM members WHERE membership_number IN (1,2,3);
Выражение NOT IN (sequence)
- отбирает только те строки, значения которых НЕ соответствуют списку значений sequence
.
SELECT col1, col2, col3 FROM members WHERE membership_number NOT IN (1,2,3);
В качестве списка значений sequence
может быть использован подзапрос, который будет отбирать столбцы аналогичного типа:
SELECT col1, col2, col3 FROM studend WHERE score NOT IN (SELECT col FROM states WHERE state=0);
expr BETWEEN min AND max
:Если выражение expr
больше или равно min
и меньше или равно max
, то инструкция BETWEEN
возвращает 1, в противном случае возвращается 0. Это эквивалентно выражению (min <= expr AND expr <= max)
, если все аргументы имеют один и тот же тип. В противном случае происходит неявное преобразование типов в соответствии с правилами, описанными в разделе "Неявные преобразования типов БД MySQL при вычислении/сравнении".
SELECT col1, col2, col3 FROM members WHERE membership_number BETWEEN 1 AND 3;
Примеры использования и выдаваемых результатов инструкцией BETWEEN
:
mysql> SELECT 2 BETWEEN 1 AND 3, -> 1 mysql> SELECT 2 BETWEEN 3 and 1; -> 0 mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0
Для достижения наилучших результатов при использовании BETWEEN
с типами даты или времени необходимо использовать функцию CAST()
для явного преобразования значений в желаемый тип данных.
Примеры: Если сравнивается DATETIME
с двумя значениями DATE
, то нужно преобразовать значения DATE
в значения DATETIME
. Если используется строковая константа, такая как '2001-1-1', то в сравнении с DATE
, то лучше строку '2001-1-1' привести к типу DATE
.
mysql> SELECT CAST('2001-1-1' AS DATE), CAST('2001-1-1' AS DATETIME); -> 2001-01-01, 2001-01-01 00:00:00
col IS NULL
Оператор col IS NULL
выберет все строки, где запись колонки col
равна NULL
или ''
(пустая строка).
col LIKE 'pattern'
:Оператор LIKE
предназначен для поиска/отбора записей по заданному шаблону 'pattern'. Подробнее смотрите в материале "Поиск по шаблону, LIKE в запросах к БД MySQL".
col RLIKE 'regexp'
,col REGEXP 'regexp'
:Оператор RLIKE
и REGEXP
идентичны и используются при поиске/отборе записей по регулярному выражению. Подробнее смотрите в материале "Поиск по регулярному выражению в БД MySQL".