GROUP BY句について。

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
アルミ缶さん  
(No.1)
このサイトのデータベースの解説と、本の解説で混乱してしまいました。
(決してこのサイトのせいにするつもりはないことを予め断っておきます)
以下に、混乱した解説を抜粋して書きます。
セレクト句で指定しているのにグループ句で指定していないとエラーになる(https://www.fe-siken.com/kakomon/28_aki/pm03.html)。
セレクト句で指定していないのにグループ句で指定するとエラーになる(https://www.fe-siken.com/kakomon/28_haru/pm03.html
また、持っている本の解説には「セレクト句に指定している属性は、全てグループ句で指定する必要がある」という記述もあります。
今まで私は「セレクト句に指定していないものをグループ句で指定するとエラーになる」と理解ましたが、全くわからなくなってしまいました。
それとも、どこかで致命的な誤解をしているのでしょうか?
どなたか教えて頂けないでしょうか?
2021.01.28 15:31
詞音さん 
(No.2)
>セレクト句で指定しているのにグループ句で指定していないとエラーになる
>セレクト句で指定していないのにグループ句で指定するとエラーになる
一見、矛盾しているようでどちらも正しいです。
例えば、「従業員」というテーブルがあり、「従業員番号(主キー)、従業員名、部署番号、部署名」という属性を持っていたとします。
このデータから「部署番号、部署名」をセレクトする場合、下記の通りになります。
セレクト句で指定している→部署番号、部署名→グループ句を使う場合は指定「しないと」エラーになる
セレクト句で指定していない→従業員番号、従業員名→グループ句を使う場合は指定「すると」エラーになる

>持っている本の解説には「セレクト句に指定している属性は、全てグループ句で指定する必要がある」という記述もあります。
これに関しては「全て」の指す内容で正しい、正しくないが異なってくるように思います。
個人的にはこの「全て」という表現が引っ掛かりますね。
というのはセレクト句に指定していても、MAXやCOUNTなどの「集約関数」を使用していればグループ句で指定する必要がないためです。
「全て」に集約関数が含まれていないのであれば正しいですが、含む場合は正しくなくなってしまいます。

>今まで私は「セレクト句に指定していないものをグループ句で指定するとエラーになる」と理解ましたが、全くわからなくなってしまいました。
理解されている内容自体は合っていて、上記例の従業員番号、従業員名に該当します。
2021.01.28 17:42
アルミ缶さん  
(No.3)
ありがとうございます。
一応確認したいのですが、
>このデータから「部署番号、部署名」をセレクトする場合、下記の通りになります。
の以下は、
「SELECT 部署番号,部署名
  FROM  従業員
  GROUP BY NULL」
「SELECT NULL
  FROM 従業員
  GROUP BY 従業員番号.従業員名」
という書き方になり、それぞれエラーになるということですよね。
つまり、口説いようですいませんが、
「セレクト句で指定した集約関数以外の属性はグループ句でも指定しないといけない。且つ、セレクト句で指定していないものをグループ句で指定することはできない」
という理解で合っていますか?
2021.01.29 11:11
通りがかりさん 
(No.4)
GROUP BY句の、そもそもの用途から見直してはいかがでしょうか。
たとえば、学校のテストの点数集計において、クラスごとの平均とか、クラスごとの受験者数とかを集計表を出すために使われます。
"~"ごとの集計表を出すのが目的ですので、。GROUP BYの後には"~"が入りますし、出力される集計表のカラム(SELECT句)には当然"~"が含まれていなければ集計表の意味をなしません。
そのため、SELECT句の後には、GROUP BY句の後の"~"と、集計関数が入るはずです。

あと、NULLの意味についても再度見直してみてください。NULLは値ではありません。
2021.01.29 14:04
アルミ缶さん  
(No.5)
ありがとうございます。
すいません、NULLは違うだろうなと思いつつ入れましたが、間違ってましたね。
確かに、そもそもグループ句はセレクト句で抽出したものをまとめるものですから、そう考えれば納得がいく答えを出すことはできます。
ただ、本当にその認識であっているのか確認したい意味も込めて質問させていただいた次第です。
とりあえずは私の認識に間違いはないとのことの様ですので、この質問は締め切らせていただきます、
お二方とも、ありがとうございました。
2021.01.29 14:20
管理人 
(No.6)
>セレクト句で指定していないのにグループ句で指定するとエラーになる(https://www.fe-siken.com/kakomon/28_haru/pm03.html)。
こちらは解説のミスです。
正しくは、

GROUP BY句で未指定の列(集計関数以外)をSELECT句に指定しているのでエラーになる

となります。GROUP BY句に指定あり、SELECT句に指定なしの場合は特に問題ありません。
2021.01.30 15:53

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop