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
работает не только со строками. Что не может не радовать.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