Синтаксис SELECT и структура запроса
Синтаксис SELECT и структура запроса
В первом модуле вы узнали, что такое базы данных, как устроена реляционная модель, что такое SQL и его диалекты, как установить и запустить СУБД, а также выполнили самый первый запрос — SELECT * FROM tablename. Теперь пора разобрать этот запрос по косточкам и понять, как SQL-запрос устроен изнутри. Это фундамент, без которого все остальные конструкции языка повисают в воздухе.
Анатомия SELECT-запроса
Запрос к базе данных — это структурированный вопрос. SQL требует, чтобы вопрос был задан в строго определённом порядке. Базовая структура SELECT-запроса выглядит так:
SELECT колонки
FROM таблица;
Это минимально работающий запрос. Оба ключевых слова обязательны: SELECT говорит «что именно вернуть», FROM говорит «откуда брать».
Пример на реальных данных. Представьте таблицу employees с колонками id, name, department, salary. Запрос:
SELECT *
FROM employees;
Вернёт все строки и все колонки. Звёздочка * — это сокращение для «всех колонок», но конкретные имена мы разберём в следующем уроке.
Порядок ключевых слов — жёсткий
Это важно понять сразу: в SQL ключевые слова должны следовать в строго определённом порядке. Нельзя написать FROM employees SELECT * — это синтаксическая ошибка. Движок ожидает именно такую последовательность: сначала SELECT, потом FROM.
Полный синтаксис SELECT-запроса, который мы будем изучать на протяжении всего курса, выглядит так:
SELECT ... -- что возвращаем
FROM ... -- откуда берём
WHERE ... -- фильтр строк
ORDER BY ... -- сортировка
LIMIT ... -- ограничение числа строк
Каждое из этих ключевых слов — отдельная «клауза» (clause). Клаузы необязательные (кроме SELECT и FROM), но их порядок нельзя менять. Сейчас в фокусе первые две — SELECT и FROM. Остальные мы освоим в следующих уроках.
Регистр и форматирование
SQL нечувствителен к регистру для ключевых слов. Три записи ниже полностью эквивалентны:
SELECT * FROM employees;
select * from employees;
Select * From Employees;
Тем не менее по общепринятому соглашению ключевые слова пишут ЗАГЛАВНЫМИ, а имена таблиц и колонок — строчными. Это помогает мгновенно различать «часть языка» и «часть данных».
SQL также игнорирует лишние пробелы и переносы строк. Следующие два запроса выполнятся одинаково:
SELECT * FROM employees;
SELECT *
FROM employees;
Длинные запросы принято форматировать в несколько строк — это улучшает читаемость. Каждую клаузу обычно начинают с новой строки и выравнивают ключевые слова по правому краю (как в примере выше).
Проверь себя: выдаст ли ошибку запрос select * from EMPLOYEES? Почему?
Точка с запятой: разделитель команд
Точка с запятой ; в SQL — это конец команды, не конец строки. В psql запрос не выполняется, пока не встретит ;. Это позволяет писать длинные запросы в несколько строк:
SELECT
id,
name
FROM
employees
;
В некоторых инструментах (онлайн-песочницы, GUI-клиенты вроде DBeaver) при наличии одного запроса точку с запятой можно не ставить. Но при нескольких запросах в одном поле ввода ; обязательна:
SELECT * FROM employees;
SELECT * FROM departments;
Без ; между запросами второй будет воспринят как продолжение первого, и вы получите синтаксическую ошибку.
Комментарии в запросах
Иногда нужно оставить заметку прямо в SQL — объяснить логику или временно отключить часть запроса. Для этого есть два вида комментариев:
-- Это однострочный комментарий
SELECT * FROM employees; -- вся таблица
/* Это
многострочный
комментарий */
SELECT * FROM departments;
-- (два дефиса) комментируют всё до конца строки. /* ... */ — блочный комментарий, может занимать несколько строк. Всё внутри комментария полностью игнорируется СУБД.
Откуда берётся таблица: схемы
В PostgreSQL таблицы организованы в схемы (schemas) — это как папки для таблиц внутри одной базы данных. По умолчанию все ваши таблицы находятся в схеме public. Запрос SELECT * FROM employees — это на самом деле сокращение для SELECT * FROM public.employees.
В большинстве случаев указывать схему не нужно. Но если в базе несколько схем, явное указание помогает избежать путаницы:
SELECT * FROM public.employees;
SELECT * FROM hr.employees; -- таблица employees из схемы hr
В SQLite схем нет — там одна «плоская» база, и все таблицы доступны напрямую по имени.
Что происходит внутри: логический порядок обработки
Когда вы отправляете запрос, база данных обрабатывает его не в том порядке, в котором вы его написали. Логический порядок выполнения:
1. FROM — определить источник данных (какие строки доступны)
2. WHERE — отфильтровать строки
3. SELECT — выбрать и вычислить колонки
4. ORDER BY — отсортировать результат
5. LIMIT — ограничить число строк
Сначала база «смотрит» в FROM, получает набор строк, потом применяет фильтры, и только потом выбирает нужные колонки для вывода. Это объясняет, почему нельзя использовать псевдоним из SELECT в WHERE — на момент выполнения WHERE псевдонимы ещё не назначены. Эта тонкость станет понятнее, когда мы дойдём до соответствующих уроков.
Пока держите в голове простое правило: SELECT выполняется позже, чем FROM.
Результат запроса — тоже таблица
Вот концепция, которая пронизывает весь SQL: результат любого SELECT-запроса — это таблица. Не строка, не список, не объект — именно таблица, у которой есть строки и колонки.
Это важно потому, что результат одного запроса можно использовать как источник для другого. В реляционной модели таблицы — универсальный «формат данных», и именно это делает SQL таким гибким. Пока достаточно просто запомнить: SELECT возвращает таблицу результатов, называемую result set.
Когда СУБД выполняет SELECT * FROM employees, она читает таблицу employees, «копирует» все строки и колонки в result set, и возвращает его клиенту. Исходная таблица при этом не меняется.
Имена таблиц и колонок: правила
PostgreSQL хранит имена таблиц и колонок как строки. Есть несколько правил:
- Имена начинаются с буквы или
_, не с цифры - Могут содержать буквы, цифры,
_ - PostgreSQL по умолчанию приводит имена к нижнему регистру:
Employeesиemployees— одно и то же - Если нужно сохранить регистр или использовать пробелы, имя берётся в двойные кавычки:
"My Table"
На практике следует придерживаться строчных букв и _ в именах — это исключает любую путаницу с регистром:
SELECT * FROM employee_data; -- хорошо
SELECT * FROM "Employee Data"; -- работает, но неудобно
В SQLite правила схожие, но реализация регистронезависимости немного отличается для нелатинских символов.
Несколько запросов в одном сеансе
В psql вы можете выполнять запросы один за другим, не выходя из сессии. Каждый запрос независим. Результат предыдущего не влияет на следующий. Введите несколько запросов подряд:
SELECT * FROM books;
SELECT * FROM employees;
psql выполнит их последовательно и покажет результат каждого. В онлайн-инструментах при наличии нескольких запросов они разделяются ;, и инструмент обычно показывает результат последнего или каждого — в зависимости от настроек.
Базовые запросы к системным данным
Иногда нужно быстро проверить, как работает выражение, без обращения к конкретной таблице. В PostgreSQL для этого используется специальная «таблица» dual ... которой нет. Вместо неё PostgreSQL позволяет SELECT без FROM:
SELECT 1 + 1;
SELECT 'hello';
SELECT NOW(); -- текущее время
Это работает только в PostgreSQL и некоторых других СУБД. В SQLite аналогично. В MySQL раньше требовалась псевдотаблица DUAL, но современные версии тоже позволяют без неё. Такие запросы полезны для быстрой проверки выражений прямо в консоли.
Проверь себя: что вернёт запрос SELECT 2 * 3; в PostgreSQL?
Типичные ошибки синтаксиса
Три ошибки, которые делают почти все в начале:
1. Перепутан порядок клауз:
FROM employees SELECT *; -- ошибка!
SELECT * employees; -- ошибка, пропущено FROM
2. Опечатка в имени таблицы:
SELECT * FROM employes; -- ошибка: таблицы с таким именем нет
PostgreSQL ответит: ERROR: relation "employes" does not exist. «Relation» — внутренний термин PostgreSQL для таблицы.
3. Запрос без точки с запятой (в psql):
SELECT * FROM employees -- psql ждёт продолжения
После нажатия Enter вы увидите postgres-# вместо результата. Добавьте ; и нажмите Enter ещё раз.
Краткий итог
- Базовая структура:
SELECT колонки FROM таблица; - Порядок ключевых слов в SQL фиксирован — его нельзя менять
- SQL нечувствителен к регистру ключевых слов, но принято писать их ЗАГЛАВНЫМИ
;— разделитель команд; в psql без него запрос не выполняется--и/* */— два вида комментариев- Логический порядок выполнения:
FROM→WHERE→SELECT→ORDER BY→LIMIT
Что дальше
Вы разобрали скелет запроса. Следующий шаг — научиться указывать конкретные колонки вместо звёздочки, давать им псевдонимы с помощью AS и управлять тем, что именно возвращается в результате.