MariaDB コマンドまとめ その2

テーブルに関してのコマンド
簡単に動作確認した限りではdescやselect文、insert文は
そのまま使用できそうな感じ。

使用頻度が高いもので追加があれば追記していく。

----------------------------

#テーブル一覧の表示
接続しているDBに作成されているテーブルの一覧を表示する。

```sql:テーブル一覧
SHOW TABLES;
```

DBに接続していないと以下エラーとなる。

```
MariaDB [(none)]> show tables;
ERROR 1046 (3D000): No database selected
```

#テーブルの作成
[]内は省略可能。
コメントについては後から追加することも可能だが、
作成時にやっておいた方が面倒がないと思う。

```sql:テーブルの作成
CREATE TABLE テーブル名(
カラム名 データ型 [COMMENT 'コメント'],
カラム名 データ型 [COMMENT 'コメント'],
･･･,
PRIMARY KEY (カラム名)
)
[CHARACTER SET 文字コード]
[COLLATE 照合順序];
```

#テーブル構造の確認

```sql:テーブル構造
DESC テーブル名;
```
Collationやコメントなども含めた
descよりも詳細なテーブル構造の確認を行う場合。

```sql:テーブル構造(詳細)
SHOW FULL COLUMNS FROM テーブル名;
```

#コメントの追加
テーブルの作成時にコメントを付けることは可能だが、
後から追加することも可能。
但し、カラムコメントについてはカラムの再定義という形になるっぽい

```sql:テーブルコメントの追加
ALTER TABLE テーブル名 COMMENT 'コメント';
```

```sql:カラムコメントの追加
ALTER TABLE テーブル名 MODIFY カラム名 COMMENT 'コメント';
```

```sql:コメントの確認
SELECT column_name, column_comment FROM information_schema.columns 
WHERE table_name='テーブル名';
```

#CREATE TABLE文の表示
指定したテーブル名のCreate Table文を表示する。
個人的にはテーブルの文字コードを確認したい時などに使う。

```sql:文字コードを確認
SHOW CREATE TABLE テーブル名;
```

#テーブルの一覧と詳細情報の確認
Collationとか作成日、最終更新日などの確認に使用。
カレント以外にもDBを指定して実行することも可能。

```sql:DBの全テーブルの一覧
SHOW TABLE STATUS;
SHOW TABLE STATUS FROM データベース名;
```

like句で特定のテーブル、ある程度文字列を含んだテーブルを
絞り込むことも可能。

```sql:テーブルの詳細情報
SHOW TABLE STATUS LIKE 'テーブル名';
SHOW TABLE STATUS FROM データベース名 LIKE 'テーブル名';
```

#カラムの追加

###テーブルの末尾に追加

```sql:末尾に追加
ALTER TABLE テーブル名 ADD カラム名 カラムの型情報; 
```

###位置を指定して追加

```sql:位置指定で追加
ALTER TABLE テーブル名 ADD カラム名 データ型 AFTER 入れたい位置の前のカラム名;
```

例：
fir_nameカラムとfam_nameカラムの間に"mid_name"というカラムを追加する場合

```
MariaDB [iwate]> desc juve;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id_no    | int(11)     | NO   |     | NULL    |       |
| no       | varchar(5)  | NO   |     | NULL    |       |
| fir_name | varchar(25) | YES  |     | NULL    |       |
| fam_name | varchar(25) | YES  |     | NULL    |       |
| position | varchar(3)  | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

MariaDB [iwate]> alter table juve add mid_name varchar(25) after fir_name;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [iwate]> desc juve;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id_no    | int(11)     | NO   |     | NULL    |       |
| no       | varchar(5)  | NO   |     | NULL    |       |
| fir_name | varchar(25) | YES  |     | NULL    |       |
| mid_name | varchar(25) | YES  |     | NULL    |       |
| fam_name | varchar(25) | YES  |     | NULL    |       |
| position | varchar(3)  | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
```

#テーブル名の変更
OracleDBと同様にalter文、rename文両方ともOKっぽい。

```sql:テーブル名の変更1
ALTER TABLE テーブル名 RENAME AS 新テーブル名;
```

```sql:テーブル名の変更2
RENAME TABLE テーブル名 TO 新テーブル名;
```

#データの挿入
[]内は省略可能。
insert文については特に変化はなし。
insert select文も使用可能。

但しOracleDBと違って「ON DUPLICATE KEY UPDATE」というオプションが存在。
これはOracleDBで言うところのmerge文的な位置付けの模様で、
対象データが無ければinsertしてあれば古いデータをupdateする、という動作。

```sql:insert文
INSERT INTO テーブル名 [カラム名, ...] 
VALUES(値,'値', ...)
[ON DUPLICATE KEY UPDATE カラム名='値'];
```

#データの更新
[]内は省略可能。
update文についても特に変化はなしだが、
他のテーブルBの値でテーブルAの値をupdateする、
と言ったことを副問合せでなく、
複数テーブルを指定するだけで可能になっている。

```sql:update文
UPDATE テーブル名[,テーブル名] SET カラム名=値 [,カラム名='値']
WHERE カラム名='値';
```

複数テーブルを指定するケースは複数テーブルで条件に当てはまる値を
いっぺんに更新できる、と勘違いしそうになる(実際に自分はそう認識してしまった)。
実行すればすぐに分かるけど、この文法だと直感的には分からない人の方が多いと思うんだけどなぁ･･･
自分だけかな？


#データの削除
delete文、truncate文両方ともそのまんまでいけそう

```sql:delete文
DELETE FROM テーブル名 [WHERE カラム名='値'];
```

```sql:truncate文
TRUNCATE TABLE テーブル名;
```

このdeleteとtruncateの内部動作の差異はまだアーキテクチャを理解してないので
OracleDBと同じ理解でいいのかはまだ分からない。


#参考

MariaDB SQL Commands
https://mariadb.com/kb/en/mariadb/sql-commands/

MySQL5.6 リファレンスマニュアル
第 13 章 SQL ステートメントの構文
https://dev.mysql.com/doc/refman/5.6/ja/sql-syntax.html

MySQL: INSERT...ON DUPLICATE KEY UPDATEまとめ
http://qiita.com/yuzroz/items/f0eccf847b2ea42f885f

よく使うMariaDB か MySQLのSQLコマンドメモ
http://qiita.com/pugiemonn/items/247dccb6dc56e373ba92

MariaDB　はじめてのMariaDB　【第５回 DBを作成してみよう】
http://www.sakc.jp/blog/archives/38550

バシャログ。
【MySQL】レコードを、別テーブルの特定の値で UPDATE する方法
http://bashalog.c-brains.jp/13/07/24-144156.php