数据库系统之SQL SELECT语句-3


接上篇文章
SQL SELECT语句-1:
https://blog.csdn.net/Jifu_M/article/details/112681846
SQL SELECT语句-2:
https://blog.csdn.net/Jifu_M/article/details/112683860

Join Queries

Join操作“连接”两个关系表中的行。

找出Peter领导的部门提供的所有课程的名称:

有以下4种联合查询的方法:

SELECT title
FROM COURSE JOIN DEPARTMENT
ON name = offered_by
WHERE chair = 'Peter';

SELECT C.title
FROM COURSE C JOIN DEPARTMENT D
ON D.name = C.offered_by
WHERE D.chair = 'Peter';

SELECT COURSE.title
FROM COURSE, DEPARTMENT
WHERE DEPARTMENT.name = COURSE.offered_by AND DEPARTMENT.chair = 'Peter';


SELECT title
FROM COURSE, DEPARTMENT
WHERE name = offered_by AND chair = 'Peter';

我们最中要找到是 title,title是在COURSE 这个表里的,所以要把COURSE 当做主表,然后筛选条件是DEPARTMENT里面的name所以我们要JOIN DEPARTMENT 这个表来帮助我们查询,将两个表确定后我们要确定两个表的外键关系,这个关系在ON这一行中,通过ON我们将两个表的属性链接起来。最后再用一行WHERE来确定SELECT条件。

在项目中,笔者习惯使用第二种格式,FROM COURSE C JOIN DEPARTMENT D中的C和D是我们给这两个表起的昵称。
在后面我们可以直接使用C和D来代表这两个表。比如D.name就是DEPARTMENT.name。

在ANSI SQL标准中可以使用的语法稍有变化:

SELECT COURSE.title
FROM COURSE JOIN DEPARTMENT
ON DEPARTMENT.name = COURSE.offered_by
WHERE DEPARTMENT.chair = 'Peter';

SELECT title
FROM COURSE JOIN DEPARTMENT
ON name = offered_by
WHERE chair = 'Peter';

SELECT C.title
FROM COURSE C JOIN DEPARTMENT D
ON D.name = C.offered_by
WHERE D.chair = 'Peter';

如果使用第二种方法要注意ON后面属性的顺序和FROM JOIN的顺序要保持一致。
前面使用AND的两种方法在这个标准里并不能使用。

Natural Join Queries

SELECT ename
FROM EMPLOYEE NATURAL JOIN DEPARTMENT
WHERE chair = 'James Bond';

SELECT ename
FROM EMPLOYEE JOIN DEPARTMENT
ON EMPLOYEE.dname = DEPARTMENT.dname
WHERE DEPARTMENT.chair = 'James Bond';

上面的natural join queries和下面的 join query效果是等同的。

Column Name Join Queries

SELECT ename
FROM EMPLOYEE JOIN DEPARTMENT
USING(dname)
WHERE chair = 'James Bond';

使用USING来简化join query的ON和WHERE。

Cross Join Queries

交叉连接操作“连接”一个关系表中的所有行与另一个关系表中的所有行。

找到所有对雇员和主席的名字:

SELECT ename, chair
FROM EMPLOYEE CROSS JOIN DEPARTMENT;

与下面的等同:

SELECT ename, chair
FROM EMPLOYEE JOIN DEPARTMENT;

SELECT ename, chair
FROM EMPLOYEE, DEPARTMENT;

两个表以上的Join Queries

找到所有注册Java课程的学生的名字:

以下3种方法效果等同:

--CASE1
SELECT STUDENT.name
FROM COURSE JOIN ENROLMENT
ON COURSE.cnum = ENROLMENT.cnum
JOIN STUDENT
ON ENROLMENT.snum = STUDENT.snum
WHERE COURSE.title = 'Java';
--CASE2
SELECT STUDENT.name
FROM COURSE, ENROLMENT, STUDENT
WHERE COURSE.cnum = ENROLMENT.cnum AND ENROLMENT.snum = STUDENT.snum AND
COURSE.title = 'Java';
--CASE3
SELECT STUDENT.name
FROM ( SELECT *
FROM COURSE JOIN ENROLMENT
ON COURSE.cnum = ENROLMENT.cnum
WHERE COURSE.title = 'Java' ) CE JOIN STUDENT

Self-Join Queries

如果在一个表中的两个属性相互关联,那么Self-Join Queries就可能被使用。

例如我们要找到第40号员工经理的名字。
这两个属性都在一个表中,如果正常分步做我们可以:

SELECT manager
FROM EMPLOYEE
WHERE enum = 40;

结果是20,接着我们再。

SELECT name
FROM EMPLOYEE
WHERE enum = 20;

找到了经理名字叫Peter。

那如果我们要在一个SELECT中实现呢?
第一种方法:

SELECT E2.name
FROM EMPLOYEE E1 JOIN EMPLOYEE E2
		ON E1.manager = E2.enum
WHERE E1.enum = 40;

第二种方法:

SELECT EMPLOYEE.name
FROM EMPLOYEE JOIN ( SELECT manager
FROM EMPLOYEE
WHERE enum = 40 ) E40
ON EMPLOYEE.enum = E40.manager;

下篇文章:
SQL SELECT语句-4:
https://blog.csdn.net/Jifu_M/article/details/112705789

References

  1. T. Connoly, C. Begg, Database Systems, A Practical Approach to Design, Implementation, and Management, Chapters 6.3.7 Multi-table Queries, Pearson Education Ltd, 2015.
  2. D. Darmawikarta, Oracle SQL : A Beginner’s Tutorial Brainy Software Inc. First Edition: June 2014.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值