当前位置:Gxlcms > 数据库问题 > oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

时间:2021-07-01 10:21:17 帮助过:2人阅读

多表连接查询

内连接(inner join

目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来。

等值连接(join...on(...=...)

--选出雇员的名字和雇员所在的部门名字

--(1)必须明确的指出重复字段属于哪个表

select ename,dname dept.deptno from emp,dept where emp.deptno = dept.deptno;

 

--(2)新语法:join...on(...=...)

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

非等值连接(join...on(...>...)

--求每个人的薪水值,名字和他的薪水处于第几个级别

--(1)不使用连接查询

select ename, sal, grade from emp, salgrade where sal between losal and hisal;

--或者

select ename, sal, grade from emp, salgrade where sal >= losal and sal <= hisal;

 

--(2)新语法:join...on(...between...and...)

select ename, grade from emp e join salgrade s on (e.sal between s.losal and s.hisal);

 

--(3)三表连接:取出雇员名字,他的部门名称,和薪水等级其中名字第二个字母包含A的不要取出

 

select ename, dname, grade from emp e join dept d on (e.deptno = d.deptno) join salgrade s on (e.sal between s.losal and s.hisal) where ename not like ‘_A%‘;

 

从上面的例子也可以看出,比较的对象不仅可以是具体的数据,字段名也可以作为比较的对象;一个join...on(...xxx...)只能连接两张表,要连接两张表以上,写多个join...on(...xxx...)即可,之间用空格隔开。

自然链接(natural join...

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

--自动将emp表中的deptno和dept表中的deptno做了连接

select emp.ename,dept.dname from emp natural join dept;

交叉链接(cross join...

交叉连接,交叉连接即返回这两个表的笛卡尔积。

select * from emp cross join dept;

 

外连接(outer join)

目的:将两张表中不能产生连接的数据也查询出来。注意和内连接的区别:内连接只查询符合连接条件的记录,外连接则把不能产生连接的数据也查询出来。

右外连接(right join... on(...=...) 

概念:right join关键字右边的表有一条(多条)不能产生连接的数据没有在连接查询中显示出来,要想把他显示出来,就要用到右连接。

--求每个雇员的名字,他所在部门的名称,全部选出来,并且把多余的部门也选出来(有一个部门没有员工)

select ename, dname from emp e right  join dept d on (e.deptno = d.deptno);

 

 

技术分享 

左外连接left join...on(...=...)...

概念:right join关键字边的表有一条(多条)不能产生连接的数据没有在连接查询中显示出来,要想把他显示出来,就要用到连接。

--求这个人的名字,他经理人的名字,并且把没有经理的员工也选出来

select e1.ename, e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);

 

技术分享 

全外连接(full join...on(...=...)...

概念:full join关键字左边右边没有连接的记录都查询出来

select ename, dname from emp e full join dept d on (e.deptno = d.deptno);

 

自连接

概念:为同一张表起不同的别名,然后当成两张表来用。

--求这个人的名字,他经理人的名字(经理也是员工,经理编号就是员工编号)

 

select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno)

 

小结

join后跟要连接的表,on后跟连接条件,将连接条件和过滤条件分开。

--SQL1992旧写法

select ename,dname from emp e,dept d where e.deptno = d.deptno and e.ename not like ‘%A%‘;

 

--SQL1999新写法

select ename,dname from emp e join dept d on(e.deptno = d.deptno) where e.ename not like ‘%A%‘;

 

 

子查询

子查询是一个 SELECT 语句,它嵌套在一个 SELECT语句、DELETE 语句、UPDATE 语句或嵌套在另一子查询中。

--求谁挣的钱最多

人气教程排行