软件测试学习 之自连接(self join)

本文深入解析了SQL自连接的概念及应用场景,通过实例展示了如何在Oracle、MySQL等数据库中使用自连接来解决数据分类问题,特别关注了员工与经理间的关系查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自连接(self join)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。一般用于数据分类

自连接的实例(MySql,Oracle,MSSQL等通用)

我们什么时候应该使用自连接呢?我们来看下面的例子。

在oracle的scott的schema中有一个表是emp

在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。下面我们需要将每一个员工自己的名字和经理的名字都找出来。这时候我们该怎么做呢?

如果我们有两张这样的表分别叫worker和mgr,那么我们就很好写SQL语句。

Select worker.name,Mgr.name
From worker,mgr
Where worker.mgr = mgr.id;

但现在我们只有一张表。你也许说我们现在再建一张表,把同样的数据拷贝过去不就可以了吗?是的,这样可以,但我们不会采用,因为这样就会很麻烦,而且数据严重冗余等等很多弊端。

我们有更好的方法,那就是自连接。

自连接的本意就是将一张表看成多张表来做连接。我们可以这样来写SQL语句

select work.ename '工人', 'works for',mgr.ename '老板'
from emp work, emp mgr
where work.mgr = mgr.empno
order by work.ename;

得到了如下结果:

工人	works for	老板
Adams	works for	James
Allen	works for	Tom
Ford	works for	Tom
James	works for	Tom
Kik	works for	James
Smith	works for	Ford
Turner	works for	Allen

 

实例讲解2(Oracle,MySql)

这里我们注意到,Tom这个人没有出现在工人列里面,是因为这个人是整个公司的老板,他没有经理。如果这时候我们希望这个人也出现在左侧,即使他没有老板。

我们可以使用刚刚才介绍过的oracle中的外连接

例如:

-- Oracle左连接写法
select work.ename '工人',' works for',mgr.ename '老板'
from emp work, emp mgr
where work.mgr = mgr.empno (+)
order by work.ename;
-- MySql左连接实现
select `work`.ename '工人','works for',mgr.ename '老板'
from emp `work`
left join emp mgr on `work`.mgr = mgr.empno
order by `work`.ename;

得到结果:

工人	works for	老板
Adams	works for	James
Allen	works for	Tom
Ford	works for	Tom
James	works for	Tom
Kik	works for	James
Smith	works for	Ford
Tom	works for	
Turner	works for	Allen

这是我们看到Tom的右侧是空白,也就是没有老板。

从这里我们看到,当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自连接。

 

转自 自连接_百度百科

https://baike.baidu.com/item/自连接

### 软件测试练习题示例 #### 边界值分析与等价类划分 边界值分析(BVA)和等价类划分(EP)是两种常用的软件测试设计技术,用于确定测试用例以发现程序中的错误。这两种技术通常一起使用,可以提高测试的效率和有效性[^2]。 例如,在12306网站上进行车票预订功能的测试时,可以通过以下方式应用这些方法: - **边界值分析**:对于日期字段,假设可选日期范围是从今天到未来90天内的任意一天,则应考虑如下边界值: - 小于今天的日期 - 今天的日期 - 明天的日期 - 第79天后的日期 - 第80天的日期 - 大于第90天的日期 - **等价类划分**:针对乘客年龄这一属性,可以根据成人、儿童和其他特殊群体来定义不同的类别,并从中选取代表性的样本作为测试数据。 ```python def test_date_selection(date): if date < today(): return "Invalid Date" elif date >= today() and date <= future_90_days(): return "Valid Date" else: return "Out of Range" def test_age_category(age): if age >= 18: return "Adult" elif age > 0 and age < 18: return "Child" else: return "Invalid Age" ``` #### 实际应用场景下的练习题目 在全国大学生软件测试大赛中有一道关于医疗系统的练习题,涉及医生管理模块的功能验证。具体来说,就是通过选择医生编号并输入关键字来进行搜索操作,确保能够找到符合条件的目标对象。这里的关键在于理解业务逻辑以及如何构建合理的查询条件[^3]。 例如,给定一个简单的Python函数模拟此场景: ```python class Doctor: def __init__(self, id_, name): self.id = id_ self.name = name doctors_db = [ Doctor(1235, '张三'), Doctor(4567, '李四') ] def search_doctor(keyword): results = [] for doc in doctors_db: if keyword.lower() in str(doc.id).lower() or keyword.lower() in doc.name.lower(): results.append(f"ID:{doc.id}, Name:{doc.name}") return "\n".join(results) print(search_doctor('123')) # 输出 ID:1235, Name:张三 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值