Синтаксис 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 без него запрос не выполняется
  • -- и /* */ — два вида комментариев
  • Логический порядок выполнения: FROMWHERESELECTORDER BYLIMIT

Что дальше

Вы разобрали скелет запроса. Следующий шаг — научиться указывать конкретные колонки вместо звёздочки, давать им псевдонимы с помощью AS и управлять тем, что именно возвращается в результате.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике