概要
インラインビューを使って、レコード中のある列が最大値/最小値となるレコードを抽出できる。
以下、実行例に沿ってその方法を整理する。
実行例
以下のデータを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> SELECT * FROM student_scores; +------+---------+-------+ | name | subject | score | +------+---------+-------+ | 安藤 | 数学 | 80 | | 安藤 | 物理 | 90 | | 安藤 | 英語 | 75 | | 伊藤 | 数学 | 65 | | 伊藤 | 文学 | 85 | | 宇藤 | 物理 | 70 | | 宇藤 | 英語 | 85 | | 宇藤 | 文学 | 95 | | 江藤 | 数学 | 85 | | 江藤 | 物理 | 80 | | 江藤 | 文学 | 65 | +------+---------+-------+ 11 rows in set (0.00 sec) |
ここでは、全学生・全教科のうち、最低得点とその得点を取った学生と科目を表示させる。
1 2 3 4 5 6 |
SELECT name, subject, score, min_score FROM student_scores, (SELECT MIN(score) AS min_score FROM student_scores) as mint WHERE score = min_score ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT name, subject, score, min_score -> FROM -> student_scores, -> (SELECT MIN(score) AS min_score FROM student_scores) as mint -> WHERE score = min_score -> ; +------+---------+-------+-----------+ | name | subject | score | min_score | +------+---------+-------+-----------+ | 伊藤 | 数学 | 65 | 65 | | 江藤 | 文学 | 65 | 65 | +------+---------+-------+-----------+ 2 rows in set (0.00 sec) |
手順
最低得点の取得
まず、全体の最低得点は以下で得られる。
1 |
SELECT MIN(score) AS min_score FROM student_scores; |
1 2 3 4 5 6 7 |
mysql> SELECT MIN(score) AS min_score FROM student_scores; +-----------+ | min_score | +-----------+ | 65 | +-----------+ 1 row in set (0.00 sec) |
インラインビューによる最低得点列の追加
インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな最低スコアの列が追加される。
1 2 3 4 5 |
SELECT name, subject, score, min_score FROM student_scores, (SELECT MIN(score) AS min_score FROM student_scores) as mint ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> SELECT name, subject, score, min_score -> FROM -> student_scores, -> (SELECT MIN(score) AS min_score FROM student_scores) as mint -> ; +------+---------+-------+-----------+ | name | subject | score | min_score | +------+---------+-------+-----------+ | 安藤 | 数学 | 80 | 65 | | 安藤 | 物理 | 90 | 65 | | 安藤 | 英語 | 75 | 65 | | 伊藤 | 数学 | 65 | 65 | | 伊藤 | 文学 | 85 | 65 | | 宇藤 | 物理 | 70 | 65 | | 宇藤 | 英語 | 85 | 65 | | 宇藤 | 文学 | 95 | 65 | | 江藤 | 数学 | 85 | 65 | | 江藤 | 物理 | 80 | 65 | | 江藤 | 文学 | 65 | 65 | +------+---------+-------+-----------+ 11 rows in set (0.00 sec) |
最低得点レコードの抽出
各学生のレコードのうち、スコアが最低スコアに等しいレコードを抽出する。
1 2 3 4 5 6 |
SELECT name, subject, score, min_score FROM student_scores, (SELECT MIN(score) AS min_score FROM student_scores) as mint WHERE score = min_score ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT name, subject, score, min_score -> FROM -> student_scores, -> (SELECT MIN(score) AS min_score FROM student_scores) as mint -> WHERE score = min_score -> ; +------+---------+-------+-----------+ | name | subject | score | min_score | +------+---------+-------+-----------+ | 伊藤 | 数学 | 65 | 65 | | 江藤 | 文学 | 65 | 65 | +------+---------+-------+-----------+ 2 rows in set (0.00 sec) |