博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你真的会玩SQL吗?内连接、外连接
阅读量:6548 次
发布时间:2019-06-24

本文共 3746 字,大约阅读时间需要 12 分钟。

原文:

大多数人一般写多表查询会这样写select * from tbA ,tbB  没有用到JOIN关键字,太Low了,官网标准建议是用JOIN明确表间的关系,下面具体来讲。
 
连接类型:
  1. 交叉联接 得到所连接表的所有组合 (笛卡儿集)cross join
  2. 内联接得到连接表的满足条件的记录组合inner join  on
  3. 外联接(左、右)得到一个表的所有行,及其余表满 足连接条件的行 full | left | right  outer join  on

     交叉联接  

  在这类联接的结果集内,两个表中每两个可能成对的行占一行。

    但是如果在交叉联接中加入where 子句就相当与是内联接

    例:

SELECT title, pub_name       FROM titles Cross JOIN publishers       Where titles.pub_id = publishers.pub_id

这就相当于我们一最开始的写法:SELECT title, pub_name  FROM titles , publishers Where titles.pub_id = publishers.pub_id

执行过程:

 

       内联接  

仅显示两个联接表中的匹配行的联接。(这是查询设计器中的默认联接类型。)

例:

SELECT title, pub_name       FROM titles INNER JOIN publishers       ON titles.pub_id = publishers.pub_id

   执行过程:

 

     左向外联接  

包括第一个命名表("左"表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。

例:

SELECT titles.title_id,titles.title,publishers.pub_name        FROM titles LEFT OUTER JOIN publishers        ON titles.pub_id = publishers.pub_id

 

右向外联接  

包括第二个命名表("右"表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。

例:

SELECT titles.title_id, titles.title,publishers.pub_name  FROM titles RIGHT OUTER JOIN publishers        ON titles.pub_id = publishers.pub_id

 执行过程:

 

完整外部联接  

包括所有联接表中的所有行,不论它们是否匹配。

例:

SELECT titles.title_id, titles.title,  publishers.pub_name        FROM titles FULL OUTER JOIN publishers        ON titles.pub_id = publishers.pub_id

 

练习:

此后用到的用例数据库是SQL2008里面的

用例数据库文件:链接: 密码:dqxx

/*返回值2007年2月12日下过订单的客户,以及他们的订单。同时也返回在2007年2月12日没有下过订单的客户。涉及到表:Sales.Customers表和Sales.Orders表。期望的输出(按简略格式显示):*/custid      companyname     orderid     orderdate----------- --------------- ----------- -----------------------72          Customer AHPOP  NULL        NULL58          Customer AHXHT  NULL        NULL25          Customer AZJED  NULL        NULL18          Customer BSVAR  NULL        NULL91          Customer CCFIZ  NULL        NULL...33          Customer FVXPQ  NULL        NULL53          Customer GCJSG  NULL        NULL39          Customer GLLAG  NULL        NULL16          Customer GYBBY  NULL        NULL4           Customer HFBZG  NULL        NULL5           Customer HGVLZ  10444       2007-02-12 00:00:00.00042          Customer IAIJK  NULL        NULL34          Customer IBVRG  NULL        NULL63          Customer IRRVL  NULL        NULL73          Customer JMIKW  NULL        NULL15          Customer JUWXK  NULL        NULL...21          Customer KIDPX  NULL        NULL30          Customer KSLQF  NULL        NULL55          Customer KZQZT  NULL        NULL71          Customer LCOUJ  NULL        NULL77          Customer LCYBZ  NULL        NULL66          Customer LHANT  10443       2007-02-12 00:00:00.00038          Customer LJUCA  NULL        NULL59          Customer LOLJO  NULL        NULL36          Customer LVJSO  NULL        NULL64          Customer LWGMD  NULL        NULL29          Customer MDLWA  NULL        NULL...

参考SQL:

--answer:select c.custid,c.companyname,o.orderid,o.orderdatefrom Sales.Customers as cleft join Sales.Orders as oon c.custid=o.custid and o.orderdate='2007-2-12'/*1.将表Sales.Customers别名为c和表Sales.Orders别名为o应用ON筛选器以custid和o.orderdate='2007-2-12'为条件左外连接,生成虚拟表VT1,2.添加外部行,外部行中非保留表中的属性被赋值为NULL,生成虚拟表VT23.处理select列表,从虚拟表VT2中查找出c.custid,c.companyname,o.orderid,o.orderdate生成虚拟表VT3*/注意and o.orderdate='2007-2-12' 改成 where  o.orderdate='2007-2-12',请注意这个结果又是什么呢?
View Code

 

/*返回没有下过订单的客户。涉及的表:Sales.Customers表和Sales.Orders表。期望的输出:*/custid      companyname----------- ---------------22          Customer DTDMN57          Customer WVAXS

参考SQL:

--answer:select c.custid,c.companynamefrom Sales.Customers as cleft join Sales.Orders as oon c.custid=o.custid where o.orderid is null/*1.将表Sales.Customers别名为c和表Sales.Orders别名为o应用ON筛选器以custid为条件左外连接,生成虚拟表VT1,2.添加外部行,外部行中非保留表中的属性被赋值为NULL,生成虚拟表VT23.应用where筛选器选出o.orderid 为 null的数据生成虚拟表VT34.处理select列表,查找出c.custid,c.companyname生成虚拟表VT4*/
View Code

 

转载地址:http://etgdo.baihongyu.com/

你可能感兴趣的文章
微信小程序把玩(二十二)action-sheet组件
查看>>
IDC:企业需要更动态、更主动的防御措施
查看>>
ExpensiveWall:“包装”恶意软件现身 Google Play,危及用户财产安全
查看>>
策略模式设计表单校验
查看>>
idea 高级调试技巧
查看>>
ffmpeg处理RTMP流媒体的命令和发送流媒体的命令(UDP,RTP,RTMP)
查看>>
背水一战 Windows 10 (38) - 控件(布局类): Panel, Canvas, RelativePanel, StackPanel, Grid
查看>>
SQLAlchemy Core中的异常及事务处理样码
查看>>
xcode中断点的威力,深入使用,老文了。重新mark下
查看>>
专家齐聚讲述人工智能时代的自然问答、聊天机器人与自然语言理解
查看>>
利用memcached构建高性能的Web应用程序
查看>>
如何优雅地用TensorFlow预测时间序列:TFTS库详细教程
查看>>
企业DLP两大驱动力:合规和敏感数据保护
查看>>
云栖大会广东峰会15日开幕新制造成焦点
查看>>
智慧城市正崛起
查看>>
How to Create a Windows NT/ Windows 2000 Service(如何创建一个Windows NT/ Windows 2000 服务)
查看>>
基于SSE指令集的程序设计简介
查看>>
从PC到手机说说云计算那些事
查看>>
2017年ACL的四个NLP深度学习趋势 (一):语言结构和词汇嵌入(Linguistic Structure and Word Embeddings)...
查看>>
微应用模式在集团企业移动信息化中的实践
查看>>