dockerとSQLについて

### Dockerについて少し勉強したので、軽くまとめました。(自分用)

###  dockerとは？
Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。 

- Dockerを使って作った仮想環境はコンテナと呼ばれる。

##### コマンドと操作
`Dockerコンテナの作成・起動・停止のために使用するコマンド`
- docker create	(新しいDockerコンテナを作成する)
- docker start	(作成済みのDockerコンテナの起動)
- docker run	(新しいDockerコンテナを作成＆起動する)
- docker stop	(作成済みのDockerコンテナを停止する)
- docker rm	(作成済みのDockerコンテナを削除する)

#### 環境構築

- 初めにディレクトリを作成することから始める。ファイルを作成後、(例)docker-compose.yml と作成。

```
version: '3.1'

services:

  db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    platform: linux/x86_64
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - 3308:3306
volumes:
  mysql_data:
```

[![Image from Gyazo](https://i.gyazo.com/9ca67910041f41fbefac378db8a586e8.png)](https://gyazo.com/9ca67910041f41fbefac378db8a586e8)

※上手く作成できれば、鯨さんのマークが付いている。

#### コンテナを起動す
コンテナを起動するには docker-compose.yml ファイルがあるディレクトリで下記コマンドを叩くとコンテナが作成される。
```
$ docker compose up
```
[![Image from Gyazo](https://i.gyazo.com/1c22ea9d2068d8202c16425942a70bcf.png)](https://gyazo.com/1c22ea9d2068d8202c16425942a70bcf)

※上手く作れたらOK

コンテナが消えるのは下記コマンドを叩く。

```
$ docker compose down
```

#### SQLに接続する

```sql
docker compose up -d && docker compose exec db bash
```
→と叩くと、＃が表示される為、下記コマンドを叩く。

```sql
mysql -u root -p 
```
すると、パスワードを要求される。PW：`example`と打てばOK

※全体的には下記のような感じ。

```sql
docker compose up -d && docker compose exec db bash
[+] Running 1/0
 ✔ Container sql_basic-db-1  Running                                                 0.0s 
bash-4.2# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

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> 
```
また、SQLから抜けるには`exit`で抜ける。

- MySQL サーバーホスト上のデータベースを一覧表示するコマンド
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.03 sec)

mysql> 
```

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


SQLの場合→sample_study というDBを作る。
```sql
mysql> create database sample_study;
Query OK, 1 row affected (0.16 sec)
```
railsの場合
```ruby
$ rails db:create
```
`show databases`で見ると、`sample_study `が入っている。
```sql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample_study       |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
```
データベースの選択方法

```sql
mysql> use runteq_study
Database changed
```
※railsではどのデータベースを使うかは自動で選択される。

#### テーブルの作成方法

- テーブルの確認
```sql
mysql> show tables;
Empty set (0.02 sec)
```
- テーブルの設定
```sql
mysql> CREATE TABLE user(
    id INT(11) AUTO_INCREMENT NOT NULL, 
    first_name VARCHAR(30) NOT NULL,
    last_name VARCHAR(30) NOT NULL,
    PRIMARY KEY (id));

Query OK, 0 rows affected (0.02 sec)
```
- 設定された後の表示
```sql
show tables;
+------------------------+
| Tables_in_sample_study |
+------------------------+
| user                   |
+------------------------+
1 row in set (0.00 sec)
```

railsの場合はこのように作成。

```ruby
$ rails g model user first_name:string last_name:string
$ rails db:migrate
```

#### テーブルにレコードを追加する方法

```sql
mysql> insert into user (first_name, last_name) values ('dyson', 'saito');
Query OK, 1 row affected (0.00 sec)
```
- テーブルを確認
```sql
mysql> select * from user;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | dyson      | saito     |
+----+------------+-----------+
1 rows in set (0.00 sec)
```
railsでのテーブル追加

```ruby
user = User.new(first_name: 'dyson', last_name: 'saito')
user.save
```

#### whereで絞り込む

```sql
mysql> select * from board where user_id = 1;
+----+-------+------------------+---------+
| id | title | body             | user_id |
+----+-------+------------------+---------+
|  1 | hoge  | hogehogehogehoge |       1 |
|  2 | fuga  | fugafugafugafuga |       1 |
+----+-------+------------------+---------+
2 rows in set (0.03 sec)
```
railsの場合

```ruby
Board.where(user_id: 1)
```

#### order について

ASC・・・昇順（小さいもの順）
DESC・・・降順（大きいもの順）

```sql
mysql> select * from board order by title desc;
+----+-------+------------------+---------+
| id | title | body             | user_id |
+----+-------+------------------+---------+
|  1 | hoge  | hogehogehogehoge |       1 |
|  2 | fuga  | fugafugafugafuga |       1 |
|  3 | bar   | barbarbarbar     |       2 |
+----+-------+------------------+---------+
3 rows in set (0.01 sec)
```
railsの場合

```ruby
Board.all.order(title: :asc)
```

#### update(変更)方法について

- 変更前
```sql
mysql> select * from user;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | dyson      | saito     |
|  2 | hisaju     | kikumoto  |
|  3 | takako     | omoshiro  |
+----+------------+-----------+
3 rows in set (0.00 sec)
```
変更する
```sql
mysql> update user set first_name="daichi" where id = 1;
```
- 変更後
```sql
mysql> select * from user;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | daichi     | saito     |
|  2 | hisaju     | kikumoto  |
|  3 | takako     | omoshiro  |
+----+------------+-----------+
3 rows in set (0.00 sec)
```
→first id に`daichi`と変更されている。

```ruby
user.update(first_name: 'daichi') # userはidが1のユーザーという前提
```

#### delete(削除)について
- レコードを削除する。

```sql
mysql> delete from user where id = 3;
```
id 3の`takako`が削除される。
- 変更前
```sql
mysql> select * from user;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | daichi     | saito     |
|  2 | hisaju     | kikumoto  |
|  3 | takako     | omoshiro  |
+----+------------+-----------+
3 rows in set (0.00 sec)
```
- 変更後
```sql
mysql> select * from user;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | daichi     | saito     |
|  2 | hisaju     | kikumoto  |
+----+------------+-----------+
2 rows in set (0.00 sec)
```