时间: 2021-08-03 09:27:39 人气: 18 评论: 0
本篇文章意在帮助大家系统地入门SQL,教大家如何解决sql查询任务。
回顾一下,上一篇文章我们已经知道了SQL语言的基本框架,并能完成简单的单表查询和双表连接查询。这篇文章希望能帮助你系统地入门SQL,从而解决产品经理80%的sql查询任务。
和上篇的一个小时入门SQL一样,这篇文章的建议学习时间为一天。如果没看过上篇文章或想回顾的可以点击:产品经理学SQL(一)一个小时上手SQL
为方便学习,我们仍然使用上篇文章用到的学生表student和成绩表sc,为了模拟业务中复杂的查询任务,我们再引入课程表course和教师表teacher。
熟练使用SQL的前提一定是先了解你的数据库表,现在花点时间看看这四张表的字段信息(描述每个字段的意义)和数据样例(给出部分真实数据),关于业务中用到表的结构可以找数据小哥拿。
1.1 学生表
Student(SId,Sname,Sage,Ssex)
SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
1.2 课程表
Course(CId,Cname,TId)
CId 课程编号,Cname 课程名称,TId 教师编号
1.3 教师表
Teacher(TId,Tname)
TId 教师编号,Tname 教师姓名
1.4 成绩表
SC(SId,CId,score)
SId 学生编号,CId 课程编号,score 分数
2.1 学生表
2.2 课程表
2.3 教师表
2.4 成绩表
本篇文章关于SQL语法的部分**讲到条件子句(where子句)、分组查询(group by子句和having子句)、结果呈现(order by和limit)和连接查询(left/right/inner join)。
看到这你可能**瞬间头大,但是由于SQL语言是有执行优先级的,这给了我们分块讲解的机**,私以为这也是SQL语言易学的重要原因。
为了解释清楚SQL语言的执行顺序和语法顺序,让我们先看看下面这个Hive单表查询的完整结构。
任何一个单表查询的SQL都可以分解成上述格式,实际上抽象化后的多表连接查询也可以分解成如上格式。从上到下是SQL的语法顺序(即你书写SQL的格式),而SQL真实的执行顺序如下:
举个简单的例子加深理解:SQL的语法顺序就像小说的插叙,而SQL真正的执行顺序就是小说的时间顺序。
上面的讲解可能让你一知半解,在正式介绍各部分SQL语法前我们先通过一个实例复习上面SQL的执行顺序。
例如,有这么一个业务查询任务:在限定学生表学号小于等于6的一批学生中,查询每门课的最高成绩(最高成绩低于70分的课程不显示),然后根据课程最高成绩降序排列取前两条记录。查询的SQL如下:
为方便阅读,下面列出被查询的成绩表sc和查询后的结果:
where sid<=6#限制只查询学号小于等于6的学生成绩
如果用过数据透视表的话应该比较容易理解分组查询的概念,分组查询一般和聚合函数一起实现,例如查看每个班的平均成绩、查看每个学生的最高成绩或者查看每个班的最低成绩等分组信息。
我们仍然用直观的数据变化来展示分组查询:
group by cid –按照课程分组查看每门课的聚合信息
max(score) –搭配group by子句使用的聚合函数,表示每门课的最高成绩
having max(score) >=70 –对分组后的结果筛选,选取最高成绩>=70的课程
在group by分组后紧跟着我们**选择需要呈现的字段,为了方便讲解,其实分组查询中呈现的图**已经是select的结果了。
order by和limit都是为了修改最终呈现结果。order by首先执行,按照某个字段进行排序(desc 关键字表示降序),这部分和excel的排序很相似。最后我们使用limit来修改结果展示的条数。
本篇文章的目的主要是帮助非技术人员在初步知晓SQL语句的情况下在一天之内系统入门SQL,从而解决80%的sql查询问题。
但是由于建议学习时间为一整天,全部内容置于一篇文章一方面过于冗长,另一方面影响读者趁热打铁(作者是上班族,更新比较慢哈望谅解~),因此我把一天学**用SQL解决业务查询问题分为上中下三篇。
上篇已经介绍了SQL的语法顺序和执行顺序的区别并仔细剖析了SQL的执行顺序;中篇**详细介绍条件子句、分组查询和排序的细节;下篇**介绍表的连接和其他常用关键字:if、case when和ditinct等。
希望学完这三篇后能助你系统地入门SQL~
作者:Tomocat,女朋友是产品经理的数据分析师。
本文由 @Tomocat 原创发布于人人都是产品经理,未经许可,禁止转载。
题图来自 Unsplash,基于CC0协议。