首页 > 技术文章 > oracle数据库连接查询

MrTanJunCai 2018-11-05 09:27 原文

简单查询、复杂查询


简单查询: 单表


复杂查询:

1. 子查询(嵌套查询)

2. 连接查询

 

************************连接查询****************************


一.什么是连接查询


把多张表连接在一起,一块查


二.什么时候使用


数据来自于多张表的时候,要使用连接查询

 

三.连接查询的分类


1. 内连接

2. 外连接

3. 交叉连接

4. 自然连接


****************************************内连接******************************

--需求:查询部门编号为10的员工姓名、薪水、部门名称


--数据来自多张表的时候 使用连接查询

--sql1999

select e.ename,e.sal,d.deptno,d.dname from dept d inner join emp e

on(d.deptno = e.deptno)

where e.deptno=10

 

执行过程: 先拿着左表的第一条记录 和右表的所有记录进行匹配,如果满足

连接条件, 左表的记录和右表记录首尾相连...第一趟


第二趟 拿着左表的第二条记录 和右表的所有记录进行匹配,如果满足连接条件

首尾相连..依次类推

 

--sql1992

select e.ename,e.sal,d.deptno,d.dname from dept d ,emp e

where d.deptno = e.deptno and d.deptno=10


****************************************外连接******************************

分类:

1.左外连接

2.右外连接

3.全外连接

 


一.左外连接


--需求:查询员工姓名、薪水、部门名称

--保证左表的数据都有,要使用左外连接

--左外连接: 在内连接的基础上,保证左表的数据都有

select d.dname,e.ename,e.sal,d.deptno from dept d left outer join emp e

on(d.deptno = e.deptno)

 

outer 可以省略


sql1992


select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno = e.deptno(+)


二.右外连接

在内连接的基础上,保证右表的数据都有,如果左表以空补齐


select d.dname,e.ename,e.sal,d.deptno from emp e right outer join dept d

on(d.deptno = e.deptno)


--sql1992


select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno = e.deptno(+)


三.全外连接


左外连接的查询结果 并上 右外连接的查询结果


--sql1999
select d.dname,e.ename,e.sal,d.deptno from dept d full outer join emp e

on(d.deptno = e.deptno)

 

--sql1992
select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno = e.deptno(+)


UNION

select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno(+) = e.deptno

 

************************交叉连接 cross join (笛卡尔积)****************************

左表中的每一条记录 和右表中的 每一条记录 收尾相连 左边4条 右表14条 查询结果 一共 56条记录

sql 1999

select * from dept cross join emp


sql1992

select * from dept,emp

 


************************自然连接 natural join****************************


有点类似于 内连接,它和内连接的区别有两个


select * from dept natural join emp


(1) 不需要写连接条件


把两张表中 相同的字段(名称相同、类型相同) 自动作为连接条件 给你加上


(2) 会自动的把重复的字段去掉

 

******************************等值连接和非等值连接*****************************


一.等值连接


连接条件相等的为等值连接,刚才学的都属于等值连接


select ename,dname from emp join dept
on (emp.deptno=dept.deptno);//1999sql


select ename,dname from emp join dept
using (deptno);--等同于上面

 


二.非等值连接

连接条件不相等 例如 != > < between 时 连接两张表的数据

 

连接第三张表

--需求: 姓名、薪水、部门名称 、薪水等级


select e.ename,e.sal,d.dname,s.grade from dept d inner join emp e

on (d.deptno = e.deptno) inner join salgrade s

on (e.sal between s.losal and s.hisal)


******************************集合操作*****************************

1.UNION 并集 重复的只显示一次


第一张表的查询结果

UNION

第一张表的查询结果


2.UNION ALL 重复的显示多次


3. INTERSECT 交集


4. MINUS 差集

 

 

 

*****************--演示需求1:按照部门进行分组之后 每个部门赚钱最多的那个人********************


select t.deptno,e.ename,t.max_sal from emp e

inner join

(select deptno,max(sal) max_sal from emp group by deptno) t

on(e.deptno = t.deptno and e.sal = t.max_sal)


*****************************演示需求2:求每个部门的平均薪水的等级********************

 

--演示需求2:求每个部门的平均薪水的等级

select t.deptno,t.avg_sal,s.grade from

(select deptno,avg(sal) avg_sal from emp group by deptno) t

inner join salgrade s

on(t.avg_sal between s.losal and s.hisal)

 

*******************特殊的连接查询---自关联************************


需求: SMITH的上司叫什么


--需求: SMITH的上司叫什么

--1. 先查SMITH上司的编号

select mgr from emp where ename='SMITH'

--2.7902这个员工的姓名

select ename from emp where empno=7902

--合并

 

现在的需求: 把所有员工的姓名 和它的上司叫什么同时显示出来


自关联: 一张表当两张表使用,自己和自己进行连接查询,叫做自关联

 

select employee.ename,manager.ename from emp manager

right join emp employee

on(manager.empno = employee.mgr)

推荐阅读