关闭

你真的会玩SQL吗?内连接、外连接

发表于:2015-10-30 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:欢醉    来源:51Testing软件测试网采编

  完整外部联接
  包括所有联接表中的所有行,不论它们是否匹配。
  例:
  SELECT titles.title_id, titles.title,  publishers.pub_name
  FROM titles FULL OUTER JOIN publishers
  ON 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
----------- --------------- ----------- -----------------------
Customer AHPOP  NULL        NULL
Customer AHXHT  NULL        NULL
Customer AZJED  NULL        NULL
Customer BSVAR  NULL        NULL
Customer CCFIZ  NULL        NULL
...
Customer FVXPQ  NULL        NULL
Customer GCJSG  NULL        NULL
Customer GLLAG  NULL        NULL
Customer GYBBY  NULL        NULL
Customer HFBZG  NULL        NULL
Customer HGVLZ  10444       2007-02-12 00:00:00.000
Customer IAIJK  NULL        NULL
Customer IBVRG  NULL        NULL
Customer IRRVL  NULL        NULL
Customer JMIKW  NULL        NULL
Customer JUWXK  NULL        NULL
...
Customer KIDPX  NULL        NULL
Customer KSLQF  NULL        NULL
Customer KZQZT  NULL        NULL
Customer LCOUJ  NULL        NULL
Customer LCYBZ  NULL        NULL
Customer LHANT  10443       2007-02-12 00:00:00.000
Customer LJUCA  NULL        NULL
Customer LOLJO  NULL        NULL
Customer LVJSO  NULL        NULL
Customer LWGMD  NULL        NULL
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',请注意这个结果又是什么呢?
  /*返回没有下过订单的客户。
  涉及的表:Sales.Customers表和Sales.Orders表。
  期望的输出:
  */
  custid      companyname
  ----------- ---------------
  Customer DTDMN
  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
  */
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号