Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
DDL (Data Definition Language) в SQL
DDL — это подмножество SQL команд, которые определяют и управляют структурой базы данных. DDL позволяет создавать, изменять и удалять объекты БД такие как таблицы, индексы, представления, хранимые процедуры и схемы.
Основные команды DDL
1. CREATE — создание объектов
-- CREATE TABLE — создание таблицы
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT CHECK (age >= 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- CREATE INDEX — создание индекса
CREATE INDEX idx_email ON users(email);
CREATE UNIQUE INDEX idx_username ON users(name);
-- CREATE VIEW — создание представления
CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE age >= 18;
-- CREATE DATABASE — создание БД
CREATE DATABASE myapp_db;
-- CREATE TABLE AS SELECT — создание таблицы на основе выборки
CREATE TABLE users_archive AS
SELECT * FROM users WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);
2. ALTER — изменение объектов
-- Добавить столбец
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Удалить столбец
ALTER TABLE users DROP COLUMN phone;
-- Изменить тип столбца
ALTER TABLE users MODIFY COLUMN age SMALLINT;
-- Переименовать столбец
ALTER TABLE users RENAME COLUMN created_at TO registration_date;
-- Добавить ограничение
ALTER TABLE users ADD CONSTRAINT chk_email CHECK (email LIKE '%@%');
-- Удалить ограничение
ALTER TABLE users DROP CONSTRAINT chk_email;
-- Изменить значение по умолчанию
ALTER TABLE users ALTER COLUMN age SET DEFAULT 18;
-- Переименовать таблицу
ALTER TABLE users RENAME TO customers;
3. DROP — удаление объектов
-- DROP TABLE — удалить таблицу
DROP TABLE users;
-- DROP TABLE IF EXISTS — удалить только если существует
DROP TABLE IF EXISTS users;
-- DROP INDEX — удалить индекс
DROP INDEX idx_email ON users;
-- DROP VIEW — удалить представление
DROP VIEW active_users;
-- DROP DATABASE — удалить БД
DROP DATABASE myapp_db;
4. TRUNCATE — удаление данных (но не самой таблицы)
-- Удалить все строки из таблицы, но сама таблица остаётся
TRUNCATE TABLE users;
-- Быстрее, чем DELETE, так как не генерирует отдельные DELETE операции
-- Нельзя откатить в некоторых БД (зависит от режима)
Ограничения и типы данных
CREATE TABLE products (
-- PRIMARY KEY — уникальный идентификатор
id INT PRIMARY KEY,
-- NOT NULL — не может быть NULL
name VARCHAR(255) NOT NULL,
-- UNIQUE — значение должно быть уникально
sku VARCHAR(50) UNIQUE,
-- DEFAULT — значение по умолчанию
status VARCHAR(20) DEFAULT 'active',
-- FOREIGN KEY — ссылка на другую таблицу
category_id INT,
FOREIGN KEY (category_id) REFERENCES categories(id),
-- CHECK — проверка условия
price DECIMAL(10, 2) CHECK (price > 0),
-- Вычисляемый столбец
final_price DECIMAL(10, 2) GENERATED ALWAYS AS (price * 1.1) STORED
);
Пример с внешними ключами
-- Таблица категорий
CREATE TABLE categories (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT
);
-- Таблица товаров со связью на категории
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
category_id INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
-- Внешний ключ с каскадным удалением
FOREIGN KEY (category_id) REFERENCES categories(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
-- Таблица заказов
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Таблица элементов заказа
CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE RESTRICT
);
Типы данных в SQL
-- Числовые
INT, BIGINT, SMALLINT, TINYINT
DECIMAL(10, 2), FLOAT, DOUBLE
-- Строки
VARCHAR(255), CHAR(10), TEXT, LONGTEXT
-- Дата и время
DATE, TIME, DATETIME, TIMESTAMP
-- Логический тип
BOOLEAN (обычно INT или TINYINT)
-- JSON (в некоторых БД)
JSON
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2),
hire_date DATE,
metadata JSON
);
Индексы
-- Простой индекс
CREATE INDEX idx_name ON users(name);
-- Уникальный индекс
CREATE UNIQUE INDEX idx_email ON users(email);
-- Составной индекс (на нескольких столбцах)
CREATE INDEX idx_last_first ON users(last_name, first_name);
-- Индекс с сортировкой
CREATE INDEX idx_created DESC ON orders(created_at DESC);
-- Индекс на выражении
CREATE INDEX idx_upper_email ON users(UPPER(email));
-- Удаление индекса
DROP INDEX idx_name ON users;
Представления (Views)
-- Создание представления
CREATE VIEW user_summary AS
SELECT
u.id,
u.name,
u.email,
COUNT(o.id) as order_count,
SUM(oi.price * oi.quantity) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN order_items oi ON o.id = oi.order_id
GROUP BY u.id, u.name, u.email;
-- Использование представления
SELECT * FROM user_summary WHERE total_spent > 1000;
-- Изменение представления
CREATE OR REPLACE VIEW user_summary AS
SELECT ... -- новый запрос
-- Удаление представления
DROP VIEW user_summary;
Отличие DDL от DML и DCL
| Категория | Назначение | Примеры |
|---|---|---|
| DDL | Структура БД | CREATE, ALTER, DROP, TRUNCATE |
| DML | Данные в БД | SELECT, INSERT, UPDATE, DELETE |
| DCL | Права доступа | GRANT, REVOKE |
| TCL | Управление транзакциями | COMMIT, ROLLBACK, SAVEPOINT |
// В Java при работе с DDL часто используется миграционный инструмент
// Например, Liquibase или Flyway
// С помощью Spring Data JPA
@Entity
@Table(name = "users", indexes = {
@Index(name = "idx_email", columnList = "email", unique = true)
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
@Column(nullable = false, unique = true)
private String email;
@Column(columnDefinition = "INT DEFAULT 18")
private Integer age;
}
Best Practices
- Используйте миграции — Flyway, Liquibase или Goose для контроля версий DDL
- Имена в convention — используйте snake_case для таблиц и столбцов
- Первичные ключи — всегда определяйте PRIMARY KEY
- Внешние ключи — используйте FOREIGN KEY для целостности данных
- Индексы — создавайте индексы на часто запрашиваемые столбцы
- Документируйте — добавляйте комментарии к таблицам и столбцам
- Осторожно с DROP — используйте IF EXISTS, проверяйте синтаксис
Вывод
DDL — это важная часть SQL, отвечающая за определение и управление структурой БД. Правильное использование DDL обеспечивает целостность данных, производительность и масштабируемость приложения.