引入
何为进阶?当我们跳出了原有限制进行更新、自定义化更强的操作时就是进阶的开始。
本期我们就将进行几个原有限制的跳出——
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的员工
得到输出如图👆