DMLとは?SQL操作コマンドをわかりやすく解説

システム開発・テクノロジー
DMLとは?ざっくりと3行で
  • DMLっていうのは、データベースに入っているデータを読んだり、書いたり、変えたり、消したりするSQL命令群のことだよ。
  • SELECTでデータを取得し、INSERTで追加、UPDATEで更新、DELETEで削除するという4つの操作がDMLの核心で、アプリ開発の日常業務で最も頻繁に使われる。
  • DMLを正確に理解することで、N+1問題の原因が見えてきたり、トランザクションの境界をどこに置くべきかが判断できるようになる。

【深掘り】これだけ知ってればOK!

DMLのうちSELECTはデータを変更しないにもかかわらず「操作言語」に分類されている。一方で学術的にはSELECTをDMLから分離して「DQL(Data Query Language)」と呼ぶ流派も存在し、PostgreSQLの公式ドキュメントでは両方の表現が混在している。

DML(Data Manipulation Language)はSQLを構成する言語カテゴリの一つで、テーブル構造ではなくテーブル内のデータそのものを対象とする。具体的にはSELECT(検索)・INSERT(挿入)・UPDATE(更新)・DELETE(削除)の4命令が該当する。対照的にDDL(Data Definition Language)はCREATE・ALTER・DROPのようにテーブルやインデックスなどの構造を定義・変更する命令群であり、DCL(Data Control Language)はGRANT・REVOKEのようなアクセス権限を管理する命令群だ。Webアプリケーションのバックエンドコードはほぼ全てDMLを通じてDBと通信しており、O/Rマッパーが生成するSQLも最終的にはこれら4命令のいずれかに変換される。

DMLの実行はトランザクション管理と密接に絡む。INSERT・UPDATE・DELETEはデータを変更するため、COMMIT/ROLLBACKの対象となる。対してSELECTは読み取り専用だが、REPEATABLE READやSERIALIZABLEといった分離レベル設定によってトランザクション内でのSELECT結果の一貫性が保証される。実務ではUPDATEの条件句(WHERE)を書き忘れて全レコードを上書きする事故がDML起因の最多障害として挙げられる。本番環境でのDML実行前には必ずSELECTで対象件数を確認し、BEGIN/STARTTRANSACTIONで囲んでから実行・確認後にCOMMITするフローが標準的な安全手順とされている。

本番DBでUPDATE/DELETEを実行する前には必ず同じWHERE句でSELECT COUNTを実行して対象件数を確認せよ。件数が予想外の場合は即座にROLLBACKできる状態でのみ実行すること。

ORMを使っている場合でも、内部で発行されているDMLを把握しておくことは非常に重要だ。ActiveRecordやHibernateはクエリを自動生成するが、N+1問題やフルテーブルスキャンが発生している場合、スロークエリログでDMLを直接確認しないと原因を特定できない。ORMの便利さに頼りすぎず、生のSQLログを定期的にレビューする習慣がパフォーマンス改善の第一歩となる。

よくある誤解

SELECTはDMLに含まれないという誤解

標準SQL(ISO/IEC 9075)ではSELECTはDMLの一部として定義されている。ただしデータを変更しない点が他の3命令と異なるため、一部の教材ではDQLと区別して説明する場合もある。試験や現場での会話ではSELECT=DMLと認識しておくのが無難だ。

DMLとDDLは同じトランザクションで管理できるのか?

MySQLではDDL文(ALTER TABLE等)を実行すると暗黙のCOMMITが発生するため、ROLLBACKできない。PostgreSQLはDDLもトランザクションに含められるが、MySQLでは不可能だ。この違いを知らずにマイグレーションを設計するとデータ不整合リスクが生まれるが、意外と見落とされていないだろうか。

会話での使われ方

ITKAGYO運営者・デプロイ太郎のアイコン画像

UPDATE文のWHEREを外してステージング環境の全データを書き換えてしまいました。もうどうしようもないですか?

新人エンジニアがインフラチームのSlackチャンネルで緊急相談している場面。バックアップからのリストア手順の説明につながる。

ITKAGYO運営者・デプロイ太郎のアイコン画像

このAPIのレスポンスが遅い原因、ORMのログ見たらSELECTが30回走ってる。N+1だね、EAGERローディングに変えよう。

