Ответ
Команды 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, слава богу.