select语句多表联合查询(二)

版权声明:未经博主允许请勿转载 https://blog.csdn.net/hlz_12345/article/details/84962508

(所有表都在select语句多表联合查询(一)中)

重名处理

我个人觉得重名处理主要处理对于表同名的情况(因为对于不同表存在同属性这种情况可以通过表名.属性的方式来区分)

问题一:求有薪水差额的任意两位教师。

根据题意我们只需要用到一个表就是teacher表,但要求薪水差额必定要用到两次薪水这个属性,我们不妨定义一次teacher表为T1,再定义一次该表为T2,有了T1.Salary和T2.Salary我们就可以求薪水是否有差了。显然,我们要将T1和T2笛卡儿积,然后where后面的条件理想当然的是T1.Salary <> T2.Salary,但你会发现一个问题:

会出现一些重复项,比如说第一个元组,赵四和赵三,第三个元组就是它的重复项,只不过教师的顺序对调了下,重复项的存在显得多余,所以我们要想一个办法把这些重复项过滤掉。仔细观察这个结果表不难发现,除了salary相等的元组,我们都能在T1.Salary > T2.Salary的元组中找到其对应的T1.Salary < T2.Salary的元组,比如说第五个,赵三的薪水大于赵五的薪水,那么必然有一个元组是赵五的薪水小于赵三的,也就是第二个元组。除去薪水相等的那几个元组,剩下的元组可以对半分为T1.Salary>T2.Salary的元组和T1.Salary<T1.Salary的元组。所以我们的筛选条件就可以是T1.Salary > T2.Salary 也可以是 T1.Salary< T2.Salary,二者选其一即可。

select T1.Tname,T1.Salary,T2.Tname,T2.Salary from Teacher T1,Teacher T2 where T1.Salary > T2.Salary;

问题二:求既学过‘001’号课程又学过‘002’号课程的所有学生的学号

这里涉及到的属性有课程号和学号,显然我们第一个想到的是SC表。然后有一个误区是在写where条件的时候初学者可能会写C# = '001' and C# = '002',事实上这是不可行的,这跟编程中的“二义性”有点类似,你到底是要我去找001还是找002呢?所以我们得另辟蹊径,一种方法就是利用重名处理,将SC表分别命名为SC1和SC2,然后笛卡儿积,将两表通过学号进行连接,于是两边都是关于该学号的学生的选课号和选课成绩,我们要做的事情就是找到左边的课程号为‘001’以及右边的课程号为‘002’。

select SC1.S# from SC SC1,SC SC2 where SC1.S# =SC2.S# AND SC1.C# = '001' AND SC2.C# = '002'
 

总结与归纳:

1.通过找到两个表的相同属性来连接两个表,得到与这个属性值相关的信息

2.order by 属性名 后面如果是升序排列可不写(即默认),如果降序需写DESC

3.重名处理通常用于表重名的情况

 

 

 

猜你喜欢

转载自blog.csdn.net/hlz_12345/article/details/84962508