编辑

SQL统计 基础统计语句讲解


增删改查

这些基础操作就不做介绍了,仅在这里列上几个语句做例子

INSERT INTO tbl_name VALUES (4,''test'',''tv'');
DELETE FROM tbl_name WHERE ID=4;
UPDATE tbl_name SET m2=''t2'' WHERE ID=4;
SELECT * FROM tbl_name;

如果这样的语句不懂,就不需要在这里浪费时间了。

GROUP BY

SQL基本统计语句: GROUP BY,将字段中相同的值合并到一起,需要配合统计函数使用,否则将只保留第一个不重复的值

SELECT c1,COUNT(c3),SUM(c3),AVG(c3) FROM tx GROUP BY c1;

很简单吧,继续

AS

将查询到的结果字段进行重新命名。

SELECT c1,COUNT(c3) AS cot,SUM(c3) AS sum,AVG(c3) AS avg FROM tx GROUP BY c1;

有没有觉得这个事情是多余的?

IF

统计函数里可以包含 IF 语法,对数据计算的时候进行一些判断

SELECT c1,SUM(IF(c2=''B4'',c3, 0)) FROM tx GROUP BY c1;

是不是觉得还是很简单?下面就上面几个简单的语法组合出一个另你们惊叹的语法:实现交叉表效果

SELECT c1,
SUM(IF(c2=''B1'',c3,0)) AS B1,
SUM(IF(c2=''B2'',c3,0)) AS B2,
SUM(IF(c2=''B3'',c3,0)) AS B3,
SUM(IF(c2=''B4'',c3,0)) AS B4
FROM tx GROUP BY c1;

WITH ROLLUP

这个语句估计很少人知道,我也是最近才看到的,而且是个超级好用的语法,因为它能解决我们做统计的时候的一大痛点:合计数,也就是__total__,看看示例:

SELECT c1,c2,sum(c3) FROM tx GROUP BY c1,c2 WITH ROLLUP
HAVING c1 IS NOT NULL;

这个语句大家自己回去看吧

SELECT IFNULL(c1,''total'') AS c1,IFNULL(c2,''total'') AS c2,sum(c3) FROM tx GROUP BY c1,c2 WITH ROLLUP;

LATERAL VIEW

一个好消息,复选可以用一句话解决,直接用这个拆分成新的一张表就好,可惜坏消息马上来了,MySQL没有这种语法,这个是Hive平台的,MSSQL是否支持你们自己回去试。

SELECT ciqsint2,cbrdint3,count(1) AS COT FROM bca
LATERAL VIEW explode(iqsint2) tiqsint2 AS ciqsint2
LATERAL VIEW explode(brdint3) tbrdint3 AS cbrdint3
GROUP BY ciqsint2,cbrdint3;

JOIN

表连接,这个应该还比较好理解,按字段或者条件将两张表连接到一起,形成一个拥有两张表字段的的新表,看示例

SELECT * FROM tbl_name JOIN tx USING (id);
SELECT * FROM tbl_name JOIN tx WHERE tbl_name.id=tx.id;

接下来看仔细了

SELECT * FROM tbl_name JOIN tx;

谁能跟我解释发生了什么?

下面再换一个

SELECT * FROM tbl_name JOIN incre_table;

这样看清楚了吗?

笛卡儿积

下面就是见证奇迹的时刻,实现复选拆分,看好了

SELECT ID,m2,AutoIncreID FROM tbl_name JOIN incre_table
ON incre_table.AutoIncreID<=length(tbl_name.m2)-length(replace(tbl_name.m2,'','',''''))+1
ORDER BY ID,AutoIncreID;
SELECT ID,m2,AutoIncreID,substring_index(substring_index(tbl_name.m2,'','',incre_table.AutoIncreID),'','',-1)
FROM tbl_name JOIN incre_table
ON incre_table.AutoIncreID<=length(tbl_name.m2)-length(replace(tbl_name.m2,'','',''''))+1
ORDER BY ID,AutoIncreID;
SELECT ID,substring_index(substring_index(tbl_name.m2,'','',incre_table.AutoIncreID),'','',-1) AS m2
FROM tbl_name JOIN incre_table
ON incre_table.AutoIncreID<=length(tbl_name.m2)-length(replace(tbl_name.m2,'','',''''))+1
ORDER BY ID,AutoIncreID;
SELECT ID,substring_index(substring_index(tbl_name.mSize,'','',incre_table.AutoIncreID),'','',-1) AS mSize
FROM tbl_name JOIN incre_table
ON incre_table.AutoIncreID<=length(tbl_name.mSize)-length(replace(tbl_name.mSize,'','',''''))+1
ORDER BY ID,AutoIncreID;
SELECT ID,substring_index(substring_index(t1.mSize,'','',incre_table.AutoIncreID),'','',-1) AS mSize,m2 FROM
(SELECT ID,mSize,substring_index(substring_index(tbl_name.m2,'','',incre_table.AutoIncreID),'','',-1) AS m2
FROM tbl_name JOIN incre_table
ON incre_table.AutoIncreID<=length(tbl_name.m2)-length(replace(tbl_name.m2,'','',''''))+1) t1 
JOIN incre_table ON incre_table.AutoIncreID<=length(t1.mSize)-length(replace(t1.mSize,'','',''''))+1
ORDER BY ID,AutoIncreID;

隐含的知识点

SQL语句是基于数据表的, 查询结果也是一个数据表,所以对于查询结果可以再次查询,这就是SQL语句的嵌套,只需要对查询结果起个表面就好啦,例如最后一个SQL语句中的t1

结束

疑问解答

相关词条