Открыть сервис

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-запросы автоматически.

Источники

  1. ISO/IEC 9075-2:2016 — Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation).
  2. C. J. Date — An Introduction to Database Systems (8th edition), Addison-Wesley, 2004.
  3. Гарсиа-Молина, Г., Ульман, Дж., Уидом, Дж. — Системы баз данных: полный курс, Вильямс, 2012.
  4. Документация PostgreSQL 16 — Chapter 6: Data Manipulation.
  5. Документация MySQL 8.0 — SQL Statements: Data Manipulation Statements.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →