Перейти к содержимому
Что такое SQL

Что такое SQL

SQL — декларативный язык для работы с реляционными БД. Описывает "что" получить, а не "как". Категории команд: DDL (CREATE, ALTER, DROP — структура), DML (SELECT, INSERT, UPDATE, DELETE — данные), DCL (GRANT, REVOKE — права), TCL (BEGIN, COMMIT, ROLLBACK — транзакции). Порядок выполнения запроса отличается от синтаксического: FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT. Примеры, визуальная схема. Почему SQL жив 50 лет: декларативность, реляционная алгебра, стандартизация, мощность, оптимизация.

Введение: Язык, который понимают все базы данных

Представьте, что вы хотите спросить у коллеги: “Сколько у нас заказов от клиентов из Москвы за последний месяц?” Если коллега говорит по-русски, вы задаете вопрос по-русски. Если по-английски — по-английски. Проблема в том, что базы данных не говорят ни по-русски, ни по-английски.

Им нужен специальный язык. Язык, который понимают и PostgreSQL, и MySQL, и Oracle, и SQL Server. Язык, который одинаково хорошо описывает и простые вопросы (“найти клиента по ID”), и сложные аналитические запросы (“показать динамику продаж по категориям товаров за последние 5 лет”).

SQL (Structured Query Language) — это язык для работы с реляционными базами данных. На нем вы:

  • Спрашиваете: “Дай мне данные, которые удовлетворяют таким-то условиям”
  • Командуете: “Добавь новую запись”, “Обнови существующую”, “Удали ненужное”
  • Создаете: “Создай таблицу для хранения клиентов”
  • Управляете: “Дай пользователю Ивану права на чтение этой таблицы”

SQL появился в 1970-х годах в лабораториях IBM и с тех пор стал стандартом индустрии. Он декларативный — вы описываете что хотите получить, а не как это сделать. База данных сама решает, как эффективно выполнить ваш запрос.

Декларативный vs Императивный

Это самое важное, что нужно понять о SQL.

Императивный подход (как)

Вы описываете последовательность действий:

# Python (императивный) — как найти пользователей из Москвы старше 18 лет
result = []
for user in all_users:
    if user.city == "Москва" and user.age > 18:
        result.append(user)

Вы говорите компьютеру: “Сделай так, потом так, потом проверь условие, потом добавь в список”. Вы управляете процессом.

Декларативный подход (что)

Вы описываете желаемый результат:

-- SQL (декларативный) — как найти пользователей из Москвы старше 18 лет
SELECT * FROM users WHERE city = 'Москва' AND age > 18;

Вы говорите: “Дай мне всех пользователей, у которых город Москва и возраст больше 18”. Как это сделать (использовать индекс или сканировать таблицу, в каком порядке проверять условия) решает база данных.

Почему это важно

АспектИмперативный (Python, Java, C++)Декларативный (SQL)
Что пишет программистАлгоритм (шаги)Результат (условия)
Кто решает “как”ПрограммистБаза данных (оптимизатор)
Зависимость от данныхВысокая (приходится переписывать)Низкая (оптимизатор подстраивается)
ПереносимостьНизкая (разные алгоритмы для разных БД)Высокая (SQL везде похож)

История SQL

ГодСобытие
1970Эдгар Кодд публикует статью о реляционной модели данных
1974В IBM создают SEQUEL (Structured English Query Language)
1979Oracle выпускает первую коммерческую реализацию SQL
1986SQL становится стандартом ANSI
1987Стандарт ISO
1992SQL-92 (масштабное обновление)
1999SQL:1999 (рекурсивные запросы, триггеры)
2003SQL:2003 (оконные функции, XML)
2011SQL:2011 (темпоральные данные)
2016SQL:2016 (JSON)

Сегодня существует много диалектов SQL. Код, написанный для PostgreSQL, может не работать в MySQL без изменений. Но основные конструкции (SELECT, FROM, WHERE, JOIN, GROUP BY) одинаковы везде.

