第268卷
13
2021年7月
距离2022年还有171天
这是软件测试堆栈的第 268 条推文
点击上方蓝字“软件测试栈”关注我,每周一三五早上08:30准时推送,每月不定期赠送技术书籍。
微信公众号后台回复“资源”和“测试工具包”即可领取测试资源,回复“微信交流群”和“内推群”即可加入群打怪。
本文共5580字,阅读时间约14分钟
大家好。 计算领域有很多很棒的设计理念和想法,例如:
多表查询经常使用连接。 关系型数据库连接查询中常用的查询方式有以下几种:内连接、左连接、右连接、交叉连接。 今天小编就为大家介绍一下各种加盟方式。
首先,准备数据表。 如果您需要接收或创建本文所需的表语句,可以在软件测试栈后台回复“数据库大礼包”。
1.学生桌
(s_id,,,s_sex) – 学生 ID、学生姓名、出生日期、学生性别。
2. 课程安排
(c_id,,t_id) – – 课程 ID、课程名称、教师 ID。
3. 教师桌
(t_id,) – 教师 ID、教师姓名。
4. 成绩单
Score(s_id,c_id,) – 学生 ID、课程 ID、分数。
一
连接查询返回的结果的分类
1
内部联接
定义:只返回两个表中满足连接条件的所有行,即根据每个表中公共列的值,使用比较运算符来匹配两个表中的行。
应用场景:A、B内部满足一定条件的数据。
例子:
结果:
说明:内连接是一个比较运算符,只返回满足条件的行。
此时相当于: * from , where .s_id=.c_id;
2
外连接
(1) 左连接(左连接/左外连接)
定义:左连接返回左表中的所有记录与右表中连接字段中的记录相等。 (左表是写在left join关键字左边的表)。
应用场景:A的所有数据,以及满足一定条件的B的数据。
例子:
运行结果:
说明:左外连接包括左连接左表中的所有行。 如果左表中的某行与右表不匹配,则结果中与该行对应的右表部分全部为空(NULL)。
注意:此时我们不能说结果的行数等于左表数据的行数。 当然,这里查询结果的行数等于左表数据的行数,因为此时左表和右表是一一对应的关系。
(2) 右连接(右连接/右外连接)
定义:返回所有记录,包括右表中的所有记录和左表中join字段相等的记录。 (右表是写在right join关键字右边的表)。
应用场景:B的所有数据,以及满足一定条件的A的数据。
例子:
运行结果:
说明:右外连接包括右连接右表中的所有行。 如果左表中的某行与右表中不匹配,则结果中左表对应的部分全部为空(NULL)。
注意:此时我们还不能说结果中的行数等于右表中的行数。 当然,这里查询结果的行数等于左表数据的行数,因为此时左表和右表是一一对应的关系。
(3)全外连接(全连接/全外连接)
定义:返回左右表中的所有记录以及左右表中连接字段相同的记录。
应用场景:满足一定条件的公共记录、唯一记录。
例子:
说明:完全外连接包括完全连接的左表和右表中的所有行。 如果右表中的某行与左表中的行不匹配,则右表中相应行的部分全部为空(NULL)。 如果左表中的某行与右表中的行不匹配,则结果中左表中与该行对应的部分全部为空(NULL)。
注:全外连接是在等价连接的基础上将左表和右表不匹配的数据相加。 不过MySQL目前不支持这种方法。 如果去掉on条件语句,就会有查询结果。
运行结果:
3
交叉连接/笛卡尔积
定义:交叉连接/笛卡尔积返回左表中的所有行,左表中的每一行与右表中的所有行相结合。
示例:有两个集合 A 和 B,A = {0,1} B = {2,3,4}
集合A×B和B×A的结果集可以分别表示为以下形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
上述A×B和B×A的结果可以称为两个集合相乘的“笛卡尔积”。
通过以上数据分析,我们可以得出以下两个结论:
两个集合相乘不满足交换率,即A×B≠B×A;
集合A和集合B的乘法包括集合A中的元素和集合B中的元素组合的所有可能性,即两个集合相乘得到的新集合中元素的个数就是集合中元素的个数A × B 集合中元素的数量。
交叉连接:
SELECT * from 表1 cross JOIN 表2;
交叉连接实际上是两个表的笛卡尔积运算,结果表是第一个表的每一行与第二个表的每一行拼接而成的表,称为“笛卡尔积表”。 表中的行数等于两个表中的行数的乘积。
例子:
运行结果:
说明:不带 WHERE 子句的交叉联接将生成联接中涉及的表的笛卡尔积。 第一个表中的行数乘以第二个表中的行数等于笛卡尔积结果集的大小。 如果我们此时在这条SQL中添加一个WHERE子句,比如SQL: * from cross join where .s_id=.c_id; 此时会返回一个符合条件的结果集,其结果与内连接中显示的执行结果相同。
4
自加入
在连接查询中,涉及的两个表是同一个表,称为自连接查询。 同一个表在 FROM 子句中出现多次。 为了区分表的每次出现,需要为表定义一个别名。 自连接是一种特殊的内连接,它意味着连接的表在物理上是同一个表,但在逻辑上可以分为两个表。
例子:
运行结果:
二
按连接条件分类
1
等效连接(join)
定义:使用“=”关系连接表的查询,其查询结果列出连接表中的所有列,包括重复列。
例子:
运行结果:
2
非等价连接
不要使用=连接,运算符包括>、>=、