Oracle数据库学习笔记(四)——集合、联合查询

1、集合

集合:每一个sql查询的结果就是一个集合
(1,3,4,65,234,123,12)

select * from emp;

并集:取两个集合中所有元素
union all:表示取两个集合的并集,不删除重复元素
union :取两个集合的并集,删除重复的元素

--查询员工工资大于1000的员工信息
select * from emp where sal>1000;

--查询员工工资小于3000的员工信息
select * from emp where sal<3000;

select * from emp where sal>1000 
union all
select * from emp where sal<3000;


select * from emp where sal>1000
union
select * from emp where sal<3000;

union、union all:union all执行效率高,union执行效率低(先进行union all把两个集合合并,之后对合并后的数据进行排序,去掉重复元素)

交集:取两个集合重叠部分的元素
intersect:表示交集(英特赛可特)
--查询工资在1000到3000之间的员工信息

select * from emp where sal>1000 and sal<3000;

select * from emp where sal>1000
intersect
select * from emp where sal<3000;

差集:第一个集合的所有元素减去两个集合重叠部分的元素
Minus::表示差集(卖了思)


select * from emp where sal>1000
minus
select * from emp where sal<3000;

select * from emp where sal>=3000;


select * from emp where sal<3000
minus
select * from emp where sal>1000;

select * from emp where sal<=1000;

集合运算,关键字前后的两个sql表示的结果集要完全相同,

select ename,job from emp
union all
select ename,job from emp;

2、联合查询

交叉连接(笛卡尔积连接)、内连接、自连接、外连接(全连接、左外连接、右外连接)、自然连接

(1)交叉连接(笛卡尔积连接)
将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积.
语法:
select 列名,列名,...
from a表  cross join b表;

select * from emp;
select * from dept;

select e.*,d.deptno dno,d.dname,d.loc from emp e cross join dept d;

select e.*,d.deptno dno,d.dname,d.loc from emp e,dept d;


(2)内连接
内连接:是把两个表中符合条件的数据连接为一条数据,如果哪个表中存在不符合连接条件的数据,那么这些数据就会被过滤掉(不显示)
语法:(应了)
select 列名,...,列名
from a表  inner join b表  on 连接条件

inner join:中的inner可以省略不写

--查询员工信息及他的部门信息
select e.*,d.* from emp e inner join dept d on e.deptno=d.deptno;

select e.*,d.* from emp e join dept d on e.deptno=d.deptno;

select e.*,d.* from emp e,dept d where e.deptno=d.deptno;


(3)自连接
自连接是一个特殊的内连接,内连接一般是两个表的连接,自连接将一个表和它自已进行连接

--查询员工信息,并显示它的上级姓名
select e1.*,e2.ename 上级姓名 from emp e1 join emp e2 on e1.mgr=e2.empno

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

(4)不等连接
不等连接:连接条件是不等条件,(大于、小于、不等于)
--查询员工信息,并显示员工的工资等级

select * from salgrade;

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


(5)全连接
全连接:它会查出两个表中的所有数据,
 1.如果两个表中的数据都符合连接条件,那么它会和内连接一样,将符合条件的数据连接为一条记录
 2.如果第一表中的一条数据,在第二张表中没有找到和它对应的记录(第二张表没有和第一张表这条数据符合连接条件),
 那么它同样会显示第一张表的这条记录,同时它对应的第二张表数据的位置会显示为空
 3.同理,如果第二张的一条记录,在第一张表中没有找到符合连接条件的数据,那么同样会显示,在显示第一张表数据的位置显示为空

语法:
select 列名,列名,列名,....
from 表A full outer join 表B on 连接条件;

full outer join :中的outer可以省略
 

--查询所有部门和员工信息

select e.*,d.* from emp e full outer join dept d on e.deptno=d.deptno;
(6)左外连接
语义:查出左表(left outer join关键字前面的表)的所有数据,根据连接条件去右表中找对应的数据
     如果找到变显示出来,如果找不到就显示空
     
--查询所有部门信息,以及各部门下的员工信息
select 列名,列名,...
from 表A left outer join 表B on 连接条件

left outer join :其中outer可以省略

select d.*,e.* from dept d left join emp e on d.deptno=e.deptno;

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

注意:用(+)表示的左连接或者右连接,如果是左连接,那么符号加在右表的关系列上,如果是右连接,那么符号加在左表的关系列上
--左连接
select d.*,e.* from dept d,emp e where e.deptno(+)=d.deptno; 
--右连接 
select d.*,e.* from dept d,emp e where d.deptno(+)=e.deptno;


(7)右外连接
语义:它会查出右表的所有数据,根据连接条件去左表查找对应的数据,如果找到就显示,如果找不到就显示为空语法:
select 列名,列名,列名,...
from 左表 right outer join 右表 on 连接条件

right outer join:其中outer可以省略

--查询员工信息,并显示它的部门信息
select d.*,e.* from dept d right outer join emp e on d.deptno=e.deptno;

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


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

   select col_name,col_name,...
   from table_a natural join table_b;
   

   select col_name,....
   from table_a natural join table_b 
   using(关系列)

select * from emp natural join dept;        --自然连接

select * from emp join dept using(deptno); --自然连接using用来指定关系列

猜你喜欢

转载自blog.csdn.net/Hao1999_/article/details/120720515