Oracle基础命令3
本文系列来自FREE教程,稍加修改以方便复习SQL,如果冒犯请联系作者删除。
集合运算 intersect交集 ,union all并集重复 ,union并集不重复, minus补集(对象是多个select结果)
Oracle集合运算就是把多个查询结果 (多个select)组合成一个查询结果,oralce的集合运算包括:INTERSECT(交集)、UINION ALL(并集重复)、UINION(并集不重复)、MINUS(补集)。
1、INTERSECT(交集),返回两个查询共有的记录。
2、UNION ALL(并集重复),返回各个查询的所有记录,包括重复记录。
3、UNION(并集不重复),返回各个查询的所有记录,不包括重复记录 (重复的记录只取一条)。
4、MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。
intersect 交集
交集,相同的去重复
select * from table a
intersect
select * from table
union all 并集重复
并集,两个组合相互结合,允许重复
select * from a where ...
union all
select * from b where ...
UNION(并集不重复)
并集,两个组合相互结合,去重
select * from a where ..
union
select * from b where ...
MINUS(补集)
MINUS先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一条数据就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这条第二个sql的数据也会被删除不要。
select * from a where ...
minus
select * from b where ...
连接查询(对象是table 表)
Oracle连接查询,包含内关联(inner jion )和外关联(outer join),其中外关联又分为左外关联(left outer join)、**右外关联(right outer join)和全外关联(full outer join)**其中外关联可以使用(+)来表示。Oracle natural join(自然连接)
内连接
Oracle内连接:两张表通过某个字段进行内关联,查询结果是通过该字段按关系运算符匹配出的数据行。其中可以包括:
- 等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列。
- 不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值,这些关系运算符包括>、>=、<=、!>、!<、<>。
等值连接
select a.id , b.name
from table1 a
join table2 b
on a.id = b.id
不等值连接
select a.id , b.name
from table1 a
join table2 b
on a.id >1 and b.id >1
Oracle natural join(自然连接)
自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果
Select emp.ename,dept.dname
From emp natural join dept;
这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,emp中的deptno和dept中的deptno做了连接。
也就是实际上相当于
Select emp.ename,dept.dname
From emp join dept on emp.deptno = dept.deptno;
因为这两张表的这两个字段deptno的类型个名称完全相同。所以使用natural join时被自然的连接在一起了。
另外:
1.如果做自然连接的两个表的有多个字段都满足有相同名称个类型,那么他们会被作为自然连接的条件。
2.如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。
left join(左联接)
LEFT JOIN是以左表的记录为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的数据。右表字段不足的地方均为NULL。
select a.*, b.stuid, b.stuname
from stuinfo a
left join stuinfo_2018 b
on a.stuid = b.stuid;
--左外连接(利用(+)在右边)另外一种写法,+在哪一表,哪表就是匹配表,另一表为全表。
select a.*, b.stuid, b.stuname
from stuinfo a,stuinfo_2018 b
where a.stuid=b.stuid(+);
right join(右连接)
和LEFT JOIN的结果刚好相反,是以右表为基础的。右表全部显示, 而左表只会显示符合搜索条件的记录。左表表记录不足的地方均为NULL。
右外连接(stuinfo_2018表中数据都存在,stuinfo不在stuinfo_2018存在的学生相关字段为null值)
select a.*, b.stuid, b.stuname
from stuinfo a
right join stuinfo_2018 b
--右外连接(利用(+)在左边)另外一种写法
select a.*, b.stuid, b.stuname
from stuinfo a,stuinfo_2018 b
where a.stuid(+)=b.stuid;
full join(全外连接)
全外连接(stuinfo、stuinfo_2018表中数据都存在,
–stuinfo不在stuinfo_2018存在的学生相关字段为null值,
–stuinfo_2018不在stuinfo存在的学生相关字段为null值
select a.*, b.stuid, b.stuname
from stuinfo a
full join stuinfo_2018 b
on a.stuid = b.stuid;
伪列
Oracle的伪列是Oracle表在存储的过程中或查询的过程中,表会有一些附加列,称为伪列。伪列就像表中的字段一样,但是表中并不存储。伪列只能查询,不能增删改。Oracle的伪列有:rowid,rownum。
ROWID物理地址
Oracle表中的每一行在数据文件中都有一个物理地址, ROWID 伪列返回的就是该行的物理地址。使用 ROWID 可以快速的定位表中的某一行。 ROWID 值可以唯一的标识表中的一行。通过Oracle select 查询出来的ROWID,返回的就是该行数据的物理地址。
select t.*,t.rowid from stuinfo t ;
select t.*,t.rowid from stuinfo t where t.rowid='AAAShjAAEAAAAEFAAD';
ROWNUM查询结果集的顺序
ORACLE ROWNUM表示的Oracle查询结果集的顺序,ROWNUM为每个查询结果集的行标识一个行号,第一行返回1,第二行返回2,依次顺序递增。
ROWNUM 与 ROWID 不同, ROWID 是插入记录时生成, ROWNUM 是查询数据时生成。ROWID 标识的是行的物理地址。 ROWNUM 标识的是查询结果中的行的次序。
select t.stuid,t.stuname,t.sex,t.classno,t.stuaddress ,rownum from stuinfo t ;
ROWNUM经常用来限制查询的结果返回的行数,求前几行或前几名的数据。
select * from
(
select * from a
order by score asc
)
where rownumber <=4