Какие основные группы команд SQL вы знаете?

«Какие основные группы команд SQL вы знаете?» — вопрос из категории SQL, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команды SQL традиционно делятся на несколько групп по их назначению.

1. DDL (Data Definition Language) — Язык определения данных. Работа со структурой объектов БД (схемой).

  • CREATE: Создание новых объектов (таблиц, индексов, представлений).
    CREATE TABLE users (
        id INT PRIMARY KEY,
        username VARCHAR(50) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  • ALTER: Изменение существующей структуры.
    ALTER TABLE users ADD COLUMN email VARCHAR(100);
  • DROP: Полное удаление объекта из БД.
    DROP TABLE temp_data;
  • TRUNCATE: Быстрая очистка всех данных из таблицы с сохранением ее структуры. Нельзя откатить (в большинстве СУБД).
    TRUNCATE TABLE session_logs;

2. DML (Data Manipulation Language) — Язык управления данными. Операции над самими данными (строками).

  • SELECT: Извлечение данных. Самая часто используемая команда.
  • INSERT: Добавление новых записей.
    INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');
  • UPDATE: Изменение существующих записей.
    UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
  • DELETE: Удаление записей с возможностью фильтрации WHERE. В отличие от TRUNCATE, операцию можно откатить.
    DELETE FROM users WHERE created_at < '2020-01-01';

3. DCL (Data Control Language) — Язык управления доступом. Управление правами пользователей.

  • GRANT: Предоставление прав на объекты или операции.
    GRANT SELECT, INSERT ON orders TO analyst_role;
  • REVOKE: Отзыв ранее выданных прав.
    REVOKE DELETE ON users FROM intern_role;

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

  • COMMIT: Фиксация изменений в БД.
  • ROLLBACK: Откат изменений до состояния последнего COMMIT.
  • SAVEPOINT: Установка точки сохранения внутри транзакции для частичного отката.

Пример комплексного DML-запроса:

SELECT 
    c.country,
    COUNT(o.id) AS total_orders,
    AVG(o.total_amount) AS avg_order_value
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'completed'
    AND o.order_date >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
GROUP BY c.country
HAVING COUNT(o.id) > 10
ORDER BY total_orders DESC
LIMIT 5;