你所在的位置: 首页 > Oracle > OCA >
最新开班 班级 报名状态
8月17日 RHCSA脱产班 已报满
10月13日 RHCE周末班 已报满
11月18日 RHCSA脱产班 已报满
11月2日 RHCSA周末班 已报满
12月2日 红帽专题班 已报满
12月16日 红帽专题班 已报满
12月23日 红帽专题班 已报满
3月03日 RHCSA脱产班 热招中
4月23日 RHCSA脱产班 热招中
7月24日 红帽RHCE暑假 热招中
  • 博赛网络ICT就业班热招中
  • 博赛推出Oracle OCM实战课程

oracle连接查询

时间:2013-10-14 10:08 作者:Superthink 点击:

4.1 连接查询

笛卡尔积
笛卡尔积是指不带连接谓词的连接,即没有连接字段。他的记录结果为关联表记录的乘积。在集合运算中,集合之间的乘积也被称为笛卡尔积。在关系型数据库中,笛卡尔的记录集的记录数目等于各个表记录数的乘积。
当从关系型数据库中的两个表中检索数据时,如果没有指定条件,那么这种检索结果就是笛卡尔积。
例子:
Select title_chinese, b.book_type_id, t.book_typ_id, book_type_name from books b , book_type t;
假设books表有12条数据,book_type表中6条数据,那么查询结果就有72条数据。
理论上这样的笛卡尔积在实际生产中是没有意义的,在现场开发环境也是不允许的。对大数据量的表,这样的笛卡尔运算是灾难性的。
内连接
内连接是指满足连接条件的连接操作。也就是说,在内连接的结果中,都是满足连接条件的数据。可以说内连接是笛卡尔集合中满足连接条件的子集。
 Select column_list 
from table_name_1 
inner join table_name_2 on join_condition;
例子:
Select title_chinese, b.book_type_id, t.book_typ_id, book_type_name
From books b 
Inner join book_type t
On b.book_type_id = t.book_type_id;
外连接
 在连接过程中,如果某个表中的数据不满足条件,也希望出现在检束结果中。那么可以用外连接。 
 外连接可以分为左外连接,右连接,全连接。
Select column_list
From table_name_1 
{left | right | full} join table_name_2 on join_condition;
外连接是在实际工作环境中用得最多的查询模式。
例子:
Select * from  table_a;

Id      A_col   
--------------------
 Id_1      a
 Id_2      b
 Id_3      c

select * from table_b ;

  id      b_col
-----------------------
 Id_1      1
 Id_3      3
 Id_1      2
   Select a.id,  a.a_col,  b.b_col
   From table_a     a
   Left join table_b  b  on a.id = b.id
order by a.id asc,  a.acol asc,  b.b_col  asc;
  
 Id_1     a_col     b_col
--------------------------------------
Id_1      a         1
Id_1      a         2
Id_2      b          
Id_3      c         3

从结果里可以看出table_a的所有记录都会出现在最后结果中,如果table_b中如果存在对应记录,那么对应记录才会出现在最终结果中。


row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 
  与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

  rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

  dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 

(责任编辑:Superthink)

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)