一、Mysql中sum和group by聯(lián)用求和為什么會(huì)計(jì)算不準(zhǔn)確
因?yàn)樵贛ySQL中,GROUP BY 語句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。在分組的列上我們可以使用 COUNT, SUM, AVG,等函數(shù)。WITH ROLLUP 可以實(shí)現(xiàn)在分組統(tǒng)計(jì)數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(jì)(SUM,AVG,COUNT…)。
GROUP BY 語法
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
實(shí)例演示
本章節(jié)實(shí)例使用到了以下表結(jié)構(gòu)及數(shù)據(jù),使用前我們可以先將以下數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中。
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
— —————————-
—? Table structure for employee_tbl
— —————————-
DROP TABLE IF EXISTS employee_tbl;
CREATE TABLE employee_tbl (
? id int(11) NOT NULL,
? name char(10) NOT NULL DEFAULT ”,
? date datetime NOT NULL,
? signin tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘登錄次數(shù)’,
? PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
— —————————-
—? Records of employee_tbl
— —————————-
BEGIN;
INSERT INTO employee_tbl VALUES (‘1’, ‘小明’, ‘2016-04-22 15:25:33’, ‘1’), (‘2’, ‘小王’, ‘2016-04-20 15:25:47’, ‘3’), (‘3’, ‘小麗’, ‘2016-04-19 15:26:02’, ‘2’), (‘4’, ‘小王’, ‘2016-04-07 15:26:14’, ‘4’), (‘5’, ‘小明’, ‘2016-04-11 15:26:40’, ‘4’), (‘6’, ‘小明’, ‘2016-04-04 15:26:54’, ‘2’);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
導(dǎo)入成功后,執(zhí)行以下 SQL 語句:
mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+—-+——–+———————+——–+
| id | name?? | date??????????????? | signin |
+—-+——–+———————+——–+
|? 1 | 小明 | 2016-04-22 15:25:33 |????? 1 |
|? 2 | 小王 | 2016-04-20 15:25:47 |????? 3 |
|? 3 | 小麗 | 2016-04-19 15:26:02 |????? 2 |
|? 4 | 小王 | 2016-04-07 15:26:14 |????? 4 |
|? 5 | 小明 | 2016-04-11 15:26:40 |????? 4 |
|? 6 | 小明 | 2016-04-04 15:26:54 |????? 2 |
+—-+——–+———————+——–+
6 rows in set (0.00 sec)
接下來我們使用 GROUP BY 語句 將數(shù)據(jù)表按名字進(jìn)行分組,并統(tǒng)計(jì)每個(gè)人有多少條記錄:
mysql> SELECT name, COUNT(*) FROM?? employee_tbl GROUP BY name;
+——–+———-+
| name?? | COUNT(*) |
+——–+———-+
| 小麗 |??????? 1 |
| 小明 |??????? 3 |
| 小王 |??????? 2 |
+——–+———-+
3 rows in set (0.01 sec)
WITH ROLLUP 可以實(shí)現(xiàn)在分組統(tǒng)計(jì)數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(jì)(SUM,AVG,COUNT…),使用 WITH ROLLUP,此函數(shù)是對(duì)聚合函數(shù)進(jìn)行求和,注意 with rollup是對(duì) group by 后的名列前茅個(gè)字段,進(jìn)行分組求和。
延伸閱讀:
二、數(shù)據(jù)庫和 SQL 概念
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫,它的產(chǎn)生距今已有六十多年。隨著信息技術(shù)和市場(chǎng)的發(fā)展,數(shù)據(jù)庫變得無處不在:它在電子商務(wù)、銀行系統(tǒng)等眾多領(lǐng)域都被廣泛使用,且成為其系統(tǒng)的重要組成部分。
數(shù)據(jù)庫用于記錄數(shù)據(jù),使用數(shù)據(jù)庫記錄數(shù)據(jù)可以表現(xiàn)出各種數(shù)據(jù)間的聯(lián)系,也可以很方便地對(duì)所記錄的數(shù)據(jù)進(jìn)行增、刪、改、查等操作。
結(jié)構(gòu)化查詢語言(Structured Query Language)簡(jiǎn)稱 SQL,是上世紀(jì) 70 年代由 IBM 公司開發(fā),用于對(duì)數(shù)據(jù)庫進(jìn)行操作的語言。更詳細(xì)地說,SQL 是一種數(shù)據(jù)庫查詢和程序設(shè)計(jì)語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng),同時(shí)也是數(shù)據(jù)庫腳本文件的擴(kuò)展名。