表连接(92,,99)

表连接

表连接92

笛卡尔积

假如第一张表12条数据,第二张表4条数据,连接之后就是48条数据

select * from emp , dept;
select ename , dname from emp , dept;
select ename, dname, e.deptno from emp e, dept d;
等值连接(在笛卡尔积基础上 取条件列相同的值)

判断两个数据源中的某个字段值相等或者不相等

--员工名称及部门名称
select ename, dname, e.deptno from emp e, dept d where e.deptno = d.deptno;
--找出30部门的员工名称及部门名称:先关联后过滤
select ename, dname, e.deptno
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 30;
--记录很多时 :先过滤后关联
-- 数据来源: emp (select * from emp where deptno=30) e , dept(select * from dept
where deptno=30) d
select * from emp where deptno = 30;
select * from dept where deptno = 30;
-- 查询的字段:ename, dname, e.deptno
-- 条件:e.deptno=d.deptno , deptno=30
select ename, dname, e.deptno
from (select * from emp where deptno = 30) e,
(select * from dept where deptno = 30) d
where e.deptno = d.deptno;
非等值连接

判断区间,判断范围的条件

--查询员工姓名,工资及等级
--900 属于哪个等级
select grade
from salgrade
where 900 > losal
and 900 < hisal;
select grade from salgrade where 900 between losal and hisal;
--查询员工姓名,工资及等级
-- 数据源: emp e, salgrade s
-- 字段: ename, grade, sal

注意:如果要使用的字段来自于多个数据源中都存在,需要指明限定词|出处

自连接

一张表作为两个数据源使用

--找出 存在上级的员工姓名 及上级名称
-- 数据来源: emp e, emp m
-- 字段: e.ename, m.ename
-- 条件: e.mgr=m.empno
select e.ename, m.ename from emp e, emp m where e.mgr = m.empno;
外连接

看逗号, 主表在,的左边就叫左外连接主表在,的右边叫右连接

–左外连接 | 左连接 : from后面主表在左边
–右外连接 | 右连接 : from后面主表在右边
–主表 : 主表中的数据无论是否满足连接条件都能显示
–92语法 : 在连接条件位置,主表的对面添加(+)

select * from emp e1,emp e2 where e1.mgr=e2.empno(+);
select * from emp e1,emp e2 where e1.mgr(+)=e2.empno;

表连接99(重点)

  • 交叉连接 cross join —>笛卡尔积
  • 自然连接(主外键、同名列) natural join -->等值连接
  • join using连接(同名列) -->等值连接
  • [inner]join on 连接 -->等值连接 非等值 自连接 (解决一切) 关系列必须区分
  • left|right [outer] join on|using -->外连接
  • full join on|using -->全连接 满足直接匹配,不满足相互补充null ,确保所有表的记录都至少出现一次
交叉连接
select * from emp cross join dept;
自然连接
select * from emp natural join dept;
--在指定列过程中同名列归共同所有(*除外)
select deptno,e.ename,d.dname from emp e natural join dept d;
using连接

指定同名字段做等值连接

注意: 在join…using中同名字段的不能使用限定词

select deptno,e.ename,d.dname from emp e join dept d using(deptno);
on连接

在join…on中同名字段的必须使用限定词

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

主表中的数据无论是否满足连接条件都显示

–左外连接|左连接 : left join
–右外连接|右连接 : right join

--所有部门的 部门名称,员工数
--左外
select dname, n
from dept d
left outer join (select deptno, count(1) n from emp group by deptno) i
on d.deptno = i.deptno;
select dname, n
from dept d
left outer join (select deptno, count(1) n from emp group by deptno) i
using (deptno);
--右外
select dname, n
from (select deptno, count(1) n from emp group by deptno) i
right outer join dept d
on d.deptno = i.deptno;
全连接

两张表都是主表 full join

select *
from (select 1 no, 'a' "name"
from dual
union
select 2 no, 'b' "name"
from dual) a
full join (select 1 no, 'c' "name"
from dual
union
select 3 no, 'd' "name"
from dual) b
on a.no = b.no;
select *
from (select 1 no, 'a' "name"
from dual
union
select 2 no, 'b' "name"
from dual) a
full join (select 1 no, 'c' "name"
from dual
union
select 3 no, 'd' "name"
from dual) b
using (no);

i.deptno;


#### 全连接

两张表都是主表 full join

select *
from (select 1 no, ‘a’ “name”
from dual
union
select 2 no, ‘b’ “name”
from dual) a
full join (select 1 no, ‘c’ “name”
from dual
union
select 3 no, ‘d’ “name”
from dual) b
on a.no = b.no;
select *
from (select 1 no, ‘a’ “name”
from dual
union
select 2 no, ‘b’ “name”
from dual) a
full join (select 1 no, ‘c’ “name”
from dual
union
select 3 no, ‘d’ “name”
from dual) b
using (no);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值