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 | 5小时前 |
- MySQL无法启动?8个排查方法全解析
- 174浏览 收藏
-
- 数据库 · MySQL | 7小时前 |
- 主键与唯一键区别,如何选主键?
- 166浏览 收藏
-
- 数据库 · MySQL | 9小时前 |
- MySQL多表连接优化技巧与实战策略
- 221浏览 收藏
-
- 数据库 · MySQL | 21小时前 |
- MySQL排序优化与性能提升技巧
- 153浏览 收藏
-
- 数据库 · MySQL | 23小时前 |
- MySQL中WHERE与HAVING的区别详解
- 340浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL排序优化与性能提升技巧
- 368浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL连接池配置与优化方法
- 297浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQLGROUPBY使用技巧与常见问题
- 306浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL缓存优化技巧分享
- 392浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL安装到D盘教程及路径设置详解
- 279浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL缓存设置及查询作用解析
- 470浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 96次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 89次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 107次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 98次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 98次使用
-
- 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浏览