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

Ответ

Команды 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;

Ответ 18+ 🔞

Давай разберем эту всю хуйню про 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: Поставить контрольную точку внутри долгой операции. Типа «сохраниться», чтобы в случае чего откатиться не полностью, а только до сюда.

А вот тебе пример, где всё вместе, как в хорошем стейк-хаусе:

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;

Смотри, какой красавчик-запрос: выбираем страны, считаем заказы за год, отфильтровываем только тех, у кого больше 10 штук, и выводим топ-5. Чистая магия DML, без единого DROP TABLE, слава богу.