シニアエンジニアがコードレビュー中にDML発行回数の問題を指摘している場面。

ITKAGYO運営者・デプロイ太郎のアイコン画像

データ移行スクリプトのINSERT、バッチサイズを1000件にして一括コミットにすれば処理時間を10分の1にできるよ。

DBアーキテクトがDWH移行プロジェクトのMTGでパフォーマンスチューニング案を提案している場面。

【まとめ】3つのポイント

  • DMLはSQLの中でも最も日常的な命令群:SELECT・INSERT・UPDATE・DELETEの4命令がDMLの全てであり、アプリケーションとDBの通信のほぼ100%はこれらのいずれかに集約される。
  • トランザクション管理とDMLは切り離せない:データを変更するDMLはCOMMIT/ROLLBACKと対になる。特にMySQLではDDLが暗黙COMMITを引き起こすため、DMLとDDLの違いを正確に把握することが障害予防の基本になる。
  • ORMを使っていても生SQLの理解は必須:O/Rマッパーが隠蔽するDMLがパフォーマンスボトルネックの原因になることは多い。スロークエリログやORMのデバッグログでDMLを可視化する習慣が、システムの健全性を保つ鍵となる。

よくある質問

Q
DMLとDDLの違いを一言で教えてください。
A

DMLはデータ(行)を操作し、DDLは構造(テーブル・カラム)を操作します。日常のCRUD処理はDML、テーブル設計変更はDDLと覚えると分かりやすいです。

Q
DML実行時にトランザクションを張らないとどうなりますか?
A

auto-commitモードの場合、各DML文が即座にコミットされます。誤ったUPDATE/DELETEを実行しても即座にロールバックできないため、本番環境では必ず明示的なトランザクション管理を行うことが推奨されます。

Q
MySQLとPostgreSQLでDMLの挙動に違いはありますか?
A

基本的な4命令の文法は同じですが、UPSERT構文(MySQLはINSERT ON DUPLICATE KEY UPDATE、PostgreSQLはINSERT ON CONFLICT)や、RETURNING句(PostgreSQLのみ)など、拡張機能に違いがあります。

Q
DMLとCRUDの違いは何ですか?
A

CRUDはCreate・Read・Update・Deleteというアプリ設計上の概念で、SQLのDMLに対応します。CRUDがアプリ層の操作モデル、DMLがDB層の実装言語という関係にあります。概念と実装の対応として整理すると理解しやすいです。

この用語と一緒に知っておきたい用語

用語この記事との関連
データ本記事のテーマと実務上セットで使われることが多い用語です。コンピュータが処理する数値や文字、画像といった事実や資料そのもの、それがデータだ
トランザクショントランザクションは関連分野でよく登場する重要キーワードです。データベースにおいて複数の操作を「全て成功するか・全て失敗して元に戻るか」の一つの処理単位として扱う仕組みのこと
MySQL次のステップとしてMySQLを学ぶと知識が広がります。オープンソースのRDBMSで世界で最も広く使われているデータベースの一つ。1995年に登場しWordPress・Drupal・LaravelなどWebフレームワークのデフォルトDBとして定着した
アイコンアイコンを押さえると本記事の理解がさらに深まります。アプリやファイル、操作ボタンなどをひと目でわかる小さな絵で表したもの、それがアイコンだ
クエリ本記事のテーマと実務上セットで使われることが多い用語です。クエリの主要な特徴と用途を理解することで、関連する技術・制度・概念を正確に把握できるようになる

【出典】参考URL

https://www.postgresql.org/docs/current/sql-commands.html:PostgreSQL公式SQLコマンドリファレンス
https://dev.mysql.com/doc/refman/8.0/en/sql-data-manipulation-statements.html:MySQL 8.0 DML公式ドキュメント

コメント

「IT用語、難しすぎて心が折れそう……」という方のための、ハードル低めな用語辞典です。

情報レベルは「基礎中の基礎」。会話を止めないためのエッセンスだけを抽出しています。分かりやすさを追求するあまり、時々例え話が暴走しているかもしれませんが、そこは「ほどよく」聞き流していただけると幸いです。
ほどよくIT用語辞典システム開発・テクノロジー
デプロイ太郎のSNSを見てみる!!