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

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

1.0 Junior🔥 211 комментариев
#SQL и базы данных

Комментарии (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. Остальные команды используются реже, но нужно понимать их назначение.

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