你所在的位置: 首页 > Oracle > OCA >
最新开班 班级 报名状态
9月16日 HCNP-R&S(含初级) 热招中
9月18日 RHCSA脱产班 热招中
9月25日 HCNA-Cloud Service 热招中
9月25日 HCNA-Cloud Service 热招中
9月30日 HCNA-R&S周末班 热招中
10月31日 HCNP-storage脱产班 热招中
10月23日 HCNA-storage脱产班 热招中
10月20日 HCNP-R&S脱产班 热招中
10月10日 HCIE-R&S脱产班 热招中
10月9日 HCNA-R&S脱产班 热招中
  • 博赛网络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)

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