0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Обычно данных в базе много, и мы хотим работать только с их частью, а не всеми данными сразу. Например, нам нужно посмотреть данные только тех пользователей, которые зарегистрировались вчера. Для выборки части данных из базы используются условия. В этом уроке мы научимся строить подобные условия при выполнении запросов в базу данных с помощью WHERE.</p>
1
<p>Обычно данных в базе много, и мы хотим работать только с их частью, а не всеми данными сразу. Например, нам нужно посмотреть данные только тех пользователей, которые зарегистрировались вчера. Для выборки части данных из базы используются условия. В этом уроке мы научимся строить подобные условия при выполнении запросов в базу данных с помощью WHERE.</p>
2
<h2>WHERE</h2>
2
<h2>WHERE</h2>
3
<p>Самое простое условие - указать прямое соответствие. Например, выборка по идентификатору:</p>
3
<p>Самое простое условие - указать прямое соответствие. Например, выборка по идентификатору:</p>
4
<p>Первый запрос выше звучит так: выбрать всех пользователей, у которых идентификатор равен трем. Такая формулировка звучит странно, так как если мы выбираем по идентификатору, то и запись должна быть одна. С точки зрения семантики идентификатора она будет одна, но в реляционной базе данных результатом любой операции над множеством является множество.</p>
4
<p>Первый запрос выше звучит так: выбрать всех пользователей, у которых идентификатор равен трем. Такая формулировка звучит странно, так как если мы выбираем по идентификатору, то и запись должна быть одна. С точки зрения семантики идентификатора она будет одна, но в реляционной базе данных результатом любой операции над множеством является множество.</p>
5
<p>В том случае, если ничего не найдено, возвращается не пустота, а пустое множество. Если же в базе есть пользователь с указанным идентификатором, то вернется множество, которое содержит один элемент - найденного пользователя.</p>
5
<p>В том случае, если ничего не найдено, возвращается не пустота, а пустое множество. Если же в базе есть пользователь с указанным идентификатором, то вернется множество, которое содержит один элемент - найденного пользователя.</p>
6
<p>Если нужно получить все записи, кроме тех, у которых есть определенное значение, то нужно =, заменить на !=:</p>
6
<p>Если нужно получить все записи, кроме тех, у которых есть определенное значение, то нужно =, заменить на !=:</p>
7
<p>Сравнение с конкретным значением работает для всех типов данных, кроме NULL. Разберем эту ситуацию подробнее.</p>
7
<p>Сравнение с конкретным значением работает для всех типов данных, кроме NULL. Разберем эту ситуацию подробнее.</p>
8
<h2>Проверка на равенство с NULL</h2>
8
<h2>Проверка на равенство с NULL</h2>
9
<p>У данных типа NULL свой синтаксис:</p>
9
<p>У данных типа NULL свой синтаксис:</p>
10
<p>Равно NULL:</p>
10
<p>Равно NULL:</p>
11
<p>Не равно NULL:</p>
11
<p>Не равно NULL:</p>
12
<p>NOT, как и отрицание в языках программирования, может добавляться практически к любому оператору.</p>
12
<p>NOT, как и отрицание в языках программирования, может добавляться практически к любому оператору.</p>
13
<h2>Равенство строк</h2>
13
<h2>Равенство строк</h2>
14
<p>У строк тоже свои особенности. В соответствии со стандартом ANSI SQL, строки в PostgreSQL<strong>регистрозависимые</strong>- результат зависит от регистра, в котором записан текст. Например, следующие два запроса выбирают разные данные:</p>
14
<p>У строк тоже свои особенности. В соответствии со стандартом ANSI SQL, строки в PostgreSQL<strong>регистрозависимые</strong>- результат зависит от регистра, в котором записан текст. Например, следующие два запроса выбирают разные данные:</p>
15
<p>По этой причине данные в базе стараются хранить в<strong>нормализованном</strong>виде - перед добавлением в БД их приводят, например, к нижнему регистру, и то же самое делают при выборках. Классический пример - email. Его нужно хранить только в нижнем регистре.</p>
15
<p>По этой причине данные в базе стараются хранить в<strong>нормализованном</strong>виде - перед добавлением в БД их приводят, например, к нижнему регистру, и то же самое делают при выборках. Классический пример - email. Его нужно хранить только в нижнем регистре.</p>
16
<h2>Другие операции сравнения</h2>
16
<h2>Другие операции сравнения</h2>
17
<p>Кроме точного соответствия SQL поддерживает и все остальные операции сравнения:</p>
17
<p>Кроме точного соответствия SQL поддерживает и все остальные операции сравнения:</p>
18
<ul><li>> - больше</li>
18
<ul><li>> - больше</li>
19
<li>< - меньше</li>
19
<li>< - меньше</li>
20
<li>!= - не равно</li>
20
<li>!= - не равно</li>
21
<li>>= - больше либо равно, не меньше</li>
21
<li>>= - больше либо равно, не меньше</li>
22
<li><= - меньше либо равно, не больше</li>
22
<li><= - меньше либо равно, не больше</li>
23
</ul><p>Например, так может выглядеть запрос на сравнение:</p>
23
</ul><p>Например, так может выглядеть запрос на сравнение:</p>
24
<p>Здесь мы выбираем всех пользователей, созданных до<em>2018-10-05</em>.</p>
24
<p>Здесь мы выбираем всех пользователей, созданных до<em>2018-10-05</em>.</p>
25
<h2>Логические операторы</h2>
25
<h2>Логические операторы</h2>
26
<p>Все операции можно объединять в цепочки, если использовать логические операторы OR и AND:</p>
26
<p>Все операции можно объединять в цепочки, если использовать логические операторы OR и AND:</p>
27
<p>Здесь мы выбираем пользователей, которые зарегистрировались между<em>2018-01-01</em>и<em>2018-10-05</em>.</p>
27
<p>Здесь мы выбираем пользователей, которые зарегистрировались между<em>2018-01-01</em>и<em>2018-10-05</em>.</p>
28
<p>Как и в случае с языками программирования, здесь действуют те же приоритеты. Чтобы не создавать неоднозначностей, в сложных ситуациях используются круглые скобки:</p>
28
<p>Как и в случае с языками программирования, здесь действуют те же приоритеты. Чтобы не создавать неоднозначностей, в сложных ситуациях используются круглые скобки:</p>
29
<h2>BETWEEN</h2>
29
<h2>BETWEEN</h2>
30
<p>Для условий с проверкой диапазона SQL поддерживает особый формат BETWEEN. По сути, это сокращенная версия для двух условий соединенных через AND:</p>
30
<p>Для условий с проверкой диапазона SQL поддерживает особый формат BETWEEN. По сути, это сокращенная версия для двух условий соединенных через AND:</p>
31
<p>Здесь мы выбираем пользователей, которые зарегистрировались между<em>2018-01-01</em>и<em>2018-10-05</em>, включая эти даты. BETWEEN всегда учитывает границы диапазона.</p>
31
<p>Здесь мы выбираем пользователей, которые зарегистрировались между<em>2018-01-01</em>и<em>2018-10-05</em>, включая эти даты. BETWEEN всегда учитывает границы диапазона.</p>
32
<h2>IN</h2>
32
<h2>IN</h2>
33
<p>В некоторых ситуациях требуется найти не диапазон строк, а строки, в которых поле соответствует одному значению из набора. Предположим, что мы хотим выполнить один запрос и найти пользователей с идентификаторами 1, 2 или 5. Для этого используют OR:</p>
33
<p>В некоторых ситуациях требуется найти не диапазон строк, а строки, в которых поле соответствует одному значению из набора. Предположим, что мы хотим выполнить один запрос и найти пользователей с идентификаторами 1, 2 или 5. Для этого используют OR:</p>
34
<p>Если понадобится найти десяток совпадений, можно использовать другое решение - IN:</p>
34
<p>Если понадобится найти десяток совпадений, можно использовать другое решение - IN:</p>
35
<p>Если нужно исключить определенные записи, достаточно добавить NOT:</p>
35
<p>Если нужно исключить определенные записи, достаточно добавить NOT:</p>
36
<h2>LIKE</h2>
36
<h2>LIKE</h2>
37
<p>Иногда нужно искать по частичному совпадению: например, проверить, что строка начинается или заканчивается с определенной последовательности символов. Допустим, мы хотим посмотреть пользователей, имя которых начинается с буквы A:</p>
37
<p>Иногда нужно искать по частичному совпадению: например, проверить, что строка начинается или заканчивается с определенной последовательности символов. Допустим, мы хотим посмотреть пользователей, имя которых начинается с буквы A:</p>
38
<p>% - специальный заполнитель, который означает "все что угодно". Если его поставить в конце, то поиск выполняется по совпадению в начале фразы, если в начале - то по совпадению с концом, а если по краям - то проверяется совпадение внутри текста. Совпадение в конце может понадобиться, чтобы анализировать пользователей, которые регистрировались с определенного почтового домена:</p>
38
<p>% - специальный заполнитель, который означает "все что угодно". Если его поставить в конце, то поиск выполняется по совпадению в начале фразы, если в начале - то по совпадению с концом, а если по краям - то проверяется совпадение внутри текста. Совпадение в конце может понадобиться, чтобы анализировать пользователей, которые регистрировались с определенного почтового домена:</p>
39
<p>Здесь мы выбираем всех пользователей, электронная почта которых заканчивается на<em>hotmail.com</em>.</p>
39
<p>Здесь мы выбираем всех пользователей, электронная почта которых заканчивается на<em>hotmail.com</em>.</p>
40
<p>Обратите внимание на то, что этот поиск регистрозависимый. Если вы хотите искать без учета регистра, то используйте ILIKE.</p>
40
<p>Обратите внимание на то, что этот поиск регистрозависимый. Если вы хотите искать без учета регистра, то используйте ILIKE.</p>
41
<h2>Выводы</h2>
41
<h2>Выводы</h2>
42
<p>В этом уроке мы разобрали, как работать с выборками части данных по условию. Теперь вы умеете строить условия при выполнении запросов в базу данных с помощью WHERE и таким образом сможете работать только с частью данных, а не со всей базой сразу.</p>
42
<p>В этом уроке мы разобрали, как работать с выборками части данных по условию. Теперь вы умеете строить условия при выполнении запросов в базу данных с помощью WHERE и таким образом сможете работать только с частью данных, а не со всей базой сразу.</p>