开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
✔个人主页:Mr.Darcy8的掘金主页
🎉欢迎关注👀点赞👍收藏⭐留言📝以及交流人生哲理🎈学习心得🎁
引入
何为进阶?当我们跳出了原有限制进行更新、自定义化更强的操作时就是进阶的开始。
本期我们就将进行几个原有限制的跳出——
- join连接:跳出单个数据表的限制
- SubQuery子查询:跳出单层逻辑的限制
- 常用函数:跳出工具的单一性限制
- groupby分组
- having过滤分组
1.join连接数据表
我们之前的操作都是基于单一数据表的,而如果我们需要查询多个数据表的内容,应该如何操作呢?
我们在之前介绍过view视图,可以把有需要的表全部合并到一个新的临时表中,然后进行查询。
但是有没有可以在查找的时候就把表连接起来的?这样可以少一个创建临时表的步骤。
答案当然是肯定的
join语句用于把多个有共同字段的表基于共同字段结合在一起,并进行下一步查询。连接有以下几种:
- 内连接(inner join)
- 做连接(left join)
- 右连接(right join)
使用语法如下:
select 字段名 [as] from 表1 join 表2 where子句;
同理,这里的as可以省略
上图较为清晰地展现了join的三个不同方式的差距。
2.SubQuery子查询
我们在以往介绍的查询过程中都是在一层条件的情况下实现的。
什么是一层条件呢?就是用一次筛选得到的表。
而当我们学习到view的时候就发现了,where子句事实上是可以放入子表的。我们把将其他sql语句放入where子句中的查询称作subquery子查询,语法如下:
select 字段1,字段2,... from 表名 where 字段名 操作符 (子查询);
举个具体的例子可以看得更加清楚:
图中的例子就是利用子查询,先在包含部门号deptno和办公地点loc的表(暂时称为表1)中查出地点以“二楼”开头的数据,返回deptno部门号(暂时称为表A),然后很自然地在包含姓名name和部门号deptno的表(暂时称为表2)中运用where子句查找满足deptno在刚刚找到的表A的数据,这样一来实现的功能就是找到了办公地点在二楼的员工姓名,
以上操作相当于把表1和表2依据deptno部门号自然连接后再用单层查找。但是很明显,这样操作势必会生成一个非常大的表,会明显占用计算机内存,拖慢运行进程。
所以子查询还是非常好用的。
3.常用函数
我们目前为止掌握的基本操作也有一些了,但是工具明显还是不够多。这里就介绍一些常用的函数来弥补工具箱的匮乏:
- count函数:用以统计符合条件的记录数。count(
*)用以统计表中的记录总数,count(字段名) 统计指定字段中不为null的记录数目。
select count(*) from employees;# 用以统计员工表中的所有员工
select count(deptno) from employees;# 用以统计员工表中部门号不为null的员工数目
-max和min函数:用于返回所选字段的最大最小值。用法与count相似,替换count的位置即可(下面类似的用法不再赘述,放同样的位置即可):
max(字段名)
min(字段名)
- avg函数:返回所选字段的平均值。用法avg(字段名)
- sum函数:返回所选字段的合计值。用法sum(字段名)
4.groupby 分组
用于配合统计函数使用,来对一个或多个列进行分组。用法很清晰明了:
select 字段名,统计函数 from 表名 where子句 group by 字段名;
5.having过滤分组
学习了groupby分组之后我们还想对分组之后的结果进行过滤,但此时where子句已经无法用在分组后的结果中了,该怎么办呢?
我们就需要使用having进行分组后的表过滤.
select 字段名,统计函数 from 表名 where子句 group by 字段名 having 统计函数 运算符 值;
上面的两个例子都可以用这个例子来演示理解一下.
我们用select deptno,avg(salary)来指定需要查询的字段(是部门号和部门平均工资),from employees来选择数据表,用group by deptno指定分组条件(是按照部门编号分组),并过滤出avg(salary)平均工资低于4500的员工
得到输出如图👆
新人上路,欢迎互相帮扶~Mr_darcy8的掘金主页
可以的话给咱点个赞呗💖