oracle多表联合查询SQL92⽅式SQL99⽅式三表联合查询多表联合查询:
--当需要获取的数据分布在多张中,考虑使⽤联合查询
--SQL92⽅式
--SQL99⽅式
SQL92⽅式
--笛卡尔积:将多个表的数据进⾏⼀⼀对应,所得到结果为多表的笛卡尔积。
--结果的数量为所有表的数量的乘积。
select * from emp,dept where emp.deptno=dept.deptno
--等值连接筛选
--概念:先做表的笛卡尔积,然后筛选,筛选条件为等值筛选。
--注意:条件为字段的值相同来进⾏筛选,字段的名字可以不同
-
-查询员⼯姓名,⼯作,薪资,部门名称
select * from emp,dept where emp.deptno=dept.deptno
--可以直接在select⼦句中使⽤字段直接获取数据,但是效率⽐较低。建议字段前加上表名
--注意:如果是公共字段,则必须声明表名
select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno--等值连接筛选
ame,emp.job,emp.sal,dept.dname,emp.deptno from emp,dept where emp.deptno=dept.deptno ame,e.job,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno and sal>2000--给表使⽤别名 --不等值连接
--查询员⼯姓名,⼯作,⼯资,⼯资等级
select * from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal
--⾃连接
--查询员⼯姓名,⼯作,薪资,及上级领导姓名
ame,e1.job,e1.ame from emp e1,emp e2 =e2.empno
--外连接
--左外连接:加在右边,显⽰左边对应字段没有值的数据
--查询员⼯姓名,⼯作,薪资,部门名称及没有部门的员⼯信息
select * from emp e,dept d where e.deptno=d.deptno(+)
--右外连接:加在做边,显⽰右边边对应字段没有值的数据
--查询员⼯姓名,⼯作,薪资,部门名称及没有员⼯信息的部门
select * from emp e,dept d where e.deptno(+)=d.deptno
SQL99⽅式
--注意1:依然可以给表添加别名
--注意2:如果使⽤on或者usering关键对结果进⾏筛选,必须使⽤inner join作⽤表与表的连接,其中inner可以省略 --注意3:外连接的outer关键字可以省略不写
--注意4:依然可以继续使⽤分组,having ,排序等
--笛卡尔积:使⽤cross join 关键字
---select 内容 from 表名 cross join
select * from emp cross join dept
--筛选
--查询员⼯姓名,⼯作,薪资,部门名称
--⾃然连接:使⽤关键字 natural joinsql left join 多表连接
--使⽤:select 内容 from 表名 natural join 表名
--特点1:底层先笛卡尔积,然后按照所有的同名同值字段⾃动进⾏等值筛选。
--问题1:如果只想按照部分字段结果筛选怎么办?
--问题2:如果想按照字段名不同,但是值相同进⾏等值筛选怎么办?
select * from emp natural join dept
--解决1:使⽤using关键字
--作⽤1:指明使⽤指定的字段对联合查询的结果进⾏等值筛选
--注意:指明的字段必须是两表的同名同值字段
--使⽤:select 内容 from 表名 inner join 表名 using(字段名,字段名,....)
select * from emp inner join dept using(deptno)
--解决2:使⽤on关键字进⾏⾃定义连接条件筛选(等值筛选,不等值筛选)
--注意:普通筛选条件使⽤where进⾏筛选,不要使⽤on进⾏。好处:SQL语句的阅读性变强。
--使⽤:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件
select * from emp inner join dept on emp.deptno=dept.deptno where sal>2000
--外连接
-
-左外连接:select 内容 from 表名 left outer join 表名 on 连接条件
--查询员⼯姓名,⼯作,薪资,部门名称及没有部门的员⼯信息
select * from emp e left outer join dept d on e.deptno=d.deptno
--右外连接:select 内容 from 表名 right outer join 表名 on 连接条件
--查询员⼯姓名,⼯作,薪资,部门名称及没有员⼯的部门信息
select * from emp e right outer join dept d on e.deptno=d.deptno
--全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
select * from emp e full outer join dept d on e.deptno=d.deptno
--⾃连接
--查询员⼯及其上级领导姓名
select e1.*,e2.ename from emp e1 inner join emp e2 =e2.empno
SQL92&SQL99实现三表联合查询
--创建city表:使⽤图形操作即可
--给city表添加测试数据
insert into city values(1,'商丘','历史闻名古都');
insert into city values(2,'邯郸','历史闻名古都');
insert into city values(3,'洛阳','历史闻名古都');
insert into city values(4,'开封','历史闻名古都');
--将部门表中的loc字段设置为城市表的城市编号
update dept set loc='1' where deptno=50;
update dept set loc='2' where deptno=40;
update dept set loc='3' where deptno=30;
update dept set loc='4' where deptno=20;
update dept set loc='4' where deptno=10;
--完成三表联合查询
--SQL92实现:查询员⼯信息及部门名称及所在城市名称并且员⼯的⼯资⼤于2000或者有奖⾦
--特点:易于书写,难于阅读
--缺点:92的SQL语句结构不清晰
--⽤法:
--select 内容 (别名,连接符,去除重复,oracle函数,逻辑运算)
--from 表名1,表名2,表名3...
--where 条件(连接条件,普通筛选条件,where⼦句关键字)
--group by 分组字段
-
-having 多⾏函数筛选
--order by 排序字段
select e.*,d.dname,came
from emp e,dept d,city c
where (e.deptno=d.deptno and d.loc=c.cid and sal>2000) or (e.deptno=d.deptno and d.loc=c.cid and comm is not null) order by e.sal
--SQL99实现:查询员⼯信息及部门名称及所在城市名称并且员⼯的⼯资⼤于2000或者有奖⾦
--特点:难于书写,易于阅读
--使⽤:
--select 内容 from 表名1
-- inner join 表名2
-- on 连接条件
--inner join 表名3
--on 连接条件
--where 普通筛选条件
--group by 分组
--having 多⾏函数筛选
--order by 排序
select * from emp e
inner join dept d
on e.deptno = d.deptno
inner join city c
on d.loc =c.cid
where e.sal>2000 or em is not null
order by e.sal
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论