此文有网上多片好文 拼接而成

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录(以左表主表,右表为辅表)

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录(以右表主表,左表为辅表)

inner join(等值连接) 只返回两个表中联结字段相等的行(交集)

左联接和右联接 又称为外连接

**************
* left join  *
* 左连接     *
**************

1. mysql> select *  from a;
+----+
| ID |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+
6 rows in set (0.05 sec)

mysql> select *  from b;
+----+
| ID |
+----+
|  1 |
|  2 |
|  3 |
+----+

2. mysql> select a.id,b.id from a left join b on a.id=b.id;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 | NULL |
|  5 | NULL |
|  6 | NULL |
+----+------+

左表(a,主表)的记录将会全部表示出来,而右表(b,辅表)只会显示符合搜索条件的记录(例子中为: a.id = b.id).
b表记录不足的地方均为NULL.

on 后面的 and 条件语句

说明: and 后的条件语句 只会对 辅表(b表)产生作用,不会对主表(a表)产生作用。即 左连接是以左边的表 作为主表。
因为 on条件是 在生成临时表时  使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

mysql> select a.id,b.id from a left join b on a.id=b.id and b.id <3;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 | NULL |
|  4 | NULL |
|  5 | NULL |
|  6 | NULL |
+----+------+
6 rows in set (0.00 sec)

mysql> select a.id,b.id from a left join b on a.id=b.id and a.id <3;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 | NULL |
|  4 | NULL |
|  5 | NULL |
|  6 | NULL |
+----+------+

where

mysql> select a.id,b.id from a left join b on a.id=b.id where b.id <3;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
+----+------+

where条件是在临时表生成好后,再对临时表进行过滤的条件。
这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

*****************
*  right join   *
*  右连接    *
*****************
mysql> select b.id,a.id from a right join b on b.id=a.id;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+

右表(b,主表)的记录将会全部表示出来,而左表(a,辅表)只会显示符合搜索条件的记录(例子中为: b.id = a.id).
a表记录不足的地方均为NULL.

on 后面的 and 条件语句

说明:and 后的条件语句 只会对 辅表(a表)产生作用,不会对主表(b表)产生作用。即 右连接是以右边的表 作为主表。
因为 on条件是 在生成临时表时  使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

mysql> select b.id,a.id from a right join b on b.id=a.id and a.id <3;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 | NULL |
+----+------+

mysql> select b.id,a.id from a right join b on b.id=a.id and b.id <3;
+----+------+
| id | id   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 | NULL |
+----+------+

where
mysql> select a.id,b.id from a right join b on a.id=b.id where a.id <3;
+------+----+
| id   | id |
+------+----+
|    1 |  1 |
|    2 |  2 |
+------+----+
where条件是在临时表生成好后,再对临时表进行过滤的条件。
这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

**************
* inner join  *
*  内连接     *
**************
在inner join中 两张表是是平等的,限制条件会对两表张表都起使用。

inner join 中on后面的限制条件将全部起作用,这与where的执行结果是一样的
取两个表的交集

mysql> select b.id,a.id from a join b on b.id=a.id and a.id <3;
+----+----+
| id | id |
+----+----+
|  1 |  1 |
|  2 |  2 |
+----+----+

mysql> select b.id,a.id from a join b on b.id=a.id where a.id <3;
+----+----+
| id | id |
+----+----+
|  1 |  1 |
|  2 |  2 |
+----+----+

***********************
*  on和where的区别    *
***********************

1.
先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走, 如果join 是left join,
就把on过滤掉的左主表中的数据再添加回来; 然后再执行where里的过滤;

on中不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.

只有当使用外连接(left, right)时, on 和 where 才有这个区别, 如果用inner join, 在哪里制定都一样,
因为on 之后就是where, 中间没有其它步骤.

2.
SQL语句如下:

SELECT * 
FROM 表1  
LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff'
WHERE 表1.NAME != 'aa' 

  步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2)

  步骤2:应用ON筛选器(当前的条件为  表1.id = 表2.id AND 表2.Name != 'ff')

  步骤3:添加外部行

  这一步只对OUTER JOIN起作用,如果是LEFT JOIN会以左边的表为保留表,如果是RIGHT JOIN会以右边的表为保留表。所谓外部行是指,保留表中的行。
   即使第二步的ON过滤掉了一些行,在这一步,会根据保留表添加第二步过滤掉的行。当前的例子,不存在这种情况。

   步骤4.应用WHERE筛选器(当前是Name != ‘aa’)过滤前三步所生成虚拟表的数据。

总结:如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用

