这是我参与「第五届青训营」伴学笔记创作活动的第13天
前言
在关系数据库中,为了减少数据冗余,我们经常将数据拆分到单独的表中。当我们需要将这些数据合成为一个时,我们需要连接表。在整个项目中,有的地方需要同时获取两个表中的信息内容返回,我们选择了采用多表联查的方式进行查询数据库。在此总结一些多表联查相关的基本概念。
1.1 多表连接查询的概念
因为数据库中的大量数据分布在多个数据库表中。查询数据时,经常会出现要检查的数据来自多个表的情况,并且必须使用多表联接查询。多表联接查询是数据库查询中的常见查询方法。 多表联接查询分为内联接和外联接。
1.2 内连接的概念
内连接即两个表处于同一位置,仅显示两个表可以匹配的记录。 内连接主要方式: 等值连接,连接条件是两个或多个表的字段相等,并且大多数多表连接查询是相等值连接。 非等值连接,连接条件不是两个或多个表的字段相等,而是其他运算符
1.3 外连接的概念
外连接有主表和副表的区别,两个表中一个是主表,另一个表是辅助表,主表中的主查询数据(将显示主表的数据),匹配查询副表,当副表中的数据与主表中的数据不匹配时,副表自动模拟null进行匹配。
外连接主要方式:
左外连接,左表是主表,主表表示左表数据不会为空,但可能会重复,并且可能会发现数据超过主表的行数。
右外连接,右边的表是主表。
1.left join(左外联查询)
如果我们想查询没有班级的学生,可以将学生表作为主表来外联班级表
select * from student left join class on student.classid = class.classid where class.classid is null;
2.right join(右外联查询)
如果我们想查询没有学生的班级,则可以将班级表作为主表来外联学生表
select * from class left join student on student.classid = class.classid where student.sid is null;
sql案例
通过传入的课程id获取信息,由于具体信息分装在各个表中,选择了采用左外连接的方式将表连接起来,最后返回所需要的确切信息。这里展示一下具体的sql语句
SELECT
c.id,
c.title,
c.cover,
CONVERT(c.price, DECIMAL(8,2)) AS price,
c.lesson_num AS lessonNum,
c.cover,
c.buy_count AS buyCount,
c.view_count AS viewCount,
cd.description,
t.id AS teacherId,
t.name AS teacherName,
t.intro,
t.avatar,
s1.id AS subjectLevelOneId,
s1.title AS subjectLevelOne,
s2.id AS subjectLevelTwoId,
s2.title AS subjectLevelTwo
FROM
edu_course c
LEFT JOIN edu_course_description cd ON c.id = cd.id
LEFT JOIN edu_teacher t ON c.teacher_id = t.id
LEFT JOIN edu_subject s1 ON c.subject_parent_id = s1.id
LEFT JOIN edu_subject s2 ON c.subject_id = s2.id
WHERE
c.id = #{id}
总结
多表联合查询是先根据连接条件将两个表(内连接/外连接)连接起来,然后拼接成一个新表,然后用这个表作为主表或副表或普通表再次连接下面的表,最后拼接后的表同时拥有三个表中的所有对应数据, 然后根据 SELECT 子句中的字段查询您需要的信息