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

Язык манипулирования данными

Язык манипулирования данными (Data Manipulation Language, DML) — это подмножество языков программирования баз данных, предназначенное для извлечения, вставки, обновления и удаления записей в таблицах реляционной базы данных. DML является одной из трёх основных составляющих языка SQL (наряду с DDL — Data Definition Language и DCL — Data Control Language) и обеспечивает взаимодействие пользователя или приложения с хранящимися данными. Основная цель DML — предоставить стандартизированные средства для выполнения операций запроса и модификации данных без необходимости описания способов их физического хранения.

Классификация и типы

В зависимости от способа обработки данных различают два основных типа DML:

  • Процедурный DML — требует явно указать, как выполнить операцию (например, навигационный подход в ранних СУБД, подобный Xbase). Пользователь задаёт последовательность шагов для доступа к записям.
  • Декларативный DML — описывает, какие данные нужны, а не способ их получения. Примером служит SQL, где запросы формулируются на основе реляционной алгебры и не зависят от физической реализации.

В контексте SQL под DML традиционно понимают четыре базовые команды:

  • SELECT — извлечение данных из одной или нескольких таблиц.
  • INSERT — добавление новых записей.
  • UPDATE — изменение существующих записей.
  • DELETEудаление записей.

Некоторые авторы включают в DML также команды MERGE (слияние данных) и TRUNCATE (быстрое удаление всех записей), но последняя часто относится к DDL. Стандарт ISO/ANSI SQL определяет DML как язык, включающий операторы SELECT, INSERT, UPDATE, DELETE, а также SEARCH (для поиска в мульти-табличных структурах), VALUES и CALL.

История и развитие

История DML неразрывно связана с эволюцией реляционных баз данных. Первые базы данных (иерархические, сетевые) использовали процедурные языки — например, DML в языке COBOL. С появлением реляционной модели (Эдгар Кодд, 1970) возникла потребность в декларативном языке. В 1974 году Дональд Чемберлин и Рэймонд Бойс (IBM) создали язык SEQUEL (Structured English Query Language), ставший предшественником SQL. Первоначально SQL содержал лишь основные DML-команды — SELECT, INSERT, UPDATE, DELETE.

Со временем стандарт SQL развивался:

  • SQL-86 — первый международный стандарт, закрепил синтаксис базовых DML.
  • SQL-92 — введён CASE и UNION, улучшена работа с вложенными подзапросами.
  • SQL:1999 — добавлена рекурсия, объектно-ориентированные расширения.
  • SQL:2003 — появление MERGE (исторически известной как «upsert» — insert or update).
  • SQL:2008 — уточнены правила работы с SELECT из VALUES и пакетная обработка.
  • Последующие версии — вводятся новые конструкции для работы с JSON, XML и временными данными.

В 1980-х годах SQL стал де-факто стандартным DML для коммерческих СУБД (Oracle, DB2, Sybase, SQL Server). В 1990-х годах появились разработки в области объектно-реляционных баз данных, но SQL сохранил доминирование. Сегодня DML реализован во всех основных СУБД: PostgreSQL, MySQL, SQLite, Microsoft SQL Server, Oracle Database. Несмотря на диалектные различия (например, LIMIT в PostgreSQL против TOP в SQL Server), синтаксис команд DML остаётся практически универсальным.

Устройство и синтаксис

Каждая DML-команда SQL имеет строгую грамматику. Ниже приведены базовые шаблоны операторов (по стандарту SQL:2016).

SELECT

Основной оператор для извлечения данных: ``sql SELECT [DISTINCT] <список_полей_или_выражений> FROM <таблица> [WHERE <условие>] [GROUP BY <поля>] [HAVING <условие_группы>] [ORDER BY <поля> [ASC|DESC]] [LIMIT n]; ``

  • WHEREфильтрация записей по условию.
  • GROUP BY — группировка для агрегатных функций (например, COUNT, SUM).
  • HAVING — фильтрация результатов группировки.
  • ORDER BYсортировка.
  • LIMIT — ограничение количества возвращаемых строк (только в некоторых реализациях).

INSERT

Добавление одной или нескольких записей: ``sql INSERT INTO <таблица> [(<столбец1>, <столбец2>, ...)] VALUES (<значение1>, <значение2>, ...) [ON CONFLICT ...]; -- специфично для некоторых СУБД ` Можно также использовать INSERT INTO ... SELECT` для копирования данных из другой таблицы.

