增删改查
这些基础操作就不做介绍了,仅在这里列上几个语句做例子
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;
如果这样的语句不懂,就不需要在这里浪费时间了。
SQL基本统计语句: GROUP BY,将字段中相同的值合并到一起,需要配合统计函数使用,否则将只保留第一个不重复的值
SELECT c1,COUNT(c3),SUM(c3),AVG(c3) FROM tx GROUP BY c1;
很简单吧,继续
将查询到的结果字段进行重新命名。
SELECT c1,COUNT(c3) AS cot,SUM(c3) AS sum,AVG(c3) AS avg FROM tx GROUP BY c1;
有没有觉得这个事情是多余的?
统计函数里可以包含 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;
这个语句估计很少人知道,我也是最近才看到的,而且是个超级好用的语法,因为它能解决我们做统计的时候的一大痛点:合计数,也就是__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;
一个好消息,复选可以用一句话解决,直接用这个拆分成新的一张表就好,可惜坏消息马上来了,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;
表连接,这个应该还比较好理解,按字段或者条件将两张表连接到一起,形成一个拥有两张表字段的的新表,看示例
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
疑问解答