【MySQL】超簡易リファレンス

# 接続
```
$ mysql --help   # ヘルプを表示する
$ mysql --help | grep my.cnf   # 設定ファイルのパスを表示する
$ mysql --version   # バージョン情報を表示する
$ mysql -u user -p [database]   # データベースに接続する
mysql> exit   # データベースとの接続を切る

// 接続情報
mysql> \s
mysql> SHOW VARIABLES LIKE ‘%port%’;
```

# ユーザー管理
```
mysql> SELECT host, user FROM mysql.user;
mysql> DELETE FROM mysql.user where password='';
mysql> DELETE FROM mysql.user where host='';
mysql> CREATE USER user_name IDENTIFIED BY 'password';
mysql> SET PASSWORD FOR user@host=password('new_password');
```

# データベース操作
```
mysql> SHOW DATABASES;   -- データベースの一覧を表示する
mysql> USE db_name;   -- 作業するデータベースを指定する
mysql> CREATE DATABASE db_name;   -- データベースを新規作成する
mysql> DROP DATABASE db_name;   -- 指定したデータベースを削除する

// 特定のデータベースの作業権限を付与した新規ユーザーを作成する
mysql> grant all on db.table to user@host identified by 'password';
```

# テーブル操作
```
mysql> CREATE TABLE IF NOT EXISTS table_name (
           id int,
           group_id int,
           name varchar(255),  -- varcharは可変長文字列
           email varchar(255),
           password char(32),  -- charは固定長文字列
           PRIMARY KEY (id),   -- 主キー制約
           CONSTRAINT FOREIGN KEY (group_id) REFERENCES ex_table (ex_column)   -- 参照整合性制約
       );

mysql> SHOW TABLES LIKE '%hoge%';   -- 名前に hoge を含むテーブルを表示する
mysql> SHOW CREATE TABLE table_name;   -- テーブルの定義を表示する
mysql> SHOW INDEX FROM table_name;   -- テーブルのインデックスを表示する
mysql> DESC table_name;   -- テーブルの定義を表示する

mysql> ALTER TABLE table_name   -- カラムを追加する
    -> ADD COLUMN new_column_name TINYINT UNSIGNED NOT NULL DEFAULT 0 AFTER existing_column_name;
mysql> ALTER TABLE table_name   -- カラムを削除する
    -> DROP COLUMN existing_column_name;
mysql> ALTER TABLE table_name   -- カラムの位置を変更する
    -> MODIFY COLUMN target_column_name INT DEFAULT 0 NOT NULL AFTER other_column_name;

mysql> DROP TABLE table_name;   -- テーブルを削除する
mysql> TRUNCATE TABLE table_name;   -- テーブルのレコードを全て削除する（定義情報は残る）

//  文字コードの変更
mysql> ALTER TABLE table_name charset=characer_code;
mysql> ALTER TABLE table_name convert to character set character_code;
```
### CREATE文で宣言するカラムの制約
|制約|意味|
|---|---|
|NOT NULL|NULLを登録しようとするとエラー|
|UNIQUE|ある列の組が一意でない場合はエラー|
|CHECK|ある列が取りうる値を指定し、違反した場合はエラー|

# レコード操作
```
mysql> INSERT INTO table_name (column_1, column_2) VALUES (value_1, value_2)
    -> ON DUPLICATE KEY UPDATE column_a = value_a;   -- レコードを追加する(キーが重複した場合は更新する)

mysql> INSERT INTO table_name (column_1, column_2) VALUES (value_1, value_2)
    -> , (value_3, value_4), (value_5, value_6);   -- 複数レコードを一括で挿入する（バルク INSERT 文）

mysql> UPDATE table_name SET column_1 = value_1, column_2 = value_2 WHERE column_a = value_a;   -- レコードを更新する

mysql> DELETE FROM table_name WHERE column_name = value;   -- レコードを削除する

mysql> SELECT * FROM table_name LIMIT 50 OFFSET 5;   -- 最初の5件をスキップし、それ以降の50件を取得する
mysql> SELECT * FROM table_name LIMIT 5 \G;   -- \G で各カラムを縦に並べて出力する。カラムが多くて見にくい時に。
```
- http://dev.mysql.com/doc/refman/5.7/en/update.html

# バックアップ
```
$ mysqldump -u user -h host database > ./file.sql   # 論理バックアップを作成
$ mysql -u user -h host database < ./file.sql   # 論理バックアップから復元
```

# 参考情報
- [ドットインストール/MySQL入門](http://dotinstall.com/lessons/basic_mysql_v2)
- [もしのまメモ/【MySQL】ユーザー関連初期設定（作成・削除とかとか）【コマンドプロンプト】](http://mosinoma.cocolog-nifty.com/blog/2010/09/mysql-425f.html)
- [karakaram-blog/MySQLのユーザを管理する方法まとめ。作成・パスワード・権限](http://www.karakaram.com/mysql-user-grant)
- [さすけのプログラミング入門/MySQL ユーザの操作（作成、パスワード変更、削除）](http://sasuke.main.jp/useri.html)
- [俺はそんなにやる気ない/MySQLのデータベースとテーブルの文字コードを変更する](http://blog.takkinoue.com/entry/2015/07/18/121230)
- [mysqlで文字コードをutf8にセットする](http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a)
- [Softel メモ/【MySQL】テーブルの文字コードを調べる](https://www.softel.co.jp/blogs/tech/archives/1470)
- [Be an Idealistic Realist/MySQLでテーブルとカラムの文字コードを一括変更する](http://beanidealisticrealist.hatenablog.com/entry/2013/05/14/MySQL%E3%81%A7%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A8%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%AE%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%B8%80%E6%8B%AC%E5%A4%89%E6%9B%B4)