一、Having子句
1. Having子句可以对聚合函数进行限制。
比如:
SQL>select job, avg(sal) from emp group by job having avg(sal)>1500;
上述SQL子句执行思路:
(1)使用group by子句将行分组为job相同的部分,即job列数据相同的员工信息分为一组;
(2)针对上一步得到的分组数据,使用avg()函数对每组数据分别计算那个均值;
(3)使用having子句限制,即查询结果只返回平均工资大于1500部分。
简单来说:分组,计算平均值,根据having筛选出显示结果。
【注意】如果对聚合函数进行限制,必须用:having聚合函数条件,不要用where。
例1:练习having子句
解:首先查看当前登录用户下的sc表:
现在将cno相同的分为一组,计算平均值,查询结果只显示平均分大于80的课程,注意下图的SQL语句:
如果用where做会报错:
所以where和having的区别就是聚合函数条件限定必须且只能用having。
二、连接的定义
1.连接:它可以用于连接任意多个表,从多个表中检索出相应的记录。
比如要查看每个员工所属部门的名称,那么这个时候需要将员工表和部门表通过“deptno”进行连接查询。
(1)SQL>select ename, dname from emp,dept
2 where emp.deotno = dept.deptno;
(2)SQL>select ename, dname from emp join dept on
2 emp.deptno =dept.deptno;
查询方式(1)是平常使用的SQL连接查询操作;查询方式(2)语法方式为SQL/92标准查询。
2.连接语句的基本语法格式:
(1)常用语句:
select 表1.列名,表2.列名 from 表1,表2 where 表1.列名1 join_operator 表2.列名2;
(join_operator前后为两张表有关联的列,如上面的deptno列)
(2)SQL/92标准语法:
select 表1.列名,表2.列名 from 表1 join_type 表2 on 表1.列名1 join_operator 表2.列名2 where子句;
(join_operator前后为两张表有关联的列,如上面的deptno列)
例2:练习多表联查
解:首先在当前登录用户下存在三个表:
(1)student表:
(2)sc表:
(3)course表:
现在查询每个学生中文名称所选修的课程,即(1)与(2)通过sno连接,可以查到每个学生选修课程的课程编号cno,如(1)表中张三学号s001,拿着s001去查(2)表,得到张三选了c001课程;然后(2)与(3)通过cno连接,可以查到每个学生选修课程的名称,如张三选了c001课程,拿着c001得到张三选的是J2SE课程,注意下图中的SQL语句:
其中a,b,c是三张表的别名。
【总结】
如果n表联查,那么where子句中的条件必须是n-1个条件,比如
上面3表联查,那么where子句中就有2个条件
例3:基于例2中的student,sc两张表,查询每个学生选修课程的成绩。
解:比如查询张三,只要在student表中获取其学号sno=’s001’,然后用s001去查sc表,即可得到张三的分数。