left join的基本用法以及on与where的区别
文章目录
- 前言
- 实例
- 总结
前言
我们在写sql语句的时候,总是无法避免使用到连接关键词,比如内连接、外连接。种类是很多的,我在这里贴上一张在别处找到的图:
这张图我认为是非常详细了,它展示出了SQL语句中常见的链接类型,以本文中的left join为例,网上是这么给定义的:LEFT JOIN 关键字会从左表 那里返回所有的行,即使在右表中没有匹配的行。
其实光从字面意思上来说的话,left join是比较好理解的,但是在使用的过程中,还是会有一些问题的,比如条件在on后面与在where后面,他们的结果是完全不一样的,接下来我们就从浅到深去了解下left join。
实例
我们现在有这两张表:
class表:
CREATE TABLE `class` (`class_id` int NOT NULL,`class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`class_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,PRIMARY KEY (`class_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;
score表:
CREATE TABLE `score` (`class_id` int NOT NULL,`stu_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`score` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;
他们各有数据:
Q1:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id。
我们对这个语句进行分析:左表是class表,右表是score表,两表的class_id为两表关联字段。
当左表class_id为1时,右表有两条记录的class_id为1;当左表class_id为2时,右表有两条记录的class_id为2;当左表class_id为3时,右表有一条记录的class_id为3,所以我们应当得到五条记录:
1 语文 A A002 82
1 语文 A A001 91
2 数学 B A002 87
2 数学 B A001 95
3 英语 C B003 65
Q2:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and s.score=90。
以第一题的例子为基础,这个又多了个s.score=90的条件,这个表示右表score的score字段为90,但是我们看表的数据,发现右表没有score为90,ok,那结果会不会是空呢?毕竟右表是没有符合条件的数据的。
事实上,如果执行这条sql语句的话,最终是可以得到结果的,只不过只会得到三条数据,左表中的字段全部显示,右表中的字段全部对应为空,这是因为右表中没有记录的score是90,所以右表的字段才是空的。
on是先对数据进行过滤,然后再进行连接,而where是在两表进行关联查询之后,再进行过滤的,on与where的区别就在这里,之后的例子也会涉及这两个区别的。
1 语文 A
2 数学 B
3 英语 C
Q3:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘语文’ and s.score=90。
这个语句里面就涉及到了where关键字了,因此是需要注意与on的不同。
这个sql的查询结果为空,这是因为先将两表连接查询出结果,然后再进行过滤,而连表查询出的结果是没有记录符合class_name=‘语文’,并且score=90,所以查询结果为空。
Q4:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and 1=0。
我们有时在sql的where条件后面会加上1=1,而这里的1=0则是表示两表关联失败,所以这个的结果只会显示出左表的数据。
1 语文 A null null
2 数学 B null null
3 英语 C null null
Q5:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on 1=0。
这个与上面的sql语句的执行结果是一样的,其实都是将左表的内容全部显示。
1 语文 A null null
2 数学 B null null
3 英语 C null null
Q6:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘语文’。
这个需要在右表中过滤出class_name为语文的记录,有两条,然后左表去连接这两条记录,所以不难看出,有四条结果:
1 语文 A A002 82
1 语文 A A001 91
2 数学 B null null
3 英语 C null null
Q7:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘英语’。
分析同上一题(空白的地方的结果为null):
1 语文 A
2 数学 B
3 英语 C B003 65
Q8:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘体育’。
右表中是没有数据的class_name为体育的,所以右表为空,显示左表的全部数据,右表对应的字段为空:
1 语文 A
2 数学 B
3 英语 C
Q9:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘语文’ and s.score=91。
右表中只有一条记录的score为91,所以需要拿左表与右表的这一条数据进行关联,左表只有语文可以与右表的那一条数据对上,所以结果为:
1 语文 A A001 91
2 数学 B
3 英语 C
Q10:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘体育’ and s.score=90。
右表中没有数据的score为90,同样左表中也没有class_name为体育,但是这并不意味着最后的结果就是空了,只要没有where条件,最终的结果数量最起码也会是左表中原先的数据数量,所以这条sql会返回左表的全部数据。
1 语文 A
2 数学 B
3 英语 C
Q11:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘英语’。
需要注意的点:条件是在where中的,也就是在表关联之后,再进行过滤的,所以最终的结果只会有一条:
3 英语 C B003 65
Q12:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where s.score=91。
和上面一样,是在连表查询之后,找出score=90的数据:
1 语文 A A001 91
Q12;select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘语文’ and s.score=91。
我们将两表连接查询后,找出结果中class_name为语文,score为91的记录,只有一条:
1 语文 A A001 91
总结
通过这12道sql语句,其实就可以基本上掌握left join的使用以及可能出现的场景了,尤其是on与where在执行sql语句时,条件位置不同,最终的结果也不大相同。我觉得需要记住,只要没有where条件,那么最终结果的数量最起码与左表的数据数量相同,不可能会出现最终的结果为空的情况。
left join的基本用法以及on与where的区别相关推荐
- python join_详解Python中的join()函数的用法
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...
- python中os.path.join()的循环用法_Python中.join()和os.path.join()两个函数的用法详解
Python中有.join()和os.path.join()两个函数,具体作用如下: . join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 ...
- mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析
MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 ...
- inner join,left join,right join 三者的用法
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...
- mysql中join on_Mysql inner join on的用法实例(必看)
语法规则 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_ ...
- (四)sql多表连接查询join on的用法
(四)sql多表连接查询join on的用法总结 需要用到的表信息如下: EMP职员表: dept部门信息表和salgrade薪资等级表: 1. 多表连接 没有任何条件限制,即笛卡儿积,产生的记录数目 ...
- mysql 多个left join_mysql多个left join连接查询用法分析
本文实例讲述了mysql多个left join连接查询用法.分享给大家供大家参考,具体如下: mysql查询时需要连接多个表时,比如查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表, ...
- python的join函数的用法及实例
目录 1.join函数的语法及用法 (1)语法:'sep'.join(sep_object) (2)用法:连接任意数量的字符串(包括要连接的元素字符串.元组.列表.字典),用新的目标分隔符连接,返回新 ...
- left join on 的用法 inner join on的用法 right join on 的用法
left join on 的用法 inner join on的用法 right join on 的用法 示例:t1表 t2表 ...
最新文章
- Linux 硬链接和软链接的区别
- 数据库持久 项目重启_Aerospike + ScaleFlux 提供的超高性能方案助力同盾超大规模核心数据库系统...
- OpenCV与c语言图像融合
- 推荐系统笔记: 基于邻居的协同过滤问题 中的降维
- C语言反序输出英文句子,C++实现英文句子中的单词逆序输出的方法
- 百度android广告sdk下载,IS_Freedom
- svn add Default@2x.png的文件含有@的文件名注意事项
- mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
- 0基础学python有多难-0基础学Python有多难?
- web项目继承ServletContainerInitializer进行访问HttpServlet(WebServlet)
- CMM3标准体系项目管理
- java 24种设计模式
- python爬取酷狗音乐源码_python爬虫教程:爬取酷狗音乐
- 4款Bootstrap在线富文本编辑器
- R语言空间插值/R语言离散数据网格化/R语言空间点插值/R语言nc日均转月均、日期转换
- 文献翻译——基于关联规则挖掘识别的鸡源大肠杆菌共有多重耐药模式(上)
- 【马克思主义基本原理】--导论
- 安卓DEVICE ID为何有15位和16位
- Excel 操作 第一篇 行列技巧
- Python爬虫实现网页自动刷票
热门文章
- @Value,@ConfigurationProperties,@EnableConfigurationProperties,@PropertySource,@PropertySources
- linux卸载mate,【重大更新】最完美的ADB一键卸载工具,新增卸载后悔重装功能,小白福利哈!基于160...
- Fly.Box 2.0.2 企业网盘,企业云盘解决方案
- 武汉mysql ocp考点_MySQL OCP考试复习系列–开篇:了解MySQL考试
- 微信服务器带宽是多少?使用大带宽服务器有什么好处?
- rr rom Android6,RR ROM 手把手教学刷入和体验
- 程式設計之道 冼鏡光
- springsecurity忽视拦截静态资源
- 【进程】进程间通信----消息队列
- (转)阿里宝宝的漫漫求职路