MySQLについて改めて調べてみた

##はじめに
MySQLはデータベース。そのことは知っていた。
しかし、結局仕組みとかわからないままでいた結果、色々詰まってしまった。（自業自得）
自戒も込めて、備忘録として基礎から学び直すことにしたので、ここに記す。

#####対象者
・データベースわからない！っていう初心者
・何と無くデータベース触ってきたけど、よくわかってない！って人

少しでも役に立てれば幸いである。

##読んだ本
[基礎からのMySQL](https://honto.jp/netstore/pd-book_28616656.html)

##ようこそ、DBの世界へ
###その名もデータベース、通称「DB」
「MySQLは世界で最も人気のあるオープンソースのデータベースソフトウェアです。」
と、冒頭に記載があるが、要は世界で最も使われているデータベースということだ。
個人的にオープンソースとは、公園のようなものだと思っている。すなわち、誰にでも開かれていて、誰が使っても良いし、無料で公開されているものだからだ。
データベースがなぜ出来たのかというと、戦争で情報を整理したかったからだとある。（著書内でもゆるく省略してる）

###RDBMSって何？
「RDBMS」の説明の前に、まず「RDB」を知らなければならない。
ここでRDBの要点をまとめると以下になる。
>・データベースにもいろんな「型」があり、その中の一つが「リレーショナル型」と呼ばれる。
・そして、「データベース」と繋げて「リレーショナルデータベース」と呼ばれる。
・ここでいう「リレーショナルデータベース」は通称「RDB」と呼ばれる。
・「リレーショナルデータベース」とは、1つのデータをいくつかの項目の集まりで表すことを指し、早い話エクセルの表を思い浮かべればOK
・エクセルを思い浮かべた時、「行」にあたる部分がRDBでは「レコード」と呼ばれ、「列」にあたる部分がRDBでは「カラム」と呼ばれる。


「「あれ？「RDBMS」ってじゃあ何？」」

RDBMSは、先に述べたRDBを管理するものである。
そして、そのRDBMSにMySQLは該当する。

###RDBMSの注意
>・一度入れたデータは変更することが出来ないと思った方がよい（トランザクションを使えば戻せる）
・同じ列（カラム）には同じデータしか入れられない
　例：数字を入れる列なら数字のみ入力可能

上記のような特徴がある為、「決められたルールでしか操作できず、厳密に管理されている」と言われる

###MySQLはどんなデータベースなのか？
冒頭で述べたような、RDBMSの1つとしてMySQLは存在する。
そしてMySQLにいは2つの形態がある。

####① MySQL Community Edition
1つ目の形態として、「MySQL Community Edition」がある。
特徴は、
>・無償で使用可能
・リファレンスマニュアルあり
・フォーラムやメーリングリストはあるが技術サポートはない

####② 商用MySQL
・有償
・定期的なアップデートやサービスパック、技術サポートがある
・複数のEditionがある

###MySQLの特徴
・動作が早い
・オープンソース
・多くのOSで動作する
・多くのプログラム言語に対応している
・無償と有償の２形態を持っている

##MySQLを動かしてみる
さて、読んでいた本の1章で、Windows内にMySQL環境をこしらえる手順が記載されていたが、
残念ながら私のPCはWindowsではなかったので読み飛ばした。
Mac環境にも勿論立てられるだろうし、クラウド環境なんかに立てるのも悪くないだろう。
構築手法はいくらでもあるので、以下資料を参考にすると良いと個人的に思っている。
[Mac へ MySQL を Homebrew でインストールする手順](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)
[AWS EC2 AmazonLinux2 MySQLをインストールする](https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06)

そして、内容は本に戻ってくる。
2章に入ると、実際に構文手法が出てくる。MySQLを扱うには「クエリ」と呼ばれる命令文を使ってデータを操作していくのだが、
これが所謂「SQL言語」と呼ばれるものである。
下記にいくつか構文を引用する。

###テーブルのカラム構造を確認
まず初めに、テーブル内のカラム構造を認識する必要がある。
その時、使用するのが以下クエリである。

```
# ----- 構文 ----- #
> DESC [テーブル名];
# ----- 例 ----- #
> DESC test;
## 意味：testというテーブルのカラム構造を確認したい場合
```

###テーブルにデータを入れる
####ただデータだけ入れたい場合
```
# ----- 構文 ----- #
> INSERT INTO [テーブル名] (データ１,データ２,データ３...);
# ----- 例 ----- #
> INSERT INTO test (1,２,３)
## 意味：testというテーブルにデータ（1,2,3）を入れる場合
```

####特定の列にデータを入れたい時

```
# ----- 構文 ----- #
> INSERT INTO [テーブル名] (カラム１,カラム２,カラム３...) VALUES(データ１,データ２...);
# ----- 例 ----- #
> INSERT INTO test (old,name,num) VALUES(3,'test_user2',22);
## 意味：testというテーブルの中の3行目に(3,'test_user2',22)というデータを入れたい場合
```

####一度にデータを入れたい時

```
# ----- 構文 ----- #
> INSERT INTO [テーブル名] (カラム１,カラム２,カラム３...) VALUES(データ１,データ２...),(データ１,データ２...),(データ１,データ２...);
# ----- 例 ----- #
> INSERT INTO test (old,name,num) VALUES(3,'test_user2',22),(4,'test_user3',23),(5,'test_user4',24);
## 意味：testというテーブルの中の3行目~5行目に()内のデータを入れたい場合
```

###テーブルのデータを表示する
####データを指定して表示させる

```
# ----- 構文 ----- #
> SELECT (カラム１,カラム２...)　FROM　[table名];
# ----- 例 ----- #
> SELECT (old,name)　FROM　test;
## 意味：testというテーブルの中のoldとnameの列を表示させたい場合
```

####データを全部表示させる

```
# ----- 構文 ----- #
> SELECT *　FROM　[table名];
# ----- 例 ----- #
> SELECT *　FROM　test;
## 意味：testというテーブルの中の全ての列を表示させたい場合
```


####テーブル関係なしに特定のデータだけ表示させる

```
# ----- 構文 ----- #
> SELECT '文字列';
# ----- 例 ----- #
> SELECT 'test';
## 意味：テーブルの中のtestと名のつくものを表示させたい場合
```

##データベースの「型」
データベースには「データ型」と呼ばれるルールが存在する。
データ型とは、指定したデータ以外入力できないことを指す。
「型」はいくつか存在し、その中の代表的なものについて紹介してあった。
以下に型の種類を挙げ、続きでそれぞれの特徴を記していく。
>・数値型
・文字列型
・日付/時刻型

###数値型
数字を入れる型のこと。
詳細は公式を読んだ方が早いので載せておく。
[数値型](https://dev.mysql.com/doc/refman/5.6/ja/numeric-types.html)

###文字列型
文字列にはその名の通り文字列を入れる型のことだが、いくつか種類が存在する。
ここでは「VARCHAR」は２５５字までなら可能。それ以上の文字列を入れたい場合は「TEXT」を使うと覚えればOKと記載があった。
また、注意として文字列を挿入する時は''または""でくくるのが原則。

###日付・時刻型
日付や時刻を格納できるカラムのデータ型には、「DATE」や「YEAR」などの手法がある。
SQLの中で時刻を表記するようにしたい場合、「YYYY:MM:DD」形式で入力する必要がある。
日付・時刻型を詳しく知りたい場合は、以下資料を参考にすると良いだろう。
[日付と時間型](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-types.html)

##主キーの設定
ここまでデータベースとは何か、データベースを扱う上でのさまざまな「型」を見てきた。
データを扱うのには慣れたもんだと例題や例文を読みながら思ったものだが、「主キー」という単語が入ってきた段階で一度立ち返ってみた。
主キーの説明の前に、「ユニーク」についての説明が入る。

###「一意」（ユニーク）とは
データベース内には大量のデータが入っていて、その中からたった一つを特定するのには骨が折れる。
しかし、その「たった1つ」を見つけ出さなければ作業が進まない。
そこで、「たった1つだけ特定できる」という唯一無二の状態を「一意である」あるいは「ユニークである」という。

###主キーって何？
数多く存在するレコードのうちの1つを特定する為に使う識別子のことだと述べられていた。
何だかよくわからない()
サイトでググると、主キーは別名「プライマリキー」とも呼ばれるとある。
結局、以下サイトが参考になったので載せる。
[主キーとは | 分かりそうで分からないでも分かった気になるIT辞典](https://wa3.i-3-i.info/word1991.html)
主キーって結局何なんだ、ということを一言でまとめると
要は「出席番号のことで、最初に区分することでわかりやすくするやつ」って覚えた。
主キーの特徴は以下の通り
>・値の重複がない
・何のデータも入力しない（NULL）ことはできない

####主キーの作り方

```
# ----- 構文 ----- #
> CREATE TABLE [テーブル名] (カラム名 データ型 PRIMARY KEY...);
# ----- 例 ----- #
> CREATE TABLE hoge (a num PRIMARY KEY, b name VARTURE(10));
## 意味：hogeというテーブルに「a num PRIMARY KEY」「b name VARTURE(10)」という行を追加して、「a」の行にプライマリキーを付与した場合
```

###インデックスを設定する
####インデックスとは
テーブル内のデータを検索する時、膨大なデータから探すのは大変なので、テーブルに「索引」機能を追加した。これがインデックス。
インデックスをつけることで処理速度が上がる。

####インデックスの作り方
```
# ----- 構文 ----- #
> CREATE INDEX [インデックス名] ON [テーブル名](カラム名);
# ----- 例 ----- #
> CREATE INDEX my_ind ON test(name);
## 意味：テーブル名「test」のカラム「name」にmy_indという名のインデックスをつくる場合
```

####インデックスを表示させる
```
# ----- 構文 ----- #
> SHOW INDEX FROM [テーブル名];
# ----- 例 ----- #
> SHOW INDEX FROM test;
## 意味：テーブル名「test」のインデックスを表示させる場合
```

##まとめ
今回は本の2章までをさくっと読んでみた。コマンドの例は記事に記載したもの以上に掲載しているのでおすすめしたい。
※記事内ではコマンド部分による演習部分は割と割愛したので、詳細は本を読むべし。