1. Основы SQL: выборка SELECT, фильтрация и сортировка данных
Основы SQL: выборка SELECT, фильтрация и сортировка данных
SQL (Structured Query Language) — это язык структурированных запросов, который используется для взаимодействия с реляционными базами данных. В отличие от процедурных языков программирования (Python, Java, C++), где вы описываете как получить результат (шаг за шагом), SQL является декларативным языком. Это означает, что вы описываете что вы хотите получить, а система управления базами данных (СУБД), такая как PostgreSQL, сама решает, как выполнить этот запрос наиболее эффективным способом.
Любая работа с данными начинается с их извлечения. В этой статье мы разберем фундамент SQL: как выбирать данные, как отсекать ненужное и как упорядочивать результаты.
Анатомия таблицы
Прежде чем писать запросы, важно понимать структуру хранения данных. В реляционных базах данных информация хранится в таблицах.
!Структура таблицы: столбцы определяют тип данных, строки содержат конкретные записи
* Таблица (Table): Набор данных, объединенных общим смыслом (например, employees — сотрудники).
* Столбец (Column/Field): Атрибут, описывающий данные (например, salary — зарплата). Каждый столбец имеет строго определенный тип данных (число, текст, дата).
* Строка (Row/Record): Единичная запись в таблице (конкретный сотрудник).
Оператор SELECT: Выборка данных
Ключевое слово SELECT указывает базе данных, какие именно столбцы вы хотите увидеть в результате. Ключевое слово FROM указывает, из какой таблицы брать эти данные.
Выборка всех столбцов
Самый простой запрос — получить абсолютно все данные из таблицы. Для этого используется символ звездочки *.
Этот запрос вернет все строки и все столбцы таблицы employees. Использовать SELECT * в реальных приложениях не рекомендуется, так как это создает избыточную нагрузку на сеть и базу данных, если таблица содержит много столбцов или «тяжелые» данные (например, большие тексты).
Выборка конкретных столбцов
Хорошей практикой считается явное перечисление необходимых столбцов. Это делает запрос быстрее и предсказуемее.
Результат будет содержать только три указанных поля для всех сотрудников.
Использование псевдонимов (Aliases)
Иногда названия столбцов в базе данных могут быть техническими или непонятными (например, emp_f_name). С помощью ключевого слова AS можно дать столбцу временное имя (псевдоним) для вывода.
Псевдонимы существуют только на момент выполнения запроса и не меняют реальные имена столбцов в базе данных.
Уникальные значения (DISTINCT)
Если вам нужно узнать, какие уникальные значения содержатся в столбце (например, список всех отделов, где есть сотрудники), используйте DISTINCT.
Если в таблице 100 сотрудников, но все они работают только в 3 отделах, запрос вернет только 3 строки.
Арифметические операции
В SELECT можно выполнять математические вычисления. Например, если мы хотим узнать годовую зарплату, не обязательно хранить её в базе — можно вычислить её на лету.
Поддерживаются стандартные операторы: сложение +, вычитание -, умножение *, деление / и остаток от деления %.
Фильтрация данных: Оператор WHERE
Чаще всего нам не нужна вся таблица, а только строки, соответствующие определенным критериям. Для этого используется оператор WHERE. Он ставится после FROM.
СУБД просматривает каждую строку таблицы, проверяет условие в WHERE. Если условие истинно (TRUE), строка попадает в результат. Если ложно (FALSE), строка отбрасывается.
!Принцип работы WHERE: строки, не соответствующие условию, исключаются из выборки
Операторы сравнения
PostgreSQL поддерживает стандартные математические операторы сравнения:
| Оператор | Описание |
| :--- | :--- |
| = | Равно |
| <> или != | Не равно |
| > | Больше |
| < | Меньше |
| >= | Больше или равно |
| <= | Меньше или равно |
Пример: найти сотрудников с зарплатой выше 50 000.
Логические операторы (AND, OR, NOT)
Условия можно комбинировать.
* AND (И): Строка выбирается, только если оба условия истинны. * OR (ИЛИ): Строка выбирается, если хотя бы одно из условий истинно. * NOT (НЕ): Инвертирует условие.
Пример: найти сотрудников из отдела 'IT', у которых зарплата больше 60 000.
Важно: Приоритет AND выше, чем OR. Если вы смешиваете эти операторы, всегда используйте скобки для явного указания порядка выполнения, чтобы избежать логических ошибок.
Специальные операторы фильтрации
#### BETWEEN
Используется для проверки диапазона значений (включительно).
Это эквивалентно записи salary >= 40000 AND salary <= 60000.
#### IN
Проверяет, входит ли значение в заданный список.
Это намного компактнее, чем писать цепочку из OR.
#### LIKE
Используется для поиска по шаблону в строках. Работает с двумя спецсимволами:
* % — любая последовательность символов (любой длины).
* _ — ровно один любой символ.
Пример: найти всех сотрудников, чья фамилия начинается на "S".
Пример: найти сотрудников, у которых вторая буква в имени "a".
В PostgreSQL оператор LIKE чувствителен к регистру. Для поиска без учета регистра используется ILIKE.
#### IS NULL
В базах данных существует специальное значение NULL, которое означает «отсутствие значения» или «неизвестно». NULL не равен нулю, пустой строке или даже самому себе.
Ошибка: WHERE bonus = NULL (никогда ничего не вернет).
Правильно: WHERE bonus IS NULL.
Пример: найти сотрудников, у которых не указан бонус.
Для поиска заполненных полей используется IS NOT NULL.
Сортировка данных: Оператор ORDER BY
Порядок строк в результате SQL-запроса не гарантирован, если вы явно не попросили их отсортировать. Для этого используется ORDER BY.
Направление сортировки
* ASC (Ascending) — по возрастанию (от А до Я, от 0 до 9). Это значение по умолчанию.
* DESC (Descending) — по убыванию (от Я до А, от 9 до 0).
Пример: отсортировать сотрудников по зарплате от самой высокой к самой низкой.
Сортировка по нескольким столбцам
Можно сортировать данные по нескольким критериям последовательно. Сначала строки сортируются по первому указанному столбцу. Если значения в первом столбце совпадают, сортировка внутри этой группы идет по второму столбцу.
В этом примере сначала все записи будут сгруппированы по отделам в алфавитном порядке. Внутри каждого отдела сотрудники будут выстроены по убыванию зарплаты.
Ограничение количества строк: LIMIT и OFFSET
Иногда таблица содержит миллионы строк, а нам нужно посмотреть только топ-10 записей или реализовать постраничную навигацию (пагинацию).
* LIMIT N — возвращает только первые N строк результата.
* OFFSET M — пропускает первые M строк перед возвратом результата.
Пример: найти 5 сотрудников с самой высокой зарплатой.
Пример: получить вторую страницу результатов (если на странице по 10 записей).
Важно: Всегда используйте ORDER BY вместе с LIMIT/OFFSET, иначе набор возвращаемых строк может быть непредсказуемым при повторных запусках запроса.
Порядок выполнения запроса
Для понимания работы SQL критически важно знать, в каком порядке СУБД обрабатывает ваш запрос. Этот порядок отличается от того, как вы пишете код.
Вы пишете:
SELECTFROMWHEREORDER BYLIMITСУБД выполняет:
!Логический порядок выполнения операций в SQL
Именно поэтому вы не можете использовать псевдоним, заданный в SELECT, внутри секции WHERE. На момент работы WHERE псевдоним еще не создан.
Ошибка:
Правильно:
Итоги
SELECT определяет столбцы (проекцию), а FROM — источник данных (таблицу). Избегайте SELECT * в продакшене.AND, OR) и специальные операторы (IN, BETWEEN, LIKE).IS NULL или IS NOT NULL.ASC), для убывания используйте DESC.WHERE) происходит до вычисления результатов (SELECT), поэтому псевдонимы столбцов недоступны в условиях фильтрации.