UPDATE

Изменение существующих записей: ``sql UPDATE <таблица> SET <столбец1> = <выражение1>, <столбец2> = <выражение2> [WHERE <условие>]; ` Без WHERE` изменяются все записи таблицы.

DELETE

Удаление записей: ``sql DELETE FROM <таблица> [WHERE <условие>]; ` Без WHERE` удаляются все записи (структура таблицы сохраняется).

MERGE

MERGE (он же UPSERT) выполняет условную операцию: если запись существует, то обновляет; если нет — вставляет: ``sql MERGE INTO <целевая_таблица> AS target USING <источник> AS source ON target.<ключ> = source.<ключ> WHEN MATCHED THEN UPDATE SET target.<поле> = source.<поле> WHEN NOT MATCHED THEN INSERT (<поля>) VALUES (<значения>); `` Эта команда не является обязательной в минимальном наборе DML, но поддерживается почти всеми современными СУБД.

Применение и значение

DML является основой любого приложения с базой данных, где требуется работа с записями. Наиболее распространённые сценарии:

  • Информационные системы (CRM, ERP, бухгалтерские системы) — регулярное добавление и обновление данных через INSERT и UPDATE.
  • Веб-приложения — извлечение данных для отображения страниц (SELECT), регистрация пользователей (INSERT), редактирование профилей (UPDATE).
  • Аналитика и отчётность — сложные запросы с GROUP BY, HAVING и объединением таблиц (JOIN), обычно с использованием SELECT.
  • Системы резервного копирования и миграции — массовое копирование данных через INSERT INTO ... SELECT.
  • Автоматизация обработки данных — скрипты, которые используют DML для очистки, коррекции и синхронизации информации.

Значение DML выходит за рамки чистого SQL. Языки запросов в NoSQL-системах (например, MongoDB Aggregation Pipeline или Cassandra Query Language — CQL) также включают операции, аналогичные DML: find, insert, update, delete. Таким образом, концепция DML универсальна для всех категорий баз данных, хотя синтаксис и возможности различаются.

Ограничения и критика

Несмотря на стандартизацию, DML имеет ряд недостатков:

  • Диалектные различия — синтаксические и семантические расхождения между СУБД (например, поведение NULL, поддержка MERGE, синтаксис для LIMIT). Переносимость кода не всегда обеспечена.
  • Производительность — сложные SELECT с большим числом объединений или подзапросов могут быть медленными; неоптимальные запросы без использования индексов приводят к перегрузке сервера.
  • Безопасность — DML уязвим к SQL-инъекциям, если запросы строятся из внешнего пользовательского ввода без экранирования. Современные подходы (параметризованные запросы, ORM) смягчают эту проблему.
  • Ограниченность выразительности — для сложных рекурсивных операций или обработки графов DML SQL не подходит; требуются расширения (CTE, WITH RECURSIVE) или отдельные языки.

Интересные факты

  • По оценкам аналитиков, более 95 % всего кода работы с реляционными БД приходится на DML — именно SELECT и UPDATE являются самыми часто используемыми операторами.
  • Стандарт SQL (ISO/IEC 9075) насчитывает более 2000 страниц, из которых основную часть занимают правила DML.
  • Исторически первая СУБД, полностью реализовавшая SQL, — Oracle 2 (1979 год). Однако базовая DML появилась ещё в System R (IBM, 1975).
  • Команда SELECT * считается плохой практикой в продуктивной среде — она может возвращать избыточные данные и нарушать семантику. Рекомендуется явно указывать поля.

Источники

  • ISO/IEC 9075:2016, Information technology — Database languages — SQL, Parts 1–4.
  • Date C. J. An Introduction to Database Systems (8th ed.). Addison-Wesley, 2004.
  • Elmasri R., Navathe S. B. Fundamentals of Database Systems (7th ed.). Pearson, 2016.
  • Стандарт SQL — описание на сайте Международной организации по стандартизации (ISO).
  • Материалы спецификации PostgreSQL (раздел DML) — документация PostgreSQL 16.
  • Чемберлин Д. SQL: The Structured Query Language // IBM Research Report RJ 2400, 1979.

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

На главную BFOmetr →