SELECTはDMLに含まれるか？ - 結論：多くのケースで含まれる

ネタ記事です。

とある記事を読んでふと気になって X にポストしたら、いくつか情報をもらったので、追加の情報を加えて忘れないように書いておきます。

https://x.com/abe_masanori/status/1894531908635431422

# 1. DBMS のドキュメントベースの情報

## 1-1. Oracle の場合

含まれる。

>データ操作言語(DML)文は、既存スキーマ・オブジェクトのデータにアクセスし、操作します。次の文は、現在のトランザクションを暗黙的にコミットしません。次に、データ操作言語文を示します。
>
> CALL
> DELETE
> EXPLAIN PLAN
> INSERT
> LOCK TABLE
> MERGE
> SELECT
> UPDATE
>
>SELECT文は、DML文の制限された形式であり、データベース内のデータへのアクセスのみが可能です。アクセスしたデータを操作してから問合せの結果を戻すことはできますが、データベースに格納されたデータを操作することはできません。

https://docs.oracle.com/cd/G11854_01/sqlrf/Types-of-SQL-Statements.html#GUID-2E008D4A-F6FD-4F34-9071-7E10419CA24D

https://x.com/HNakaie/status/1894556224089460997

ただし、パラレル処理においてはクエリと DML は明確に区別するとのこと。確かに ```ALTER SESSEION ENABLE PARALLEL {QUERY|DML|DDL}``` は明確に使い分けている。

https://x.com/HNakaie/status/1894556877150982223

## 1-2. MS SQL Server の場合

含まれる。

> データ操作言語
>データ操作言語 (DML) は、データベースに格納される情報に影響します。 データベースの行を挿入、更新、変更するには、以下のステートメントを使います。
>
>BULK INSERT
>DELETE
>INSERT
>SELECT
>UPDATE
>MERGE

## 1-3. MySQL の場合

含まれる？

>DML
> Data manipulation language, a set of SQL statements for performing INSERT, UPDATE, and DELETE operations. The SELECT statement is sometimes considered as a DML statement, because the SELECT ... FOR UPDATE form is subject to the same considerations for locking as INSERT, UPDATE, and DELETE.
>
>DML statements for an InnoDB table operate in the context of a transaction, so their effects can be committed or rolled back as a single unit.

```SELECT ... FOR UPDATE``` はロックの考慮が必要なため、DML とみなされる場合がある。逆に言うと、```FOR UPDATE``` ではない ```SELECT``` は DML ではない？


https://x.com/ora_gonsuke777/status/1894546048968004073

ちなみに、ロックを考え出すと、SQL Server の READ_COMMITTED_SNAPSHOT = OFF の場合の ```SELECT``` の扱いもどうなのかと疑問が湧いてくる。

## 1-4. PostgreSQL の場合

ドキュメントの "6. Data Manipulation" には ```SELECT``` に関する記述はないので、含まれない？

>Chapter 6. Data Manipulation
Table of Contents
>
>6.1. Inserting Data
>6.2. Updating Data
>6.3. Deleting Data
>6.4. Returning Data from Modified Rows

https://www.postgresql.org/docs/17/dml.html

"26. High Availability, Load Balancing, and Replication" にも以下のような記載があり、```SELECT``` は含まれていない。（文脈上の問題な気もする）

> Data Manipulation Language (DML): INSERT, UPDATE, DELETE, MERGE, COPY FROM, TRUNCATE.
Note that there are no allowed actions that result in a trigger being executed during recovery.
This restriction applies even to temporary tables, because table rows cannot be read or written
without assigning a transaction ID, which is currently not possible in a hot standby environment.

```TRUNCATE``` は DML に含まれるのかという更なる疑問が…

"Acronyms" にも。（Such as は例示なので、含んでいないことを意味しているわけではないが）

>DML
>Data Manipulation Language14, SQL commands such as INSERT, UPDATE, DELETE

## 1-5. Snowflake

含まれないっぽい。

>General DML
>
>Commands for inserting, deleting, updating, and merging data in Snowflake tables:
>
> - INSERT
> - INSERT (multi-table)
> - MERGE
> - UPDATE
> - DELETE
> - TRUNCATE TABLE

https://docs.snowflake.com/en/sql-reference/sql-dml#general-dml

# 2. SQL 標準

無料では読めない SQL 標準においては含んでいるらしい。（そういえば ```SELECT * INTO``` あったなぁ…）

> Note:
> As per SQL standard select is in DML list.
> They mentioned that select is limited form of DML means select is DQL and select * into is DML. 
> Data manipulation can be,
> 
> 1. Data aggregation
> 2. Data Grouping
> 3. Data Ordering like ascending or descending
> 4. Performing mathematical operations
> 5. Data conversion or type conversion
> 6. Pattern matching with regex
> 7. Condition retrieving of data
> 8. Working with CTE
>
>Other than the above list, there are many other operations which can be included in the DML list.

https://x.com/meijik/status/1894533219846087022

# 3. まとめ

ドキュメント上では、```SELECT``` は DML に含めることが多いようです。ただし、コミュニケーションをとる際に疑問があれば確認しましょう。

あと、単に ```SELECT``` といっても、以下を含むので、ちょっと話がややこしくなりますね。

- ```SELECT ... FOR UPDATE```
- ```SELECT * INTO ...```
- （SQL Server　における READ_COMMITTED_SNAPSHOT = OFF 時の ```SELECT```）

あと、次は ```TRUNCATE TABLE``` は DML か DDL か？という疑問が…