Категории команд SQL

DDL (Data Definition Language) — определение данных

Создание и изменение структуры базы данных.

КомандаНазначениеПример
CREATEСоздать таблицу, индекс, представлениеCREATE TABLE users (id INT, name TEXT);
ALTERИзменить структуру таблицыALTER TABLE users ADD COLUMN email TEXT;
DROPУдалить таблицу, индекс, представлениеDROP TABLE users;
TRUNCATEОчистить таблицу (удалить все строки)TRUNCATE TABLE logs;

DML (Data Manipulation Language) — манипуляция данными

Чтение и изменение данных.

КомандаНазначениеПример
SELECTЧтение данныхSELECT * FROM users WHERE age > 18;
INSERTДобавление строкINSERT INTO users (name) VALUES ('Иван');
UPDATEОбновление строкUPDATE users SET age = 30 WHERE name = 'Иван';
DELETEУдаление строкDELETE FROM users WHERE age < 18;

DCL (Data Control Language) — контроль доступа

Управление правами пользователей.

КомандаНазначениеПример
GRANTДать праваGRANT SELECT ON users TO analyst;
REVOKEЗабрать праваREVOKE INSERT ON users FROM public;

TCL (Transaction Control Language) — управление транзакциями

Управление транзакциями (будет подробно в отдельной теме).

КомандаНазначениеПример
BEGINНачать транзакциюBEGIN;
COMMITЗафиксировать измененияCOMMIT;
ROLLBACKОтменить измененияROLLBACK;
SAVEPOINTУстановить точку откатаSAVEPOINT sp1;

Простейший SQL запрос

-- Выбрать все столбцы из таблицы users
SELECT * FROM users;

-- Выбрать только имя и email
SELECT name, email FROM users;

-- Выбрать с условием
SELECT name, email FROM users WHERE city = 'Москва';

-- Выбрать с сортировкой
SELECT name, age FROM users ORDER BY age DESC;

-- Выбрать с ограничением количества
SELECT name FROM users LIMIT 10;

Порядок выполнения SQL запроса

Это одна из самых важных тем для понимания SQL. То, как вы пишете запрос, и то, как база данных его выполняет, — это разные порядки.

Как мы пишем (синтаксический порядок)

SELECT DISTINCT 
    u.name,
    COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.city = 'Москва'
    AND o.created_at > '2024-01-01'
GROUP BY u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC
LIMIT 10;

Как выполняется (логический порядок)

    graph TD
    A[1 FROM + JOIN] --> B[2 WHERE]
    B --> C[3 GROUP BY]
    C --> D[4 HAVING]
    D --> E[5 SELECT]
    E --> F[6 DISTINCT]
    F --> G[7 ORDER BY]
    G --> H[8 LIMIT / OFFSET]
  
ШагКлючевое словоЧто происходит
1FROM + JOINОпределяется набор данных. Соединяются таблицы, создается “виртуальная таблица” со всеми колонками из всех JOIN
2WHEREФильтрация строк. Отбрасываются строки, не удовлетворяющие условию. Здесь еще нет доступа к алиасам из SELECT
3GROUP BYГруппировка. Строки объединяются в группы по указанным колонкам
4HAVINGФильтрация групп. Отбрасываются группы, не удовлетворяющие условию. Здесь уже можно использовать агрегатные функции
5SELECTВычисление выражений. Создаются алиасы колонок, вычисляются скалярные функции
6DISTINCTУдаление дубликатов из результата
7ORDER BYСортировка результата. Здесь уже можно использовать алиасы из SELECT
8LIMIT / OFFSETОграничение количества строк. Выбрасываются строки за пределами лимита

Почему это важно знать

Ошибка 1: Использование алиаса в WHERE

