0


〖Python 数据库开发实战 - MySQL篇⑳〗- 数据表的内连接


万叶集🎉 隐约雷鸣,阴霾天空。 🎉🎉 但盼风雨来,能留你在此。 🎉


前言
✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 🐶哈士奇🐶 ,一位致力于 TFS - 全栈 赋能的博主 ✌
🏆 CSDN博客专家认证、新星计划第三季全栈赛道 MVP 、华为云享专家、阿里云专家博主 🏆
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦


专栏系列(点击解锁)学习路线(点击解锁)知识定位 🔥Python全栈白皮书🔥 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。 语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。 自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。 自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。 数据库开发实战篇 掌握关系型与非关系数据库知识,提升数据库实战开发能力。 爬虫入门与实战 更新中 数据分析篇 更新中 前端入门+flask 全栈篇 更新中 django+vue全栈篇 更新中 拓展-人工智能入门 更新中 网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者 网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。 vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。 shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结] WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器 测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得! 测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。 RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。 Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。该工具目前的应用场景已不多,文档已删,为了排版好看才留着。


在这里插入图片描述


文章目录

该章节的内容为多表连接查询的内连接,因为 MySQL 是关系型数据库,数据是拆分重组在多个数据表里面的。所以我们势必要从多个数据表中提取数据,通过 SQL 语句的内连接与外连接就能够实现多表查询了。这部分内容是需要我们重点学习的,学习的过程中会穿插多种的案例来强化对表连接的语法的运用。(简单一点来说,其实就是从多张表里查询数据集,这一大段是我为了给摘要凑字数用的!)

🐳 从多张表中提取数据

  • 如果要从多张表中提取数据,必须指定其关联的条件。如果没有定义关联的条件,就会出现无条件的连接,表与表之间的每一条数据都会进行匹配连接,于是就产生了笛卡尔积。
  • 举个例子,比如说员工表中的某个员工 “deptno” 的部门编号所属是 “10”,他能够与 部门表中的 “10” 所进行连接,这就是连接条件;如果没有关联的条件,那就是无条件的连接表中的记录了。见下方的 SQL 语句与图片
SELECT empno, ename, dname
FROM t_emp 
JOIN t_dept;-- 这是一中造成笛卡尔积的错误语法示例-- 这种例句实不符合现实逻辑的,所以我们在做表连接的时候一定要给出连接条件才行


  • 如果规定了 “连接条件” 的表连接语句,就不会出现笛卡尔积了。见下方的 SQL 语句与图片
SELECT e.empno, e.ename, d.dname
FROM t_emp e JOIN t_dept d
ON e.deptno = d.deptno;-- 使用 ON 子句 规定 "连接条件",这个条件就是 "员工表"中的"部门编号" 要与 "部门表"中的"部门编号"是相等的 -- 需要注意的是,一定要针对连接的表与表之间起一个别名,否则直接使用 "ON deptno = deptno" 的话,MySQL 会不知道这个字段属于哪个表-- "t_emp" 表的别名为 "e" ; "t_dept" 表的别名为 "d"

从图中我们可以看到没有产生 "笛卡尔积" ,所以说最关键的地方就在于 "ON" 子句 规定了表连接。

🐳 表连接的分类

  • 表连接分为两种:内连接与外连接
  • 内连接是结果集中只保留符合连接条件的记录,不符合连接条件的记录是绝对不会出现在结果集中的。(该章节主要介绍的就是 "内连接")
  • 外连接是不管符不符合连接条件,查询到的记录多会保留在结果集中。(至于为何会这样,在后续的外连接章节再为大家详细的介绍吧)

🐳 内连接的简介与语法

  • 内连接是最常见的一种表连接,用于查询多张关系表符合连接条件的记录。(也就是符合连接条件的交集的部分)

内连接常用语法:
SELECT......FROM 表1JOIN 表2ON 连接条件;-- 这是最标准的内连接语法,用 "JOIN" 关键字连接两张表,"ON" 子句规定连接的条件。

内连接的变种语法①:
-- 思考一个问题先:既然 "ON" 子句规定的是连接条件筛选符合条件的记录,那么是否可以将连接条件写在 "WHERE" 子句中呢?-- 答案是完全可以的,与是就有了下面这种语法。SELECT......FROM 表1JOIN 表2WHERE 连接条件;-- 忽略 "ON" 子句,使用 "WHERE" 子句来替代

