SQL通用语言之五项进阶操作

70 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

✔个人主页:Mr.Darcy8的掘金主页

🎉欢迎关注👀点赞👍收藏⭐留言📝以及交流人生哲理🎈学习心得🎁

引入

何为进阶?当我们跳出了原有限制进行更新、自定义化更强的操作时就是进阶的开始。

本期我们就将进行几个原有限制的跳出——

  • join连接:跳出单个数据表的限制
  • SubQuery子查询:跳出单层逻辑的限制
  • 常用函数:跳出工具的单一性限制
  • groupby分组
  • having过滤分组

1.join连接数据表

我们之前的操作都是基于单一数据表的,而如果我们需要查询多个数据表的内容,应该如何操作呢?

我们在之前介绍过view视图,可以把有需要的表全部合并到一个新的临时表中,然后进行查询。

但是有没有可以在查找的时候就把表连接起来的?这样可以少一个创建临时表的步骤。

答案当然是肯定的

join语句用于把多个有共同字段的表基于共同字段结合在一起,并进行下一步查询。连接有以下几种:

  • 内连接(inner join)
  • 做连接(left join)
  • 右连接(right join)

使用语法如下:

select 字段名 [as] from1 join2 where子句;

同理,这里的as可以省略

image.png

上图较为清晰地展现了join的三个不同方式的差距。

2.SubQuery子查询

我们在以往介绍的查询过程中都是在一层条件的情况下实现的。

什么是一层条件呢?就是用一次筛选得到的表。

而当我们学习到view的时候就发现了,where子句事实上是可以放入子表的。我们把将其他sql语句放入where子句中的查询称作subquery子查询,语法如下:

select 字段1,字段2,... from 表名 where 字段名 操作符 (子查询);

举个具体的例子可以看得更加清楚:

image.png

图中的例子就是利用子查询,先在包含部门号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 统计函数 运算符 值;

image.png

上面的两个例子都可以用这个例子来演示理解一下.

我们用select deptno,avg(salary)来指定需要查询的字段(是部门号和部门平均工资),from employees来选择数据表,用group by deptno指定分组条件(是按照部门编号分组),并过滤出avg(salary)平均工资低于4500的员工

得到输出如图👆

新人上路,欢迎互相帮扶~Mr_darcy8的掘金主页

可以的话给咱点个赞呗💖