MySQL の group by に関する簡単な説明

MySQL の group by に関する簡単な説明

1. はじめに

MySQLgroup by 、クエリされたデータをグループ化するために使用されます。さらに、 MySQL 、グループ内のデータをフィルター処理するためのhaving句も提供されています。

MySQL多くのselect句キーワードを提供します。

声明文中の順序は次のとおりです。

条項効果必要か/いつ使うべきか
選択返されるデータまたは式を照会するはい
からクエリするテーブルを指定しますいいえ
どこ行レベルのフィルタリングを指定するいいえ
グループ化グループ化いいえ/データをグループ化するときに使用
持つパケットフィルタリングいいえ/グループ化されたデータをフィルタリングするために使用
並び替えデータを返すときに並べ替えルールを指定するいいえ
制限返される行数を指定しますいいえ

2. ユーザーテーブルを準備する

DDLとテーブルデータは次の通りであるユーザーテーブルを準備します。

名前を設定します utf8mb4;
FOREIGN_KEY_CHECKS = 0 を設定します。

-- ----------------------------
-- ユーザー用テーブル構造
-- ----------------------------
`user` が存在する場合はテーブルを削除します。
テーブル `user` を作成します (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `name` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ユーザー名',
  `nation` varchar(255) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'Ethnicity',
  `age` int(11) NULL デフォルト NULL コメント '年齢',
  `height` double NULL デフォルト NULL コメント '高さ',
  `sex` smallint(6) NULL デフォルト NULL コメント '性別',
  BTREE を使用した主キー (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- ユーザーの記録
-- ----------------------------
INSERT INTO `user` VALUES (1, '李子八', '汉族', 18, 180, 1);
INSERT INTO `user` VALUES (2, '张三', '慧族', 20, 175, 1);
`user` に VALUES (3, '李四', 'Uyghur', 45, 168, 0) を挿入します。
`user` に VALUES (4, '王五', '蒙古族', 18, 177, 1) を挿入します。
INSERT INTO `user` VALUES (5, '赵六', '汉族', 16, 184, 0);
INSERT INTO `user` VALUES (6, '田七', 'Uygur', 27, 192, 1);

ユーザー テーブルのデータは次のとおりです。

mysql> ユーザーから * を選択します。
+----+---------+---------+-------+-------+------+
| ID | 名前 | 国籍 | 年齢 | 身長 | 性別 |
+----+---------+---------+-------+-------+------+
| 1 | 李子巴 | 漢民族 | 18 | 180 | 1 |
| 2 | 張三 | 回族 | 20 | 175 | 1 |
| 3 | 李斯 | ウイグル人 | 45 | 168 | 0 |
| 4 | 王武 | モンゴル語 | 18 | 177 | 1 |
| 5 | 趙柳 | 漢民族 | 16 | 184 | 0 |
| 6 | 天啓 | ウイグル語 | 27 | 192 | 1 |
+----+---------+---------+-------+-------+------+
セット内の 6 行 (0.00 秒)

2.1 グループ化ルール

group by group by

  • group by句はwhereの後、 order by句の前に配置されます。
  • having句は、group by 句の後、order by 句の前に配置されます。
  • group by句内の各列は、選択列または有効な式である必要があります。集計関数は使用できません。
  • selectで使用される式は、group by句に出現する必要があり、別名は使用できません。
  • グループgroup byデータには null 値が含まれており、null 値は 1 つのグループにまとめられます。
  • group by句はネストすることができ、ネストされたグループは最後のグループで要約されます。

2.2 グループの使用

必要:

さまざまな国籍のユーザーの数を数える

声明:

mysql> ユーザーグループから nation を選択し、count(*) を nation で選択します。
+----------+-----------+
| 国 | カウント(*) |
+----------+-----------+
| 漢民族| 2 |
| 回族| 1 |
| ウイグル語 | 2 |
| モンゴル語| 1 |
+----------+-----------+
セット内の 4 行 (0.00 秒)

GROUP BY はwhereと組み合わせて使用​​できますが、 group byの後のフィルタリングにwhereを使用することはできません。 where句を使用した後、グループ化されたデータは WHERE 句によってフィルタリングされたデータセットになります。

mysql> ユーザーから nation_num として count(*) を選択し、 sex = 0 で nation をグループ化します。
+----------+-------------+
| 国 | 国番号 |
+----------+-------------+
| ウイグル語 | 1 |
| 漢民族| 1 |
+----------+-------------+
セット内の 2 行 (0.00 秒)

2.3 havingの使用

group group byグループ化した後のデータを再度フィルタリングする必要がある場合は、 having句を使用する必要があります。 MySQL サーバーはgroup by句の後に where 句を使用すると例外をスローします。

mysql> ユーザーグループから nation, count(*) as nation_num を選択し、nation = '汉族' を選択します。
エラー 1064 (42000): SQL 構文にエラーがあります。1 行目の 'where nation = '汉族'' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。


この時点では、上記の where 句を having 句に置き換えるだけで済みます。having havingはすべてのwhere演算子をサポートします。簡単に言うと、where 句は、group by 句を having に置き換えた場合にのみ、 group by句の後に使用できますhaving

vmysql> ユーザーグループから nation を選択し、count(*) を nation_num として取得します。nation は '汉族' です。
+--------+-------------+
| 国 | 国番号 |
+--------+-------------+
| 漢民族| 2 |
+--------+-------------+
セット内の 1 行 (0.00 秒)

2.4 order by と limit

グループ化されたデータを並べ替える必要がある場合は、 order by使用できます。 order by句は、 having句の後に置く必要があります。

mysql> ユーザーグループから nation を選択し、 count(*) を nation_num として取得します。 nation != '汉族' を order by nation_num desc;
+----------+-------------+
| 国 | 国番号 |
+----------+-------------+
| ウイグル語 | 2 |
| 回族| 1 |
| モンゴル語| 1 |
+----------+-------------+
セット内の 3 行 (0.00 秒)

出力結果に返される行数を指定する必要がある場合は、 limitを使用できます。 limit 句は、ステートメント全体の最後にあります。

mysql> select nation, count(*) as nation_num from user group by nation having nation != '汉族' order by nation_num desc limit 2;
+----------+-------------+
| 国 | 国番号 |
+----------+-------------+
| ウイグル語 | 2 |
| 回族| 1 |
+----------+-------------+
セット内の 2 行 (0.00 秒)

2.5 ロールアップ付き

group by 句では、 WITH ROLLUPグループ化された統計データに基づいて同じ統計 (SUM、AVG、COUNT など) を実行できます。

たとえば、max():

mysql> ユーザーグループから nation, max(height) を nation_num として選択し、rollup で nation をロールアップします。
+----------+-------------+
| 国 | 国番号 |
+----------+-------------+
| 回族| 175 |
| 漢民族| 184 |
| ウイグル語 | 192 |
| モンゴル語| 177 |
| NULL | 192 |
+----------+-------------+
セット内の行数は 5 です (0.00 秒)

たとえば、avg():

mysql> ユーザーグループから、nation、avg(height) を nation_num として選択し、rollup で国を選択します。
+----------+--------------------+
| 国 | 国番号 |
+----------+--------------------+
| 回族| 175 |
| 漢民族| 182 |
| ウイグル語 | 180 |
| モンゴル語 | 177 |
| NULL | 179.33333333333334 |
+----------+--------------------+
セット内の行数は 5 です (0.00 秒)

たとえば、count():

mysql> ユーザーグループから nation, count(*) as nation_num を選択し、rollup で nation を指定します。
+----------+-------------+
| 国 | 国番号 |
+----------+-------------+
| 回族| 1 |
| 漢民族| 2 |
| ウイグル語 | 2 |
| モンゴル語| 1 |
| NULL | 6 |
+----------+-------------+
セット内の行数は 5 です (0.00 秒)

これで、MySQL の group by に関するこの記事は終了です。MySQL の group by の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • C# でクエリ式 GroupBy を使用する方法
  • MySQL データベース グループ クエリの group by ステートメントの詳細な説明
  • Oracle グループクエリにおける group by の使用ルールの詳細な説明
  • グループ統計のためにデータテーブルで groupby を使用する方法
  • グループ化の使用法の詳細な説明

<<:  HTTP ヘッダー情報の解釈と分析 (詳細概要)

>>:  Linux のソフトリンクとハードリンクの詳細な説明

推薦する

React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

1. Reactでクラス宣言する際のヒント 上記のように、Child クラスは class キーワー...

Ubuntu 18.04 が VMware 仮想マシンでネットワークに接続できない問題の解決策

仮想マシン内のUbuntu 18.04がネットワークに接続できない問題の解決策は次のとおりですVMw...

MySQLバイナリログを介してデータベースデータを復元する方法の詳細な説明

ウェブサイト管理者は、さまざまな理由や操作により、ウェブサイトのデータを誤って削除したり、ウェブサイ...

MySQLデータのエクスポートとインポートに関する知識ポイントの簡単な分析

多くの場合、ローカル データベースのデータをエクスポートしたり、他のデータベースからデータをインポー...

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント複数行のテキスト コンポーネントを折りたたんで表示し、展...

Vueはボトムクエリ関数を実装します

この記事では、ボトムクエリ機能を実装するためのVueの具体的なコードを例として紹介します。具体的な内...

MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?

MySQL を頻繁に使用する人は、次のような状況に遭遇する可能性があります。 1. フィールド タ...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...

丸い角や鋭い角の代わりに文字を使用することに関する研究経験の共有

1. フォントと文字表示の関係左側と右側の鋭角部分は Songti フォントで表示されます: &l...

IntelliJ IDEA で Java を使用して MySQL データベースに接続する方法の詳細な説明

1. MySQLデータベースをダウンロードし、インストールして設定するダウンロードアドレス: htt...

Docker-compose チュートリアルのインストールとクイックスタート

目次1. Compose の紹介2. ComposeとDockerの互換性3. Dockerをインス...

docker runコンテナの自動終了の解決策

今日、Dockerfile を使用してイメージを作成したときに問題が発生し、イメージの実行後にコンテ...

WebプロジェクトのDockerデプロイメントの実装

前回の記事では、docker サービスをインストールしました。引き続き、Web プロジェクトのデプロ...