DBと仲良くしたいときに役立つリンク集

# バックアップ用にテーブルをコピーしたい
```sql
create table {バックアップ用テーブル} as select * from {元のテーブル};
```

- [Oracleで既存のテーブルをコピーして別名のテーブルを作る方法 - 小さい頃はエラ呼吸](http://replication.hatenablog.com/entry/20130228/1364095737)
- [テーブルの複製 - Qiita](https://qiita.com/nao_ipub/items/1151304ea8396770324a)

# 同じテーブルに一部のカラムの値だけ変更してデータをコピーしたい
```sql
insert into テーブルA (カラム1, カラム2, カラム3, カラム4) select カラム1, 'hoge', カラム3, カラム4 from テーブルA where {コピー元のデータを抽出する条件};
```

- [selectした結果をinsertする - Qiita](https://qiita.com/ques0942/items/acfdd5382c638580ce0b)

# CASE
```sql:null判定
CASE WHEN {null判定したいカラム} IS NULL THEN {nullの場合の結果} ELSE {nullでない場合の結果} END
```

- [全ては時の中に… : 【SQL】CASE式でNULLかどうかを判定する](http://blog.livedoor.jp/akf0/archives/51469844.html)

```sql:構文の違いによる処理速度は変わらないらしいです。
/* 検索形式:こっちだと複数条件を組み合わせられます。注意: CASEとWHENの間にカラム書いちゃダメ */
CASE WHEN {条件式} THEN {条件式がtrueになった時の結果} [WHEN ...] ELSE {どの条件式に当てはまらなかった時の結果} END
/* 単純形式:値の一致だけが条件であればこちらがカンタンです。 */
CASE {条件となるカラム} WHEN {値} THEN {カラム値が値だった時の結果} [WHEN ...] ELSE {カラム値がどの値でもない時の結果} END
```
```sql:Sample
/* 同じ内容を2つの形式で書いてみる */
CASE WHEN col = 1 THEN 'hoge' WHEN col = 2 THEN 'fuga' ELSE 'pon' END;
CASE col WHEN 1 THEN 'hoge' WHEN 2 THEN 'fuga' ELSE 'pon' END;
/* こういうのは単純形式では書けない */
CASE WHEN col IN (1,2,3) THEN 'hoge' WHEN col IN (4,5,6) THEN 'fuga' ELSE 'pon' END;
CASE WHEN col1 <> 1 AND col2 = 'a' THEN 'hoge' WHEN col1 = 1 AND col2 = 'b' THEN 'fuga' ELSE 'pon' END;
```

# `with` で同じselect文をまとめたい
- [SQL WITH句で同じSQLを１つのSQLに共通化する](https://zukucode.com/2017/09/sql-with.html)

# `join`がわからなくなる
```sql
/* 完全外部結合 */
select * from {テーブルA} a full outer join {テーブルB} b on a.列A = b.列B [where {条件式}];
```

- [JOIN / INNER JOIN / OUTER JOIN / LEFT JOIN / RIGHT JOIN の違い](https://qiita.com/YumaInaura/items/12dfa07e41e1592baf6f)

# `group by`した最大値のレコードがほしい
```sql
-- ぱたーん1. 自分と最大値をselectした自分をinner joinする
SELECT * FROM table a INNER JOIN (SELECT id, MAX(col) AS col FROM table GROUP BY id) AS b ON a.id = b.id AND a.col = b.col;
-- ぱたーん2. 最大値をselectして条件にする
SELECT * FROM table a where a.col = (SELECT MAX(col) FROM table b WHERE a.id = b.id GROUP BY id);
-- ぱたーん3. 自分と自分をleft joinする(速い)
SELECT * FROM table a LEFT JOIN table b ON a.id = b.id AND a.col < b.col WHERE b.col IS NULL;
```

- [特定のカラムのグループごとの最大値が格納されている行 - MySQL](https://dev.mysql.com/doc/refman/5.6/ja/example-maximum-column-group-row.html)
- [グループごとの最大値を持つレコードを取得する - Qiita](https://qiita.com/sunadorinekop/items/c287ced6f2c25a1ba36d)

# 順序
```text:書く順序
SELECT > FROM > WHERE > GROUP BY > HAVING > ORDER BY
```

```text:評価順序
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > ORDER BY > TOP（LIMIT）
```
[SELECT文の評価順序 - Qiita](https://qiita.com/suzukito/items/edcd00e680186f2930a8)


# DB情報
- [Oracle・PostgreSQL・MySQL・SQLServer・H2Databaseそれぞれでテーブル・カラム・プライマリキー・インデックスを取得するSQL - Qiita](https://qiita.com/ota-meshi/items/e1bd7a4e7c8fd87664c8#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%88%A5%E3%82%AB%E3%83%A9%E3%83%A0%E6%83%85%E5%A0%B1%E4%B8%80%E8%A6%A7%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E4%BB%98)

# Oracle
- [Oracleで頑張りたいときに役立ちたいリンク集 - Qiita](https://qiita.com/ponsuke0531/items/5bec37fbf5a0e48ff5a2)

# PostgreSQL
- [はじめてのPostgreSQLに役立つサイト集 - Qiita](https://qiita.com/ponsuke0531/items/12bf73640ee54c238e7e)
- [OracleのSQLをPostgeSQLのSQLにしてみる時に役立てたいリンク集 - Qiita](https://qiita.com/ponsuke0531/items/7da0e916023ffcdc7a64)

# MySQL
- [MySQLとの暮らしに役立ちたいリンク集 - Qiita](https://qiita.com/ponsuke0531/items/ca4a166dde2adf49c02f)

# MyBatis
- [MyBatis &#x2013; MyBatis 3 | 動的 SQL](http://www.mybatis.org/mybatis-3/ja/dynamic-sql.html)
- [MyBatis &#x2013; MyBatis 3 | Mapper XML ファイル](http://www.mybatis.org/mybatis-3/ja/sqlmap-xml.html)
- [聞いたことはあるけどよく知らないMyBatisにもうちょっと近づいてみる - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2018/01/19/140436)
- [MyBatisでエラーになって困った事例集 - Qiita](https://qiita.com/ponsuke0531/items/7b778aa54d509ab87939)
- resultTypeに書くプリミティブ型のエイリアス(「_」を忘れるとめでたくラッパー型になる)
    - 出典 : [MyBatis &#x2013; MyBatis 3 | 設定](https://mybatis.org/mybatis-3/ja/configuration.html#typeAliases)

|エイリアス|Java タイプ|
|:--|:--|
|_byte|byte|
|_long|long|
|_short|short|
|_int / _integer|int|
|_double|double|
|_float|float|
|_boolean|boolean|


# ストアドプロシージャって何？
- [ストアドプロシージャって何？ - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2019/06/03/204729)



# (Windows)A5:SQL Mk-2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/d771d8aa-26df-60b2-bd4a-fd80c1a4c305.png)

|やりたいこと|ショートカット|
|---|---|
|コメントアウト(コメントアウトを解除)|Ctrl + K (Ctrl + Shift + K)|
|実行計画を表示|Ctrl + E|
- [A5:SQL Mk-2のサイト](https://a5m2.mmatsubara.com/)
- [便利ツール　A5:SQL Mk-2の便利なショートカットをまとめてみた - 思考停止するな](http://shimonss.hatenablog.com/entry/2017/07/08/161043)
- [WindowsのDBツール「A5:SQL Mk-2」5つの便利機能 - Qiita](https://qiita.com/hrk_okd/items/d4062e96587355ea5fef)

## 設定をファイルに出力しておく方法
```text:readme.txt(v2.13.2)
■ポータブルモード
  通常、A5:SQL Mk-2はレジストリ及び、%APPDATA%\a5m2(x86)（または %APPDATA%\a5m2(x64)）
配下に設定や一時ファイルを保存しますが、あらかじめ、A5M2.exeと同じフォルダに 
"Portable" フォルダを作成しておくことで全ての設定および一時ファイル・SQLログ
ファイルを "Portable" フォルダに配置するようになる「ポータブルモード」で動作
させることができます。
　これにより、USBメモリなどに配置してA5:SQL Mk-2を持ち運び、各PCで設定を共有
することができるようになります。

　ポータブルモードは以下の特徴を備えます。

　・レジストリに書き込みを行わない
　・"Portable" フォルダ以外に一時ファイルを作成しない
　・設定や一時ファイル・SQLログファイルはすべてAES(256bit)で暗号化される
　・起動パスワードを設定することができる
　・ファイルの関連付けは行えない

　ポータブルモードは上述の通り、設定や一時ファイル・SQLログファイルをすべて
AES(キー長:256bit)で暗号化します。このため、起動パスワードを設定すれば、万一
A5:SQL Mk-2 の入ったUSBメモリ等を紛失しても、DBの設定情報や一時保存されたSQL・
ER図・スクリプト、SQLの実行を記録したログファイルが流出する可能性を最小限に
することができます。

　もちろん、USBメモリ等に入れなくとも、レジストリに書き込みを行わない目的で
ポータブルモードを利用することもできます。
```