Mysqlメモその１

# はじめに
これまでずっとフロントエンドでやってきて、バックエンド・DBは触ってこなかったので勉強しつつ覚書として残しておくためのものです。

# 流れ
1. 導入(OSX)
2. 立ち上げ
3. 基本操作

## 導入(OSX)

homebrewをインストールしてある場合、以下のコマンドでインストールできます。
（homebrewがインストールされていない場合は各自でインストールしてください）

```
$ brew install mysql
```

バージョンの確認をします。

```
$mysql --version
```

以下のような感じで出ればインストール完了です。

```
$ mysql --version
mysql  Ver 8.0.12 for osx10.13 on x86_64 (Homebrew)
```

## 立ち上げ

mysqlへ接続するには、以下のコマンドを使用します。

```
$ mysql -h host -u user -p
```
host, userにはそれぞれhost名とuser名が入り、この次の行でpasswordの入力を求められます。
ただし今回は同一host（localhost）ですのでhostを省略します。

```
$ mysql -u root -p
```

さらに、rootユーザーであればpasswordの入力も不要ですので、何も入力せずエンターキーを押せば立ち上がります。

-pの後にスペースを開けずにパスワードを記入する（例：-ppassword）ことでパスワードの入力を省くこともできるが、セキュリティ上の観点から非推奨。

なお、UnixまたはWindowsユーザーでエラーが出る場合は公式docsの[このあたり](https://dev.mysql.com/doc/refman/8.0/en/installing.html)を参照すると良いらしいです。

うまく立ち上がると、以下の画面が出てくると思います。
（バージョンによって多少変わるかと思います）

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.12 Homebrew

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
```

最後の行のmysql>とある部分にカーソルがあると思います。
この状態でmysqlコマンドを打ち込むことでmysqlを操作できます。

元のターミナルに戻るためにはexitと入力します。

```
mysql> exit
Bye
```

以上で、mysqlサーバーを立ち上げ、終了する流れができました。

## 基本操作

基本的には、この

```
mysql>
```
という表示がある状態でコマンドを入力していくことによりmysqlを操作していきます。

基本的な操作**（クエリ）**の動作についてはこんな感じ。

- 文末はセミコロン（;）で終わる。（quit, use, exitなど一部例外あり）
- 間違えてセミコロンを省いてしまうと、複数行クエリの受付になってしまう。useなどにセミコロンがつく分には問題ないので、毎回セミコロン打つ癖を付けたほうが良さそう。
- クエリの実行時に、サーバーに対してリクエストを送り、処理結果を表示する。
- 処理結果は行と列のあるテーブル状に表示される
- クエリは大文字小文字関係ない（show databasesでもSHOW DATABASESでも動く）


### 現在あるデータベースの一覧表示
```
mysql> SHOW DATABASES;
```

### データベースの作成

```
mysql> CREATE DATABASE test;
```

### データベースの選択
```
mysql> USE test
```

データベースの選択は本来mysql立ち上げごとに行わなくてはならないが、
立ち上げ時のコマンドラインの末尾にデータベース名を付けておけば一発で切り替えまで行える。

```
$ mysql -h host -u user -p test
```

### テーブルの作成（とデータの注入）
```
mysql> CREATE TABLE todos (
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    content  CHAR(40)           DEFAULT '',
    appointedto  CHAR(20)       DEFAULT '',
    duedate   DATE,
    PRIMARY KEY(id));
mysql> INSERT INTO todos (content,appointedto,duedate) VALUES
    ('A','John','2018-12-04'),('B','Hanna','2018-12-12'),('A','Jack','2018-12-23'),('B','John','2018-12-05'),
    ('C','John','2018-12-24'),('D','Jack','2018-12-9'),('D','David','2018-12-05');
```

- 名称、データタイプ、デフォルト値の順で各項目を設定。
- AUTO_INCREMENTを設定することで、数値を自動設定してくれるようになる（その場合PRIMARY KEYとしての指定が必須）
- DEFAULT値を指定していなかった場合はNULLになる。

[データタイプ一覧](https://dev.mysql.com/doc/refman/8.0/en/data-types.html)

### テーブルの確認

#### データベース内のテーブル一覧
```
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| todos          |
+----------------+
```

#### 詳細の確認
```
mysql> DESCRIBE todos;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | mediumint(9) | NO   | PRI | NULL    | auto_increment |
| content     | char(40)     | YES  |     |         |                |
| appointedto | char(20)     | YES  |     |         |                |
| duedate     | date         | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
```

#### 特定情報の抽出
```
mysql> SELECT * FROM todos ORDER BY duedate;
+----+---------+-------------+------------+
| id | content | appointedto | duedate    |
+----+---------+-------------+------------+
|  1 | A       | John        | 2018-12-04 |
|  4 | B       | John        | 2018-12-05 |
|  7 | D       | David       | 2018-12-05 |
|  6 | D       | Jack        | 2018-12-09 |
|  2 | B       | Hanna       | 2018-12-12 |
|  3 | A       | Jack        | 2018-12-23 |
|  5 | C       | John        | 2018-12-24 |
+----+---------+-------------+------------+
```

### テーブルの削除
```
DROP TABLE todos;
```
*該当するDBを選択（USE）状態である必要がある

### データベースの削除
```
DROP DATABASE dbname;
```
**削除の際に、特に警告等は出ないので注意**

# 参考文献

https://dev.mysql.com/doc/refman/8.0/en/tutorial.html
https://www.tutorialspoint.com/mysql/index.htm