小石头课堂(一)查询语句顺序及外连接
学到select 语句了有些人认为比较难我感觉就是对语句的执行顺序不明确,,每一步过后不能再脑海里形成中间结果集,因此感觉有点绕,要知道用sql语句进行查询时深入了解查询顺序是很重要的,因此我结合相关文档做出了如下总结:
查询顺序:
(1)执行from语句后的表,锁定查询范围,即涉及到那几个表。
(2)执行where语句后的条件,筛选掉一些记录(on是在连接前过滤,where是连接后)
(3)group by后的语句,计算聚集函数,(一般有分组必有聚集函数)
(4)having后约束(一般是组函数)
(5)计算一般表达式。
(6)order by排序。
下面我就举几个具体的实例具体说明一下:
一、 单表查询:
Select e.deptno id, avg(salary) avgsal from emp_y e where e.deptno is notnull group by deptno having avg(salary)>5000 order by id desc;
(找出每个部门平均工资大于5000的部门号和该部门的平均工资)
现分析该语句:
(1)先执行from 锁定范围即表emp_y,因此别名e 在整个查询语句中都可以用到。
(2)执行where语句该语句是找到部门号不为空的所有记录。一般对整个结果过滤的条件都用where 提高查询效率。
(3)在执行group by 按部门分组,至此中间结果集里已经没有重复的部门号了即相当于对部门号做“distinct”处理。
(4)用having 对组函数过滤,找出大于5000的记录。
(5)至此中间结果集里包含部门号不为空且平均工资大于5000的每个部门、部门平均工资。在执行一般表达式,及选出deptno。
(6)最后对整个结果集排序。
以上我对每个列及表都加上别名,就是想说明该语句的执行顺序,where 和groupby后不能用列别名order by 后可以跟列别名和表别名。
二、 多表查询:
本人认为连接查询很垃圾,但还是总结一下,连接分为两大类,一是内连接;再者就是让人头疼的外连接(左外连接、右外连接、全外连接)。
内连接就是一般的匹配连接,较简单就不罗嗦了,下面主要说一下外连接
外连接主要是搞清楚驱动表和匹配表的问题,其实说白了就是对于有匹配不成功的行是否要显示出来,如果是A left join B就是对于匹配不到B表中行的A表行也显示出来,right 则反之。而全连接就是都显示出来,对于oracle还有一简单的表达方式就是(+),eg:from A ,B whereA.salary(+)=B.lowsal;就是B中行全显示出来。这种表达式还省去了join on 关键子,是我比较喜欢用的方式。
同样据以具体例子说之:
select gid, count(emp_y.salary) from emp_y,grade whereemp_y.salary(+) between losal and hisal group by gid ;
对于salary再grade中没有相匹配的grade表中的行也显示出来
再比如三个表的:
图1.、三个表及内容
select dname, rname, avg(salary) from emp_y e,regionr,dept_y d where e.deptno(+)=d.deptno and d.rid(+)=r.rid group byd.dname,r.rname;
(选出每个部门的平均工资及所在地)
结果如下图:
对于e.deptno中没有匹配上的d.deptno(options)也存在的中间结果集中,之后再对于d.rid中没有匹配上的r.rid(广州)也到了最终结果里,这就是外连接。
如果你真正理解上面两个例子,那么恭喜你对于外连接你已经无敌了。
本文提供者:怀念@那片蓝 QQ448661040。