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 работает не только со строками. Что не может не радовать.

undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0110
Напиши запрос выбора всех пользователей (используй *) из таблицы users, у которых значение поля age ровно 25.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0111
Напиши запрос выбора всех сотрудников (используй *) из таблицы employee, у которых значение поля salary строго больше 2000.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0112
Выбрать содержимое колонок id, salary, department (в указанном порядке) из таблицы employee, у которых значение поля salary меньше либо равно 1594.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0113
Напиши запрос выбора всех сотрудников (используй *) из таблицы employee, у которых значение поля salary не равно 3200. Используй !=
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0114
Напиши запрос выбора всех сотрудников (используй *) из таблицы employee, у которых значение поля salary не равно 3200. Используй <>
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0115
Выбрать содержимое колонок id, salary, department, name (в указанном порядке) из таблицы employee, у которых значение поля salary строго меньше 5000 И значение поля department равное dev.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0116
Выбрать содержимое всех колонок (используй *) из таблицы employee, у которых значение поля salary строго меньше 5000 И значение поля salary строго больше 2000.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0117
Выбрать содержимое колонок department, salary, name (в указанном порядке) из таблицы employee, у которых значение поля salary строго больше 2200 И значение поля department НЕ равное qa. Используй AND NOT.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0118
Выбрать содержимое колонок department, salary, name (в указанном порядке) из таблицы employee, у которых значение поля salary строго меньше 1000 ИЛИ значение поля salary больше либо равно 5000. Используй OR.
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0119
Выбрать все колонки (используй *) из таблицы employee, у кого значение поля department dev или qa
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0120
Выбрать все колонки (используй *) из таблицы employee, у кого значение поля salary МЕЖДУ 1000 и 5000 включительно. Используй оператор BETWEEN
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0121
Выбрать все колонки (используй *) из таблицы car, у которых значение разницы количества (quantity) и забронированного количества (booked_quantity) МЕЖДУ 10 и 100 включительно. Используй оператор BETWEEN
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0122
Выбрать все колонки (используй *) из таблицы car, у которых значение поля brand ОДНО ИЗ: mazda, toyota, nissan. Используй оператор IN
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0123
Выбрать все колонки (используй *) из таблицы car, у которых значение поля brand ОДНО ИЗ: renault, opel, seat, skoda. Используй оператор IN
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0124
Выбрать колонки brand, model, booked_quantity (в указанном порядке) из таблицы car, у которых значение поля model начинается на букву k. Используй оператор LIKE
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0125
Выбрать колонки brand, model, booked_quantity (в указанном порядке) из таблицы car, у которых значение поля model не содержит комбинации букв ea (буквы - латиница, строчные) Используй оператор NOT LIKE
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0126
Выбрать колонки brand, model, quantity, booked_quantity (в указанном порядке) из таблицы car, у которых значение поля model европейское (renault, opel, seat, skoda) ИЛИ разница между quantity и booked_quantity МЕНЬШЕ 10 Нужно использовать: IN, OR
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 2 лекция
Недоступна
task0127
Выбрать все колонки (используй *) из таблицы car, у которых значение поля model не содержит букву a (латиница, строчная) И разница между quantity и booked_quantity МЕЖДУ 5 и 500 включительно. Нужно использовать: NOT LIKE, BETWEEN