SQL (Structured Query Language) — это декларативный язык запросов к реляционным базам данных. На нем вы описываете, какой результат нужен (какие строки и столбцы вернуть, что вставить или изменить), а не то, каким алгоритмом система должна этот результат получить. SQL — это именно язык, набор правил и команд, а не программа: исполняет его отдельное приложение — система управления базами данных (СУБД).
Содержание
Ниже разберу, чем язык SQL отличается от СУБД, что значит его декларативность, зачем нужен международный стандарт и почему при этом существуют разные диалекты, а также из каких четырех подмножеств (DDL, DML, DCL, TCL) состоит язык. Это обзор SQL как языка, без углубления в конкретные приемы соединения таблиц.
SQL — это язык, а СУБД — это программа
Эти два понятия часто путают, поэтому разведу их сразу цепочкой:
- SQL — текст стандарта и синтаксис. Сам по себе он ничего не выполняет, это описание того, как формулировать команды.
- СУБД — программа (PostgreSQL, MySQL, SQLite, Microsoft SQL Server, Oracle Database), которая принимает SQL-команду, разбирает ее, строит план выполнения и обращается к файлам данных на диске.
- База данных — конкретное хранилище таблиц, которым управляет СУБД.
То есть одну и ту же команду SELECT * FROM students вы пишете на языке SQL, а выполняют ее разные СУБД — каждая по-своему. Сравнение самих систем (реляционные и NoSQL, как выбрать продукт) — отдельная тема; здесь речь только про язык.
Декларативность: описываем что, а не как
В императивных языках (Python, C++, Java) вы задаете последовательность шагов: открыть коллекцию, пройти циклом, сравнить, положить в результат. В SQL вы описываете сам результат, а способ его получить выбирает оптимизатор запросов внутри СУБД.
SELECT name, email
FROM students
WHERE email IS NOT NULL
ORDER BY name;
Здесь вы не пишете цикл и не указываете, читать ли таблицу целиком или через индекс. Вы описали условие (email заполнен) и порядок (по имени), а решение — использовать индекс, в каком порядке соединять таблицы, сколько памяти взять — принимает планировщик СУБД. Ожидаемый результат: список имен и почт студентов с непустым email, отсортированный по имени.
Граница упрощения: полностью «алгоритм не важен» — неверно. От того, как написан запрос и какие есть индексы, зависит скорость. Но саму пошаговую механику перебора строк вы не программируете — в этом и есть декларативность.
Стандарт SQL и его диалекты
У SQL есть международный стандарт. Первую версию ANSI утвердил в 1986 году, ISO — в 1987; далее выходили редакции SQL-92, SQL:1999, SQL:2003 (оконные функции, работа с XML), SQL:2011 (темпоральные данные), SQL:2016 (поддержка JSON). Актуальная редакция — SQL:2023 (стандарт ISO/IEC 9075), которая добавила запросы к графам свойств (SQL/PGQ) и расширила работу с JSON.
Стандарт задает общее ядро, но каждая СУБД реализует его не полностью и добавляет свои расширения — так появляются диалекты:
| СУБД | Диалект / процедурный язык | Характерная особенность |
|---|---|---|
| PostgreSQL | PL/pgSQL | строгое следование стандарту, богатые типы |
| MySQL / MariaDB | SQL/PSM | популярна для веб-проектов |
| Microsoft SQL Server | T-SQL (Transact-SQL) | своя команда SELECT TOP n |
| Oracle Database | PL/SQL | исторически ROWNUM, свои пакеты |
| SQLite | — | встраиваемая, минимум настроек |
Примеры расхождений диалектов, о которые спотыкаются новички:
- Ограничение числа строк:
LIMIT 10в PostgreSQL и MySQL,SELECT TOP 10 ...в T-SQL, стандартноеFETCH FIRST 10 ROWS ONLYподдержано не везде одинаково. - Склейка строк: стандартный оператор
||, а в SQL Server для этого используют+. - Автоинкремент ключа:
AUTO_INCREMENTв MySQL,SERIALилиGENERATEDв PostgreSQL,IDENTITYв SQL Server, последовательности в Oracle.
Вывод для практики: базовый SELECT ... WHERE ... ORDER BY переносится между СУБД почти без изменений, а расширения и служебные команды часто приходится переписывать под конкретный диалект.
Из чего состоит язык: DDL, DML, DCL, TCL
Команды SQL делят на четыре подмножества по решаемой задаче. Это удобная классификация, а не отдельные языки.
| Подмножество | Расшифровка | Что делает | Основные команды |
|---|---|---|---|
| DDL | Data Definition Language | описывает структуру: таблицы, индексы, схемы | CREATE, ALTER, DROP, TRUNCATE |
| DML | Data Manipulation Language | работает с самими данными в таблицах | SELECT, INSERT, UPDATE, DELETE, MERGE |
| DCL | Data Control Language | управляет правами доступа | GRANT, REVOKE |
| TCL | Transaction Control Language | управляет транзакциями | COMMIT, ROLLBACK, SAVEPOINT |
Иногда SELECT выделяют в отдельную группу DQL (Data Query Language) — это тот же язык, просто другое деление. Ниже — короткий пример на каждое подмножество.
DDL — структура. Создаем таблицу:
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE
);
Команда описывает форму таблицы: три столбца, первичный ключ и требование уникальности email. Данных в таблице после нее еще нет.
DML — данные. Добавляем строку и читаем ее:
INSERT INTO students (id, name, email)
VALUES (1, 'Ivan', 'ivan@example.com');
SELECT name FROM students WHERE id = 1;
-- вернет: Ivan
INSERT кладет запись, SELECT возвращает имя студента с id = 1. UPDATE меняет существующие строки, DELETE удаляет.
DCL — доступ. Выдаем и отзываем права роли:
GRANT SELECT, INSERT ON students TO analyst;
REVOKE INSERT ON students FROM analyst;
После этих команд роль analyst может читать таблицу и добавлять строки, но право на вставку затем отозвано — остается только чтение. Команда DENY (явный запрет) есть в T-SQL от Microsoft, но в стандарт SQL не входит — это пример диалектного расширения.
TCL — транзакции. Группируем изменения в одну атомарную операцию:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- при ошибке между шагами: ROLLBACK
Перевод денег между счетами должен пройти целиком или не пройти вовсе. COMMIT фиксирует оба изменения разом; если между шагами возникла ошибка, ROLLBACK откатывает транзакцию к состоянию до BEGIN. SAVEPOINT ставит промежуточную точку, к которой можно откатиться частично. Тут снова видны диалекты: стандартное начало транзакции — START TRANSACTION, но многие СУБД принимают BEGIN, а в T-SQL пишут BEGIN TRANSACTION.
Где применяется SQL
SQL — не язык общего назначения: игру или мобильное приложение целиком на нем не напишешь. Его задача — работа с табличными данными, и она встречается почти везде:
- Бэкенд веб-сервисов и приложений: почти любое хранение данных о пользователях, заказах, товарах идет через SQL-запросы.
- Аналитика и отчеты: аналитики и маркетологи выбирают и агрегируют данные напрямую, не отвлекая разработчиков.
- Тестирование: проверка состояния базы до и после действий приложения.
- Внутренние инструменты: выгрузки, дашборды, разовые проверки данных руководителями.
Знание SQL полезно широкому кругу специалистов именно потому, что он декларативный и читается близко к английскому: порог входа в базовые запросы ниже, чем в языки программирования общего назначения.
Выводы
- SQL — это декларативный язык запросов: вы описываете нужный результат, а как его получить, решает СУБД.
- Язык SQL и СУБД — разные вещи: SQL это набор команд и стандарт, а PostgreSQL, MySQL, SQL Server, Oracle, SQLite — программы, которые его исполняют.
- Есть международный стандарт (актуальная редакция SQL:2023) и надстроенные над ним диалекты (T-SQL, PL/SQL, PL/pgSQL) с расширениями и расхождениями.
- Команды делятся на четыре подмножества: DDL (структура), DML (данные), DCL (доступ), TCL (транзакции).
- SQL применяется везде, где есть табличные данные: бэкенд, аналитика, тестирование, внутренние отчеты.
Где применяется / связь с практикой
Освойте тему на практике
Разобраться в подмножествах и диалектах удобнее на практике: написать свои CREATE и SELECT, разграничить права через GRANT, обернуть изменения в транзакцию и увидеть разницу поведения в разных СУБД. Системно этот путь — от базовых запросов до проектирования схем и оптимизации — выстроен на курсе SQL в Otus. Прежде чем выбирать программу, стоит зайти на бесплатные открытые уроки и вживую посмотреть формат и уровень.
FAQ
SQL — это язык программирования?
Это специализированный декларативный язык запросов, а не язык общего назначения. Написать на чистом SQL полноценное приложение нельзя, но процедурные расширения диалектов (PL/pgSQL, T-SQL, PL/SQL) добавляют переменные, условия и циклы.
Чем отличается SQL от MySQL?
SQL — это язык и стандарт, а MySQL — конкретная СУБД (программа), которая понимает SQL. Аналогично PostgreSQL, SQL Server и Oracle: все это программы-исполнители, а не разные языки.
Нужно ли учить SQL под каждую СУБД отдельно?
Базовое ядро (SELECT, INSERT, UPDATE, DELETE, JOIN, GROUP BY) переносится между СУБД почти без изменений. Различаются в основном служебные команды, функции и синтаксис ограничения выборки — их доучивают под нужный диалект.



