質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

9269閲覧

なぜMAXが必要なのでしょうか

Hekomi

総合スコア11

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2018/04/16 14:50

前提・実現したいこと

『達人に学ぶ SQL徹底指南書』でSQLの勉強をし始めたばかりです。
P.23のSQL文で、なぜMAXが必要なのかが理解できず躓いています。

テーブル名:StudentClub
列はstd_id|club_id|club_name|main_club_flgの4列で8行
std_id|club_id|club_name|main_club_flg
100    1    野球      Y
100   2   吹奏楽     N
200   2   吹奏楽     N
200   3   バドミントン  Y
200    4   サッカー    N
300   4   サッカー    N
400   5   水泳      N
500   6   囲碁      N

・1つだけのクラブに所属している学生については、そのクラブIDを取得する
・複数のクラブをかけ持ちしている学生については、主なクラブのID(main_club_flugがYのクラブ)を取得する

解答は
/* CASE 式の中で集約関数を使う*/
SELECT std_id,
CASE WHEN COUNT() = 1 / 一つのクラブに専念する学生の場合 */
THEN MAX(club_id)
ELSE MAX(CASE WHEN main_club_flg = 'Y'
THEN club_id
ELSE NULL END)
END AS main_club
FROM StudentClub
GROUP BY std_id;

std_id|main_club
100 1
200 3
300 4
400 5
500 6

発生している問題・エラーメッセージ

SQL文、3行目の「MAX]を外しても出来上がるテーブルに問題はないのですが
4行目の「MAX」を外すと std_id 200 のmain_clubがNULL になるのは何故でしょうか。
そもそも何故、「MAX」が必要なのかが分かりません(>_<)

ご教授いただけないでしょうか。

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はじめまして

そもそも何故、「MAX」が必要なのか

簡単な理由(?)としては

GROUP BY句を使った場合、グループ化した列名以外の
列では集計関数(MAX,MIN, AVG や COUNT(*) など...)が必要

だからです。

GROUP BY句とSQLの集計関数は対で使う、と覚えておきましょう!)

しかし詳細は以下の説明になる、
と思います。
(間違っていたらご指摘ください)


SQLにおけるMAX関数の機能は、少し複雑です。

ttps://www.shift-the-oracle.com/sql/aggregate-functions/max.html
こちらに詳しい説明があります。

抜粋すると

NULL は最大値を選択するためのデータに含まれない。
該当データが無い場合、NULL しかデータが存在しない場合には MAX 関数は NULL を戻す。

だからです。

これだと まずMAXがない状態では

SQL

1CASE WHEN main_club_flg = 'Y' 2THEN club_id 3ELSE NULL END 4・・・ 5GROUP BY std_id;

は std_id 200 では
吹奏楽、バドミントン、サッカーの3つなので
[NULL 3 NULL]  =>  NULL
最後のNULLが返ります。

なので 「「MAX」を外すと std_id 200 のmain_clubがNULL」

一方 MAXをつけて

SQL

1MAX(CASE WHEN main_club_flg = 'Y' 2THEN club_id 3ELSE NULL END) 4・・・ 5GROUP BY std_id;

を実行すると

まず CASE ~ GROUP BY std_id; は同じなので [NULL 3 NULL] が来て
これをMAX関数で処理するから

MAX([NULL 3 NULL]) => MAXは 3
(NULL は最大値を選択するためのデータに含まれない。)

std_id 200 のmain_clubは 3
となります。

こういった解釈だと思います。

投稿2018/04/16 16:28

kawakawa2018

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hekomi

2018/04/16 22:30

早速のご回答、本当にありがとうございます! 朝、既に回答が来ていてビックリしました!! 超初心者に丁寧に解説してくださり本当に助かります! 重ね重ね、ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問