Язык манипуляции данными
Язык манипуляции данными (Data Manipulation Language, DML) — это подмножество языков программирования, предназначенное для извлечения, вставки, обновления и удаления данных в базах данных (БД). В отличие от языка определения данных (DDL), который управляет структурой БД (создание, изменение таблиц), и языка управления данными (DCL), регулирующего права доступа, DML обеспечивает непосредственное взаимодействие с содержимым таблиц. Основным промышленным стандартом DML является язык SQL (Structured Query Language), хотя существуют и другие реализации, например, в NoSQL-системах.
История
Концепция манипуляции данными возникла вместе с первыми системами управления базами данных (СУБД) в 1960-х годах. Ранние иерархические и сетевые модели (например, IMS от IBM и IDMS) использовали навигационные языки, требующие от программиста явного указания путей доступа к записям. В 1970 году Эдгар Кодд предложил реляционную модель, которая легла в основу SQL. Первая коммерческая реализация SQL появилась в СУБД System R (IBM) в середине 1970-х годов.
В 1986 году ANSI (Американский национальный институт стандартов) принял первый стандарт SQL, который включал базовые операторы DML. Последующие версии стандарта (SQL:1999, SQL:2003, SQL:2016 и другие) расширили возможности DML, добавив поддержку рекурсивных запросов, оконных функций, выражений общего табличного выражения (CTE) и операторов MERGE (upsert). С развитием NoSQL-движения в 2000-х годах появились альтернативные DML, ориентированные на документные, графовые и ключ-значение модели данных.
Основные операторы
В реляционных СУБД (РСУБД) стандартными операторами DML являются четыре команды, часто называемые CRUD (Create, Read, Update, Delete):
SELECT
Оператор SELECT используется для извлечения данных из одной или нескольких таблиц. Он позволяет задавать условия фильтрации (WHERE), сортировку (ORDER BY), группировку (GROUP BY) и соединение таблиц (JOIN). Пример: SELECT name, age FROM employees WHERE department = 'IT' ORDER BY age DESC;
INSERT
Оператор INSERT добавляет новые строки (записи) в таблицу. Он может вставлять одну строку с явным указанием значений или множество строк из результата другого запроса. Пример: INSERT INTO employees (name, age, department) VALUES ('Иванов', 30, 'IT');
UPDATE
Оператор UPDATE изменяет существующие записи в таблице. Он обязательно использует условие WHERE для указания, какие строки следует обновить; при его отсутствии обновляются все строки таблицы, что часто является ошибкой. Пример: UPDATE employees SET age = 31 WHERE name = 'Иванов';
DELETE
Оператор DELETE удаляет строки из таблицы. Как и UPDATE, он требует указания условия WHERE для предотвращения массового удаления. Пример: DELETE FROM employees WHERE name = 'Иванов';
Разновидности
Процедурные и декларативные DML
- Декларативные DML (например, SQL) — пользователь описывает, какие данные нужны, не указывая способ их получения. СУБД сама оптимизирует запрос.
- Процедурные DML (например, PL/SQL, T-SQL) — позволяют встраивать циклы, условия и вызовы функций, что даёт более тонкий контроль над обработкой данных, но требует большего объёма кода.
DML в NoSQL-системах
- Документные СУБД (MongoDB) — используют JSON-подобные запросы:
db.collection.find({department: "IT"})(аналог SELECT) иdb.collection.updateOne({name: "Иванов"}, {$set: {age: 31}})(аналог UPDATE). - Графовые СУБД (Neo4j) — применяют язык Cypher:
MATCH (e:Employee {name: "Иванов"}) RETURN e.age(аналог SELECT). - Ключ-значение СУБД (Redis) — операции GET, SET, DEL.
DML в распределённых системах
В распределённых базах данных (например, Apache Cassandra, Google Spanner) DML-операции должны учитывать согласованность данных (consistency) и устойчивость к разделению (partition tolerance). В таких системах часто используются механизмы «лёгких транзакций» (lightweight transactions) для атомарного выполнения операций.
Применение
Обработка транзакций
DML является основой для операционных систем (OLTP — Online Transaction Processing). Каждая операция в банковском переводе, заказе в интернет-магазине или бронировании билета включает INSERT, UPDATE или DELETE. Для обеспечения целостности данных эти операции группируются в транзакции, которые поддерживают свойства ACID (атомарность, согласованность, изоляция, долговечность).
Аналитика и отчётность
Оператор SELECT с агрегатными функциями (SUM, AVG, COUNT) и группировками используется в системах бизнес-аналитики (BI) для построения отчётов. Например, SELECT department, AVG(age) FROM employees GROUP BY department; вычисляет средний возраст по отделам.
Массовая загрузка и выгрузка
Для переноса больших объёмов данных между системами применяются специализированные инструменты (например, SQL*Loader в Oracle, BULK INSERT в SQL Server), которые используют DML-команды в пакетном режиме.
Веб-приложения и API
Современные веб-фреймворки (Django, Spring, Ruby on Rails) генерируют DML-запросы на основе действий пользователя. Например, при сохранении формы регистрации выполняется INSERT в таблицу users.
Безопасность
SQL-инъекции
Наиболее распространённая уязвимость, связанная с DML, — SQL-инъекция. Злоумышленник может внедрить вредоносный код в строку запроса, что приведёт к несанкционированному чтению, изменению или удалению данных. Для защиты рекомендуется использовать параметризованные запросы (prepared statements) и экранирование пользовательского ввода.
Права доступа
DML-операции контролируются через DCL-команды GRANT и REVOKE. Например, пользователю можно дать право только на SELECT в определённой таблице, запретив UPDATE и DELETE.
Аудит
Многие СУБД ведут журналы DML-операций (audit logs), которые фиксируют, кто, когда и какие данные изменил. Это необходимо для соблюдения нормативных требований (например, Федерального закона № 152-ФЗ «О персональных данных» в России).
Критика и ограничения
- Производительность при сложных запросах: Вложенные SELECT и множественные JOIN могут приводить к медленному выполнению на больших объёмах данных. Для оптимизации используются индексы и материализованные представления.
- Сложность транзакций: В распределённых системах обеспечение ACID-свойств для DML-операций может быть дорогим с точки зрения производительности, что привело к появлению NoSQL-решений с моделью BASE (Basically Available, Soft state, Eventually consistent).
- Отсутствие стандартизации в NoSQL: Каждая NoSQL-СУБД имеет свой DML, что затрудняет перенос приложений между системами.
- Риск человеческой ошибки: Операторы UPDATE и DELETE без условия WHERE могут привести к необратимой потере данных. Для предотвращения этого рекомендуется использовать транзакции и резервное копирование.
Интересные факты
- В ранних версиях SQL команда SELECT отсутствовала; её роль выполняла команда RETRIEVE.
- Оператор MERGE (upsert) был добавлен в стандарт SQL:2003 и позволяет выполнить INSERT или UPDATE в одной команде в зависимости от существования записи.
- В России для работы с базами данных в государственных информационных системах часто используются СУБД, включённые в Единый реестр российских программ для электронных вычислительных машин и баз данных, такие как Postgres Professional (на основе PostgreSQL) и «Линтер».
Источники
- Codd, E. F. (1970). A Relational Model of Data for Large Shared Data Banks. Communications of the ACM.
- ISO/IEC 9075-1:2016 Information technology — Database languages — SQL — Part 1: Framework.
- Date, C. J. (2003). An Introduction to Database Systems (8th ed.). Addison-Wesley.
- Elmasri, R., & Navathe, S. B. (2016). Fundamentals of Database Systems (7th ed.). Pearson.
- Документация PostgreSQL 16: Data Manipulation Language.
- Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →