Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
SQL команды: полный обзор для Data Analyst
SQL состоит из нескольких групп команд, каждая из которых решает разные задачи. Как Data Analyst, я работаю с ними ежедневно.
1. DML (Data Manipulation Language) — манипуляция данными
Это команды для работы с данными:
-- SELECT: выборка данных
SELECT name, salary FROM employees WHERE department = 'Sales';
-- INSERT: вставка новых строк
INSERT INTO employees (name, salary, department)
VALUES ('Иван', 50000, 'IT');
-- UPDATE: обновление существующих данных
UPDATE employees SET salary = 55000 WHERE employee_id = 5;
-- DELETE: удаление строк
DELETE FROM employees WHERE department = 'HR';
2. DDL (Data Definition Language) — определение структуры
Для создания и изменения структуры БД:
-- CREATE TABLE: создание таблицы
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10,2),
hire_date DATE,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id)
);
-- ALTER TABLE: изменение структуры
ALTER TABLE employees ADD COLUMN phone VARCHAR(20);
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2);
ALTER TABLE employees DROP COLUMN phone;
-- CREATE INDEX: создание индекса
CREATE INDEX idx_department_id ON employees(department_id);
-- DROP TABLE: удаление таблицы
DROP TABLE employees;
-- CREATE VIEW: создание представления
CREATE VIEW high_earners AS
SELECT * FROM employees WHERE salary > 100000;
3. DQL (Data Query Language) — запросы данных
Всё, что нужно для аналитики:
WHERE и фильтрация
-- Простые условия
SELECT * FROM sales WHERE amount > 1000 AND status = 'completed';
SELECT * FROM orders WHERE year IN (2023, 2024, 2025);
SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM logs WHERE created_date BETWEEN '2024-01-01' AND '2024-12-31';
GROUP BY и агрегация
-- Агрегирование по группам
SELECT
department,
COUNT(*) as employee_count,
AVG(salary) as avg_salary,
MAX(salary) as max_salary,
MIN(salary) as min_salary,
SUM(salary) as total_salary
FROM employees
GROUP BY department;
-- Фильтрация после группировки
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
JOIN: соединение таблиц
-- INNER JOIN: только совпадающие
SELECT e.name, d.department_name, e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
-- LEFT JOIN: все из левой таблицы
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- RIGHT JOIN: все из правой таблицы
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
-- FULL OUTER JOIN: все с обеих сторон
SELECT e.name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
-- CROSS JOIN: декартово произведение
SELECT e.name, p.product_name
FROM employees e
CROSS JOIN products p;
ORDER BY и LIMIT
-- Сортировка
SELECT name, salary FROM employees
ORDER BY salary DESC, name ASC;
-- Ограничение результатов
SELECT * FROM users LIMIT 10 OFFSET 20;
UNION и подзапросы
-- UNION: объединение результатов
SELECT name FROM employees
UNION
SELECT name FROM contractors;
-- Подзапрос (Subquery)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Подзапрос с IN
SELECT name FROM employees
WHERE department_id IN (
SELECT id FROM departments WHERE location = 'Moscow'
);
Window functions (оконные функции) — мощный инструмент
-- ROW_NUMBER: порядковый номер
SELECT
name,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) as salary_rank
FROM employees;
-- RANK: ранг с пропусками
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
-- LAG/LEAD: значения из соседних строк
SELECT
date,
revenue,
LAG(revenue) OVER (ORDER BY date) as prev_day_revenue,
LEAD(revenue) OVER (ORDER BY date) as next_day_revenue
FROM daily_sales;
-- SUM OVER: скользящее окно
SELECT
date,
sales,
SUM(sales) OVER (
ORDER BY date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) as rolling_7day_sales
FROM daily_sales;
CTE (Common Table Expression) — временные таблицы
-- WITH: создание временной таблицы
WITH high_earners AS (
SELECT * FROM employees WHERE salary > 80000
),
department_summary AS (
SELECT
department,
COUNT(*) as count,
AVG(salary) as avg_salary
FROM employees
GROUP BY department
)
SELECT he.name, he.salary, ds.avg_salary
FROM high_earners he
JOIN department_summary ds ON he.department = ds.department;
4. DCL (Data Control Language) — управление доступом
-- GRANT: предоставление прав
GRANT SELECT, INSERT ON database.table TO 'user'@'localhost';
-- REVOKE: отзыв прав
REVOKE DELETE ON database.table FROM 'user'@'localhost';
5. TCL (Transaction Control Language) — управление транзакциями
-- Основные операции с транзакциями
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- сохранить изменения
-- или
ROLLBACK; -- отменить изменения
6. Аналитические функции для Data Analyst
Вычисления и округления
SELECT
price,
ROUND(price * 1.1, 2) as price_with_tax,
CAST(revenue AS DECIMAL(10,2)) as rounded_revenue,
ABS(target - actual) as deviation
FROM products;
Работа со строками
SELECT
UPPER(name) as uppercase_name,
LOWER(email) as lowercase_email,
LENGTH(description) as description_length,
SUBSTRING(phone, 1, 3) as area_code,
REPLACE(address, 'Moscow', 'MSK') as short_address,
CONCAT(first_name, ' ', last_name) as full_name
FROM users;
Работа с датами
SELECT
order_date,
YEAR(order_date) as order_year,
MONTH(order_date) as order_month,
DAY(order_date) as order_day,
DATEDIFF(CURDATE(), order_date) as days_ago,
DATE_ADD(order_date, INTERVAL 30 DAY) as delivery_date,
EXTRACT(QUARTER FROM order_date) as quarter
FROM orders;
Условные выражения
SELECT
name,
salary,
CASE
WHEN salary > 100000 THEN 'High'
WHEN salary > 50000 THEN 'Medium'
ELSE 'Low'
END as salary_category,
COALESCE(bonus, 0) as bonus_or_zero
FROM employees;
7. Производительность: важные техники
Объяснение плана запроса
-- Посмотреть как БД выполняет запрос
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE customer_id = 5 AND order_date > '2024-01-01';
Индексы для оптимизации
-- Составной индекс
CREATE INDEX idx_customer_date
ON orders(customer_id, order_date DESC);
-- Уникальный индекс
CREATE UNIQUE INDEX idx_email ON users(email);
Чеклист SQL для Data Analyst
- ✓ SELECT с WHERE, GROUP BY, HAVING, ORDER BY
- ✓ Все типы JOIN (INNER, LEFT, RIGHT, FULL)
- ✓ Агрегатные функции (COUNT, SUM, AVG, MAX, MIN)
- ✓ Window functions (ROW_NUMBER, RANK, LAG/LEAD, SUM OVER)
- ✓ CTE (WITH clause)
- ✓ Подзапросы и корреляции
- ✓ CASE для условной логики
- ✓ Работа с датами и строками
- ✓ UNION и UNION ALL
- ✓ Индексы и EXPLAIN для оптимизации
При работе Data Analyst постоянно используются SELECT, GROUP BY, JOIN и window functions. Остальные команды используются реже, но нужно понимать их назначение.