史上最简单MySQL教程详解(基础篇)之多表联合查询

史上最简单MySQL教程详解(基础篇)之多表联合查询常用术语表连接的方式数据准备student表college表内连接外连接左外连接右外连接注意事项:自连接子查询在上篇文章史上最简单MySQL教程详解(基础篇)之数据库设计范式及应用举例我们介绍过,在关系型数据库中,我们通常为了减少数据的冗余量将对数据表进行规范,将数据分割到不同的表中。当我们需要将这些数据重新合成一条时,就需要用到我们介绍来将…

大家好,又见面了,我是你们的朋友全栈君。


在上篇文章史上最简单MySQL教程详解(基础篇)之数据库设计范式及应用举例我们介绍过,在关系型数据库中,我们通常为了减少数据的冗余量将对数据表进行规范,将数据分割到不同的表中。当我们需要将这些数据重新合成一条时,就需要用到我们介绍来将要说到的表连接。

常用术语

  • 冗余(Redundancy):存储两次数据,以便使系统更快速。
  • 主键(Primary Key):主键是唯一的。同一张表中不允许出现同样两个键值。一个键值只对应着一行。
  • 外键(Foreign Key):用于连接两张表。

表连接的方式

  • 内连接
  • 外连接
  • 自连接

我们接下来将对这三种连接进行详细的介绍。

数据准备

我们需要创建下面的数据表来作为示例:

student表

表结构:

字段 解释
studentId 学号(主键)
name 姓名
phone 电话
collegeId 学生所在学院ID(外键)

SQL语句:

