Oracle-多表连接

什么是多表连接

--通过连接条件把相关表关联起来
	select * from emp;
--n个表相连会有n-1个关联关系,先写关联条件,再写限制条件

笛卡尔积:

	--为什么会产生笛卡尔积:
		--没有连接条件会产生笛卡尔积
	select emp.ename,emp.empno,dept.deptno,dept.dname
	from emp,dept

等值连接:通过=关联两个表中的列

	select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.dname
	from emp,dept
	where emp.deptno=dept.deptno;

限制歧义列名:给表起一个别名

	select e.ename,e.deptno
	from emp e,dept d
	where e.deptno=d.deptno;

非等值连接

	select e.ename,e.sal,s.grade
	from emp e,salgrade s
	where e.sal between s.losal and s.hisal

外部连接(Oracle自带的连接)

	--(+):+号的一边产生一个万能行,是由空值组成的
	--基准表:+的对立面是基准表
	select  e.ename,e.deptno,d.deptno,d.dname
	from emp e,dept d
	where e.deptno(+)=d.deptno;(dept为基准表)
			--基准表中的数据全部显示,另一张表中的数据和基准表中的数据匹配,匹配不上则用空值填充

自身连接(自连接)

	--连接条件
	--员工的经理编号=经理的员工编号
	select worker.ename,manager.ename
	from emp worker,emp manager
	where worker.mgr=manager.empno;

SQL99的写法:

	select  e.empno,e.deptno,d.deptno,d.dname
	from emp e
	cross join dept d;
		--产生笛卡尔积,不可取

自然连接:

	--两个表中要有相同列
	--列的数据类型保持一致
	--是等值连接
	select deptno,e.ename
	from emp e
	natural join dept d;
		--注意:共有的列不能用限定词

using连接:

	select  e.ename,e.sal,d.dname
	from emp e join dept d using(deptno)
		--using指定的列是两个表中具有相同名称和数据类型的列

ON子句:指定连接条件

	select e.eanme,e.deptno,d.deptno,d.dname
	from emp e
	join dept d
	on(e.deptno=d.deptno);

左外连接:

	--以左表为基准,右表和左表匹配,匹配不上用空值填充
	select e.empno,e.ename,e.deptno,d.deptno,d.dname
	from emp e
	left outer join dept d
	on(e.deptno=d.deptno);--emp为左表,没有部门的员工显示出来

左连接:

	select e.empno,e.ename,e.deptno,d.deptno,d.dname
	from emp e
	left  join dept d
	on(e.deptno=d.deptno);--效果无区别,书法上有区别

右外连接:

	--以右表为基准,左表和右表匹配,匹配不上用空值填充
	select e.empno,e.ename,e.deptno,d.deptno,d.dname
	from emp e
	right outer join dept d
	on(e.deptno=d.deptno);--dept为右表,没有员工的部门显示出来

右连接:

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

全外连接

	--在等值连接的基础上,两个表中的数据都显示
	select e.empno,e.ename,e.deptno,d.deptno,d.dname
	from emp e
	full outer join dept d
	on(e.deptno=d.deptno);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值