MySQLデータベース入門—groupbyコマンド使用法解析


-----group byコマンド使い方-----
1.groupbyコマンドの使い方
groupbyの一般的な使い方は、集約関数を組み合わせ、パケット情報を利用して統計を行い、maxなどの集約関数を組み合わせてデータをフィルタリングした後に分析し、havingを組み合わせてフィルタリングした後にフィルタリングすることが一般的である.
一般的な集約関数は次のとおりです.
  • 既存のデータベーステーブルを次のように仮定します:テーブルuser_info,idプライマリキー,user_idユニークキー
  • CREATE TABLE `user_info` (     `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT ' id',     `user_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT ' ',     `grade` VARCHAR(50) NOT NULL DEFAULT '' COMMENT ' ',     `class` VARCHAR(50) NOT NULL DEFAULT '' COMMENT ' ',     PRIMARY KEY (`id`),    UNIQUE INDEX `uniq_user_id` (`user_id`) ) ENGINE=InnoDB
  • INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (10, '10230', 'C', 'B'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (9, '10229', 'C', 'a'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (8, '10228', 'B', 'b'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (7, '10227', 'B', 'b'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (6, '10226', 'B', 'a'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (5, '10225', 'B', 'a'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (4, '10224', 'A', 'b'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (3, '10223', 'A', 'b'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (2, '10222', 'A', 'a'); INSERT INTO `user_info` (`id`, `user_id`, `grade`, `class`) VALUES (1, '10221', 'A', 'a');
  • max
  • select max(user_id),grade from user_info group by grade;
    #このsqlの は で、gradeフィールドに ってデータをグループ し、 グループの user_をクエリーします.idおよび のグループの .ここで、パケット はgradeであり、クエリの もgradeであることに してください.ここでは は しません.
    :
  • having
  • select max(user_id),grade from user_info group by grade  having grade>'A';
    #このsqlは の とほぼ じですが、havingフィルタ が に いています.grade '>A'をフィルタリングしました.ここで、パケット はgradeであり、クエリの もgradeであることに してください.ここでは は しません.
    :
    HavingとWhereの い
  • where の は、クエリー をグループ する に、where に しない を することです.すなわち、グループ する にデータをフィルタします.where には が まれず、where を して の をフィルタします.
  • having の は、 を たすグループをフィルタリングすることである.すなわち、パケットの にデータをフィルタリングすることであり、 には がしばしば まれ、having を いて のグループをフィルタリングしてもよいし、 のパケット を いてパケット してもよい.

  • 2.groupbyの
    select max(user_id),id,grade from user_info group by grade;
    #gradeグループで を すuser_id、idを 、gradeを 、user_からinfonテーブルから します.
    :
    このsqlの は に するが, の とは なり,クエリ がidの より い.データがgradeによってグループ された 、gradeの は じで、max(user_id)がデータによって するのも で、idの はどのように を りますか? のデータの を ると、
    :idは メモリの の です. たして を ける があるのか.
    データの
  • idを データの に ってid=1をid=99に し、sqlを した の :
  • .
    らかに、 の の とは なる.1 のデータidは99になり、 された 、1 のデータのidは1から2になった.id=1のレコードはid=2より に するため、idという フィールドの はデータの き み とは であり、 されたデータはこのデータの を したにすぎないことを している.mysqlのデータ と びつけてidはプライマリキーであるため,データは がプライマリキー にソートされてフィルタリングされるため,
    :idフィールドの はmysqlに された データに って する の である.idを1に すると の に り, の を すことはできなかった.
    クエリー を するには、 の に います.select max(user_id),user_id,id,grade from user_info group by grade; # grade user_id, user_id, id, grade, user_infon
    :
    データをuser_idを10999に すると、

    select max(user_id),user_id,id,grade from user_info group by grade;
    :
    user_を しましたid 、クエリーされたデータエントリは されていないため、 のキーを してもクエリーマッチングのエントリルールに を えることはできないため、エントリルールは として のエントリ、すなわちid=1に している.
  • groupbyと を み わせて する 、 はパケット の
  • である.
  • groupbyがhavingと 、パケット フィルタ
  • として する.
  • groupbyが とともに フィールドと に される 、 フィールドの は、idの さいエントリに するフィールドコンテンツとして に する.