IBM i 駆け出し日記：SQLを使ってDb2 for i を操作してみる(初心者向け)

# はじめに
SQL学習中です。
SQLをIBM i で利用すると、便利なことはロチェで学んだのですがVS codeのDb2 for iで使いこなせないかと思い、、初心者向けお勉強記事です。

# SQLとは
リレーショナル・データベースのデータを定義したり、操作したりするための言語です。
SQL ステートメントを直接使用して、スキーマ、テーブル、 およびビューの作成と処理を行うことができます。

## SQLの用語：DDLとDMLとDCL
SQLで使用される3つの主要なカテゴリのことを指す言葉です。
- DDL（データ定義言語）
データベースの構造を定義または変更するためのコマンド。
テーブルの作成や変更、削除などを行う時に使う。
例：CREATE, ALTER, DROP


- DML（データ操作言語）
データベース内のデータを操作するためのコマンド。
データの追加、更新、削除、検索をする時に使う。
例：SELECT, INSERT, UPDATE, DELETE

- DCL（データ制御言語）
データベースのアクセス制御を管理するためのコマンド。
ユーザーの権限を付与したり、取り消したりします。
例：GRANT, REVOKE

これらのコマンドを使用することで、データベースの設計からデータの操作、アクセス権限の管理まで一貫した操作が可能になります。

## SQL用語とIBM i 用語の対比
| SQL用語　| IBM i 用語 |
|:-:|:-:|
| スキーマ |  ライブラリ |
|  テーブル |  物理ファイル(PF) |
| ビュー  | 論理ファイル(LF)  |

# SQLが実行できるIBM i 環境
選択肢は3つあると思っていて、
・ACS
・VS codeのDb2 for i
・5250画面
5250画面でも`STRSQL`コマンドでSQL実行できます。

ただSQLの醍醐味はコピーアンドペーストだと思っているので、コピペがしやすい上2つを個人的には推します。

今回はVS codeのDb2 for iを使ってSQL実行していきます！
[VS codeの拡張機能であるDb2 for iの概要とセットアップについてはこちらの記事を参照ください。](https://qiita.com/KOINULIB/items/7e3527ea864e042586cc)

# SQLでライブラリ(スキーマ)を作ってみる
VS codeのDb2 for i を開きます。
テキストエディタの適当な部分を右クリックすると、新しいテキストファイルの作成ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/071a39f2-221d-60e9-56c4-206e1c8ad08b.png)
新しいテキストファイルを開いて、実行したいSQLを入力していきます。


SQL文を実行するためにスキーマ(ライブラリ)を作ります。
```
CREATE SCHEMA KOGASCH
```
右上の三角の実行ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/6298c2f2-950c-8339-2057-e1b6f1a0c852.png)

スキーマブラウザー確認してみます、作成できていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/10a5c48a-0b12-2342-f161-f1eec96b834c.png)

# SQLで物理ファイル(テーブル)を作ってみる
## IBM i Serviceを使う
サイドバーの下の方にExamplesがあります。その中のDDL一覧の中になんとテーブル作成のSQLが、、、！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/b93736f8-64d6-9e03-5156-4e58c0f46ebf.png)
原型はこれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/a0d29a9f-0ccf-cb6c-cca6-fabc36c80e9f.png)

原型を生成AIの力を借りてもじって以下を作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/1959d11c-675c-03cd-1c2f-3e52e9ac6e1c.png)


```
CREATE TABLE KOGASCH.KOGATAB (
    TKBANG INT NOT NULL, 
    TKNAKN VARCHAR(50),
    UPDATE_TIMESTAMP TIMESTAMP,
    TKGURT INT,
    TKGURIT VARCHAR(50)
);
```

実行して、SCHEMA BROWSERから結果を見ると、KOGATABがいる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/e8bbd063-fe43-58cc-c3d5-f092c4d4b291.png)

メモ帳マークを押してみるとテーブル原型ができてました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/78b8e675-bedc-804f-1918-3bf079a62825.png)

こんな感じで例からもじってSQL実行すると楽ちんですね。

実行したSQLはCommand+Sでローカルに保存することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/459092de-b3f7-87ad-6e01-ab01d34497bb.png)

保存すれば使いまわせる、人にも配れるで便利ですね。
以下実行していったSQLと結果です。

## プライマリキーの指定
```
ALTER TABLE KOGASCH.KOGATAB
ADD PRIMARY KEY (TKBANG);
```
結果はTKBANGをプライマリーキーにしただけなので見た目的な変化はないので割愛。
エラーが出てなければ基本実行できています。

## データの追加
```
INSERT INTO KOGASCH.KOGATAB (TKBANG, TKNAKN)
VALUES ('1000', '相沢書店');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/2bd897bf-8e66-c7ce-20d0-926945f1f182.png)

### 複数データの追加
```
INSERT INTO KOGASCH.KOGATAB (TKBANG, TKNAKN, UPDATE_TIMESTAMP, TKGURT, TKGURIT)
VALUES 
    (2000, '山田商事', CURRENT_TIMESTAMP, 1000, '詳細B'),
    (3000, '川崎不動産', CURRENT_TIMESTAMP, 2000, '詳細C'),
    (4000, '東京書店', CURRENT_TIMESTAMP, NULL, NULL);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/360f627d-01ec-5dc5-e2f8-d898623a9b38.png)

## データの更新
東京書店の当月売上高を300000に更新
```
UPDATE KOGASCH.KOGATAB
SET TKGURT = 300000
WHERE TKBANG = '4000';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/b8bd7962-81fe-2efc-ee10-a6bfa6fd2e72.png)


## データの削除
山田商事を削除します
```
DELETE FROM KOGASCH.KOGATAB
WHERE TKBANG = '2000';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/8d1c9936-acf4-71e5-2433-a8aedeb13053.png)

# SQLの活用場面
データベース操作でこのようにDb2 for i のデータを操作できます。
IBM i 初心者がデータベース操作を行ってみるのに関してはSQLを使ってみるのもいいのかなと思います。

データベース操作以外に実行管理もSQLで実行できますので、今度紹介したいです。