Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 позволяет принимать информированные решения при разработке систем.