← Назад к вопросам

Какие SQL-команды знаешь?

1.3 Junior🔥 161 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SQL команды

SQL (Structured Query Language) — язык запросов к базам данных. Владение SQL критично для системного аналитика при проектировании и анализе систем хранения данных. Разберу основные категории команд.

DDL (Data Definition Language) — Определение структуры

Команды для создания и изменения структуры БД.

CREATE — создание объектов

CREATE TABLE Users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100),
  email VARCHAR(100) UNIQUE,
  created_at TIMESTAMP
);

CREATE INDEX idx_email ON Users(email);

CREATE VIEW active_users AS
SELECT * FROM Users WHERE active = true;

ALTER — изменение структуры

ALTER TABLE Users
ADD COLUMN phone VARCHAR(20);

ALTER TABLE Users
DROP COLUMN phone;

ALTER TABLE Users
MODIFY COLUMN name VARCHAR(150);

DROP — удаление объектов

DROP TABLE Users;
DROP INDEX idx_email ON Users;
DROP VIEW active_users;

TRUNCATE — очистка таблицы (быстрее DELETE)

TRUNCATE TABLE Users;  -- Удаляет все строки, сбрасывает counter

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

Команды для работы с данными.

SELECT — получение данных

-- Базовый SELECT
SELECT id, name, email FROM Users;

-- С условиями
SELECT * FROM Users WHERE age > 18 AND city = 'Moscow';

-- С сортировкой и лимитом
SELECT * FROM Users ORDER BY created_at DESC LIMIT 10;

-- С JOIN (объединение таблиц)
SELECT Users.name, Orders.order_id
FROM Users
JOIN Orders ON Users.id = Orders.user_id;

-- С GROUP BY и агрегацией
SELECT city, COUNT(*) as user_count
FROM Users
GROUP BY city
HAVING COUNT(*) > 5;

INSERT — добавление данных

-- Одна строка
INSERT INTO Users (name, email)
VALUES ('Ivan', 'ivan@example.com');

-- Множество строк
INSERT INTO Users (name, email) VALUES
('Ivan', 'ivan@example.com'),
('Maria', 'maria@example.com'),
('Alex', 'alex@example.com');

-- Вставка из другой таблицы
INSERT INTO Users_Archive
SELECT * FROM Users WHERE created_at < '2020-01-01';

UPDATE — изменение данных

-- Обновление конкретной записи
UPDATE Users
SET email = 'newemail@example.com'
WHERE id = 5;

-- Обновление с условием
UPDATE Users
SET status = 'inactive'
WHERE last_login < DATE_SUB(NOW(), INTERVAL 6 MONTH);

-- Обновление с вычислением
UPDATE Orders
SET total = price * quantity
WHERE total IS NULL;

DELETE — удаление данных

-- Удаление конкретной записи
DELETE FROM Users WHERE id = 5;

-- Удаление с условием
DELETE FROM Orders
WHERE status = 'cancelled' AND created_at < '2020-01-01';

-- ВАЖНО: Без WHERE удалит всё!
DELETE FROM Users;  -- ОПАСНО!!!

DCL (Data Control Language) — Управление доступом

Команды для прав доступа.

GRANT — выдача прав

GRANT SELECT, INSERT ON database.* TO 'user'@'localhost';
GRANT ALL PRIVILEGES ON database.* TO 'admin'@'%';

REVOKE — отзыв прав

REVOKE DELETE ON database.* FROM 'user'@'localhost';

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

Команды для работы с транзакциями.

BEGIN/START TRANSACTION — начало транзакции

BEGIN;
-- Команды внутри транзакции

COMMIT — подтверждение всех изменений

BEGIN;
UPDATE Accounts SET balance = balance - 100 WHERE id = 1;
UPDATE Accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- Обе операции выполнены

ROLLBACK — отмена всех изменений в транзакции

BEGIN;
UPDATE Users SET status = 'deleted';
ROLLBACK;  -- Отмена изменений

SAVEPOINT — точка сохранения внутри транзакции

BEGIN;
UPDATE Users SET ...;
SAVEPOINT sp1;
UPDATE Orders SET ...;
ROLLBACK TO sp1;  -- Отмена только второй операции
COMMIT;

Полезные встроенные функции

Агрегирующие функции:

SELECT
  COUNT(*) as total_users,      -- Количество строк
  SUM(amount) as total_amount,   -- Сумма
  AVG(age) as average_age,       -- Среднее
  MIN(price) as min_price,       -- Минимум
  MAX(price) as max_price        -- Максимум
FROM Users;

Функции для строк:

SELECT
  UPPER(name) as name_upper,      -- Заглавные буквы
  LOWER(email) as email_lower,    -- Строчные буквы
  LENGTH(name) as name_length,    -- Длина
  SUBSTRING(name, 1, 3) as prefix  -- Подстрока
FROM Users;

Функции для дат:

SELECT
  DATE_ADD(created_at, INTERVAL 30 DAY) as due_date,
  DATEDIFF(NOW(), created_at) as days_ago,
  MONTH(created_at) as month,
  YEAR(created_at) as year
FROM Orders;

Важные конструкции

WHERE условия:

-- Сравнение
WHERE age > 18

-- BETWEEN (диапазон)
WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31'

-- IN (список значений)
WHERE city IN ('Moscow', 'SPB', 'Kazan')

-- LIKE (по шаблону)
WHERE email LIKE '%@gmail.com'

-- IS NULL
WHERE phone IS NULL

-- Логические операторы
WHERE age > 18 AND status = 'active' OR city = 'Moscow'

Типы JOIN:

-- INNER JOIN (пересечение)
SELECT * FROM Users
INNER JOIN Orders ON Users.id = Orders.user_id;

-- LEFT JOIN (все из левой таблицы)
SELECT * FROM Users
LEFT JOIN Orders ON Users.id = Orders.user_id;

-- RIGHT JOIN (все из правой таблицы)
SELECT * FROM Users
RIGHT JOIN Orders ON Users.id = Orders.user_id;

-- CROSS JOIN (декартово произведение)
SELECT * FROM Users CROSS JOIN Cities;

Практические примеры

Пример 1: Аналитика заказов

SELECT
  u.name,
  COUNT(o.id) as order_count,
  SUM(o.amount) as total_spent,
  AVG(o.amount) as avg_order
FROM Users u
LEFT JOIN Orders o ON u.id = o.user_id
GROUP BY u.id
HAVING COUNT(o.id) > 0
ORDER BY total_spent DESC;

Пример 2: Поиск неактивных пользователей

SELECT * FROM Users
WHERE last_login < DATE_SUB(NOW(), INTERVAL 6 MONTH)
AND status = 'active';

Пример 3: Миграция архивных данных

BEGIN;
INSERT INTO Orders_Archive
SELECT * FROM Orders
WHERE created_at < '2023-01-01';
DELETE FROM Orders
WHERE created_at < '2023-01-01';
COMMIT;

Совет по производительности

  • Используй INDEX на часто фильтруемые столбцы
  • EXPLAIN перед большими запросами
  • LIMIT для больших результатов
  • Избегай **SELECT *** если не нужны все столбцы
  • Используй JOIN вместо подзапросов если возможно

Заключение

Владение SQL критично для системного аналитика. Я регулярно использую эти команды для анализа данных, проектирования схем БД, отладки проблем и валидации бизнес-логики. Понимание SQL позволяет принимать информированные решения при разработке систем.

Какие SQL-команды знаешь? | PrepBro