HOME»基本情報技術者試験掲示板»平成27年春期午後問3
投稿する

[3395] 平成27年春期午後問3

 The gameさん(No.1) 
https://www.fe-siken.com/kakomon/27_haru/pm03.html
この問題の問3の設問2でcount(*)とcount(会員表.会員番号)が一緒であることがわかりません。
GROUP BYで世帯表.班ごとになっているのはわかるのですが、だとしたらGROUP BYより、count(*)はcount(世帯表.班)になるような気がします。count(*)がどれに対するcountなのかってどう見分ければいいですか。
2021.06.15 00:38
GinSanaさん(No.2) 
FE シルバーマイスター
そもそも会員テーブルの主キーは会員番号で、必ず入るんですよね。それで、count(会員番号)は会員番号がnullでないのが何行いますか?って問合せなわけですから、count(*)と変わりませんよね(count(*)はnullを許容するが、今回はnull云々はどうでもよい)。
2021.06.15 09:20
GinSanaさん(No.3) 
FE シルバーマイスター
>count(*)がどれに対するcountなのか
は、select *よろしく  全列  です。指定すると、実行したときにオプティマイザってのがテーブルの列名に置き換えるんですよ。
※実際はムダが多いので、世の中のメジャーなRDBMSのオプティマイザは「COUNT(*)」を「COUNT(列名1)」とか内部的に置き換えて実行している。

2021.06.15 09:25
 The gameさん(No.4) 
設問していただき、ありがとうございます。count(*)=班ごとの会員数なら、count(会員表.会員番号)は、会員全員の会員数を数えるため、設問3の(ア)に対する誤答理由、同じ値になるというのは違う気がするのですが。
2021.06.16 20:11
GinSanaさん(No.5) 
FE シルバーマイスター
この投稿は投稿者により削除されました。(2021.06.17 08:09)
2021.06.17 08:09
GinSanaさん(No.6) 
FE シルバーマイスター
>count(*)=班ごとの会員数なら、count(会員表.会員番号)は、会員全員の会員数を数えるため、設問3の(ア)に対する誤答理由、同じ値になるというのは違う気がするのですが。

実際にSQL通りgroup byをせずに図2のように結合してみると
世帯表.世帯番号  会員表.会員番号(以下略)
0181  0412
0181  0413
これでgroup byで集約対象を世帯表.世帯番号に置いているから
0181に集約されたのが丸々2行というのがcount(*)のいうところで(*を列名に置換すれば、結合後の全ての列の塊、つまり  世帯表.世帯番号  会員表.会員番号(以下略))が世帯番号ごとにいくつあるかを数えるわけで、

当然countのフォーカスを会員番号に当てても  必ず会員番号は入っているのだから、言い換えれば
結合後の全ての列の塊の中に会員番号がnullでないのは世帯番号ごとにいくつありますか?
と聞いているのと同義であり、結果は同じになるんですよ。

2021.06.17 08:09
The  gameさん(No.7) 
GROUP BYで世帯表.班となっているため、会員表の会員番号を数える際もあくまで、班ごととなるため、count(*)と同じ意味になるということですね。わかりやすい説明ありがとうございます。
2021.06.17 09:47

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop