MySQL SQL文の基礎をまとめる

# 目的

- MySQLを用いてSQL文を学んでいるのでまとめる(SQL文は小文字で記載するがスペルがあっていれば大文字でも小文字でも問題ない)

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| PC機種 | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 前提環境

- すでに何かしらのデータベースが作成され、テーブルが作成されていることを前提とする。
- まだ前述の作業が実施できていない方はこちら→[MySQL データベース作成 テーブル作成からデータの格納 取り出し](https://qiita.com/miriwo/items/613726e104f9850b3063)

# 準備

1. 下記コマンドを実行してMySQLのターミナルを起動する。(MySQLのルートユーザのパスワードを忘れてしまった方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

    ```terminal
    $ mysql -u root -p
    ```
1. MySQLにターミナルからログインできる事を確認する。(ターミナルに`mysql>`と表示されていればOK)
1. use文を使ってデータベースを指定する。(データベース名一覧の出力方法はこちら→[MySQL データベース作成 テーブル作成からデータの格納 取り出し](https://qiita.com/miriwo/items/613726e104f9850b3063))

    ```mysql
    mysql> use データベース名;
    ```

# コメントアウト

- `--`の後に半角スペースを開けて記載した文字はコメントとして扱われる。
- `*/`と`/*`で囲んだ部分もコメントとして扱われる。

# テーブル内の特定のカラムに格納されている値を出力する

- 下記を実行する。

    ```mysql
    mysql> select カラム名
        -> from テーブル名;
    ```
- 「users」テーブルの「id」カラムを出力したい場合は下記を実行する。

    ```mysql
    mysql> select id
        -> from users;
    ```
- 「users」テーブルの全てのカラムを出力したい場合は下記を実行する。

    ```mysql
    mysql> select *
        -> from users;
    ```

# カラムの別名定義

- 予約語(selectなど)を使用する際に、テーブル名やカラム名を別名として定義することができる。
- 現状基礎では必要ないように思えるが後々使用する事になるので別名定義の存在と記載方法だけ紹介する。
- 下記の二つの構文をそれぞれの予約後と絡めて実行する。
    - テーブル名の別名を定義したい場合は`本来のテーブル名 as 定義したいテーブル名`となる。
    - カラム名の別名を定義したい場合は`本来のカラム名 as 定義したいカラム名`となる。
- 「user」テーブルの別名を「people」と定義し、全てのカラムを出力したい場合は下記を実行する。

    ```mysql
    mysql> select *
        -> from user as people;
    ```
- 「user」テーブルの「id」カラムの別名を「user_id」と定義して「id」カラムを出力したい場合は下記を実行する。

    ```mysql
    mysql> select id as user_id
        -> from user;
    ```

# 新しくレコードを作ってデータを格納する

- 下記を実行する。

    ```mysql
    mysql> insert into テーブル名
        -> (カラム名1, カラム名2, カラム名3)
        -> value ('カラム名1に追加するデータ', 'カラム名2に追加するデータ', 'カラム名3に追加するデータ');
    ```
- すべてのカラムに対してデータを追加する場合、データを格納する先のカラムは指定しなくて良い
- 下記のカラムとデータが存在するuserテーブルにidが「2」、dateが「2020-04-02」、memoが「idが2のユーザです」という情報のレコードを追加する場合は下記を実行する。
    - 追加前のテーブルの状態を下記に記載する。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|
    - 下記を実行する。

        ```mysql
        mysql> insert into user
            -> (id, date, memo)
            -> value ('2','2020-04-02', 'idが2のユーザです。');
        ```
    - 実行後userテーブルは下記のようにデータが追加された状態になる。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|
        |2|2020-04-02|idが2のユーザです|

# 指定カラムのデータを更新する

- テーブル内の指定カラム全てを同じ値で更新したい場合は下記を実行する。

    ```mysql
    mysql> update テーブル名
        -> set カラム名1 = 上書きしたいデータ;
    ```
- 条件付けを行い一致したレコードのカラムのデータを書き換える場合は下記を実行する。

    ```mysql
    mysql> update テーブル名
        -> set カラム名1 = 上書きしたいデータ
        -> where 条件
    ```
- 下記のカラムとデータが存在するuserテーブルのidが２のユーザのdateを「2020-04-03」に更新したい場合は下記を実行する。
    - データ更新前のテーブルの状態を下記に記載する。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|
        |2|2020-04-02|idが2のユーザです|
    - 下記を実行する。

        ```mysql
        mysql> update user 
            -> set date = '2020-04-03'
            -> where id = '2';
        ```
    - 実行後userテーブルは下記のようにデータが更新された状態になる。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|
        |2|2020-04-03|idが2のユーザです|

# 指定カラムのデータを削除する

- テーブル内の全てのカラムのデータを削除する場合は下記を実行する。(基本これは実行しない。本能的にこれは実行を禁止するレベルで覚える)

    ```mysql
    mysql> delete from テーブル名；
    ```

- 特定のレコードのカラムないのデータを削除する場合は下記を実行する。

    ```mysql
    mysql> delete from テーブル名
        -> where カラム名 = データ;
    ```
- 下記のカラムとデータが存在するuserテーブルのidが２のレコードのデータを削除する場合下記を実行する。
    - データ更新前のテーブルの状態を下記に記載する。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|
        |2|2020-04-03|idが2のユーザです|
    - 下記を実行する。

        ```mysql
        mysql> delete from user
            -> where id = 2;
        ```
    - 実行後userテーブルは下記のようにデータが更新された状態になる。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|

# テーブルを作成する

- 下記を実行する。

    ```mysql
    mysql> create table テーブル名 (初回作成カラム名1 データ型(オプション), 初回作成カラム名2 データ型(オプション));
    ```

# テーブルを削除する

- 下記を実行する。(文字通りそっくりそのままテーブルを削除するので実行には注意する。)

    ```mysql
    mysql> drop table テーブル名;
    ```

# 特定のカラムを追加する

- 新規作成されたカラムのデータはすでにいくつかのレコードが存在している場合、NULLが格納される。
- 下記を実行する。

    ```mysql
    mysql> alter table カラムを追加したいテーブル名
        -> add 追加したいカラム名 データ型;
    ```
- 下記のカラムとデータが存在するuserテーブルのidカラムの隣にデータ型がtinyint型のnameカラムを追加したい場合は下記を実行する。
    - カラム追加前のテーブルの状態を下記に記載する。

        |id|date|memo|
        |---|---|---|
        |1|2020-04-01|idが1のユーザです|
    - 下記を実行する。

        ```mysql
        mysql> alter table user
            -> add name tinyint
            -> after id;
        ```
    - カラム追加後のテーブルの状態を下記に記載する。

        |id|name|date|memo|
        |---|---|---|---|
        |1|NULL|2020-04-01|idが1のユーザです|

# 特定のカラムを削除する

- 下記を実行する。(文字通りそっくりそのままカラムを削除するので実行には注意する。)

    ```mysql
    mysql> alter table users
        -> drop カラム名;
    ```

# テーブル内のデータをターミナル上に出力する

- 下記を実行する。

    ```mysql
    mysql> select *
        -> from テーブル名;
    ```

# テーブル作成時、カラム追加時に自動インクリメント(連番付与)してくれるカラムを定義する

- テーブル作成時のカラム設定を記述する場合は下記を実行する。

    ```mysql
    mysql> create table テーブル名
        -> 自動インクリメントを行たいカラム名 データ型 auto_incrment;
    ```
- カラム追加時のカラム設定を記述する場合は下記を実行する。

    ```mysql
    mysql> alter table テーブル名
        -> add 自動インクリメントを行たいカラム名 データ型 auto_incrment;
    ```

# 既存のカラム名を変更する

- 下記を実行する。(データ型の記載までが必須である。)

    ```mysql
    mysql> alter table テーブル名
        -> change 現在のカラム名 変更後のカラム名 データ型 その他の設定;
    ```
- userテーブルのdateカラムのカラム名をcreate_atカラムでデータ型をdateに修正したい場合は下記を実行する。(先に記載されているdateは現在のカラム名、後に記載されているdateはカラム名をcreate_atに変更した後のデータ型)

    ```mysql
    mysql> alter table user
        -> -- change 現在のカラム名 変更後のカラム名 データ型と記載する
        -> change date create_at date
    ```

# 既存のカラムのデータ型や設定を変更する

- 下記を実行する。(データ型までの記載が必須である。)

    ```mysql
    mysql> alter table テーブル名
        -> modify カラム名 変更後のデータ型 変更後のその他の設定
    ```

- userテーブルのmemoカラムのデータ型をvarchar型で最大文字数を20文字に変更したい場合は下記を実行する。

    ```mysql
    mysql> alter table user
        -> -- modify データ型などを変更したいカラム名 データ型の順に記載する。
        -> modify memo varchar(20);
    ```

# 既存カラムのデータ型、NULL制約、初期値、キー設定を表示する。

- 下記を実行する。

    ```mysql
    mysql> show columns from テーブル名;
    ```

# データベースの作成

- 下記を実行する。

    ```mysql
    mysql> create database データベース名;
    ```

# データベースの削除

- 下記を実行する。完全に内容も削除するので注意すること。

    ```mysql
    mysql> drop database データベース名；
    ```