黑马程序员技术交流社区

标题: 数据库中join的具体同法? [打印本页]

作者: 陈云帆    时间: 2012-7-27 19:37
标题: 数据库中join的具体同法?
数据库中join的具体同法?
作者: 王辉    时间: 2012-7-28 12:36
有以下几种用法(例子源于网络):
(1) cross join
参与select语句所有表的的所有行的笛卡尔乘积
例如:select au_lname ,title      from authors cross join   titiles

outer join 对参与join的两个表有主从之分,处理方式以主表的每条数据去match 从属表的列,合乎条件的数据是我们所要的答案,不合乎条件的也是我们要的答案,只不过哪些从属表选取的列将被添上null。

(2) left join
左边的为主表,右边为从属表
例如:select a.cust_id ,b.order_date,b.tot_ant
      from customer a left join sales b
      on (a.cust_id =b.cust_id and b.order_date>''1996/10/15'')

也可以写为
select a.cust_id,b.order_date,b.tot_ant
      from custom a
      left join (select * from sales where order_date>''1996/10/15'') b
     on a.cust_id =b.cust_id

(3) right join
左边的表为从属表,右边的表为主表

(4) self join
self join 常用在同一表内不同数据间对同一列的比较

select a.emp_no,a.emp_name,b.emp_no,b.emp_name,a.date_hired
     from employee a
     join employee b
     on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)
     order by a.date_hired

这样会重复数据,只要加上一句 and a.emp_name>b.emp_name

(5) full join
不仅列出符合条件的数据,两边未符合join条件的数据也会一并列出。哪些未符合join条件的数据如果在select列中无法得到对应的值则填上null
select a.cust_id,b.tot_amt
     from customer a full join sales b
     on a.cust_id=b.cust_id
作者: 陈汉维    时间: 2012-7-28 12:48
join的用法inner join,left join,right join,full join,具体是什么我也记不太清,我举几个我用到过的
一般我们常用的查询语句都这样写:
select a.name,b.name
from a,b
where a.age = b.age
这样等同于
select a.name,b.name
from a inner join b on a.age= b.age
其他的具体用法你可以到w3c官网看看,非常详细 http://www.w3school.com.cn/sql/sql_join_inner.asp

作者: 黑马杨凯    时间: 2012-7-29 10:35
本帖最后由 黑马杨凯 于 2012-7-29 14:18 编辑

初学,现学现卖,呵呵~找了以前练习中的两个表:
表 T_Member

表 T_Interest


个人理解:
表连接
  inner join  
  就是我们平时写的 join 连接,执行join连接,会舍弃一些不能满足同时存在条件的null数据,如我们想输出多列,例如我想输出 “姓名” 和 “爱好”, 如果这个人的爱好代码为null,这个人的数据会被舍弃。
  
select  mb.Name,i.Interest
from T_Member mb
join T_Interest i on mb.InterestID=i.Id
查询结果:

  
  外部链接 left join   right join
  能够保留同时存在条件中的某项存在null的数据行,就像上例中的爱好代码为null的人也会输出
  
select  mb.Name,i.Interest
from T_Member mb
left join T_Interest i on mb.InterestID=i.Id
查询结果:


  完全连接 full  join
  除了返回满足你条件的结果外,还会把剩下的不满足的也显示,不满足的地方填null

select  mb.Name,i.Interest
from T_Member mb
full join T_Interest i on mb.InterestID=i.Id

查询结果:

  
4 交叉连接  cross join
    实现数学中的笛卡尔积,通过几个连接的小数据表,获得大量的数据,可用于建立数据库后的测试,一般不大用(据说)
select  mb.Name,i.Interest
from T_Member mb
cross join T_Interest i

这个结果是任意一个人和任意一个兴趣的组合




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2