多表联合查询

两种查询方式

SQL92

笛卡尔积 :多个表的数据量直接相乘

两张表合成一张表了

select *from emp,dept

在这里插入图片描述

上面的表的数据是不匹配的,都有deptno这个字段

等值连接

select *from emp,dept where emp.deptno=dept.deptno

在这里插入图片描述

select empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno

当同一字段两个表都有,需要加上表名,可以给表使用别名

select empno,ename,job,mgr,hiredate,sal,comm,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno

在这里插入图片描述

不等值连接
例如给员工工资分等级

select *from emp e,salgrade s where e.sal>s.losal and e.sal<=s.hisal 

在这里插入图片描述

自连接
mgr是领导编号,在本章表找到对应领导,用两个一样的表进行联合

select e1.*,e2.* from emp e1,emp e2 where e1.mgr=e2.empno

在这里插入图片描述

当使用等值连接有员工没有部门时,或者有部门没有员工,这个员工或者这个部门就会被删
加括号(+) 就是不删选空着的
SQL92不能同时用两个(+) 99可以

select *from emp,dept where emp.deptno=dept.deptno(+)
select *from emp,dept where emp.deptno(+)=dept.deptno

SQL99

在这里插入图片描述

笛卡尔积

select *from emp cross join dept

自然连接

自动根据两表相同字段筛选出对应内容,和92里面等值连接是一样的效果
自然连接筛选的是字段名相同,字段值相同
如果有多个字段相同 就是 and 叠加筛选效果

select *from emp natural  join dept

如果只想按照部分字段或者某个字段进行筛选,自然连接就做不到,或者需要字段名不同,筛选字段值相同,也做不到

指定字段using

指明使用指定字段进行等值筛选,两表字段也必须同名

select *from inner join dept using(deptno)

解决字段必须同名on

提高语句的可读性,普通筛选用where,等值筛选用on
99里面进行筛选一般都用on,而不用上面两个(using和natural)

select *from emp inner join dept on emp.deptno=dept.deptno 

99简化了外连接

select *from emp e Left join dept d  on e.deptno=d.deptno 
select *from emp e Right join dept d  on e.deptno=d.deptno 
select *from emp e Full join dept d  on e.deptno=d.deptno

99自连接

select *from emp e1 join emp e2 on e1.mgr=e2.empno

三表联合查询
三表笛卡尔积,多个条件筛选
92
在这里插入图片描述

select *from emp e,dept d,city c where e.deptno=d.deptno and d.loc=c.cid

95

select *from emp e join dept d on e.deptno=d.deptno join city c on d.loc=c.cid 

99的优势是这样非常容易阅读,结构清晰

select *from emp e 
join dept d on e.deptno=d.deptno 
join city c on d.loc=c.cid 
where sal e.sal>2000 or e.comm is not null
order by sal

内连接、外连接的区别

<select id="selAll1" resultMap="stuMap1"> 
		select s.id sid,s.name sname,age age,t.id
		tid,t.name tname FROM student s left outer join teacher t on s.tid=t.id
</select>
  • Student表 属性tid(老师编号外键)
  • Teacher 属性id(老师编号)
  • 上面的SQL语句,若Student中tid数据缺失
  • 使用内连接这条数据无法联合
  • 使用外连接可以是使用,左外,或者右外也可以(SQL语句中表顺序换一下)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值