目的
- 一瞬サブクエリの実行部分で詰まったので例文を記載する
実施環境
- ハードウェア環境
項目 | 情報 |
---|---|
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にログインすることができること。
$ mysql -u root -p
-
command not found
と出力された方はこちら→Mac HomebrewでMySQLをインストールする - rootユーザのパスワードを失念してしまった方はこちら→MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法
-
-
studyデータベースにusersテーブルを作成する。作成に際して役立ちそうなリンクを下記に記載する。
-
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> -- 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> 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の最大値を求めているのかの違いである。