SQL连接(内连接、外连接、交叉连接)

假设现在有两个表:table1 , table2

table1:                                table2 :
  id      name                          id      score  
  1       lee                            1        90  
  2       zhang                         2        100    
  4       wang                          3       70

表的连接是针对列(属性),将两个表通过某种规则将两个表进行连接起来,一般是要么增加列或是减小列的个数,如

id    name    id    score   
  1    lee       1      90   
  2    zhang    2     100

1内联接:join      inner   join

select   *   from   表1   join   表2   on   两个表关联部分 where 条件语句

如:

select   *   from   table1   join   table2   on   table1.id=table2.id

内联接是用比较运算符比较要联接列的值的联接 ,只有两个表相匹配的行才进行连接 ,他等价

select   a.*,b.*   from   table1   a,table2   b   where   a.id=b.id

结果:

id    name    id    score   
  1    lee       1      90   
  2    zhang    2     100

2)外连接(左连接、右连接、全连接)

左连接:left   join      left   outer   join   

select   *   from   表1   left   join   表2   on   两个表关联部分

select   *   from   table1   left   join   table2   on   table1.id=table2.id

左向外联接的结果集包括   LEFT   OUTER   子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。

结果

1  lee     1       90   
  2  zhang  2      100   
  4  wang  NULL  NULL  //左表的某行在右表中没有匹配行,右表填 null。

 右连接:right   join      right   outer   join   

select   *   from   表1   right   join   表2   on   两个表关联部分

如select   *   from   table1   right   join   table2   on   table1.id=table2.id

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

结果

id      name   id    score   
  1       lee     1     90   
  2       zhang  2    100   
  NULL  NULL   3    70   //右表的某行在左表中没有匹配行,左表填空值

 完整外部联接:full   join      full   outer   join     

select   *   from   表1   full   join   表2   on   两个表关联部分

select   *   from   table1   full   join   table2   on   table1.id=table2.id

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 
结果

id      name     id     score   
  1        lee      1        90   
  2       zhang    2        100   
  4       wang    NULL   NULL   
  NULL   NULL   3        70   //某一个表中没有匹配行时,则另一个表填空值

3)交叉连接(完全,笛卡尔积 cross   join   (不带on条件where...)  

select   *   from   表1   cross   join   表2

如select   *   from   table1   cross   join   table2

没有 WHERE子句(或者是ON子句)的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录),他等价select   *   from   table1,table2

结果
  id        name       id         score   
  1        lee           1         90   
  2        zhang        1         90   
  4        wang        1          90   
  1        lee           2         100   
  2        zhang        2         100   
  4        wang        2          100   
  1        lee           3          70   
  2        zhang        3          70   
  4        wang        3          70

最新文章

  1. GO 基础(一)
  2. 如何实现EndNote中的PDF批量导出
  3. JS-Math对象
  4. Microsoft.Web.RedisSessionStateProvider 运行异常问题
  5. hiho_1067_最近公共祖先2
  6. spf13-vim – The Ultimate Distribution for Vim Editor
  7. Oracle- UPDATE FROM讲解
  8. ubuntu12.10设置禁止锁屏和屏幕常亮
  9. HTML基础总结<链接>
  10. 版本控制之三:SVN合并及解决冲突(转)
  11. ORACLE使用CASE WHEN的方法
  12. 分析轮子(十)- HashMap.java 之概念梳理
  13. linux每日命令(10):touch命令
  14. 比较器(TreeSet和优先队列,可以对里面的元素按照自己的意愿进行排序)
  15. 读取properties文件的信息
  16. 模块and包
  17. Android广播接收器里弹出对话框
  18. 迷你MVVM框架 avalonjs 学习教程3、绑定属性与扫描机制
  19. django LookUp
  20. POJ2505 A multiplication game(博弈)

热门文章

  1. python IF while逻辑判断语句
  2. sockjs.js?9be2:1606 GET http://192.168.1.101:8080/sockjs-node/info?t=1583642185049 net::ERR_CONNECTION_TIMED_OUT错误连接方式解决方法
  3. Java异常机制,自定义异常以及spring boot异常设计方案
  4. 【译】gRPC-Web for .NET now available
  5. 浅谈:C#中的非泛型集合
  6. 线段树(二)STEP
  7. STL函数库的应用第一弹——数据结构(队列)
  8. Spring事务专题(五)聊聊Spring事务到底是如何实现的
  9. 《Java从入门到失业》第一章:计算机基础知识(一):二进制和十六进制
  10. Ubuntu下载连接(阿里云镜像)