3.1 Сравнение значений: <, >, =, <>

Одно из самых частых ключевых слов, которые используются при написании SQL-запросов – это ключевое слово WHERE. Именно с его помощью мы указываем MySQL какие строки таблицы мы хотим отфильтровать (отобрать).

После ключевого слова WHERE можно писать очень сложные и заковыристые условия. Так какие же операции может содержать это условие?

Оператор Описание Пример
< Меньше salary < 40000
> Больше salary > 100000
<= Меньше или равно age <= 25
>= Больше или равно age >= 18
= Равно occupation = ‘Программист’
<>, != Не равно Year(join_date) != 2015

В отличии от языка Java для строгого равенства тут используется один символ равно, а не два.

Если же вы хотите проверить, что значения не равны, то это можно сделать двумя способами: <> или != Первый подход используется в языках типа Паскаль, второй характерен для таких языков, как C++ и Java.

Для присваивания в SQL используется := как в Паскале, однако само присваивание используется очень редко.

Давай напишем запрос, где отобразим всех сотрудников, которые не были наняты в 2015 году.


SELECT * FROM employee WHERE YEAR(join_date) != 2015
        

И получим такой результат запроса:

id name occupation salary age join_date
1 Иванов Иван Программист 100,000 25 2012-06-30
2 Петров Петр Программист 80,000 23 2013-08-12
3 Иванов Сергей Тестировщик 40,000 30 2014-01-01
6 Васька кот 1,000 3 2018-01-01

3.2 Логические операции AND, OR, NOT

Также в WHERE можно использовать логические операции AND, OR и NOT. И пишутся они именно так как я их тут описал. Никаких &&, || или !

Давай напишем SQL-запрос, где отберем сотрудников, которые старше 20 лет и получают зарплату меньше 50К.


SELECT * FROM employee WHERE age > 20 AND salary < 50000
        

И получим такой результат запроса:

id name occupation salary age join_date
3 Иванов Сергей Тестировщик 40,000 30 2014-01-01
5 Кириенко Анастасия Офис-менеджер 40,000 25 2015-10-10

Слишком просто. Давай напишем запрос, где отберем сотрудников, которые получают больше 100К и не работают директором:


SELECT * FROM employee WHERE salary >= 100000 AND NOT occupation = 'Директор'
        

Тут мы специально вместо символа != использовали оператор NOT.

И получим такой результат запроса:

id name occupation salary age join_date
1 Иванов Иван Программист 100,000 25 2012-06-30

3.3 BETWEEN: диапазон значений

Также в SQL есть специальный оператор BETWEEN с помощью которого можно проверить лежит ли переменная между двух значений. Этот оператор используется внутри логических выражений. Общий вид такого оператора имеет вид:


переменная BETWEEN нижняя_граница AND верхняя_граница
        

При этом в отличии от языка Java, и нижняя и верхняя границы входят в разрешенный интервал.

Давай напишем пример, где отберем всех сотрудников с зарплатой от 40К до 100К. Запрос будет иметь вид:

SELECT * FROM employee WHERE salary BETWEEN 40000 AND 100000

И получим такой результат запроса:

id name occupation salary age join_date
1 Иванов Иван Программист 100,000 25 2012-06-30
2 Петров Петр Программист 80,000 23 2013-08-12
3 Иванов Сергей Тестировщик 40,000 30 2014-01-01
5 Кириенко Анастасия Офис-менеджер 40,000 25 2015-10-10

Оператор BETWEEN поддерживает не только числовые типы, но также даты и даже строковые типы. В случае работы со строками используется лексикографический порядок: ааба идет перед аабб

3.4 IN: список значений

Кроме того, в SQL есть специальный оператор IN с помощью которого можно проверить содержится ли переменная в указанном списке. Этот оператор используется внутри логических выражений. Общий вид такого оператора имеет вид:

переменная IN (значение1, значение2, … значениеN)

Давай напишем запрос, в котором отберем сотрудников, которым 20, 25 или 30 лет. Запрос будет иметь вид:

SELECT * FROM employee WHERE age IN (20, 25, 30)

И получим такой результат запроса:

id name occupation salary age join_date
1 Иванов Иван Программист 100,000 25 2012-06-30
3 Иванов Сергей Тестировщик 40,000 30 2014-01-01
5 Кириенко Анастасия Офис-менеджер 40,000 25 2015-10-10

А теперь давай напишем запрос, где наоборот отберем сотрудников, возраст которых не 20, 25 или 30. Запрос будет иметь вид:

SELECT * FROM employee WHERE age NOT IN (20, 25, 30)

И получим такой результат запроса:

id name occupation salary age join_date
2 Петров Петр Программист 80,000 23 2013-08-12
4 Рабинович Мойша Директор 200,000 35 2015-05-12
6 Васька кот 1,000 3 2018-01-01

Все сработало, как и ожидалось. Красота.

3.5 LIKE: шаблон строк

И наконец еще один важный и очень часто используемый оператор – LIKE. Он используется при сравнении строк. С его помощью можно задать шаблон строки. Этот оператор используется внутри логических выражений. Общий вид такого оператора имеет вид:

переменная LIKE 'шаблон'

В шаблоне могут использоваться специальные символы: % и _.

  • Подчеркивание означает любой символ, всегда 1 шт.
  • Процент означает любой символ и любое количество раз (включая 0 раз).

Давай напишем запрос, с помощью которого отберем всех людей, у которых фамилия начинается на букву "И". Запрос будет иметь вид:

SELECT * FROM employee WHERE name LIKE 'И%'

И получим такой результат запроса:

id name occupation salary age join_date
1 Иванов Иван Программист 100,000 25 2012-06-30
3 Иванов Сергей Тестировщик 40,000 30 2014-01-01

Теперь усложним задание – в имени должно быть "о" и имя должно заканчиваться на "а". Запрос будет иметь вид:

SELECT * FROM employee WHERE name LIKE '%о%а'

И получим такой результат запроса:

id name occupation salary age join_date
4 Рабинович Мойша Директор 200,000 35 2015-05-12

Ладно, усложним еще немного. Давай отфильтруем всех сотрудников, у которых возраст начинается с цифры "3". Запрос будет иметь вид:

SELECT * FROM employee WHERE age LIKE '3%'

И получим такой результат запроса:

id name occupation salary age join_date
3 Иванов Сергей Тестировщик 40,000 30 2014-01-01
4 Рабинович Мойша Директор 200,000 35 2015-05-12
6 Васька кот 1,000 3 2018-01-01

Кстати, колонка age у нас имеет тип int, так что LIKE работает не только со строками. Что не может не радовать.