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

Что такое DDL в SQL?

2.0 Middle🔥 201 комментариев
#Базы данных и SQL

Комментарии (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

  1. Используйте миграции — Flyway, Liquibase или Goose для контроля версий DDL
  2. Имена в convention — используйте snake_case для таблиц и столбцов
  3. Первичные ключи — всегда определяйте PRIMARY KEY
  4. Внешние ключи — используйте FOREIGN KEY для целостности данных
  5. Индексы — создавайте индексы на часто запрашиваемые столбцы
  6. Документируйте — добавляйте комментарии к таблицам и столбцам
  7. Осторожно с DROP — используйте IF EXISTS, проверяйте синтаксис

Вывод

DDL — это важная часть SQL, отвечающая за определение и управление структурой БД. Правильное использование DDL обеспечивает целостность данных, производительность и масштабируемость приложения.