• 締切済み

( Mysql ) GROUP BY節について

お世話になります。 二つ質問があります。 1.GROUP BY節のイメージが湧きません。文字で表現することは難しいかもしれませんが、正確に理解するためのイメージを教えていただけないでしょうか。 2.以下の2命令文とその結果の相違点について疑問があります。 ★select gender, count(gender) from main_customer group by gender; ☆select gender, count(gender) from main_customer; 以下の表は、次の記号に置き換えてお読みください。 ・g=gender ・c=count(gender) ★の結果 | g | c | | 1 | 3 | | 2 | 1 | ☆の結果 | g | c | | 1 | 4 | ★の結果には何ら疑問点はありません。しかし、☆の結果に若干気になる点があります。以下に私が☆の命令結果に関する仮定を示しますので、その正否を教えてください。誤りはある場合は、正しい答えを導いてください。 (仮定1)☆の結果に表示されたgender下の数字 1 は、テーブル(main_customer)の最上位(id=1)のgenderに所属する数値である。 (仮定2)☆の結果に表示されたgender下の数字 4 は、テーブル(main_customer)のgenderカラムの数値の合計個数である。nullはカウントの対象ではない。 尚、上記質問2で用いるテーブルの名称は、main_customerです。命令:select * from main_customer; の表示結果画像を以下に添付させていただきます。 ※一部、文字化けがありますが、回答に支障はきたさないと思われます。 ※画像内の練習用データベーステーブルに入力している個人情報は、すべて架空のものです。 年末年始のお忙しい時期とは存じますが、ご回答いただきますよう何卒宜しくお願い申し上げます。

みんなの回答

回答No.3

>質問の本題とはそれますが、確認させていただきたいことがあります。 >MYSQLにおけるNULLは、空文字ではなく、「偽」を示す値なのでしょうか。 >宜しければお答えください。宜しくお願い致します。 NULLは、空文字でも「偽」でもありません。「不定」(真偽の判定ができない)です。これは、標準SQLでもそうだし、主要なRDBMSでもそうです。 すなわち、 列名=NULL 列名='' などでは、「真」とも「偽」とも判定されず、「不定」となります。 Oracleでは、空文字とNULLは同値と解釈するようですが、これはOracleの独自仕様であり、主要なRDBMSの中では少数派です。

bb2318bb
質問者

お礼

ご回答いただき、有難うございます。 疑問が氷解しました。 ただ、ここで関連性のある疑問が生じました。 どういった場合に、NULLという値が生じるのでしょうか・・・。PHPプログラムとセットで始めたばかりなので、きっとまだまだ勉強不足なのでしょうね。

回答No.2

何が疑問点か分かりづらいのですが? 次の3点は、SQLの常識です。 1.select ount(*) from 表名  とした場合、表の行数が返ります。つまり、表全体の検索結果は、1行です。 2.select count(列名) from 表名 とした場合、表全体で、その列がnullでない行数が返ります。つまり、表全体の検索結果は1行です。 3.select 列名,count(*) from 表名 group by 列名 とした場合、group byで指定した列の値毎に、それぞれ何行存在するか返ります。つまり、結果はgroup byで指定した列の値の種類の数だけ返ります。 4.select 列名1,列名2,count(*) from 表名 group by 列名1 といった書き方をした場合、MySQLではgroup byで指定した列名1の値の種類だけ、結果が返ります。しかし、列名2の値は、不定です。列名1でグループ化した結果、列名2の値も一意になる場合のみ、使用しても良いMySQLの拡張仕様です 列名2の値が一意にならないなら、結果は保証されません。 この指定は、標準SQLでは許されない構文であり、主要RDBMSでも文法エラーになります。 select gender, count(gender) from main_customer という構文は、私が使用しているMySQL 5.0.19では、値が1個しか返らないcountと、複数行返るgenderという列名を指定しているため、文法エラーになります。 bb2318bbさんが使っているのは、MySQLのバージョンは何でしょうか? 実際に実行したSQLを、質問のために割愛して提示していないでしょうか?

bb2318bb
質問者

お礼

ご回答いただき、有難うございます。 私が使用しているMYSQLのバージョンを意図的に提示しなかったのではありません。私の配慮が足りませんでした。この点については、お詫び申し上げます。 ご紹介いただいた情報は、参考にさせていただきたいと思います。どうぞよい年始をお過ごしください。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

疑問点がどこにあるのかがよくわからないのですが・・・ group byをしないでcountをとる場合、countした項目以外の項目は なにがくるかはわかりません(保障されません) count(特定のフィールド)とした場合、特定のフィールド内のNULLを 除いた値がカウントされるようです この場合のNULLとは0や""ではありませんのでご注意ください

bb2318bb
質問者

お礼

参考になりました。 有難うございました。

bb2318bb
質問者

補足

ご回答いただき、有難うございます。 1.について 私は、★の結果は事実として把握しています。上記の命令を書けば、機械的に★のような結果が得られるということは、ただ暗記すればすむことです。ただ、group byの本質的な役割を完全にイメージすることはできていません。引き続きご回答いただけないでしょうか。 2.について 把握できている点を明示した上で対比的に疑問点を提示することで、より効果的な回答が期待できると思い、上記のような質問形式をとらせていただきました。しかし、今回は質問の書き方に改善の余地があったと思われます。今後はより回答者目線に立った質問の記述をさせていただきたいと思います。この質問に対するご回答は頂戴しました。有難うございました。 質問の本題とはそれますが、確認させていただきたいことがあります。 MYSQLにおけるNULLは、空文字ではなく、「偽」を示す値なのでしょうか。 宜しければお答えください。宜しくお願い致します。

関連するQ&A