本篇旨在将实务中最常出现的详细情况进行说明,从而解决产品经理80%的sql查询任务;希望对大家有帮助~
前言
之前我们已经用一个例子介绍了SQL的语法顺序和执行顺序,想必现在你已经知道了一个完整的SQL包括条件子句(关键字where)、分组查询(关键字group by)、字段选择(关键字select)和结果呈现(关键字order by)。本篇我们旨在将实务中最常出现的详细情况进行说明,从而解决产品经理80%的sql查询任务。
产品经理学SQL(二)一天学会用SQL解决业务查询问题系列共包括前中后三篇,建议学习时间为一天。
想回顾之前内容的可以点击:
产品经理学SQL(一)一个小时上手SQL
产品经理学SQL(二)一天学会用SQL解决业务查询问题(上篇)
条件子句(where)
1. 比较运算符(适用于区间)
比较运算符包括=(等于),>=(大于等于),<=(小于等于),!=(不等于),>(大于),<(小于)。
例如:查询年龄sage小于30的学生
where sage < 30
2. 确定范围(适用于连续范围)
between … and …为取值限定了一个范围。
例如:查询年龄大于等于10小于等于20的学生
where sage between 10 and 20
3. 确定集合(适用于离散的少数值)
例如:插入年龄为10,20,30的学生
where sage in (10,20,30)
**in可以和not一起使用,表示不在这个区间的值
**where sage not in (10,20,30)
4. 字符匹配(模糊查询)
通过like关键字和正则表达式匹配,常用的通配符有%(任意个字符)和_(一个字符)。
例如:查询名字sname带“王”的学生
where sname like “%王%”
5. 判断是否为空值
通过is null关键字判断值是否为空。
例如:查询姓名sname不为空的学生
where sname is not null
6. 多个查询条件
用and(两个条件同时满足)和or(两个条件满足一个即可)
例如:查询年龄sage小于20且性别ssex为男的学生
where sage<20 and ssex=’男’
一、分组查询(group by&聚合函数&having子句)
分组查询实现了类似excel中数据透视表的功能,可以帮助我们对数据进行分层汇总,而我们对分层后的数据进行统计的时候需要用到聚合函数(也就是平均值、求和、最大值和最小值等),最后我们对分层之后的数据筛选的时候需要用到having子句。
**where子句是对原始表做筛选的
**having子句是对分层汇总之后的结果做筛选的
回顾我们上一篇讲过的例子:在限定学生表学号小于等于6的一批学生中,查询每门课的最高成绩(最高成绩低于70分的课程不显示),然后根据课程最高成绩降序排列取前两条记录。
查询的SQL如下:
回顾一下执行顺序,首先我们用where子句对原始数据做了学号id需要小于等于6的限制。然后我们用group by和max(score)聚合函数实现了对课程进行分层,求出每门课的最高成绩,为了对聚合之后的结果作限制,我们用having子句只展示最高分数大于等于70的记录。
关于这个例子详细解释可以回顾上篇文章,下面我们详细介绍每个部分的常用语句。
1. group by
group by不仅可以对一个字段进行分组,还能对多个字段进行分组。这和excel中的数据透视表一致。
2. 聚合函数
3. having子句
和where子句一致,只需注意是对聚合后的结果作限制。
二、字段选择(select)
select比较灵活,我们不单单能选择原始数据表的字段,还能使用函数对字段进行计算,正如我们第一篇提到的,函数并不是重点,当你需要的时候百度或者问技术小哥就知道了。我们这里只简单介绍一下可以对字段进行计算。
例如:查询各学生的年龄(通过公式计算年龄)
三、结果呈现(order by)
和excel一样,可以用多个字段排序
关键字desc表示降序排列
例如:查询学生id和年龄,并先按照学号sid降序,再按照年龄sage升序排列
四、后续学习
本篇文章的目的主要是帮助非技术人员在初步知晓SQL语句的情况下在一天之内系统入门SQL,从而解决80%的sql查询问题。
但是由于建议学习时间为一整天,全部内容置于一篇文章一方面过于冗长,另一方面影响读者趁热打铁(作者是上班族,更新比较慢哈望谅解~),因此我把一天学会用SQL解决业务查询问题分为上中下三篇。
上篇已经介绍了SQL的语法顺序和执行顺序的区别并仔细剖析了SQL的执行顺序;这篇详细介绍了条件子句、分组查询和排序的细节;下篇会介绍表的连接和其他常用关键字。
希望学完这三篇后能助你系统地入门SQL~