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

Какие виды запросов умеешь писать на SQL?

1.8 Middle🔥 211 комментариев
#Базы данных

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Основные виды SQL-запросов (DML, DDL, DCL, TCL)

Как Go-разработчик с опытом работы с базами данных, я регулярно использую различные типы SQL-запросов. SQL (Structured Query Language) можно разделить на несколько категорий в зависимости от их назначения.

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

Это наиболее часто используемые запросы в повседневной разработке:

SELECT - извлечение данных:

-- Простой запрос с условием
SELECT id, name, email FROM users WHERE active = true;

-- JOIN для связи таблиц
SELECT u.name, o.order_date, o.amount 
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount > 1000;

-- Агрегатные функции
SELECT department, COUNT(*) as employee_count, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

INSERT - добавление новых записей:

-- Вставка одной записи
INSERT INTO users (name, email, created_at) 
VALUES ('Иван Петров', 'ivan@example.com', NOW());

-- Множественная вставка
INSERT INTO products (name, price, category_id) 
VALUES 
    ('Ноутбук', 75000, 1),
    ('Мышь', 2500, 1),
    ('Клавиатура', 4500, 1);

UPDATE - изменение существующих данных:

-- Обновление с условием
UPDATE users 
SET last_login = NOW(), login_count = login_count + 1 
WHERE id = 42;

-- Обновление нескольких столбцов
UPDATE orders 
SET status = 'completed', completed_at = NOW()
WHERE status = 'processing' AND created_at < '2024-01-01';

DELETE - удаление данных:

-- Удаление с условием
DELETE FROM session_tokens 
WHERE expires_at < NOW();

-- Каскадное удаление (зависит от структуры БД)
DELETE FROM users WHERE id = 100;

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

Эти запросы используются при миграциях и изменении схемы БД:

CREATE - создание объектов БД:

-- Создание таблицы
CREATE TABLE IF NOT EXISTS products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) CHECK (price >= 0),
    category_id INTEGER REFERENCES categories(id),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Создание индекса для оптимизации
CREATE INDEX idx_products_category ON products(category_id);

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

-- Добавление столбца
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- Изменение типа данных
ALTER TABLE products ALTER COLUMN price TYPE DECIMAL(12, 2);

-- Добавление ограничения
ALTER TABLE orders ADD CONSTRAINT fk_user 
FOREIGN KEY (user_id) REFERENCES users(id);

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

-- Удаление таблицы
DROP TABLE IF EXISTS temporary_data;

-- Удаление индекса
DROP INDEX idx_old_query;

TRUNCATE - быстрая очистка таблицы:

-- Удаление всех данных из таблицы
TRUNCATE TABLE audit_logs RESTART IDENTITY;

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

Управление правами доступа (чаще используется администраторами БД):

GRANT - предоставление прав:

GRANT SELECT, INSERT ON users TO app_user;
GRANT ALL PRIVILEGES ON database_name TO admin_user;

REVOKE - отзыв прав:

REVOKE DELETE ON orders FROM junior_developer;

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

Критически важные запросы для обеспечения целостности данных:

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

BEGIN;
-- или
START TRANSACTION;

COMMIT - подтверждение изменений:

COMMIT;

ROLLBACK - откат изменений:

ROLLBACK;

SAVEPOINT - создание точки сохранения:

SAVEPOINT before_complex_operation;

5. Дополнительные возможности SQL

Подзапросы (Subqueries):

SELECT name, email FROM users 
WHERE id IN (SELECT user_id FROM orders WHERE amount > 10000);

CTE (Common Table Expressions):

WITH regional_sales AS (
    SELECT region, SUM(amount) as total_sales
    FROM orders
    GROUP BY region
)
SELECT region, total_sales 
FROM regional_sales 
WHERE total_sales > 100000;

UNION/UNION ALL:

SELECT product_name FROM current_products
UNION
SELECT product_name FROM archived_products;

Оконные функции (Window Functions):

SELECT 
    department,
    employee_name,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank_in_dept
FROM employees;

Практическое применение в Go

В Go-приложениях я обычно использую:

  • Подготовленные выражения (Prepared Statements) для предотвращения SQL-инъекций
  • Транзакции для сложных операций
  • Миграции для управления схемой БД
  • ORM/Query Builder для построения сложных запросов

Пример транзакции в Go:

func TransferMoney(ctx context.Context, tx *sql.Tx, from, to int, amount float64) error {
    // Начинаем транзакцию (если не передана извне)
    // Выполняем несколько запросов
    _, err := tx.ExecContext(ctx, 
        "UPDATE accounts SET balance = balance - $1 WHERE id = $2", 
        amount, from)
    if err != nil {
        return err
    }
    
    _, err = tx.ExecContext(ctx,
        "UPDATE accounts SET balance = balance + $1 WHERE id = $2",
        amount, to)
    if err != nil {
        return err
    }
    
    return nil
}

Понимание различных типов SQL-запросов позволяет писать эффективный и безопасный код, правильно проектировать базы данных и оптимизировать производительность приложений. В современных приложениях важно сочетать прямое SQL с использованием ORM там, где это повышает читаемость и поддерживаемость кода.

Какие виды запросов умеешь писать на SQL? | PrepBro