プログラミング学習記録20〜MySQL突破〜

##今日やったこと
- Udemyの「Web開発入門完全攻略コース - プログラミングをはじめて学び創れる人へ！未経験から現場で使える開発スキルを習得！」のセクション14の195~214

以下、パートごとの学習メモです。

###セクション14MySQL入門
####195.イントロダクション-MySQL入門-
セクション14の概要。

データベース(DB)とは、整理された情報の集まりのことです。

ほぼ全てのシステムでデータベースを使っています。

####196.本セクションの学習環境について
・AWS Cloud9
・MySQL 5.7

####197.MySQLのインストール１
Cloud9上でmysql5.7をインストールしました。

####198.MySQLのインストール2
MySQLの環境設定を行いました。

文字コードをutf-8にしたり、Cloud9の起動と同時にMySQLが起動する設定に変えました。

####199.公式ドキュメント
MySQLのリファレンスです。

MySQL 5.7 Reference Manual(https://dev.mysql.com/doc/refman/5.7/en/)

5.7はまだ日本語に訳されていないのですが、5.6はすでに訳されています。

入門のレベルでは5.6を参照しても問題ないみたいです。

####200.データベース関連の用語について
行のことをレコード、列のことをフィールドと言います。

####201.データベースの操作
・データベースの一覧表示
・データベースの作成
・データベースの削除
・データベースの切り替え

データベースの一覧表示
`show databases;`

データベースの作成
`create database db01(データベース名）;`

データベースの削除
`drop database db03（データベース名）;`

操作対象にするデータベースを切り替える
`use db01;`

MySQLにログインする時に使用するデータベースを指定する
`mysql -u root db01`

####202.作業用ユーザーの作成
ルートユーザーで作業して間違った時の被害を少なくするために、作業用ユーザーを設定してから行うのが一般的です。

ローカルホストからアクセスするユーザー向けの設定をしました。

####203.SQLファイルからSQLを実行
ターミナルからではなく、SQLの外部ファイルからSQLを実行する方法を学びました。

####204.SQLのコメント
他の言語と同じようにcommandキー+/キーでコメントアウトできます。

####205.テーブルの操作
####206.データの挿入１
よくわかりませんが、動画の言う通りに写経してました。

テーブルを作って１行ずつ入れてるのはわかりました。

```sql
mysql> select * from users;
+------+-----------+------+
| id   | name      | age  |
+------+-----------+------+
|    1 | sato      |   20 |
|    2 | suzuki    |   21 |
|    3 | takahashi | NULL |
+------+-----------+------+
3 rows in set (0.00 sec)
```

`select * from users;`
でusersというテーブルの中身を確認しました。

入れたものが無事入っていました。

```sql
mysql> insert into users (id, name, age) values
    -> (4, 'tanaka', 24),
    -> (5, 'ito', 25),
    -> (6, 'watanabe', 26);
```

のように書くと、複数のデータを同時に入力することができます。


####207.データの挿入２

```sql
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32)      | YES  |     | NULL    |                |
| age   | int(11)          | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
```

not nullとPRIMARY KEYを指定しました。

not nullにより、nullを指定するとエラーが出て進まなくなります。

PRIMARY KEYを指定することによりidが自動で1ずつ増えていきます。

また、デフォルトを指定するやり方もやりました。


####208.データベースから値を取得
全てのカラムを取得する方法と指定したカラムだけを取得する方法を学びました。

####209.条件を指定してデータを取得する
ageが20以上、nameがsatoなど、指定した条件のデータだけを取得する方法を学びました。


####210.パターンマッチ

```sql
mysql> select * from users where name like 's%';
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | sato   |   18 |
|  2 | suzuki |   22 |
+----+--------+------+
2 rows in set (0.00 sec)
```

`where name like ’s%’;`
を追加することにより、sから始まるものだけを抽出しました。


```sql
mysql> select * from users where name like '%s%';
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | sato      |   18 |
|  2 | suzuki    |   22 |
|  3 | takahashi |   29 |
+----+-----------+------+
3 rows in set (0.00 sec)
```

%s%により、「sを含むもの」を抽出しました。

####211.並び替え
order byを使った並び順を指定します。

```sql
mysql> select * from users order by age asc;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  7 | yamamoto  | NULL |
|  1 | sato      |   18 |
|  5 | ito       |   19 |
|  6 | watanabe  |   20 |
|  2 | suzuki    |   22 |
|  3 | takahashi |   29 |
|  4 | tanaka    |   30 |
+----+-----------+------+
7 rows in set (0.00 sec)
```

Ascで昇順になります。

```sql
mysql> select * from users order by age desc;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  4 | tanaka    |   30 |
|  3 | takahashi |   29 |
|  2 | suzuki    |   22 |
|  6 | watanabe  |   20 |
|  5 | ito       |   19 |
|  1 | sato      |   18 |
|  7 | yamamoto  | NULL |
+----+-----------+------+
7 rows in set (0.00 sec)
```

descで降順になります。

####212.件数の制限
取得するデータの件数を制限します。

```sql
mysql> select * from users limit 3;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | sato      |   18 |
|  2 | suzuki    |   22 |
|  3 | takahashi |   29 |
+----+-----------+------+
3 rows in set (0.00 sec)
```

3件に制限した例です↑

```sql
mysql> select * from users order by age asc limit 3;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  7 | yamamoto | NULL |
|  1 | sato     |   18 |
|  5 | ito      |   19 |
+----+----------+------+
3 rows in set (0.00 sec)
```

昇順で3件に制限した例です↑

####213.データの更新
カラムのデータを更新するにはupdateコマンドを使います。

```sql
mysql> update users set age = 40 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from users;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | sato      |   40 |
|  2 | suzuki    |   22 |
|  3 | takahashi |   29 |
|  4 | tanaka    |   30 |
|  5 | ito       |   19 |
|  6 | watanabe  |   20 |
|  7 | yamamoto  | NULL |
+----+-----------+------+
7 rows in set (0.00 sec)
```

Idが1のageを40に更新しました。

全てのカラムを更新してしまうというミスをしないためにwhereを確認することは大事だと思いました。


####214.データの削除
データの削除にはdeleteコマンドを使います。

```sql
mysql> select * from users;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | sato      |   18 |
|  2 | suzuki    |   22 |
|  3 | takahashi |   29 |
|  4 | tanaka    |   30 |
|  5 | ito       |   19 |
|  6 | watanabe  |   20 |
|  7 | yamamoto  | NULL |
+----+-----------+------+
7 rows in set (0.00 sec)

mysql> delete from users where id=1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from users;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  2 | suzuki    |   22 |
|  3 | takahashi |   29 |
|  4 | tanaka    |   30 |
|  5 | ito       |   19 |
|  6 | watanabe  |   20 |
|  7 | yamamoto  | NULL |
+----+-----------+------+
6 rows in set (0.00 sec)
```

Idが1のレコードを削除しました↑

```sql
mysql> delete from users where age>=20;
Query OK, 4 rows affected (0.00 sec)

mysql> select * from users;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  5 | ito      |   19 |
|  7 | yamamoto | NULL |
+----+----------+------+
2 rows in set (0.00 sec)
```

条件(ageが20以上)を指定して削除しました↑

条件を指定すると全レコードを削除してしまうので、注意しましょう。

削除したレコードは簡単には復旧できないそうです。


###セクション14MySQL入門　全体の感想
SQLに関してはProgateでも触れたことがなく、ターミナルの操作も慣れていないため大変でした。最初の方はずっと箱の中身はなんだろな？をやらされているような感覚でした。


ただ、気にせず学習を進めていくと、何回も使うコマンドだったり、共通する文言などが徐々にわかってきたのでよかったです。


正直、わからないことだらけで辛さも感じてます。

ただ、それでもせっかくプログラミング学習の習慣がついてきたので、これを無駄にしたくないという気持ちもあります。

迷う気持ちは消えないですが、だからと言って立ち止まっていても、何も解決しないです。
むしろもっと迷う羽目になる気がします。

なので、わからなくてもとりあえず１周を終えます。

ということで、引き続き明日からもプログラミング学習頑張ります。