大多数人一般写多表查询会这样写select * from tbA ,tbB  没有用到JOIN关键字,太Low了,官网标准建议是用JOIN明确表间的关系,下面具体来讲。

连接类型:
  1. 交叉联接 得到所连接表的所有组合 (笛卡儿集)cross join
  2. 内联接得到连接表的满足条件的记录组合inner join  on
  3. 外联接(左、右)得到一个表的所有行,及其余表满 足连接条件的行 full | left | right  outer join  on

交叉联接

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

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

例:

MySQL
1
2
3
4
5

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

执行过程:

内联接

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

例:

MySQL
1
2
3
4
5

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

执行过程:

左向外联接

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

例:

MySQL
1
2
3
4
5

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

右向外联接

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

例:

MySQL
1
2
3
4
5

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

执行过程:

完整外部联接

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

例:

MySQL
1
2
3
4
5

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

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

/*返回值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:

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14

--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',请注意这个结果又是什么呢?

MySQL
1
2
3
4
5
6
7
8

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

参考SQL:

MySQL
1
2
3
4
5
6
7
8
9
10
11
12

--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
*/

from: http://blog.jobbole.com/93758/

你真的会玩SQL吗?内连接、外连接相关推荐

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

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

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  8. SQL语法 自然连接 外连接 内连接

    文章目录 笛卡尔积 连接 内连接 自连接 自然连接 外连接 左外连接 右外连接 区分连接 自然连接 内连接 内连接.外连接 on 和 where 条件过滤的区别 参考链接 笛卡尔积 结果集数目为多个表 ...

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

    透视转换是一种行列互转的技术,在转过程中可能执行聚合操作,应用非常广泛. 本章与 你真的会玩SQL吗?数据聚合 内容比较重要,还涉及到 你真的会玩SQL吗?Case的用法 的内容,都可以一起看. 下面 ...

  10. oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

    清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦 直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问 ...

最新文章

  1. 可能是最好的跨域解决方案了
  2. 汇编语言 字母的大小写转换
  3. IIS和.net framework 4.0的安装顺序导致的问题
  4. SQLite 附加数据库(http://www.w3cschool.cc/sqlite/sqlite-attach-database.html)
  5. WebDriver中的元素状态检测表
  6. php 失去 焦点 另一个表单猎取值,同一表单如何根据某一个文本框的值 改变另一个文本框的值...
  7. windows 8,关闭随意窗体都提示“已停止工作”的解决的方法
  8. python扫雷算法_python实战教程之自动扫雷(自己存下来学习之用)
  9. ClassPathResource详解
  10. 十四、Oracle学习笔记:集合操作
  11. pdf在线浏览器pdf viewer
  12. 微信小程序图片宽高自适应
  13. fedora安装字体
  14. 【error】error: failed to push some refs to ‘远程仓库地址‘ git报错解决
  15. matlab 安装时报错: dsp_doc_en_common 时检测到以下错误
  16. 手机vnc远程桌面,手机vnc远程桌面教程加配置说明
  17. nginx-----部署集群
  18. php调用大漠,大漠路人 - SegmentFault 思否
  19. 在北京租房应该注意什么?
  20. 提升python运行效率_如何让python运行速度提高3倍

热门文章

  1. 实例详解 EJB 中的六大事务传播属性--转
  2. 【Python】json
  3. var_export()函数的使用举例(后续添加其他的php输出函数)
  4. 重庆市推进组建区块链数字资产交易所
  5. 剑桥加密资产研究的主要发现 金评媒JPM 09-19 00:00 金评媒(https://www.jpm.cn)编者按:研究发现,全球有 1876 人在加密资产行业中工作。其中最多的是在亚太地区工作,
  6. 部委调研互联网金融企业 内部风控指引或出台
  7. 看样子还是:JSP和JAVA
  8. Spring-AOP @AspectJ切点函数之within()
  9. Spring-注入参数详解-[字面值及引用其他Bean]
  10. Android模拟多线程下载