MySQL让人又爱又恨的多表查询
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《MySQL让人又爱又恨的多表查询》,聊聊MySQL,我们一起来看看吧!

1. 前言
在SQL开发当中,多表联查是绝对绕不开的一种技能。同样的查询结果不同的写法其运行效率也是千差万别。
在实际开发当中,我见过(好像还写过~)不少又长又臭的查询SQL,数据量一上来查个十几分钟那是家常便饭。
因此,深入理解SQL的多表查询机制,少写一些慢查询,应该可以少挨点骂。

2. 等值连接和非等值连接
2.1 等值连接
等值连接是在多表查询中最基础,也最简单的一种,其值为所有满足条件的笛卡尔积。
在from后面,哪个表写在前面结果中哪个表的值就先出现,如下:
select * from student, family where student.family_id = family.id;

阿里在最新发布的Java开发手册中强制要求,只要涉及多个表,必须在列名前加表的别名(或表名)进行限定
2.2 非等值连接
非等值连接是通过a表中的值在b表中的某一个范围来进行的,能够很好的满足预设定好的分段统计需求。
非等值连接有两种写法,使用between...and...或大于号小于号
-- 第一种写法:使用between...and... select a.discipline_name, a.score, b.grade_tag from achievement a, achievement_grade b where a.score between b.lowest_score and b.highest_score; -- 第二种写法,使用>=或= b.lowest_score and a.score

3. 自连接和非自连接
3.1 自连接
自连接,顾名思义就是同一张表自己跟自己连接,为了区分需要给表取不同的别名。如一张成绩表,需要查询所有分数比“语文”高的数据:

若不使用自连接,需要先通过查询语文的分数,然后再查询大于这个分数的数据。
具体可以按如下步骤进行查询:
-- 先查询语文的分数 select score from achievement where discipline_name = '语文'; -- 再查询分数比语文分数更高的数据 select * from achievement where score > 76;
而使用自连接,则可以在一条sq语句里完成查询:
select a.* from achievement a, achievement b where b.discipline_name = '语文' and a.score > b.score;

3.2 非自连接
除自连接外,其他的都叫非自连接~~~
4. 内连接和外连接
内连接和外连接的区分本质上是另一种分类方法,如内连接就是等值连接。
- 内连接:合并具有同一列的两个或两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的
行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
- 左外连接:连接条件中左边的表也称为主表 ,右边的表称为从表 。
- 右外连接:连接条件中右边的表也称为主表 ,左边的表称为从表 。
- 全外连接
4.1 测试数据
测试用学生表student和家庭表family数据如下:


4.2 左外连接
-- 查出student中的所有数据,不满足的显示为null -- 这里student在前面 select a.* from student a left join family b on a.family_id = b.id

4.3 右外连接
-- 查出student中的所有数据,不满足的显示为null -- 这里student在后面 select a.* from family b right join student a on b.id = a.family_id;

4.4 全外连接
很遗憾,MySQL不支持全外连接。
附录:测试数据SQL脚本
-- auto-generated definition create table student ( id int auto_increment primary key, student_id int null comment '学号', student_name varchar(40) null comment '姓名', family_id int null comment '家庭ID', create_time datetime default CURRENT_TIMESTAMP null comment '创建时间' ) comment '学生表'; create table family ( id int auto_increment primary key, family_name varchar(40) null comment '家庭名称', family_address varchar(40) null comment '家庭地址', create_time datetime default CURRENT_TIMESTAMP null comment '创建时间' ) comment '家庭表'; create table achievement ( id int auto_increment primary key, score int null comment '分数', discipline_name varchar(40) null comment '学科名称', student_id int null comment '学号' ) comment '成绩表'; create table achievement_grade ( id int auto_increment primary key, grade_tag varchar(10) null comment '档次', lowest_score int null comment '最低分', highest_score int null comment '最高分', create_time datetime default CURRENT_TIMESTAMP null comment '创建时间' ) comment '分数档次表'; INSERT INTO achievement_grade (id, grade_tag, lowest_score, highest_score, create_time) VALUES (1, '不及格', 0, 60, '2022-03-02 11:44:01'); INSERT INTO achievement_grade (id, grade_tag, lowest_score, highest_score, create_time) VALUES (2, '良好', 60, 80, '2022-03-02 11:44:01'); INSERT INTO achievement_grade (id, grade_tag, lowest_score, highest_score, create_time) VALUES (3, '优秀', 80, 100, '2022-03-02 11:44:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (1, 1, '张三', 1, '2022-03-02 09:55:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (2, 2, '李四', 2, '2022-03-02 09:55:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (3, 3, '王五', 3, '2022-03-02 09:55:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (4, 4, '高飞', null, '2022-03-02 19:45:14'); INSERT INTO family (id, family_name, family_address, create_time) VALUES (1, '张三家', '北京', '2022-03-02 09:54:13'); INSERT INTO family (id, family_name, family_address, create_time) VALUES (2, '李四家', '上海', '2022-03-02 09:54:13'); INSERT INTO family (id, family_name, family_address, create_time) VALUES (3, '王五家', '西伯利亚', '2022-03-02 09:54:13'); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (1, 76, '语文', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (2, 80, '数学', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (3, 65, '英语', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (4, 98, '地理', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (5, 77, '历史', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (6, 69, '生物', 1);
微信搜索:『深海云帆』关注我的众号
或者加我微信:hqzmss,拉你入技术交流群
到这里,我们也就讲完了《MySQL让人又爱又恨的多表查询》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

- 上一篇
- Navicat 16 for MySQL 修改注册表 永久试用

- 下一篇
- MySQL 索引失效常见的几种情况
-
- 难过的吐司
- 很好,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享技术文章!
- 2023-04-10 02:36:59
-
- 悦耳的毛巾
- 这篇文章内容真及时,太细致了,真优秀,mark,关注up主了!希望up主能多写数据库相关的文章。
- 2023-04-04 14:12:10
-
- 爱听歌的小甜瓜
- 这篇文章出现的刚刚好,太细致了,太给力了,mark,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-02-24 10:20:59
-
- 欣慰的雪糕
- 这篇文章太及时了,太详细了,很有用,码住,关注大佬了!希望大佬能多写数据库相关的文章。
- 2023-02-22 05:03:13
-
- 洁净的苗条
- 太全面了,码起来,感谢作者大大的这篇博文,我会继续支持!
- 2023-02-21 05:50:24
-
- 友好的酒窝
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享博文!
- 2023-02-17 07:31:01
-
- 数据库 · MySQL | 7小时前 | 数据类型 扩展性 存储引擎 CREATETABLE 约束条件
- MySQL建表攻略:详解数据表创建方法
- 265浏览 收藏
-
- 数据库 · MySQL | 11小时前 | mysql 字符集 中文乱码 utf8mb4 utf8mb4_unicode_ci
- MySQL中文乱码解决方案与字符集修改命令大全
- 339浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 23次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 35次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 37次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 46次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 40次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览