欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > 数据库 >内容正文

数据库

你真的会玩SQL吗?和平大使 内连接、外连接

发布时间:2024/1/17 数据库 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 你真的会玩SQL吗?和平大使 内连接、外连接 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

你真的会玩SQL吗?系列目录

你真的会玩SQL吗?之逻辑查询处理阶段

你真的会玩SQL吗?和平大使 内连接、外连接

你真的会玩SQL吗?三范式、数据完整性

你真的会玩SQL吗?查询指定节点及其所有父节点的方法

你真的会玩SQL吗?让人晕头转向的三值逻辑

你真的会玩SQL吗?EXISTS和IN之间的区别

你真的会玩SQL吗?无处不在的子查询

你真的会玩SQL吗?Case也疯狂

你真的会玩SQL吗?表表达式,排名函数

你真的会玩SQL吗?简单的 数据修改

你真的会玩SQL吗?你所不知道的 数据聚合

你真的会玩SQL吗?透视转换的艺术

你真的会玩SQL吗?冷落的Top和Apply

你真的会玩SQL吗?实用函数方法汇总

你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)

你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)

 

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

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

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

        例:

    SELECT title, pub_nameFROM titles Cross JOIN publishersWhere titles.pub_id = publishers.pub_id

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

    执行过程:

     

           内联接  

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

    例:

    SELECT title, pub_nameFROM titles INNER JOIN publishersON titles.pub_id = publishers.pub_id

       执行过程:

     

         左向外联接  

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

    例:

    SELECT titles.title_id,titles.title,publishers.pub_nameFROM titles LEFT OUTER JOIN publishersON titles.pub_id = publishers.pub_id

     

    右向外联接  

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

    例:

    SELECT titles.title_id, titles.title,publishers.pub_nameFROM titles RIGHT OUTER JOIN publishersON titles.pub_id = publishers.pub_id

     执行过程:

     

    完整外部联接  

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

    例:

    SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles FULL OUTER JOIN publishersON titles.pub_id = publishers.pub_id

     

    练习:

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

    用例数据库文件:链接:http://pan.baidu.com/s/1qW1QxA0 密码:dqxx

    /*返回值2007年2月12日下过订单的客户,以及他们的订单。同时也返回在2007年2月12日没有下过订单的客户。 涉及到表:Sales.Customers表和Sales.Orders表。 期望的输出(按简略格式显示): */ custid companyname orderid orderdate ----------- --------------- ----------- ----------------------- 72 Customer AHPOP NULL NULL 58 Customer AHXHT NULL NULL 25 Customer AZJED NULL NULL 18 Customer BSVAR NULL NULL 91 Customer CCFIZ NULL NULL ... 33 Customer FVXPQ NULL NULL 53 Customer GCJSG NULL NULL 39 Customer GLLAG NULL NULL 16 Customer GYBBY NULL NULL 4 Customer HFBZG NULL NULL 5 Customer HGVLZ 10444 2007-02-12 00:00:00.000 42 Customer IAIJK NULL NULL 34 Customer IBVRG NULL NULL 63 Customer IRRVL NULL NULL 73 Customer JMIKW NULL NULL 15 Customer JUWXK NULL NULL ... 21 Customer KIDPX NULL NULL 30 Customer KSLQF NULL NULL 55 Customer KZQZT NULL NULL 71 Customer LCOUJ NULL NULL 77 Customer LCYBZ NULL NULL 66 Customer LHANT 10443 2007-02-12 00:00:00.000 38 Customer LJUCA NULL NULL 59 Customer LOLJO NULL NULL 36 Customer LVJSO NULL NULL 64 Customer LWGMD NULL NULL 29 Customer MDLWA NULL NULL ...

    参考SQL:

    --answer: select c.custid,c.companyname,o.orderid,o.orderdate from Sales.Customers as c left join Sales.Orders as o on 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,生成虚拟表VT2 3.处理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 DTDMN 57 Customer WVAXS

    参考SQL:

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

     

    总结

    以上是生活随笔为你收集整理的你真的会玩SQL吗?和平大使 内连接、外连接的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。