文章目录

  • 前言
  • 实例
  • 总结

前言

我们在写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的区别相关推荐

  1. python join_详解Python中的join()函数的用法

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  2. python中os.path.join()的循环用法_Python中.join()和os.path.join()两个函数的用法详解

    Python中有.join()和os.path.join()两个函数,具体作用如下: . join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 ...

  3. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

  4. inner join,left join,right join 三者的用法

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...

  5. mysql中join on_Mysql inner join on的用法实例(必看)

    语法规则 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_ ...

  6. (四)sql多表连接查询join on的用法

    (四)sql多表连接查询join on的用法总结 需要用到的表信息如下: EMP职员表: dept部门信息表和salgrade薪资等级表: 1. 多表连接 没有任何条件限制,即笛卡儿积,产生的记录数目 ...

  7. mysql 多个left join_mysql多个left join连接查询用法分析

    本文实例讲述了mysql多个left join连接查询用法.分享给大家供大家参考,具体如下: mysql查询时需要连接多个表时,比如查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表, ...

  8. python的join函数的用法及实例

    目录 1.join函数的语法及用法 (1)语法:'sep'.join(sep_object) (2)用法:连接任意数量的字符串(包括要连接的元素字符串.元组.列表.字典),用新的目标分隔符连接,返回新 ...

  9. left join on 的用法 inner join on的用法 right join on 的用法

    left join on 的用法 inner join on的用法 right join on 的用法 示例:t1表                                   t2表     ...

最新文章

  1. Linux 硬链接和软链接的区别
  2. 数据库持久 项目重启_Aerospike + ScaleFlux 提供的超高性能方案助力同盾超大规模核心数据库系统...
  3. OpenCV与c语言图像融合
  4. 推荐系统笔记: 基于邻居的协同过滤问题 中的降维
  5. C语言反序输出英文句子,C++实现英文句子中的单词逆序输出的方法
  6. 百度android广告sdk下载,IS_Freedom
  7. svn add Default@2x.png的文件含有@的文件名注意事项
  8. mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
  9. 0基础学python有多难-0基础学Python有多难?
  10. web项目继承ServletContainerInitializer进行访问HttpServlet(WebServlet)
  11. CMM3标准体系项目管理
  12. java 24种设计模式
  13. python爬取酷狗音乐源码_python爬虫教程:爬取酷狗音乐
  14. 4款Bootstrap在线富文本编辑器
  15. R语言空间插值/R语言离散数据网格化/R语言空间点插值/R语言nc日均转月均、日期转换
  16. 文献翻译——基于关联规则挖掘识别的鸡源大肠杆菌共有多重耐药模式(上)
  17. 【马克思主义基本原理】--导论
  18. 安卓DEVICE ID为何有15位和16位
  19. Excel 操作 第一篇 行列技巧
  20. Python爬虫实现网页自动刷票

热门文章

  1. @Value,@ConfigurationProperties,@EnableConfigurationProperties,@PropertySource,@PropertySources
  2. linux卸载mate,【重大更新】最完美的ADB一键卸载工具,新增卸载后悔重装功能,小白福利哈!基于160...
  3. Fly.Box 2.0.2 企业网盘,企业云盘解决方案
  4. 武汉mysql ocp考点_MySQL OCP考试复习系列–开篇:了解MySQL考试
  5. 微信服务器带宽是多少?使用大带宽服务器有什么好处?
  6. rr rom Android6,RR ROM 手把手教学刷入和体验
  7. 程式設計之道 冼鏡光
  8. springsecurity忽视拦截静态资源
  9. 【进程】进程间通信----消息队列
  10. (转)阿里宝宝的漫漫求职路