如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用

转载于:https://blog.51cto.com/wxhh12/1244293

from_子句-内连接-左连接-右连接相关推荐

  1. 数据库内、外、左、右连接详解

    写在前面: 数据库连接操作非常重要,明确连接操作有助于更好地掌握SQL语句查询操作. 数据库连表方式: 内连接 :inner join 外连接 :outer join 左外连接 :left outer ...

  2. linq to entity 左联接 右连接 以及内连接写法的区别(转)

    linq to entity 左连接 右连接 以及内连接写法的区别  还有就是用lambda表达式怎么写,那个效法效率高些? [解决办法] 左连右连还是内连这个其实你不需要关心.只需要根据实体的映射关 ...

  3. 区分笛卡儿积,自然连接,等值连接,内连接,外连接—左,右

    1.笛卡尔积 笛卡儿积,不用多说,返回所有的情况. 2.自然连接 自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系.自然连接是一种特殊的等值 ...

  4. oracle右连接失效,oracle 右连接

    t1.name(+) = t2.name 的意思是 用t2表做主表 t1表做副表做右关联 会用t2的所有数据,如果和t1关联不上则放空值 转自http://blog.csdn.net/one132/a ...

  5. 【MySQL】MySQL 的连接(内、左、右、全)

    一.表 的连 结 1.目的:减少数据的冗余 2.核心:分类 ***连接时至少要两张表,连接主要有内连接(inner join).左外连接(left outer join).右外连接(right out ...

  6. c++中实现域内,左,右对齐的方法

    需要包含头文件 实现域内左对齐 int main() {cout.setf(ios::left);//for (int i = 0; i < 5; i++)cout << setw( ...

  7. oracle in的用法_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法

    Oracle中的连接可分为,内连接(INNER JOIN).外连接(OUTER JOIN).全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式. Oracle ...

  8. oracle 建表id自增长_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法...

    Oracle中的连接可分为,内连接(INNER JOIN).外连接(OUTER JOIN).全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式. Oracle ...

  9. SQL连接的理解和使用(内连接:自然连接等值连接,外连接:左连接右连接全外连接)

    目录 一.连接的介绍 连接是什么? 连接分几种? 条件连接 等值连接 自然连接 二.连接的使用 内连接 INNER JOIN 内连接与等值连接区别 内连接与自然连接区别 外连接 OUTER JOIN ...

最新文章

  1. Mysql中的count()与sum()区别
  2. 对OCR文字识别软件进行自动分析和识别设置的教程
  3. xcode:关于Other Linker Flags
  4. Debug Tensorflow: 随着训练进行,内存消耗越来越大
  5. 阿里研究员:缩短软件开发中的反馈弧
  6. 用java自动化访问百度测试_java+eclipse+selenium+百度搜索设置自动化测试
  7. GUI Design Studio 4 5 151 0原型设计工具的使用
  8. 深度学习(六十六)生成模型、最大化似然、KL散度
  9. hdu 6149 Valley Numer II(01背包套状压dp)
  10. 警惕分页中的checkbox
  11. linux虚拟机网卡无法启动
  12. 项目管理中,制定项目进度计划有何意义?
  13. c语言常量定义的数组初始化
  14. 一个屌丝程序猿的人生(三十二)
  15. 计算机第一个应用领域是,第一代计算机主要应用领域是什么
  16. 生成SGML格式,用于算BLEU,NIST,TER
  17. 数字图像处理及其表示
  18. 属于python保留字的是_属牛的女人全集:属牛女的性格、命运、属相婚配表等-第一星座网...
  19. Golang并发编程入门教程
  20. 【技术美术图形部分】2.3 HLSL常用函数

热门文章

  1. Chrome 浏览器 NET::ERR_SSL_OBSOLETE_VERSION 问题及解决方式
  2. [Ext JS 7]基于NPM的开发
  3. Hibernate的缓存机制介绍
  4. html 自动滚动到底部,Javascript实现DIV滚动自动滚动到底部的代码
  5. sql查询三级菜单分类_SQL面试50题——思路解答与分类整理(中)窗口函数与子查询...
  6. Python标准库中的zipfile
  7. android 开机打开串口失败,请大神帮我看看这是怎么回事,一用就说串口打开失败,再电脑上试...
  8. 64位系统目录在那里_旷视王珏:前Adobe首席科学家,手握64项专利,曾助力奥斯卡...
  9. php微信公众号测试号token配置失败,微信公众号Token配置失败解决办法
  10. ebc是什么意思_什么是亚马逊EBC,EBC有什么用?