两种查询方式
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语句中表顺序换一下)