SQL表连接

文章详细介绍了在SQL查询中处理多表数据时的几种连接方式,包括92语法和99语法下的等值连接、非等值连接、自连接、外连接(左、右、全)以及交叉连接(笛卡尔积)。通过示例展示了如何根据不同的连接条件筛选和组合数据,强调了在不同语法中对同名列和连接条件的处理方法。
摘要由CSDN通过智能技术生成
获取的数据不是来自一张表,而是来自多张表的时候

92语法

--92语法 select 数据 from 数据源1,数据源2... where 行过滤条件 group by 分组字段1,分组字段2.. having 组过滤信息 order by 排序字段1,.. desc|asc;

--执行流程 : from --> where --> group by --> having --> select --> order by

--92语法中表 连接条件定义 在where后面

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

  1. 笛卡尔积

交叉连接,同名字段必须使用表名或者别名区分,* 除外
select emp.*,dept.deptno,dept.dname from emp,dept;

一共会产生4*12=48行数据

  1. 等值连接

判断两个数据源中的某个字段值相等或者不相等
select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno=d.deptno;

  1. 非等值连接

非等值连接 : 判断区间,判断范围的条件
select *from emp,salgrade where sal between losal and hisal;

  1. 自连接

特殊的等值连接,一张表作为两个数据源来使用
select * from emp e1,emp e2 where e1.mgr=e2.empno;

5.外连接

内连接 : 满足连接条件查询到不满足过滤掉
外连接 : 某一个数据源中的数据不满足连接条件的时候也能显示

左外连接 | 左连接 : 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 ,确保 所有表的记录 都至少出 现一次

  1. 交叉连接

select * from emp cross join dept;

会产生4*12=48条信息,类比笛卡尔积

  1. 等值连接(自然连接

自然连接 : 自动做等值连接(同名字段|主外键字段) natural join
select ename,deptno,dname from emp natural join dept;

在做连接的时候,同名列归共同所有,所以同名字段不能使用表名或者别名区分(不能使用限定词

  1. using连接

指定同名字段做等值连接

join ..using(同名字段) 指定使用哪个同名字段做等值连接

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

select ename,deptno,dname from emp join dept using(deptno);

  1. on连接

既可以做等值连接,也可以做非等值连接

数据源1 join 数据源2 on 连接条件;

注意: 在join..on中同名字段的必须使用限定词

4.1非等值连接

--查询30部门的员工的工资信息
select ename, grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
where deptno = 30;

4.2等值连接

--部门编号为30的员工 员工名称 部门名称 工资等级 上级名称
select *
  from emp e1
  join dept d
    on e1.deptno = d.deptno
  join salgrade sa
    on sal between losal and hisal
  join emp e2
    on e1.mgr = e2.empno
 where e1.deptno = 30
 order by e1.sal desc;

  1. 内连接|外连接|全连接

内连接 : (inner) join 不满足条件直接过滤掉

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

左外连接|左连接 : left join

右外连接|右连接 : right join

全连接 : 两张表都是主表 full join

--主表是员工
select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
select * from emp e1 right join emp e2 on e1.mgr=e2.empno;
select * from emp e1 full join emp e2 on e1.mgr=e2.empno;

主表是员工

主表是经理

包含上述两个表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值