MySQL 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にログインすることができること。

    ```terminal
    $ mysql -u root -p
    ```
    - `command not found`と出力された方はこちら→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9)
    - rootユーザのパスワードを失念してしまった方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)
- studyデータベースにusersテーブルを作成する。作成に際して役立ちそうなリンクを下記に記載する。
    - [MySQL SQL文で自動インクリメントなどの機能を備えたusersテーブルを作る](https://qiita.com/miriwo/items/50a2c18a0e8241481866)
    - [MySQL SQL文の基礎をまとめる](https://qiita.com/miriwo/items/e880d816c8b15096ada0)
- usersテーブルには下記のデータがすでに格納されている事とする。(※テーブル内に記載されている情報は全て架空のものである)

    | id | name          | age | gender | email                    | authority | created_at          | updated_at          |
    |---|---|---|---|---|---|---|---|
    |  1 | admin         |  20 | other  | shunokawa@gmail.com      | admin     | 2020-04-08 16:06:08 | 2020-04-08 17:52:22 |
    |  2 | 山田 太郎     |  25 | male   | tarou_yamada@email.com   | user      | 2020-04-08 16:22:08 | 2020-04-08 17:51:15 |
    |  4 | 鈴木 一郎     |  58 | male   | ichirou_suzuki@email.com | user      | 2020-04-08 16:28:14 | 2020-04-08 17:51:15 |
    |  5 | 田中 太郎     |  16 | male   | tarou_tanaka@email.com   | user      | 2020-04-08 16:37:06 | 2020-04-08 17:51:15 |
    |  6 | 中田 太郎     |  36 | male   | tarou_nakata@email.com   | user      | 2020-04-08 16:37:25 | 2020-04-08 17:51:15 |
    |  8 | 渡邉 キヨ     | 113 | female | kiyo_wataab@email.com    | user      | 2020-04-08 16:39:29 | 2020-04-08 17:53:08 |

# ageの値が最大のレコードを取得する

- サブクエリ未使用で実施する場合は下記を実行する。

    ```mysql
    mysql> -- ageの最大値を求める
    mysql> select max(age)
        -> from users;
    +----------+
    | max(age) |
    +----------+
    |      113 |
    +----------+
    mysql> -- 先の出力をもとに下記を実行する
    mysql> select *
        -> from users
        -> where age = 113;
    +----+---------------+-----+--------+-----------------------+-----------+---------------------+---------------------+
    | id | name          | age | gender | email                 | authority | created_at          | updated_at          |
+----+---------------+-----+--------+-----------------------+-----------+---------------------+---------------------+
    |  8 | 渡邉 キヨ     | 113 | female | kiyo_wataab@email.com | user      | 2020-04-08 16:39:29 | 2020-04-08 17:53:08 |
    +----+---------------+-----+--------+-----------------------+-----------+---------------------+---------------------+
    ```
- サブクエリを使用して実施する場合は下記を実行する。

    ```mysql
    mysql> select *
        -> from users
        -> where age = (select max(age) from users);
    +----+---------------+-----+--------+-----------------------+-----------+---------------------+---------------------+
    | id | name          | age | gender | email                 | authority | created_at          | updated_at          |
+----+---------------+-----+--------+-----------------------+-----------+---------------------+---------------------+
    |  8 | 渡邉 キヨ     | 113 | female | kiyo_wataab@email.com | user      | 2020-04-08 16:39:29 | 2020-04-08 17:53:08 |
    +----+---------------+-----+--------+-----------------------+-----------+---------------------+---------------------+
    ```

# ちょっとした解説(逆に混乱した場合は無視してください)

- サブクエリは少しだけ複雑なのだが考え方は至ってシンプルである。
- サブクエリ未使用の場合、「ageカラムの最大値を求める→次のselect文でのwhereで先のageの最大値を用いて表示切り分け」としている。
- サブクエリを使用する場合、「select文のwhereでageの最大値を求めてそのまま使用」としている。
- 最終結果であるレコードを検索する部分でageの最大値を求めているのかそれより先に別のselect文とmax関数でageの最大値を求めているのかの違いである。