ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 连接运算:inner join、right join、left join、 outer join 详细

连接运算:inner join、right join、left join、 outer join 详细

原创 Linux操作系统 作者:mxming 时间:2010-01-01 23:45:09 0 删除 编辑

join 连接运算详细:

连接运算包括外连接、内连接、交叉连接。其中

1.外连接包括左向-外联接(left outer join或 left join)、右向-外联接(right outer join或right join)、完整-外联接 (full outer join或 full join)

2.内连接即内部连接(inner join 或 join)

3.交叉连接(cross join )

准备测试数据:

按以下结构创建一个用户表: b_users

SQL> desc b_users;
Name  Type        Nullable Default Comments
----- ----------- -------- ------- --------
UNO   NUMBER                       用户编号
UNAME VARCHAR2(8) Y                用户名  
USEX  CHAR(4)     Y                性别    

数据如下:
 SQL> select * from b_users;


       UNO UNAME    USEX
---------- -------- ----
  20050002 王静     女
  20050004 雁南飞   女
  20050006 上官燕   女
 200215122 刘晨晨   女
 200215124 张立立   男
 200215121 李勇勇   男 

按以下结构创建一个学生表: a_students

SQL> desc a_students;
Name  Type         Nullable Default Comments
----- ------------ -------- ------- --------
SNO   NUMBER                        学号    
SNAME VARCHAR2(8)  Y                姓名    
SEX   CHAR(4)      Y                性别    
SAGE  NUMBER       Y                年龄    
SDEPT VARCHAR2(10) Y                所在系  

数据数据如下:

SQL> select * from a_students;

        SNO         SNAME    SEX        SAGE   SDEPT
---------- -------- ---- ---------- ----------
 200215121    李勇          男           20         CS
 200215122    刘晨          女           19         CS
 200215123    王敏          女           18         MA
 200215124    张立          男           19         IS

1.1我们来说说外连接------ 

要求以左向外连接的方式查询两表中具有相同编号的元组,执行结果如下:

SQL> select * from  b_users bu left join a_students stu on   bu.uno=stu.sno;
 
       UNO UNAME    USEX        SNO SNAME    SEX        SAGE SDEPT
---------- -------- ---- ---------- -------- ---- ---------- ----------
 200215121 李勇勇   男    200215121 李勇     男           20 CS
 200215122 刘晨晨   女    200215122 刘晨     女           19 CS
 200215124 张立立   男    200215124 张立     男           19 IS
  20050002 王静     女                                      
  20050006 上官燕   女                                      
  20050004 雁南飞   女                                      
 
6 rows selected

调换两个表的位置,执行结果如下;

SQL> select * from  a_students stu left join  b_users bu on   bu.uno=stu.sno;
 
       SNO SNAME    SEX        SAGE SDEPT              UNO        UNAME    USEX
---------- -------- ---- ---------- ---------- ---------- -------- ----
 200215121 李勇     男           20      CS            200215121      李勇勇       男
 200215122 刘晨     女           19      CS            200215122      刘晨晨       女
 200215123 王敏     女           18      MA                            
 200215124 张立     男           19      IS               200215124     张立立       男
 

可见,left join 的结果集包括在left join 左边的表的所有行,与连接表联接列所匹配的行。如果左边表的某行在右边表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。right join 则与之相反,以出现在right join 右边的表为基础表。

        这样一来,就不难理解 full join了。完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含两个基础表的数据值

SQL> select * from  b_users bu  full join  a_students stu  on bu.uno=stu.sno;
 
  UNO             UNAME    USEX     SNO               SNAME  SEX    SAGE   SDEPT
---------- -------- ---- ---------- -------- ---- ---------- ----------
  20050002    王静         女                                      
  20050004    雁南飞     女                                      
  20050006   上官燕      女                                      
 200215122  刘晨晨     女             200215122   刘晨       女         19         CS
 200215124  张立立     男             200215124   张立       男         19          IS
 200215121  李勇勇     男             200215121   李勇       男         20          CS
                                                          200215123   王敏       女         18          MA
 
7 rows selected

2.1我们来说说内连接------ 

内连接 join:结果集只包括基表中符合条件的匹配行,如:

SQL> select * from  b_users bu join  a_students stu  on bu.uno=stu.sno;
 
       UNO UNAME    USEX        SNO SNAME    SEX        SAGE SDEPT
---------- -------- ---- ---------- -------- ---- ---------- ----------
 200215121 李勇勇   男    200215121 李勇     男           20 CS
 200215122 刘晨晨   女    200215122 刘晨     女           19 CS
 200215124 张立立   男    200215124 张立     男           19 IS
 
 3.1最后我们来说说交叉连接------ 
 cross join :无匹配条件,相当于求该连接关键字左右的两个表的笛卡尔积,如下

SQL> select * from  a_students stu cross join b_users bu;
 
       SNO SNAME    SEX        SAGE SDEPT             UNO UNAME    USEX
---------- -------- ---- ---------- ---------- ---------- -------- ----
 200215121 李勇     男           20 CS           20050002 王静     女
 200215121 李勇     男           20 CS           20050004 雁南飞   女
 200215121 李勇     男           20 CS           20050006 上官燕   女
 200215121 李勇     男           20 CS          200215122 刘晨晨   女
 200215121 李勇     男           20 CS          200215124 张立立   男
 200215121 李勇     男           20 CS          200215121 李勇勇   男
 200215122 刘晨     女           19 CS           20050002 王静     女
 200215122 刘晨     女           19 CS           20050004 雁南飞   女
 200215122 刘晨     女           19 CS           20050006 上官燕   女
 200215122 刘晨     女           19 CS          200215122 刘晨晨   女
 200215122 刘晨     女           19 CS          200215124 张立立   男
 200215122 刘晨     女           19 CS          200215121 李勇勇   男
 200215123 王敏     女           18 MA           20050002 王静     女
 200215123 王敏     女           18 MA           20050004 雁南飞   女
 200215123 王敏     女           18 MA           20050006 上官燕   女
 200215123 王敏     女           18 MA          200215122 刘晨晨   女
 200215123 王敏     女           18 MA          200215124 张立立   男
 200215123 王敏     女           18 MA          200215121 李勇勇   男
 200215124 张立     男           19 IS           20050002 王静     女
 200215124 张立     男           19 IS           20050004 雁南飞   女
 
       SNO SNAME    SEX        SAGE SDEPT             UNO UNAME    USEX
---------- -------- ---- ---------- ---------- ---------- -------- ----
 200215124 张立     男           19 IS           20050006 上官燕   女
 200215124 张立     男           19 IS          200215122 刘晨晨   女
 200215124 张立     男           19 IS          200215124 张立立   男
 200215124 张立     男           19 IS          200215121 李勇勇   男
 
24 rows selected

注释:(b_users X a_students)返回的行数6*4=24.
 

资源文章:http://guyuanli.itpub.net/post/37743/493303

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22350698/viewspace-624098/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-01-01

  • 博文量
    6
  • 访问量
    6388