SQL 查询语句(四)连接查询

多张表联合起来查询称为连接查询。

如果两张表查询没有限制,最终查询结果就会是两张表数据条数的乘积。如emp表中ename数据有14条,dept表中dename数据有4条,没有限制的最终查询结果是14*4=56条信息。表连接次数越多效率越低。

注意:为了查询效率,需要给表起别名,指定某个字段在哪个表中查询:e.ename就是在e表中查询ename,否则会在两张表中都找一遍ename字段,降低了查询效率。SQL语句举例:

select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;

这条语句中给表emp起别名e,表dept起别名d。在字段前面加上对应的表别名 e.ename

一、内连接与外连接区别

内连接是将完全匹配查询条件的数据(符合on后面条件的数据)查询出来。

外连接的两张表有主次之分,除了查询满足条件的数据外,还将一张表中的其他不匹配查询条件的数据也全部显示出来,就是说主要查询一张表中的全部数据,捎带着关联查询另一张表。

二、内连接

1.等值连接

查询每个员工所在的部门名,显示员工名和部门名

select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;

其中,join表示表连接,inner表示内连接,可省略,加上inner可读性更好。on后面跟条件

2.非等值连接

找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级

select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;

此时条件不是等值关系,称为非等值连接。

3.自连接

查询员工的上级领导,要求显示员工名和对应的领导名?

mgr表示上级领导,smith的上级领导编号为7902,对应的名字为FORD

思路就是把一张表看成两张表,给查询出的两个列起别名。

select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr=b.empno;

由于KING员工的上级数据为NULL,所以查询结果不包含KING,总共13条记录。

三、外连接

1.左连接

查询join关键字左边的表全部数据,无论是否满足查询条件。在join关键字前加left

select e.ename,d.dname from dept d left outer join emp e on e.deptnp=d.deptno;

outer表示外连接,可以省略,带上outer可读性强。

2.右连接

即查询join关键字右边的表全部数据,无论是否满足查询条件。在join关键字前加right

select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;

左连接和右连接可以互相转换。

外连接案例:查询员工的领导名,要求显示所有员工名字和领导名字?

select a.ename as '员工名',b.ename as '领导名' from emp a left join emp b on a.mgr=b.empno;

与内连接中的自连接相比,外连接将KING这个领导名为NULL(不完全匹配查询条件)的数据也查询出来了,查询结果共14条数据。

四、三张表连接

语法:select ...from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件;

其中a和c的连接条件是指,a和b连接查询后的结果再与c连接查询所使用的条件。一条SQL语句中可以内外连接混合,只需在需要的join前加left或right即可。

案例:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?

emp表结构:

dept表结构:

salgrade表结构:

查询语句:

select e.ename,e.sal,d.dname,s.grade from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.hisal;

输出结果:

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值