group by 語句根據(jù)一個或多個列對結(jié)果集進行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG,等函數(shù)。
GROUP BY 語法
SELECT column_name,function(column_name)FROM table_name
WHERE column_name operator value
GROUP BY column_name;
實例演示
本章節(jié)實例使用到了以下表結(jié)構(gòu)及數(shù)據(jù),使用前我們可以先將以下數(shù)據(jù)導入數(shù)據(jù)庫中。
MariaDB [RUNOOB]> SET NAMES utf8;Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> SET FOREIGN_KEY_CHECKS = 0;Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> DROP TABLE IF EXISTS `employee_tbl`;Query OK, 0 rows affected, 1 warning (0.00 sec)MariaDB [RUNOOB]> CREATE TABLE `employee_tbl` (
? ?-> ? `id` int(11) NOT NULL,
? ?-> ? `name` char(10) NOT NULL DEFAULT ”,
? ?-> ? `date` datetime NOT NULL,
? ?-> ? `singin` tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘登錄次數(shù)’,
? ?-> ? PRIMARY KEY (`id`)
? ?-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.04 sec)
MariaDB [RUNOOB]> BEGIN;Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> INSERT INTO employee_tbl VALUES (‘1’, ‘aa’, ‘2016-04-22 15:25:33’, ‘1’), (‘2’, ‘bb’, ‘2016-04-20 15:25:47’, ‘3’), (‘3’, ‘cc’, ‘2016-04-19 15:26:02’, ‘2’), (‘4’, ‘bb’, ‘2016-04-07 15:26:14’, ‘4’), (‘5’, ‘aa’, ‘2016-04-11 15:26:40’, ‘4’), (‘6’, ‘aa’, ‘2016-04-04 15:26:54’, ‘2’);Query OK, 6 rows affected, 6 warnings (0.00 sec)
Records: 6 ?Duplicates: 0 ?Warnings: 6
MariaDB [RUNOOB]> COMMIT;Query OK, 0 rows affected (0.00 sec)
MariaDB [RUNOOB]> SET FOREIGN_KEY_CHECKS = 1;Query OK, 0 rows affected (0.00 sec)
導入成功后,執(zhí)行以下 SQL 語句:
MariaDB [RUNOOB]> select * from employee_tbl;+—-+——+———————+——–+
| id | name | date ? ? ? ? ? ? ? ?| singin |
+—-+——+———————+——–+
| ?1 | aa ? | 2016-04-22 15:25:33 | ? ? ?1 |
| ?2 | bb ? | 2016-04-20 15:25:47 | ? ? ?3 |
| ?3 | cc ? | 2016-04-19 15:26:02 | ? ? ?2 |
| ?4 | bb ? | 2016-04-07 15:26:14 | ? ? ?4 |
| ?5 | aa ? | 2016-04-11 15:26:40 | ? ? ?4 |
| ?6 | aa ? | 2016-04-04 15:26:54 | ? ? ?2 |
+—-+——+———————+——–+
6 rows in set (0.00 sec)
接下來我們使用 GROUP BY 語句 將數(shù)據(jù)表按名字進行分組,并統(tǒng)計每個人有多少條記錄:
MariaDB [RUNOOB]> SELECT name, COUNT(*) FROM ? employee_tbl GROUP BY name;+——+———-+
| name | COUNT(*) |
+——+———-+
| aa ? | ? ? ? ?3 |
| bb ? | ? ? ? ?2 |
| cc ? | ? ? ? ?1 |
+——+———-+
3 rows in set (0.00 sec)
使用 WITH ROLLUP
WITH ROLLUP 可以實現(xiàn)在分組統(tǒng)計數(shù)據(jù)基礎上再進行相同的統(tǒng)計(SUM,AVG,COUNT…)。
例如我們將以上的數(shù)據(jù)表按名字進行分組,再統(tǒng)計每個人登錄的次數(shù):
MariaDB [RUNOOB]> SELECT name, SUM(singin) as singin_count FROM ?employee_tbl GROUP BY name WITH ROLLUP;+——+————–+
| name | singin_count |
+——+————–+
| aa ? | ? ? ? ? ? ?7 |
| bb ? | ? ? ? ? ? ?7 |
| cc ? | ? ? ? ? ? ?2 |
| NULL | ? ? ? ? ? 16 |
+——+————–+
4 rows in set (0.00 sec)
其中記錄 NULL 表示所有人的登錄次數(shù)。
我們可以使用 coalesce 來設置一個可以取代 NUll 的名稱,coalesce 語法:
select coalesce(a,b,c);
參數(shù)說明:
如果a!=null,則選擇a;
如果a==null,則選擇b;
如果b==null,則選擇c;
如果a b c 都為null ,則返回為null(沒意義)。
以下實例中如果名字為空我們使用總數(shù)代替:
MariaDB [RUNOOB]> SELECT coalesce(name, ‘總數(shù)’), SUM(singin) as singin_count FROM ?employee_tbl GROUP BY name WITH ROLLUP;+————————+————–+
| coalesce(name, ‘總數(shù)’) ? ? | singin_count |
+————————+————–+
| aa ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ?7 |
| bb ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ?7 |
| cc ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ?2 |
| 總數(shù) ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? 16 |
+————————+————–+
4 rows in set (0.00 sec)