博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql外连接中多个条件需要特殊注意之处
阅读量:6154 次
发布时间:2019-06-21

本文共 2164 字,大约阅读时间需要 7 分钟。

left join 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。查询中 on 的条件只有一个,因此不存在特殊注意之处。但是当我们 on 条件如果存在多个时候会出现一些与我们预期不符的查询结果。

用户表:

mysql> select * from tab_user;+---------+------+--------+----------+| name    | age  | sex    | addr     |+---------+------+--------+----------+| daxin   |   18 | male   | beijing  || mali    |   28 | female | shandong || wangsan |   34 | male   | beijing  || lisi    |   45 | male   | liaoning || liwu    |   58 | female | beijing  || maoliu  |   43 | male   | anhui    || zhouba  |   62 | female | beijing  |+---------+------+--------+----------+7 rows in set (0.00 sec)

订单表:

mysql> select * from tab_order;+-------+-----------+| name  | gname     |+-------+-----------+| daxin | Smartisan || mali  | iPhone    || liwu  | Mac       || lisi  | xiaomi    || maliu | nike      |+-------+-----------+5 rows in set (0.00 sec)

查询

mysql> select * from tab_user u left join tab_order o on u.name=o.name and u.name='lisi';+---------+------+--------+----------+------+--------+| name    | age  | sex    | addr     | name | gname  |+---------+------+--------+----------+------+--------+| daxin   |   18 | male   | beijing  | NULL | NULL   || mali    |   28 | female | shandong | NULL | NULL   || wangsan |   34 | male   | beijing  | NULL | NULL   || lisi    |   45 | male   | liaoning | lisi | xiaomi || liwu    |   58 | female | beijing  | NULL | NULL   || maoliu  |   43 | male   | anhui    | NULL | NULL   || zhouba  |   62 | female | beijing  | NULL | NULL   |+---------+------+--------+----------+------+--------+7 rows in set (0.00 sec)

咋一看是不是很蒙圈,为什么已经限制了 u.name='lisi' 却查询结果还有其他人呢?如果换用 where 约束.

mysql> select * from tab_user u left join tab_order o on u.name=o.name where u.name='lisi';+------+------+------+----------+------+--------+| name | age  | sex  | addr     | name | gname  |+------+------+------+----------+------+--------+| lisi |   45 | male | liaoning | lisi | xiaomi |+------+------+------+----------+------+--------+1 row in set (0.00 sec)

结论

这次确实只有 lisi 了。那为什么第一个查询语句会与预期不符?回顾一下 left join 的定义,左边表会返回所有行,所以 left join 如果对左边表进行约束的话是不会生效的。但是,对 left join 的右边表添加条件的话是生效的!反之,right join 同理!

转载于:https://www.cnblogs.com/feiqiangsheng/p/10997078.html

你可能感兴趣的文章
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
[20170628]12C ORA-54032.txt
查看>>
linux运维人员的成功面试总结案例分享
查看>>
Windows DHCP Server基于MAC地址过滤客户端请求实现IP地址的分配
查看>>
命令查询每个文件文件数
查看>>
《跟阿铭学Linux》第8章 文档的压缩与打包:课后习题与答案
查看>>
RAC表决磁盘管理和维护
查看>>
Apache通过mod_php5支持PHP
查看>>
发布一个TCP 吞吐性能测试小工具
查看>>
java学习:jdbc连接示例
查看>>
PHP执行批量mysql语句
查看>>
Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块
查看>>
Silverlight 如何手动打包xap
查看>>
建筑电气暖通给排水协作流程
查看>>
JavaScript面向对象编程深入分析(2)
查看>>
linux 编码转换
查看>>
POJ-2287 Tian Ji -- The Horse Racing 贪心规则在动态规划中的应用 Or 纯贪心
查看>>
Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月7日-1月14日)
查看>>
关于C#导出 文本文件
查看>>
使用native 查询时,对特殊字符的处理。
查看>>