CREATE TABLE `student` ( `studentId` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `phone` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `collegeId` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`studentId`), KEY `collegeId` (`collegeId`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

数据:
这里写图片描述

college表

表结构:

字段 解释
collegeId 学院ID(主键)
collegeName 学院名

SQL语句:

CREATE TABLE `college` ( `collegeId` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `collegeName` varchar(255) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`collegeId`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

数据:
这里写图片描述

内连接

内连接就是表间的主键与外键相连,只取得键值一致的,可以获取双方表中的数据连接方式。语法如下:

SELECT 列名1,列名2... FROM1 INNER JOIN2 ON1.外键=表2.主键 WhERE 条件语句;

运行结果:

mysql> SELECT student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId;
+——+————-+
| name | collegeName |
+——+————-+
| 张三 | 清华 |
| 李四 | 北大 |
| 王五 | 浙大 |
+——+————-+
3 rows in set (0.04 sec)

这样,我们就成功将【student】表中的【name】和【college】表中的【collegeName】进行了重新结合,并检索出来。

外连接

与取得双方表中数据的内连接相比,外连接只能取得其中一方存在的数据,外连接又分为左连接和右连接两种情况。接下来,我们将介绍这两种连接方式。

左外连接

左连接是以左表为标准,只查询在左边表中存在的数据,当然需要两个表中的键值一致。语法如下:

SELECT 列名1 FROM1 LEFT OUTER JOIN2 ON1.外键=表2.主键 WhERE 条件语句;

运行结果:

mysql> SELECT student.name,college.collegeName FROM student LEFT OUTER JOIN college ON student.collegeId = college.collegeId;
+——+————-+
| name | collegeName |
+——+————-+
| 张三 | 清华 |
| 李四 | 北大 |
| 王五 | 浙大 |
| 赵六 | NULL |
| 钱七 | NULL |
+——+————-+
5 rows in set (0.00 sec)

我们可以看出,与内连接查询结果不同的是:【赵六】、【钱七】这两个学生虽然没有学校ID但是也被查出来了,这就是我们所说的,他会以左连接中的左表的全部数据作为基准进行查询。

右外连接

同理,右连接将会以右边作为基准,进行检索。语法如下:

SELECT 列名1 FROM1 RIGHT OUTER JOIN2 ON1.外键=表2.主键 WhERE 条件语句;

运行结果:

mysql> SELECT student.name,college.collegeName FROM student RIGHT OUTER JOIN college ON student.collegeId = college.collegeId;
+——+————-+
| name | collegeName |
+——+————-+
| 张三 | 清华 |
| 李四 | 北大 |
| 王五 | 浙大 |
| NULL | 厦大 |
+——+————-+
4 rows in set (0.00 sec)

我们可以看出,这里就是以右边的表【college】为基准进行了检索,因为【student】中并没有【厦大】的学生,所以检索出来的为【NULL】

注意事项:

  • 内连接是抽取两表间键值一致的数据,而外连接(左连接,右连接)时,是以其中一个表的全部记录作为基准进行检索。
  • 左连接和右连接只有数据基准的区别,本质上是一样的,具体使用哪一种连接,根据实际的需求所决定
  • 无论是内连接还是外连接,在查询的时候最好使用【表名.列名】的方式指定需要查询的列名,否则一旦两个表中出现了列名一致的数据时,可能会报错,养成良好的习惯很重要。
  • 表的别名:其实我们在查询的过程中,如果遇到了特别复杂的数据表名,我们可以通过取别名的方式来实现,使用的是我们以前使用过的【AS】语句,例如,我们的内连接就可以化简为下面的语句:
    SELECT s.name,c.collegeName FROM student AS s INNER JOIN college AS c ON s.collegeId = c.collegeId;查询结果一致,是不是瞬间觉得语句简洁很多呢?

自连接

自连接顾名思义就是自己跟自己连接,有人或许会问,这样的连接有意义吗?答案是肯定的。
例如,我们将【student】的数据改为下图:
这里写图片描述
运行结果如图:

mysql> SELECT * FROM student s ,student a where a.collegeId=s.collegeId AND a.name <> s.name ORDER BY a.collegeId;
+———–+——+——-+———–+———–+——+——-+———–+
| studentId | name | phone | collegeId | studentId | name | phone | collegeId |
+———–+——+——-+———–+———–+——+——-+———–+
| 4 | 赵六 | 136 | 11 | 1 | 张三 | 139 | 11 |
| 1 | 张三 | 139 | 11 | 4 | 赵六 | 136 | 11 |
| 5 | 钱七 | 135 | 22 | 2 | 李四 | 130 | 22 |
| 2 | 李四 | 130 | 22 | 5 | 钱七 | 135 | 22 |
+———–+——+——-+———–+———–+——+——-+———–+
4 rows in set (0.00 sec)

可以看出,我们就将【student】表中在同一个学校的学生查出来了。
语句释义:

  • 【student s】和【student a】的含义就是分别给我们的【student】表取了两个不同的别名;
  • 【a.collegeId = s.collegeId AND a.name <> s.name 】的含义是找出【collegeId】相同,但是【name】不同的人.
  • 【ORDER BY a.collegeId;】将结果顺序输出;

自连接的使用情况还是很多的,比如当我们找某个站点所经过的所有公交等,都可以采用自连接的方式进行检索;

子查询

通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择。基本语法如下:

SELECT 列名1 ...FROM 表名 WHERE 列名 比较运算符 (SELECT 命令);

例如:我们利用上面的内连接的例子,在它的基础上查出学校为【清华】的学生的姓名

mysql> SELECT * FROM (SELECT student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId)b WHERE b.collegeName = ‘清华’;
+——+————-+
| name | collegeName |
+——+————-+
| 张三 | 清华 |
| 赵六 | 清华 |
+——+————-+
2 rows in set (0.00 sec)

查询成功。
到此,已经介绍完了所有关于MySQL基础篇的内容,接下来,我们将介绍史上最简单MySQL教程详解(进阶篇)之存储引擎及默认引擎设置

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142749.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月23日 上午6:20
下一篇 2022年5月23日 上午6:20


相关推荐

  • Weisfeiler-Lehman图同构测试及其他

    Weisfeiler-Lehman图同构测试及其他Weisfeiler-LehmanTest(WLTest)BorisWeisfeilerandAndreyLehman,1968GraphIsomorphism一个简单的同构图例子:1-dimensionalWLTest输入:两个可有节点属性的图输出:两个图是否同构(满足WLTest是两图同构的必要条件)演示1演示2更加具体的描述稳定状态失效情况注意这里和原ppt不

    2022年4月7日
    47
  • 雷达信号处理——雷达系统

    雷达信号处理——雷达系统1 1 工作的基本条件雷达发射机发射电磁波 电磁波在空间中直线传播 遇到障碍物后产生散射 一部分散射后的回波能量能被雷达接收机接收 工作基本条件 1 电磁波在空间中直线传播速度 v 3 10 8m s 2 电磁波具有二次散射性 3 电磁波的定向传播性 4 目标径向运动时回波带多普勒频移 雷达测量目标的距离公式 是目标回波到达时间相比发射时间的时延 c 是电磁波传播速度 光速 多普勒频移公式 用回波的多普勒频移可以求出目标速度 1 2 雷达系统的基本组成常见的雷达系统组

    2026年3月26日
    3
  • 一元多项式回归

    一元多项式回归设拟合多项式为 m x 残差平方和用最小二乘来确定系数 a0 a1 am 设残差平方和 Q 对 ak 求偏导数 并令其等于零 有写成矩阵形式为 上面的方程是解别人的图 原址奉上 https www cnblogs com 144823836yj p 5524610 html 接下来就是解线性方程组增广矩阵法由于需要构造系数为 1 将进行大量浮点运算 况且矩阵的元素肯能很大

    2026年3月18日
    2
  • 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

    在Linux上开发C/C++程序,或许你会直接(本机或远端)登入Linux,打开编辑器写完代码后,就用gcc/g++来编译,遇到要除错(debug)的时候,则会选择使用gdb来进行除

    2021年12月21日
    148
  • vue 时间戳转日期格式

    vue 时间戳转日期格式formatDate value 年月日 vard newDate parseInt value 1000 return d getFullYear d getMonth 19 d getMonth 1 0 d getMonth 1 d getDate 9 d getDate 0 d getDate

    2026年3月26日
    2
  • 文件上传漏洞攻击与防范方法[通俗易懂]

    文件上传漏洞攻击与防范方法[通俗易懂]文件上传漏洞攻击与防范方法文件上传漏洞简介:文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。文件上传漏洞危害:上传漏洞与SQL注入或XSS相比,其风险更大,如果Web应用程序存在上传漏洞,攻击者上传…

    2022年4月19日
    355

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号