首先是针对左右连接,这里与inner join区分

在使用left join时,on and 和on where会有区别

1. on的条件是在连接生成临时表时使用的条件,以左表为基准 ,不管on中的条件真否,都会返回左表中的记录
2.where条件是在临时表生成好后,再对临时表过滤。此时 和left join有区别(返回左表全部记录),条件不为真就全部过滤掉,on后的条件来生成左右表关联的临时表,
where后的条件是生成临时表后对临时表过滤

on and是进行韦恩运算时 连接时就做的动作,where是全部连接完后,再根据条件过滤

CREATE TABLE `a` (`id` int(11) NOT NULL AUTO_INCREMENT,`sid` int(11) NOT NULL,`type` char(10) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;INSERT INTO `a` (`id`, `sid`, `type`) VALUES (1, 1, 'a');
INSERT INTO `a` (`id`, `sid`, `type`) VALUES (2, 1, 'b');
INSERT INTO `a` (`id`, `sid`, `type`) VALUES (3, 2, 'c');
INSERT INTO `a` (`id`, `sid`, `type`) VALUES (4, 3, 'd');CREATE TABLE `b` (`sid` int(11) NOT NULL,`remark` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `b` (`sid`, `remark`) VALUES (1, 'A');
INSERT INTO `b` (`sid`, `remark`) VALUES (2, 'B');
INSERT INTO `b` (`sid`, `remark`) VALUES (3, 'C');
INSERT INTO `b` (`sid`, `remark`) VALUES (4, 'D');

mysql> select * from a;
+----+-----+------+
| id | sid | type |
+----+-----+------+
|  1 |   1 | a    |
|  2 |   1 | b    |
|  3 |   2 | c    |
|  4 |   3 | d    |
+----+-----+------+
4 rows in setmysql> select * from b;
+-----+--------+
| sid | remark |
+-----+--------+
|   1 | A      |
|   2 | B      |
|   3 | C      |
|   4 | D      |
+-----+--------+
4 rows in set
mysql> select * from a left join b on a.sid=b.sid;
+----+-----+------+-----+--------+
| id | sid | type | sid | remark |
+----+-----+------+-----+--------+
|  1 |   1 | a    |   1 | A      |
|  2 |   1 | b    |   1 | A      |
|  3 |   2 | c    |   2 | B      |
|  4 |   3 | d    |   3 | C      |
+----+-----+------+-----+--------+
mysql> select * from a left join b on a.sid=b.sid and a.sid=1;
+----+-----+------+------+--------+
| id | sid | type | sid  | remark |
+----+-----+------+------+--------+
|  1 |   1 | a    |    1 | A      |
|  2 |   1 | b    |    1 | A      |
|  3 |   2 | c    | NULL | NULL   |
|  4 |   3 | d    | NULL | NULL   |
+----+-----+------+------+--------+
mysql> select * from a left join b on a.sid=b.sid where a.sid=1;
+----+-----+------+-----+--------+
| id | sid | type | sid | remark |
+----+-----+------+-----+--------+
|  1 |   1 | a    |   1 | A      |
|  2 |   1 | b    |   1 | A      |
+----+-----+------+-----+--------+

对于inner join

mysql> select * from a inner join b on a.sid=b.sid and a.sid=1;
+----+-----+------+-----+--------+
| id | sid | type | sid | remark |
+----+-----+------+-----+--------+
|  1 |   1 | a    |   1 | A      |
|  2 |   1 | b    |   1 | A      |
+----+-----+------+-----+--------+
mysql> select * from a inner join b on a.sid=b.sid where a.sid=1;
+----+-----+------+-----+--------+
| id | sid | type | sid | remark |
+----+-----+------+-----+--------+
|  1 |   1 | a    |   1 | A      |
|  2 |   1 | b    |   1 | A      |
+----+-----+------+-----+--------+

on and和on where结果一致
在使用inner join时,不管是对左表还是右表进行筛选,on and和on where都会对生成的临时表进行过滤

转载于:https://www.cnblogs.com/HKUI/p/8536969.html

MYSQL 表左连接 ON AND 和ON WHERE 的区别相关推荐

  1. lambda多表左连接

    下面是mysql多表左连接,对应的lambda表达式写法,只为快速解决你的问题,详细的就不介绍了,只出结果,相信稍微有点基础的都能看懂.相关知识点,请自行百度 关键字:GroupJoin.Select ...

  2. 多个表左连接LEFT JOIN

    多个表左连接(LEFT JOIN) ,在此记录一下. SELECT ts.shift_id, ts.line_id, ts.tour_guide_id, ts.hotel_id, shift_name ...

  3. mysql表全连接_关于mysql 实现表连接(左,右,内,全连接)

    mysql 实现表连接(左,右,内,全连接) 查询中出现两个表的连接,下面通过实例来讲解一下各种连接查询的不同之处 表 a,和表b 如下图 a 表中 有 abcd b表中有 abcf 内连接:SELE ...

  4. mysql连续左连接(left join)和多层从属子表的查询

    left join 在做报表查询的时候很常用. 学连接查询的时候,感觉很简单,并且印象不深刻. 实际使用过程中,才遇到了困难. 在网上查询的过程中,了解到 问题1:是否可以连续left join,可以 ...

  5. 【mysql】左连接 连表查询 去重

    1.直接上代码 mysql: select DISTINCT a.* FROM user a LEFT JOIN user_login_log b ON a.id = b.userid where 1 ...

  6. mysql之左连接与右连接

    左连接: select 列1,列2,列N from tableA left join tableB on tableA.列 = tableB.列(正常是一个外键列) [此处表连接成一张大表,完全当成一 ...

  7. mysql的左连接应用

    如果两个表存在外键连接,可根据外键对两个表进行左连接,这时候外键相对应的其他列如果有NULL值,代表这两个表可能存在不同步的现象,可删除相应的值使2个表同步. 操作实例: mysql> desc ...

  8. MYSQL表的连接方式

    mysql表连接方式可以分为 1.内连接         2.外连接         3.全连接         4.交叉连接 t1表                                  ...

  9. MySQL数据库左连接查询left join ... on

    1. 左连接查询 以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在使用null值填充 左连接查询效果图: 左连接查询语法格式: select 字段 from 表1 left join 表 ...

  10. mysql自左连接最大值_mysql左连接自连接例子

    连接就是将两个表按照某个公共字段来拼成一个大表. 左连接就是在做连接是以左边这个表为标准,来遍历右边的表. 1.引子 左连接,自连接 SELECT * FROM test_visit t1 LEFT ...

最新文章

  1. [原创]商城系统下单库存管控系列杂记(二)(并发安全和性能部分延伸)
  2. “数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力
  3. Codeforces Round #539 (Div. 1)
  4. check $m2_home environment variable and mvn script match
  5. docker快速入门01——docker安装与简单应用
  6. Oracle字符函数length substr concat实例
  7. 【论文】基于特定实体的文本情感分类总结(PART II)
  8. ArcGIS Pro 简明教程(3)数据编辑
  9. hdu 1159(DP+字符串最长公共序列)
  10. TensorFlow 学习(六) —— TensorFlow 与 numpy 的交互
  11. 【剑指 offer】(十三)—— 在 O(1) 时间删除链表结点
  12. MySQL导出表结构
  13. canvas 小球碰撞
  14. 阿里云企业邮箱标准版多域名绑定
  15. Android CameraX的基本使用
  16. ​最强全集,数据科学领域,那些你不能不知道的大咖们!
  17. 哈尔滨工业大学计算机科学与技术学院许博文,王轩-哈尔滨工业大学(深圳)计算机科学与技术学院...
  18. UNITY 2D入门基础教程 (一)
  19. 蓝牙开发工具市场现状-市场规模、市场份额、市场定位、产品类型以及发展规划
  20. C++实现二维快速傅里叶变换(FFT)

热门文章

  1. Flutter Card组件
  2. c++ 定时器_「正点原子Linux连载」第十九章定时器按键消抖实验
  3. Thinkphp 生成数据表字段缓存
  4. PHP PDO连接mysql,sqlsrv;得到任意2个日期之间的所有日期;递归创建文件
  5. 编程基本功:工作环境、运行环境,跟代码一样重要,都要备份
  6. github fork自己的库,如何同步源库的更新
  7. SecureCRT更改字体
  8. eclipse不能调试某个文件的解决办法
  9. 全网首发:编译链接错误:对‘vtable for xxxx’未定义的引用
  10. 中国气候变暖绝对是事实