小石头课堂(一)查询语句顺序及外连接

小石头课堂(一)查询语句顺序及外连接

       学到select 语句了有些人认为比较难我感觉就是对语句的执行顺序不明确,,每一步过后不能再脑海里形成中间结果集,因此感觉有点绕,要知道用sql语句进行查询时深入了解查询顺序是很重要的,因此我结合相关文档做出了如下总结:

查询顺序:

   (1)执行from语句后的表,锁定查询范围,即涉及到那几个表。

  2)执行where语句后的条件,筛选掉一些记录(on是在连接前过滤,where是连接后)

  3group by后的语句,计算聚集函数,(一般有分组必有聚集函数)

  4having后约束(一般是组函数)

  5)计算一般表达式。

  6order 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还有一简单的表达方式就是(+),egfrom 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 ;

对于salarygrade中没有相匹配的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.deptnooptions)也存在的中间结果集中,之后再对于d.rid中没有匹配上的r.rid(广州)也到了最终结果里,这就是外连接。

如果你真正理解上面两个例子,那么恭喜你对于外连接你已经无敌了。

 

      本文提供者:怀念@那片蓝 QQ448661040。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从来不用昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值