Базовый курс SQL. Извлечение данных с условиями. WHERE.

Forums:

[к оглавлению]

Для получения данных, соответствующих определённым условиям, нужно к запросу SELECT добавить ключевое слово WHERE.

Буквально это будет означать: "ПОЛУЧИТЬ такие-то строки, ИЗ такой-то таблицы, ГДЕ выполняется такое-то условие".

SELECT student_name
FROM Students
WHERE student_age = 21;

Получим имена только тех студентов, чей возраст - 21 год:

student_name
--------------------
Пётр                                              
Григорий        

Где лучше фильтровать данные? Cразу в запросе или на уровне приложения, уже после получения всех данных из БД?

Однозначно первый вариант. Во-первых, базы данных специально разработаны для быстрой и эффективной работы с данными, следовательно превосходят в скорости клиентскую сторону. Во-вторых, отправляя лишние данные по сети, Вы подвергаете их дополнительной опасности перехвата. В-третьих, просто неоправданно увеличиваете сетевой трафик.

Также если Вам требуется отсортировать полученные результаты, обратите внимание, что располагать ORDER BY следует в конце запроса, после WHERE.

Какие операторы ещё можно использовать

Оператор     |  Значение
----------------------------------
=            |   равно
<>           |   не равно
!=           |   не равно
<            |   меньше 
<=           |   меньше или равно
!<           |   не меньше
>            |   больше
>=           |   больше или равно
!>           |   не больше
BETWEEN      |   входит в диапазон
IS NULL      |   является NULL 

Некоторые из операторов, представленные в таблице, дублируют друг друга по смыслу. Но некоторые из них могут НЕ поддерживаться Вашей СУБД. Чтобы узнать, какие именно, обратитесь к документации.

<> тоже самое, что != 
<= тоже самое, что !>

Сравнение

Рассмотрим примеры помимо равенства. Допустим, нам нужно найти все группы старше второго курса, т.е. которые проучились больше 4х семестров.:

SELECT group_id, group_name
FROM Groups
WHERE semester_id > 4;

Ответ:

group_id   |   group_name
---------------------------------
31548	|   304F      
30913	|   117F      

Неравенство

В следующем примере сделаем запрос всех названий дисциплин, кроме Истории

SELECT discipline_name
FROM Disciplines
WHERE discipline_name <> 'История'
ORDER BY discipline_name;

Ответ:

discipline_name
------------------------
Дифференциальная геометрия                                                                                                                                                                                                                                     
Компьютерная геометрия и графика                                                                                                                                                                                                                               
Математический анализ                                                                                                                                                                                                                                          
Объектно-ориентированное программирование                                                                                                                                                                                                                      
Социология                                                                                                                                                                                                                                                     
Статистика                                                                                                                                                                                                                                                     
Теория информации                                                                                                                                                                                                                                              
Технологии программирования                                                                                                                                                                                                                                    
Философия 

В данном примере мы заключили слово История в кавычки, чтобы отделить операторы sql от данных, хранящихся в таблице. Это требуется в том случае, если тип данных строковый. Для числовых значений, соответственно, не требуется.

Принадлежность отрезку

Синтаксис BETWEEN немного отличается, т.к. нам необходимо передать 2 значения: начала и конца диапазона. Например, достанем фамилии всех студентов, возраст которых находится в отрезке [22; 24]:

SELECT student_surname
FROM Students
WHERE student_age BETWEEN 22 AND 24;

Ответ:

student_surname
---------------------------
Петрашевский                                      
Легран                                            
Распопов                                          
Колобков                                          
Шульгина    

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

SELECT student_surname
FROM Students
WHERE student_age >= 22 AND student_age <= 24;

Результат будет аналогичный.

Проверка на NULL

При создании таблицы мы указываем, обязательно ли столбец должен содержать значение, или может быть NULL. NULL отличается от 0 и от ' ' (пустая строка): он обозначает, что значения нет вообще. Поэтому запись WHERE smth = NULL не имеет смысла. Для этого в SQL предусмотрена особенная запись:

SELECT student_age
FROM Students
WHERE student_email IS NULL;

В ответе возраст студентов, не указавших электронную почту:

student_age
-----------------------
21
21

Следует отметить, что строки, содержащие NULL, не вернутся и при проверке условия на неравенство, несмотря на то, что по сути NULL не равен любому предложенному значению. Запомните просто, что NULL не подлежит сравнению и обратиться к нему можно только непосредственно.

Также можно запросить все строки, содержащие НЕ NULL:

SELECT student_age
FROM Students
WHERE student_email IS NOT NULL;
student_age
-----------------------
22
25
19
24
22
22
23
20

Следующая страница. Комбинирование условий при извлечении данных.
Оглавление.