Язык манипулирования данными
Язык манипулирования данными (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 →