-- Так нельзя (WHERE выполняется до SELECT)
SELECT name, age * 12 AS age_months FROM users WHERE age_months > 240;

-- Так можно
SELECT name, age * 12 AS age_months FROM users WHERE age * 12 > 240;

Ошибка 2: Использование агрегатной функции в WHERE

-- Так нельзя (WHERE выполняется до GROUP BY)
SELECT department, AVG(salary) FROM employees WHERE AVG(salary) > 50000 GROUP BY department;

-- Так можно (HAVING выполняется после GROUP BY)
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 50000;

Ошибка 3: Использование алиаса в GROUP BY

-- В некоторых СУБД нельзя, в некоторых можно
SELECT name, age * 12 AS age_months FROM users GROUP BY name, age_months;

-- Безопасный вариант
SELECT name, age * 12 AS age_months FROM users GROUP BY name, age * 12;

Ошибка 4: Использование LIMIT без ORDER BY

-- Непонятно, какие 10 строк будут выбраны
SELECT * FROM users LIMIT 10;

-- Правильно: сначала сортируем, потом ограничиваем
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;

Визуальный пример порядка выполнения

Запрос:

SELECT 
    u.name,
    COUNT(o.id) as orders
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.city = 'Москва'
GROUP BY u.name
HAVING COUNT(o.id) > 2
ORDER BY orders DESC;

Шаг 1: FROM + JOIN

Создается виртуальная таблица со всеми колонками из users и orders.

u.idu.nameu.cityo.ido.user_ido.amount
1ИванМосква1011500
1ИванМосква1021300
2ПетрСПб1032700
3АннаМосква1043200
3АннаМосква1053400
3АннаМосква1063100

Шаг 2: WHERE

Оставляем только Москву.

u.idu.nameu.cityo.ido.user_ido.amount
1ИванМосква1011500
1ИванМосква1021300
3АннаМосква1043200
3АннаМосква1053400
3АннаМосква1063100

Шаг 3: GROUP BY

Группировка по имени.

u.nameГруппа
Иван[строки 1-2]
Анна[строки 3-5]

Шаг 4: HAVING

Оставляем только тех, у кого COUNT(o.id) > 2.

u.nameCOUNT(o.id)Подходит?
Иван2Нет (не больше 2)
Анна3Да

Шаг 5: SELECT

Вычисляем выражения.

nameorders
Анна3

Шаг 6: DISTINCT

Нет DISTINCT — пропускаем.

Шаг 7: ORDER BY

Сортировка по orders DESC.

nameorders
Анна3

Шаг 8: LIMIT

Нет LIMIT — пропускаем.

Почему SQL жив уже 50 лет

ПричинаОбъяснение
ДекларативностьВы говорите “что”, а не “как”. База данных сама находит лучший способ выполнения
Математическая основаРеляционная алгебра — строгая, предсказуемая, формальная
СтандартизацияЕдиный язык для разных баз данных
МощностьОдин запрос может заменить тысячи строк императивного кода
ОптимизацияОптимизаторы запросов становятся умнее, код на SQL не нужно переписывать
ЭкосистемаBI-инструменты (Tableau, Power BI), ORM (SQLAlchemy, Hibernate) — все говорят на SQL

Резюме для системного аналитика

  1. SQL (Structured Query Language) — язык для работы с реляционными базами данных. Декларативный: вы описываете “что” получить, а не “как”.

  2. Категории команд: DDL (структура), DML (данные), DCL (права), TCL (транзакции). Аналитик чаще всего работает с DML (SELECT, INSERT, UPDATE, DELETE).

  3. Порядок выполнения SQL запроса отличается от порядка написания: FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT. Это критически важно для понимания, почему одни запросы работают, а другие — нет.

Проверка знаний

Вопрос 1 из 4
Что такое SQL?
Что означает, что SQL декларативный?
Какие классы команд есть в SQL?
Почему аналитику важно понимать SQL?

Вопросы, где были ошибки