Db2の基本的な使い方と自分用メモ

業務でdb2を久々に触りました。
何年か前にプロジェクトで使ったことはあったのですが、打つコマンドがほぼ限られていたのとDB設計や構築を自分で行なってないことから、ほとんど訳わからんままでした。
今回はお客様環境でDb2を使うのですが、その際に使用するシェルのテストをしたく、ローカルでDb2を構築することにしたのでした。

## 【重要】Db2 CLIはApple Silliconに対応していない
当方Mac M1端末を使用していますが、まず衝撃だったのが、Db2のCLIはApple Sillicon端末に対応していないことでした。Db2自体はDb2 on cloud等で使うことができますが、私の用途（シェルでテーブルいじりたい）をテストするのはcloud版ではできなかったので、Db2 Cliを使えるようにする必要がありました。

コミュニティの質問では結局、colimaを使用してDb2コンテナを動かして使用する例がありました。
[DB2 LUW. 11.5.xx - Mac M1 ready](https://community.ibm.com/community/user/datamanagement/communities/community-home/digestviewer/viewthread?GroupId=2983&MessageKey=bf84e57b-263a-4ba5-a925-f13530c70e00&CommunityKey=ea909850-39ea-4ac4-9512-8e2eb37ea09a)

こちらの記事もcolimaで成功しています。
[M1 Macでcolimaを使ってDb2コンテナの稼働に成功（厄介な制約付き）](https://qiita.com/shimac/items/4866bf3f756f11b705a4)

ちなみに自分はその時間はなかったので、眠らせていたintel Mac端末を引っ張り出してきてDb2コンテナを構築しました。CLI使いたかっただけなのになんで？

## intel端末のMacにおけるDb2コンテナの動かし方
ではintel端末でどう動かしたかを自分向けにメモ。この点においては、公式のドキュメントがわかりやすかったです。なお、Docker HubのDb2ページはサンセットするみたいで、どのみち以下に誘導されるはずです。
[macOS システムへの Db2 Community Edition Docker イメージのインストール](https://www.ibm.com/docs/ja/db2/11.5?topic=system-macos)

フォルダには気をつけつつ、dockerコマンドはほぼdocs通りに打っていくだけでした。"su"の部分だけエラーが出ましたが、ハイフンを打ち直すことで解決。なんで？

本当はこれくらい簡単なはずだったのに…
* [Db2 コマンドラインインターフェースから IBM Cloud 上のリモート Db2 インスタンスに接続する](https://dotnsf.blog.jp/archives/1071023235.html)
* [Db2 on Cloudにデータをコマンドでロードする3つの方法](https://qiita.com/nishikyon/items/a5ab65cbb48ec177ed5f)

## Db2コマンド使用の際に遭遇したエラー
M1 macじゃないのにDb2クライアント入れてもエラーが出る…
```
Db2: command not found
```
そんなときは「.bash_profile」とか「.bashrc」とかにこちらを追加してください。
```
if [ -f /db2home/db2inst1/sqllib/db2profile ]; then
  . /db2home/db2inst1/sqllib/db2profile
fi
```
【参考】
["Db2: command not found"​ error when Db2 commands are run from command-line for Linux or Unix Operating system](https://www.ibm.com/support/pages/db2-command-not-found%E2%80%8B-error-when-db2-commands-are-run-command-line-linux-or-unix-operating-system)


## 使った・使っているDb2コマンド
※自分用チートシートとして。

* Db2インスタンス起動
```
db2start
```

* データベースに接続
```
db2 connect to (DB名) user (username) using (password)
```


## 個人的SQLチートシート
*ドキュメントは[こちら](https://www.ibm.com/docs/en/db2/11.5?topic=fundamentals-sql)。
db2 + "SQLコマンド"で使う。

* 現在のスキーマを確認する
```
values current schema
```

* スキーマを作る
```
create schema (スキーマ名)
```

* デフォルトスキーマを変更する
```
set current schema ${スキーマ名}
```

* スキーマ一覧を表示する
```
select schemaname from SYSCAT.SCHEMATA
```

* テーブル一覧を確認する
```
list tables
```

* テーブル項目を調べる
```
describe table (テーブル名)
```

* テーブル名を追加する
```
create table (テーブル名) (
        （カラム名）（データタイプ）（オプション/NOT NULLとか）
   )
```

* PKを追加する
```
alter talbe (テーブル名) add constraint (主キー制約名) primary key (主キー対象項目 [,主キー対象項目...]) 
```

* テーブルのデータをコピーする
```
insert into コピー先テーブル名 select * from コピー元テーブル名
あるいは
insert into スキーマ名.コピー先テーブル名 select * from スキーマ名.コピー元テーブル名
```

* ある条件下で出力する
```
case when (条件) then (出力)
```
※whenは色々な使い方があるので[公式ドキュメント](https://www.ibm.com/docs/ja/db2-for-zos/11?topic=e-case-expressions)を参考ください。

* 削除する
```
drop from (テーブル名)
```
でも良いけど、トランザクションログが作られるので、
```
truncate table (テーブル名) immediate
```
がお勧め。ログが作られずに一括削除ができます。
【参考】[DB2 10.5 表データの一括削除(TRUNCATE TABLE)](https://symfoware.blog.fc2.com/blog-entry-1340.html)

* CSVをIMPORTするとき
[How to import data from a DB2 database table (from a CSV file)](https://www.ibm.com/support/pages/how-import-data-db2-database-table-csv-file)　を参照。


## おわり
実際にローカルでdb2コンテナを起動させて、自分で一からスキーマやテーブルをcreateし、データを入れてと行うことで色々な勉強になりました。業務でDB設計したことない〜とは言ってたけど、実際にこうやってちょっと作るだけで「こういうことしなきゃいけないんだな」とか「こういうことに注意が必要だな」と多くの気づきがありました。

このページは本当に自分のためのブックマークみたいなところがありますので、読みにくくてもご愛嬌でお願いします。
早くApple Silliconに対応されますように★