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