Oracle 学习笔记

原创 2007年10月15日 20:59:00

Oracle 学习笔记
Chapter 4 联接多个表

4.1 笛卡儿联接
4.1.1笛卡儿联接--传统方法:
     select title, name
     from books, publisher;
4.1.2笛卡儿联接--JOIN方法:
     select title, name
     from books cross join publisher;

(笛卡儿联接(也称“笛卡儿乘积”或“交叉联接”)中, 第一个表中的每一个记录都和第二个表中的每一个记录配对。)
4.2 相等联接
在实际工作中,最常用的联接类型是在对 一个公共列中存储了相同的书记的两个(或多个)表创建的。这种联接称为 “相等联接”,也可以将它们称为同等联接,内部联接或简单联接。

4.2.1相等联接—传统方法
   select title, name
   from books, publisher
   where books.pubid = publisher.pubid;
使用where子句来区别笛卡儿联接。通过使用where子句使Oracle 9i知道两个(或多个)表两个(或多个)相同的数据列,从而建立相等联接。当两个(或多个)表存在相同的列名的时候必须使用“列修饰符”,列修饰符指定了包含所使用的列的表。为了简便,我们引入了“表别名”(相当于列别名)。

4.2.2相等联接--JOIN方法
        在这里可以使用三种JOIN关键字的方法来创建相等联接:NATURAL JOIN,JOIN```USING 和JOIN ```ON。
        1,NATURAL```JOIN 关键字将在包括一个同等的命名和定义的字段的两个表之间自动创建联接。
        2,使用USING子句可以根据两个表中具有相同命名和定义的列创建联接。
        3,当两个(或多个)表中没有包含一个同等命名或定义的字段时,那么你就必须要使用到JOIN```ON 方法了。

NATURAL JOIN 方法
   select title, name
   from books NATURAL JOIN publisher;
在使用NATURAL JOIN 方法的时候不允许使用列修饰符。
USING 方法
   select title, name
   from books join publisher
   USING (pubid);
    使用USING 方法时需要把公共字段包括在括号中,而且在这里同样也是不允许使用列修饰符。

JOIN ON 方法
   select title, name
   from books JOIN publisher
   ON books.pubid = publisher.pubid
   在使用JOIN ON 方法的时候,希望不要忘记在ON子句中的列名称之前添加列修饰符,否则就会收到一个多义性错误。
4.3 不等联接
在不能使用等号联接相关的列的时候---也就是表中不存在可以联接的相同的行的事业,我们可以使用“不等联接”。不等联接就是将一个记范围最小的值存储在记录的一个列中,将这个范围的最大值存储在另一个列中。不等联接用于确定一个值属于某一个范围之中。

4.3.1不等联接—传统方法
   select title, gift
   from books, promotion
   where
   retail between minretail and maxretail;
   使用不等联接的时候,必须确定一个值只能属于一个范围之内,也就是必须确定没有重叠的值。

4.3.2不等联接—JOIN方法
    select title, retail, gift
    from books join promotion
    on retail between minretail and maxretail;
4.4 自我联接
有时,一个表中的数据引用了同一个表中存储的其他数据。实际就是联接同一个表。

4.4.1自我联接—传统方法
   select r.firstname, r.lastname, c.lastname                  referred
   from customers c, customers r
   where c.referred = r.customer#;
           在进行自我联接的时候,实际上你就是把一个表当作两个表来处理,通过表别名来区分两个表。一个表就是两个表。相似于相等联接。

4.4.2自我联接—JOIN方法
   select r.firstname, r.lastname, c.lastname referred
   from customers c join customers r
   on c.referred = r.customer#;
           这个和其他的JOIN方法没有什么区别,请自己认真复习。
4.5外部联接
当你需要在联接查询的结果中包括存在于一个表但在另外一个表中没有对应行的记录的时候,那么你就需要用到外部联接。也就是说,当我联接查询的时候,我的第一个表中的行不管与第二个表中的行是否相等,我第一个表中的行都要列出来,而在第二个表中,如果有行与我的第一个表中的行相对应,那么就把对应的行列出,否则不列出。简单的说,就是联接查询中的第一个表的行全部列出,而第二个表中的行如果与第一个表的行相对应则列出,否则不列出。之前我们学的都可以说是内部联接。

4.5.1外部联接—传统方法
   select firstname, lastname, order#
   from customers, orders
   where customers.customer# = orders.customer# (+);
   在Where 子句中缺少对应行的表的列名称后面加(+),是告诉Oracle 9i在这个表中创建一个NULL行,以便与其他表中的行联接。此方法实际上是给没有匹配值的行加上NULL值。

4.5.2外部联接—JOIN方法
   Select firstname, order#
   from customers left outer join orders on customers.customer# = orders.customer#;
           在使用JOIN方法时,默认是建立内部联接,当你想创建外部联接使用到JOIN方法时,你就需要添加left/right/full outer (左联接,右联接,全联接)。否则你只能实现内部联接。当使用left选项时,说明是以JOIN左边的表做主,也就是左边的表的符合条件的行全部列出,而右边的表中的相匹配的行也相应列出。而使用right选项时则相反,使用full选项则两个表都全部列出。
4.6集合运算符
集合运算符是用来结合两个或多个select语句的结果。Oracle 9i 中的有效的集合运算符是UNION, UNION ALL, INTERSECT, MINUS。他们的作用如下表。


Select customer# from customers
      union
      select customer# from orders;
Select customer# from customers
      union all
      select customer# from orders;

Select customer# from customers
   intersect
   select customer# from orders;
Select customer# from customers
  minus
  select customer# from orders;
4.7联接三个或更多表
有写情况下你要联接两个以上的表来检索你需要的数据,比如当你想要知道每一个客户所订购的图书,那么你就要联接customers, orders, orderitems, books这四个表,如果客户还想知道他买的书的出版社,那么你就还需要联接到publisher表了。当你的数据库设计的表很多的时候,你就很可能要经常用到多个表联接了。
4.7.1传统方法
select title, firstname || ' ' || lastname  "customer's name"
  from customers, orders, orderitems, books
  where customers.customer# =        orders.customer#
   and orders.order# = orderitems.order#
   and orderitems.isbn = books.isbn
 

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle 学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)