内连接的变种语法②:(基于 "变种语法①" 衍生出来的语法)
SELECT......FROM 表1, 表2WHERE 连接条件;-- 将 "JOIN" 关键字去掉,使用 "," 来代替。-- 想连接多少张表,直接在 "FROM" 子句后面写上表名即可,最后再 "WHERE" 子句里定义好连接条件就可以了。

🐬 内连接衍生语法的运行效果

内连接衍生语法 SQL 语句示例如下①:
SELECT e.empno, e.ename, d.dname
FROM t_emp e JOIN t_dept d
WHERE e.deptno = d.deptno;-- 将 "ON" 子句替换为 "WHERE" 子句


内连接衍生语法 SQL 语句示例如下②:
SELECT e.empno, e.ename, d.dname
FROM t_emp e , t_dept d
WHERE e.deptno = d.deptno;-- 将 "JOIN" 关键字省略替换为 "," 逗号

PS:以上的写法都是正确的内连接,在运行效率上没有什么区别。当然了,运行结果也都是一样的。所以内连接携程什么样子,完全就看个人的喜好、好恶了。

🐬 内连接小练习 ①

  • 查询每个员工的工号、姓名、部门名称、底薪、职位、工资等级
SELECT e.empno, e.ename, d.dname, e.sal, e.job, s.grade
FROM t_emp e 
JOIN t_dept d ON e.deptno = d.deptno
JOIN t_salgrade s ON e.sal BETWEEN s.losal AND hisal;-- 先利用 "员工表" 的 "部门编号" 关联 "部门表" 的 "部门编号"-- 再利用 "薪资等级表" 的 "薪资等级区间" 关联 "员工表" 的 "月薪" 进行等级的匹配

同样的,在这个小案例里,我们也发现了一个问题:在内连接的数据表中,不一定必须要有同名的字段,只要字段之间符合逻辑关系就可以了,同样可以把数据表连接起来。

🐬 内连接小练习 ②

  • 查询与 “SCOTT” 相同部门的员工都有谁? 这里需要注意两个条件- 第一个未知:不知道 "SCOTT" 的部门是什么?- 第二个未知:不知道谁与 "SCOTT" 是同一个部门的?- `关于未知的条件,大家可能第一时间想到的就是利用子查询来实现,OK,那就先来使用 “子查询” 实现

子查询 SQL 示例如下:
SELECT ename
FROM t_emp
WHERE deptno =(SELECT deptno FROM t_emp WHERE ename ="SCOTT")AND ename !="SCOTT";

这个查询语句,还是非常好理解的哈。非常的符合人的思考逻辑,但是并不推荐这种写法。因为子查询的查询效率是非常的慢的,因为 “FROM” 子句查询的是 “t_emp” 员工表,从 “员工表” 提取出来的每一个记录在 “WHERE” 子句里进行条件匹配的时候会与 “子查询” 都会重新执行一遍。当 “员工表” 里存在大量的数据的时候(比如上万条),则 “WHERE” 子句会将子查询也都会重新执行一遍。

试想一下,这样的效率是不是很低的,虽然说这样的写法非常的符合人的思考与逻辑思维,但是数据库执行起来真的会效率非常的低下。所以这个时候,最好的解决方案就得需要利用 “表连接” 的方式来实现了!


内连接 SQL 示例如下:
SELECT e2.ename
FROM t_emp e1 JOIN t_emp e2 ON e1.deptno = e2.deptno
WHERE e1.ename ="SCOTT"AND e2.ename !="SCOTT";-- 可能大家会觉得 "员工表" 与 "员工表" (自己与自己)做表连接很奇怪,但是在实际语法上,这是可行且没有错误的-- 原理其实就是在同一个数据表中,分别提取不同的数据而已;如此语法在效率上要远远的超过子查询的效率

从这个案例我们也同样得到一个结果:“相同的数据表也是可以做表连接的在语法与逻辑关系上都没有问题。”




本文转载自: https://blog.csdn.net/weixin_42250835/article/details/126079193
版权归原作者 不渴望力量的哈士奇 所有, 如有侵权,请联系我们删除。

“〖Python 数据库开发实战 - MySQL篇⑳〗- 数据表的内连接”的评论:

还没有评论