Oracle中的JOIN

一、两张表

Student表

SID                  SNAME                CLASSID

-------------------- -------------------- --------------------
001                  小明                 1
002                  小红                 2
003                  小张                 4

Class表
ID                   NAME
-------------------- --------------------
1                    一班
2                    二班
3                    三班

二、自连接
只返回两张表连接列的匹配项。以下三种效果相同
select * from student s inner join class c on s.classid = c.id;

select * from student s join class c on s.classid = c.id;
select * from student s,class c where s.classid = c.id;

SID                  SNAME                CLASSID              ID                   NAME
-------------------- -------------------- -------------------- -------------------- --------------
001                  小明                 1                    1                    一班
002                  小红                 2                    2                    二班

 

三、笛卡儿乘积连接
即不加任何条件,达到 M*N 的结果集。以下两种查询结果一样。
select * from student s cross join class c;
select * from student,class;

SID                  SNAME                CLASSID              ID                   NAME
-------------------- -------------------- -------------------- -------------------- --------------
001                  小明                 1                    1                    一班
001                  小明                 1                    2                    二班
001                  小明                 1                    3                    三班
002                  小红                 2                    1                    一班
002                  小红                 2                    2                    二班
002                  小红                 2                    3                    三班
003                  小张                 4                    1                    一班
003                  小张                 4                    2                    二班
003                  小张                 4                    3                    三班

除了cross join不可以加on外,其它join连接都必须加上on关键字,后都可加where条件。加上条件,产生跟自连接一样的结果。
select * from student s cross join class c where s.classid = c.id;

四、左连接
列出左边表全部的,及右边表符合条件的,不符合条件的以空值代替。在(+)计算时,哪个带(+)哪个需要条件符合的,另一个全部的。即放左即右连接,放右即左连接。以下结果集相同。

select * from student s left join class c on s.classid = c.id;
select * from student s,class c where s.classid = c.id(+);

SID                  SNAME                CLASSID              ID                   NAME
-------------------- -------------------- -------------------- -------------------- --------------
001                  小明                 1                    1                    一班
002                  小红                 2                    2                    二班
003                  小张                 4


五、右连接
与左连接一样,列出右边表全部的,及左边表符合条件的,不符合条件的用空值替代。(+)一样,它的位置与连接相反。
select * from student s right join class c on s.classid = c.id;
select * from student s,class c where s.classid(+) = c.id;

SID                  SNAME                CLASSID              ID                   NAME
-------------------- -------------------- -------------------- -------------------- --------------
001                  小明                 1                    1                    一班
002                  小红                 2                    2                    二班
                                                                      3                    三班  

六、全连接
产生M+N的结果集,列出两表全部的,不符合条件的,以空值代替。
select * from student s full join class c on s.classid = c.id;

SID                  SNAME                CLASSID              ID                   NAME
-------------------- -------------------- -------------------- -------------------- --------------
001                  小明                 1                    1                    一班
002                  小红                 2                    2                    二班
003                  小张                 4                                        

                                                                      3                    三班

七、总结

(+)连接符只能Oracl中应用,join等语句其他数据库也适用。

原帖地址:http://www.cnblogs.com/lovemoon714/archive/2012/03/02/2376782.html

时间: 2024-08-02 22:45:03

Oracle中的JOIN的相关文章

oracle中left join和right join的区别浅谈_oracle

通俗的讲:     A   left   join    B    的连接的记录数与A表的记录数同     A   right   join    B    的连接的记录数与B表的记录数同       A   left   join    B    等价B   right   join    A   table    A:     Field_K,    Field_A    1                        a    3                        b   

oracle中或者or和左连接left join 怎么一起使用????

问题描述 oracle中或者or和左连接left join 怎么一起使用???? 语句 select a.owner_id,count(b1.ship_id) cnt,nvl(sum(b1.dwt),0) dwt from so_shipowner_info a left join order_info_secondhand_formal b1 on b1.ship_business_date>to_char(sysdate,'yyyy') and (b1.buyer_id=a.owner_id

oracle中如何判断本表有多少张表对其有外键关联

在oracle中如何判断本表有多少张表对其有外键关联?我们主要分为两步: 第一步:        //查询表的主键约束名 select * from user_constraints e where e.table_name='' -----此处输入表名 第二步:        //查询所有引用到该主键的记录 select b.table_name,b.column_name from user_constraints a inner join user_cons_columns b on a.

oracle中游标(Cursor)的详解

概述 也许大家对数据库中游标都不陌生,但对于其概念可能有时又会有些模糊,游标到底是什么? 为了使大家对游标有个清晰的认识,本文将介绍Oracle中游标(curosr)相关的知识. 游标的概念 一般来讲,游标包含着两种不同的概念: 程序中的游标(Program Cursor)和Oracle中的游标(Oracle Curosr). 程序中的游标(Program Cursor): 在最终用户程序(Client Application)中,游标(curosr)通常指和SQL语句关联的一个数据结构,用于关

oracle中 这样的语句该怎么写.!!!!

问题描述 oracle中 这样的语句该怎么写.!!!! 由于刚学sql没多久sql不是很懂就来请教各位大神了例如我有两个表表1 表2id name age id pid height weight1 张三 6 1 9 180 1502 李四 7 2 3 170 1303 张三 9 3 5 150 100 我想得到的是在表一中如果name重复 那就取age最大的那个. 之后表2的pid关联表1的id. 例如最后我想获取到的是id name age height weight3 张三 9 170 1

c# 从oracle中查询数据,设置时间参数问题,在线等

问题描述 c# 从oracle中查询数据,设置时间参数问题,在线等 各位大神,小弟刚接触c#时间不长,写了个程序,从界面上datatimepicker中取出时间,然后在c#代码的sql语句中设置时间参数,无论怎么设置要不就查不到数据,要不就是时间格式设置的不对,下面是代码 public DataTable QueryUsedMaterial(string classgroup, string beginTime, string endTime) { string sql_QueryMateria

oracle中sql查询语句,求助

问题描述 oracle中sql查询语句,求助 比如有两张表 用户表User {id name }成绩表Score {id userid coursename courseScore}现在怎么查找每个用户的最高成绩 解决方案 select distinct u.idu.names.courseScore from User as uinner join ( select max(courseScore) as courseScore userid from Scoregroup by userid

Oracle中merge into的使用 (转)

该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1.insert 和update是可选的 2.UPDATE 和INSERT 后面可以跟WHERE 子句 3.在ON条件中可以使用常量来insert 所有的行到目标表中,不需要连接到源表和目标表 4.UPDATE 子句后面可以跟delete 来去除一些不需要的行. create table PRODUCTS (

Oracle中merge into的使用 (转)

http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5980965   该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,insert 和update是可选的 2,UPDATE 和INSERT 后面可以跟WHE