【SQL】SQLってCRUD以外に何があるの？と思った時に読むQiita

## はじめに
以下は、あるSQL初学者（私）のSQL理解の変遷です。

→SQLってなんだろう？SQLを学ぼう！と思う

→まずはSQLのCRUD（Create, Read, Update, Delete）処理の基本を学ぶ

→SELECT, INSERT, UPDATE, DELETEという命令文があるんだ！と知る

→いろいろ試して触ってみる
うんうん簡単だ！　4大命令ができたらもうSQLできたようなもんだよね！

→なんかだんだん…他にもいろいろなルールが出てきたな…

- INSERT後はCOMMITしなきゃいけないとか
- 修飾語のWHEREとかFROMとか
- なんかデータこねくり回せるDISTINCTとかLPADとか…
- なんかちょっと高度なことするALTERとかTRUNCATEとか
- どっかの記事でDDLがなんとか…って言ってたけどあれはなんだったんだ？

このように、SQLを断片的にちびちびと触っていると、次第にこう思うわけです。

→SQLってCRUD以外に何があるの？
そしてALTERとかTRUNCATEとかは、どこに分類されるの？

↑今ココ！の認識の人が対象のQiita記事です。
SQLの命令文について、[スッキリわかるSQL入門](https://sukkiri.jp/books/sukkiri_sql2)を参考に、覚えやすく大別しました。
## この世には「DB使用者」と「DB提供者」がいる
います。

というのは、SQLは「既存のDB内のデータを操作する」命令文と、「DBそのものを操作する」命令文の2種類に大別できる、という意味です。

![2101_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/3e9136de-1e14-ade5-0765-0c1ec13c1875.png)

「[SQL 命令 種類](https://www.google.com/search?sxsrf=ALeKk03TDX_3Y-4zVyf7oGDPhG9iEkmhAw%3A1611583137204&ei=oc4OYNyJDJK_wAPIm6z4Dg&q=SQL+%E5%91%BD%E4%BB%A4+%E7%A8%AE%E9%A1%9E&oq=SQL+%E5%91%BD%E4%BB%A4+%E7%A8%AE%E9%A1%9E&gs_lcp=CgZwc3ktYWIQAzIECCMQJzoECAAQHjoGCAAQBxAeUNXt2wFYq_bbAWCA-dsBaABwAHgAgAGAAYgBwQKSAQMxLjKYAQCgAQGqAQdnd3Mtd2l6wAEB&sclient=psy-ab&ved=0ahUKEwic3qyDn7fuAhWSH3AKHcgNC-8Q4dUDCA0&uact=5 )」で検索をかけると、上の方に3種類とか4種類とか出てきちゃいます。DBMS製品や資料によって異なるそうです。
また、ある基本情報のテキストでは、DDLとDMLの2種類に分けて説明していたりもします。ここ、混乱ポイントなんですよね…

ただ、命令の数はあまり重要ではありません。ここで重要なのは、**その命令がDB使用者視点か、DB提供者視点か**、ということです[^1]。

![2101_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/2ea38d16-a940-8d51-bac9-45fdf7820c1c.png)

DB使用者視点の命令文2種類、DB提供者視点の命令文2種類の計4種類と考えると覚えやすいので、ここでは4種類とします。
以下で詳しく見ていきます。

[^1]: ※DB使用者・DB提供者という語は、説明のために作成したので、一般的な単語ではありません。ご承知おきください。

## DB使用者視点の命令文：DMLとTCL

DB使用者視点の命令文は以下2つです。
### DML（Data Manipulation Language）

![2101_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/9fd9fe3d-333f-5075-ca5a-e47c443a29ef.png)

DMLはデータ操作言語とも言います。主にデータの格納や閲覧、更新、削除などの命令ができます。
いわゆる「SQLの4大命令」「SQLのCRUD」などと言われるSELECT, INSERT, UPDATE, DELETEはDMLに当たります。他にも、テーブルを明示的にロックできるLOCK TABLE文や、SQL文の実行プランを調べられるEXPLAIN文などもDMLに該当します。

そして、最初に出てきた「修飾語のWHEREとかFROMとか」は、「SQLの4大命令」を使ってより複雑な処理を行うための修飾語です。
重複する行を取り除くDISTINCTやゼロパディングを簡単に行えるLPAD[^2]も、データを加工してより見やすくしたり、処理を簡単にするための修飾語です。

[^2]: LPADは、製品によっては未実装のものもあります。

### TCL（Transaction Control Language）

![2101_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/c497e6b7-40b4-e3ad-5a16-4725abc8b225.png)

トランザクション制御言語とも言います。
トランザクションは、SQLというよりもDBMSの基本機能のため詳細な説明は省きますが、簡単にいうと、DBを同時に複数人で書き換えられなくするための制御方法のことです。COMMITやROLLBACKなどの命令文がこれに当たります。

## DB提供者視点の命令文：DDLとDCL
続いて、DB提供者視点の2種類の命令文について説明します。

### DDL（Data Definition Language）

![2101_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/b267e4ac-55fc-6125-3145-14b3ea7cca19.png)

データ定義言語とも言います。
テーブルそのものを作成・削除や、列の追加・削除などができます。
CREATE, ALTER, DROP, TRUNCATEなどが代表的な命令文です。

### DCL（Data Control Language）

![2101_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/00b40ff2-a803-da26-1d7e-dac3a282e974.png)

データ制御言語とも言います。
誰に、どのようなデータ操作やテーブル操作を許可するか、権限の設定を行うことができます。
GRANTやREVOKEなどがこれに当たります。
主にDBAと呼ばれるデータベース管理者が使用するものであり、少なくとも個人で少しDBを触ってみるか〜くらいの段階では、使用機会が稀な命令文かと思います。


## おわりに
SQLを断片的に触ってきてしまったので、ちょっとここで一つ整理しようと思って記事を書きました。
いろんなネット記事を漁りましたが、[スッキリわかるSQL入門](https://sukkiri.jp/books/sukkiri_sql2)の10章での「データベースを使う2つの立場」という説明がすごく分かりやすかったので、DB使用者とDB提供者、という語を当て、自分なりにまとめ直してみました。
調べていく上で、どの命令文がDB製品固有のもので、どこからが広くSQL全般に存在するのか、も理解が深まり、勉強になりました！

最後になりますが、文中の素敵なイラストは[Loose Drawing](https://loosedrawing.com/)よりお借りいたしました。ありがとうございます。

それでは、ここまでお読みいただき、ありがとうございました！