Сообщить об ошибке.

MySQL: Операторы, используемые с WHERE

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.


=, >, <, >=, <=, <>

Операторы сравнения =, >, <, >=, <=, <> можно использовать с любыми типами данных. Колонки, имеющие числовые типы и типы связанные с датой и временем, сравниваются как и ожидает пользователь. Строковые типы колонок сравниваются согласно правилам сортировки и указанному значению 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".