DML
DML (Data Manipulation Language, язык манипулирования данными) — это подмножество языка SQL (Structured Query Language), предназначенное для извлечения, добавления, изменения и удаления данных в реляционных базах данных. DML является одной из основных частей SQL наряду с DDL (Data Definition Language, язык определения данных) и DCL (Data Control Language, язык управления данными). Операторы DML работают непосредственно с содержимым таблиц, а не с их структурой.
История и развитие
Концепция DML возникла в 1970-х годах в рамках развития реляционной модели данных, предложенной Эдгаром Коддом. Первоначально язык манипулирования данными был реализован в системе System R, разработанной в исследовательском центре IBM. В 1986 году ANSI (Американский национальный институт стандартов) принял первый стандарт SQL, который включал базовые операторы DML. Впоследствии стандарт неоднократно обновлялся (SQL:1999, SQL:2003, SQL:2008, SQL:2016), расширяя возможности манипулирования данными, включая поддержку оконных функций, рекурсивных запросов и MERGE-операций.
Основные операторы DML
Стандарт SQL определяет четыре основных оператора DML:
SELECT
Оператор SELECT используется для извлечения данных из одной или нескольких таблиц. Он является наиболее часто используемым оператором SQL. Базовая конструкция включает указание столбцов, источника данных (таблицы) и условий фильтрации:
``sql SELECT column1, column2 FROM table_name WHERE condition; ``
SELECT поддерживает множество расширений: соединения (JOIN), группировку (GROUP BY), сортировку (ORDER BY), агрегатные функции (COUNT, SUM, AVG, MIN, MAX) и подзапросы.
INSERT
Оператор INSERT добавляет новые строки в таблицу. Существует две основные формы:
- Вставка одной строки с явным указанием значений:
``sql INSERT INTO table_name (column1, column2) VALUES (value1, value2); ``
- Вставка результата подзапроса:
``sql INSERT INTO table_name SELECT ... FROM another_table; ``
UPDATE
Оператор UPDATE изменяет существующие данные в таблице. Он требует указания изменяемой таблицы, новых значений и условий, определяющих, какие строки будут затронуты:
``sql UPDATE table_name SET column1 = new_value1 WHERE condition; ``
Без условия WHERE оператор UPDATE применится ко всем строкам таблицы, что может привести к нежелательным последствиям.
DELETE
Оператор DELETE удаляет строки из таблицы. Как и UPDATE, он обычно использует условие WHERE для ограничения удаляемых строк:
``sql DELETE FROM table_name WHERE condition; ``
Без условия WHERE оператор удалит все строки таблицы, но не саму таблицу (в отличие от DDL-оператора DROP TABLE).
Дополнительные операторы и расширения
MERGE (UPSERT)
Оператор MERGE (также известный как UPSERT) выполняет условное обновление или вставку данных. Он позволяет синхронизировать данные между источником и целевой таблицей: если запись существует, она обновляется; если нет — вставляется. MERGE был добавлен в стандарт SQL:2003.
TRUNCATE
Хотя TRUNCATE формально относится к DDL (так как изменяет структуру хранения данных), по своему действию (удаление всех строк таблицы) он близок к DML. TRUNCATE работает быстрее DELETE без условия, так как не генерирует журнал транзакций для каждой удалённой строки.
CALL
Оператор CALL используется для вызова хранимых процедур, которые могут содержать DML-операции.
Транзакции и DML
Операторы DML обычно выполняются в контексте транзакций. Транзакция — это логическая единица работы, которая обладает свойствами ACID (атомарность, согласованность, изолированность, долговечность). Основные команды управления транзакциями:
- BEGIN TRANSACTION (или эквивалент в конкретной СУБД) — начало транзакции.
- COMMIT — фиксация всех изменений, сделанных в рамках транзакции.
- ROLLBACK — отмена всех изменений, сделанных в рамках транзакции.
Возможность отката изменений является ключевым отличием DML от DDL: многие DDL-операторы (например, CREATE TABLE) в ряде СУБД не могут быть отменены.
Различия в реализациях СУБД
Несмотря на стандартизацию, конкретные реализации DML в различных системах управления базами данных (СУБД) имеют особенности:
- MySQL/MariaDB: поддерживает оператор REPLACE (аналог INSERT с замещением), не поддерживает MERGE в стандартной форме.
- PostgreSQL: поддерживает MERGE (с версии 15), имеет расширения вроде RETURNING для получения изменённых данных.
- Microsoft SQL Server: поддерживает MERGE, имеет оператор OUTPUT для возврата данных из изменённых строк.
- Oracle: имеет обширные расширения DML, включая операторы для работы с иерархическими запросами и материализованными представлениями.
- SQLite: поддерживает ограниченный набор DML, включая INSERT OR REPLACE и UPSERT (с версии 3.24.0).
Безопасность и производительность
Предотвращение SQL-инъекций
Операторы DML, особенно формируемые динамически с конкатенацией пользовательского ввода, уязвимы для SQL-инъекций — атак, при которых злоумышленник может выполнить произвольные запросы к базе данных. Основные методы защиты:
- Использование параметризованных запросов (prepared statements).
- Экранирование специальных символов.
- Валидация входных данных на стороне приложения.
Оптимизация DML-операций
Производительность DML-операций зависит от многих факторов:
- Индексы: замедляют INSERT, UPDATE и DELETE, так как требуют обновления, но ускоряют SELECT.
- Пакетная обработка: выполнение нескольких операций в одной транзакции снижает накладные расходы.
- Планировщик запросов: СУБД автоматически выбирает оптимальный план выполнения, который можно анализировать с помощью команды EXPLAIN.
Критика и ограничения
Основные ограничения DML связаны с реляционной моделью данных:
- Отсутствие навигационных возможностей: DML не предназначен для пошаговой навигации по записям, что характерно для навигационных баз данных.
- Декларативность: пользователь описывает, какие данные нужны, но не способ их получения, что может приводить к неоптимальным планам выполнения.
- Ограниченная работа с иерархическими и графовыми данными: стандартный DML плохо подходит для рекурсивных структур, хотя рекурсивные CTE (Common Table Expressions) частично решают эту проблему.
Применение в современных системах
DML используется во всех приложениях, работающих с реляционными базами данных: веб-приложения, ERP-системы, CRM-системы, банковские системы, системы управления контентом. В современных архитектурах микросервисов DML применяется для взаимодействия с базами данных каждого сервиса, при этом часто используются ORM (Object-Relational Mapping) библиотеки, которые генерируют DML-запросы автоматически.
Источники
- ISO/IEC 9075-2:2016 — Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation).
- C. J. Date — An Introduction to Database Systems (8th edition), Addison-Wesley, 2004.
- Гарсиа-Молина, Г., Ульман, Дж., Уидом, Дж. — Системы баз данных: полный курс, Вильямс, 2012.
- Документация PostgreSQL 16 — Chapter 6: Data Manipulation.
- Документация MySQL 8.0 — SQL Statements: Data Manipulation Statements.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →