多表查询

本文详细介绍了Oracle SQL中的多表查询技术,包括等值连接、不等值连接、外连接等多种连接方式,以及ANSI SQL:1999标准下的连接语法,并对比了Oracle自有语法与新标准语法的不同之处。

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

2
1

programming
1
Oracle SQL开发基础


2
2

programming
课程结构

内容

课时(H)

第一章 Oracle数据库基础

2.5

第二章 编写简单的查询语句

1.5

第三章 限制数据和对数据排序

2

第四章 单行函数

4

第五章 多表查询

4

第六章 分组函数

3

第七章 子查询

4

第八章 数据操作与事务控制

4

第九章 表和约束

4

第十章 其他数据库对象

4

 


2
3

programming
第五章 多表查询

目标:

本章旨在向学员介绍:

1)等值连接和不等值连接

2)外连接

3)ANSI SQL :1999标准的连接
语句

4)Union 和Union All

 

时间: 4学时
教学方法:讲授ppt+上机练习
2
4

programming
本章要点
.多表连接的定义
.笛卡尔积
.等值连接
.不等值连接
.外连接
.ANSI SQL:1999标准的连接语句
.Union,Union All(集合运算符)



2
5

programming
第五章 多表查询

多表查询:

5.1ORACLE自有连接方法

5.2ANSI SQL:1999标准的连接语法

5.3集合运算


2
6

programming
5.1ORACLE自有连接方法

.多表连接主要分为
–笛卡尔积
–等值连接
–不等值连接
–外连接
–自连接

 



2
7

programming
5.1.1笛卡尔积
.笛卡尔积是把表中所有的记录作乘积操作,生成大量的结果,
而通常结果中可用的值有限。笛卡尔积出现的原因多种多样,
通常是由于连接条件缺失造成的。



SELECT last_name, job_id, department_name

FROM employees, departments;


2
8

programming
5.1.2等值连接基本语句 1/3

.等值连接又称简单连接或内连接。就是当两个表的公共字段相
等的时候把两个表连接在一起。公共字段是两个表中有相同含
义的列。


EMPLOYEES
DEPARTMENTS
Foreign key Primary key


2
9

programming
5.1.2等值连接基本语句 2/3
.等值连接的语法结构
–在 WHERE 子句中写连接条件
–当多个表中有重名列时,必须在列的名字前加上表名作为
前缀

 


SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
2
10

programming
5.1.2等值连接基本语句 3/3
SELECT employees.last_name, employees.job_id,
employees.department_id,departments.department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;

 

等值连接的示例


2
11

programming
5.1.3等值连接中的记录筛选
.多表连接中,记录筛选语句同样写在WHERE语句中,用逻辑
AND和连接判断语句写在一起。


SELECT employees.last_name, employees.job_id,
employees.department_id,departments.department_name
FROM employees, departments
WHERE employees.department_id=departments.department_id
AND job_id LIKE '%MAN%';
2
12

programming
5.1.4表别名的使用 1/2
.等值连接表别名示例


SELECT e.last_name, e.job_id, e.department_id,
d.department_name

FROM employees e, departments d

WHERE e.department_id = d.department_id

AND job_id LIKE '%MAN%';


2
13

programming
5.1.4表别名的使用 2/2

.关于表别名需要注意以下几点:
–表别名长度不超过30个字符;
–表别名定义在FROM子句中;
–如果已经定义了表别名,那么只能使用表别名而不能使用
原表名;
–表别名的有效范围只是当前语句。


.SQL语句的书写顺序是:
–SELECT FROM WHERE ORDER BY


.而实际的执行顺序是:
–FROM WHERE SELECT ORDER BY

 



2
14

programming
5.1.5两表以上的多表连接
.查找特定城市员工信息。


SELECT e.last_name, e.job_id, e.department_id,
d.department_name,l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id
AND l.city IN ('Southlake','Oxford');
2
15

programming
5.1.6不等值连接 1/3
.除了等号之外,在表连接语句中还可以使用其它的运算符。这
种使用除等号之外运算符的连接语句被称为不等值连接。
.使用不等值连接查询可以查询两个表中具有非等值关系的数据。
操作符可以是比较运算符,也可以是between···and 或者是in、
like。



2
16

programming
5.1.6不等值连接 2/3

DESC salgrades;
SELECT *
FROM salgrades;
2
17

programming
5.1.6不等值连接 3/3
SELECT e.last_name, e.job_id, e.salary, s.grade_level
FROM employees e, salgrades s
WHERE e.salary BETWEEN s.lowest_salary AND
s.highest_salary AND e.job_id in('IT_PROG','SA_REP')
ORDER BY s.grade_level;
2
18

programming
5.1.7外连接 1/4
.为了查找到所有记录,包括没有匹配的记录,需要用外连接语句来实
现。
.右外连接:以右表为基准,右表中的每个记录都必须显示,即使左表
中没有与之相匹配的记录。
.左外连接:以左表为基准,左表中的每个记录都必须显示,即使右表
没有与之相匹配的记录。
.注意:+放在没有与之相匹配表的那一端。


SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column(+) = table2.column;

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column = table2.column(+);


2
19

programming
5.1.7外连接 2/4
EMPLOYEES
DEPARTMENTS

两个员工不属于任何一个部门


2
20

programming
5.1.7外连接 3/4

.例5-8 所有部门信息,不管部门是否有员工。



SELECT e.last_name, e.job_id, e.department_id,
d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
2
21

programming
5.1.7外连接 4/4

.例5-9 所有员工信息,不管员工是否有部门。


 

SELECT e.last_name, e.job_id, e.department_id,
d.department_name

FROM employees e, departments d

WHERE e.department_id= d.department_id(+);


2
22

programming
第五章 多表查询
多表查询:
5.1ORACLE自有连接方法
5.2ANSI SQL:1999标准的连接语法
5.3集合运算
2
23

programming
5.2ANSI SQL:1999标准的连接语法 1/2

.Oracle9i除了Oracle自己的连接语法外,同时支持美国国家
标准协会(ANSI)的SQL:1999标准的连接语法。


SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];
2
24

programming
5.2ANSI SQL:1999标准的连接语法 2/2

.CROSS JOIN:交叉连接,生成笛卡尔积;
.NATURAL JOIN:自然连接;
.USING (column_name):USING子句,通过名字来具体指定
连接
.JOIN table2


 ON (table1.column_name = table2.column_name):等值连
接语句;

.[LEFT|RIGHT|FULL OUTER JOIN:左外连接|右外连接|全外
连接。



2
25

programming
5.2.1交叉连接
.交叉连接子句(CROSS JOIN)是在SQL99标准中,为了生成
笛卡尔积而设计的。


SELECT last_name, job_id, department_name

FROM employees

CROSS JOIN departments;



2
26

programming
5.2.2自然连接
.NATURAL JOIN是SQL99中新增语句,连接条件是两个表中所
有的值和数据类型都相同的同名列。如果仅列名相同而数据类
型不同,则报错。


SELECT department_id, department_name, city
FROM departments
NATURAL JOIN locations;
2
27

programming
5.2.3USING子句 1/2
.USING (column_name)子句也是SQL99新增子句,可以较灵
活的完成在多表连接,多列列名相同时,使用其中的一列同名
列连接,而不需写连接条件的功能。
. USING子句和NATURAL JOIN不能在一条语句中同时书写。



2
28

programming
5.2.3USING子句 2/2

SELECT last_name, job_id, department_name
FROM employees
JOIN departments
USING(department_id);
2
29

programming
5.2.4在ON子句中写连接条件
.例


SELECT e.last_name, e.job_id,
e.department_id,d.department_name
FROM employees e
JOIN departments d
ON (e.department_id = d.department_id);

 


2
30

programming
5.2.5ANSI SQL:1999中实现两表以上连接
.例5-14 查找特定城市员工信息。


SELECT e.last_name, e.job_id, e.department_id,
d.department_name,l.city
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
WHERE l.city IN ('Southlake','Oxford');
2
31

programming
5.2.6左外连接
.在LEFT OUTER JOIN中,会返回所有左边表中的行,即使在
右边的表中没有可对应的列值。
.例5-15 所有员工信息,不管员工是否有部门。


SELECT e.last_name, e.job_id, e.department_id,
d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.department_id= d.department_id;
2
32

programming
5.2.7右外连接

.RIGHT OUTER JOIN,会返回所有右边表中的行,即使在左
边的表中没有可对应的列值。
.例5-16 所有部门信息,不管部门是否有员工。


SELECT e.last_name, e.job_id, e.department_id,
d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON e.department_id= d.department_id;
2
33

programming
5.2.8全外连接
.全外连接(FULL OUTER JOIN)主要功能是返回两表连接中等
值连接结果,及两个表中所有等值连接失败的记录。
.所有信息,不管部门是否有员工,也不管员工是否有部门。


SELECT e.last_name, e.job_id, e.department_id,
d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id= d.department_id;
2
34

programming
第五章 多表查询
多表查询:

5.1ORACLE自有连接方法

5.2ANSI SQL:1999标准的连接语法

5.3集合运算


2
35

programming
5.3.1Union 操作符 1/3
UNION
操作符返回两个查询的结果集的并集(去掉重复值
后的结果)
UNION 操作符返回两个查询的结果集的并集(去掉重复值
后的结果)
2
36

programming
5.3.1Union 操作符 2/3
.UNION (联合)运算
–UNION 运算返回所有由任一查询选择的行。用 UNION 运算从
多表返回所有行,但除去任何重复的行。
–原则
.被选择的列数和列的数据类型必须是与所有用在查询中的
SELECT 语句一致。列的名字不必相同。
.联合运算在所有被选择的列上进行。
.如果多个查询结果都有NULL值,整个结果中只包含一个
NULL值
.IN 运算有比 UNION 运算高的优先级。
.在默认情况下,输出以 SELECT 子句的第一列的升序排序。
.每个查询不能包含自己的Order by语句,只能在联合之后使
用Order by 。

 

 


 


2
37

programming
5.3.1Union 操作符 3/3

.列出工资大于15000或者部门在60,90的员工编号,
First_name,salary,department_id


Select employee_id,first_name,salary,department_id
From employees
Where salary>15000
Union
Select employee_id,first_name,salary,department_id
From employees
Where department_id in (60,90)
2
38

programming
5.3.2Union ALL 操作符 1/4
A

B
UNION ALL
操作符返回两个查询的结果集的并集以及两
个结果集的重复部分(不去掉重复值的结果)
UNION ALL 操作符返回两个查询的结果集的并集以及两
个结果集的重复部分(不去掉重复值的结果)
2
39

programming
5.3.2Union ALL 操作符 2/4

.完全联合 (UNION ALL) 运算
–原则
.和联合不同,重复的行不被过滤,并且默认情况下输出
不排序。
.如果每个查询结果中都有NULL值,也不被去掉。


–注意:使用UNION ALL会比UNION的速度快,因为省去了
去掉重复记录的时间。

 



2
40

programming
5.3.2Union ALL 操作符 3/4
.列出工资大于15000或者部门在60,90的员工编号,
First_name,salary,department_id


Select employee_id,first_name,salary,department_id

From employees

Where salary>15000

Union all

Select employee_id,first_name,salary,department_id

From employees

Where department_id in (60,90)


2
41

programming
5.3.2Union ALL 操作符 4/4
.列出部门信息和部门的经理信息


select manager_id,'department:',department_name
from department
where manager_id is not null
union all
select manager_id,'manager:',last_name
from department d,employees e
where d.manager_id=e.employee_id
order by 1,2
2
42

programming
本章小结
.本章讲述了什么是多表连接,以及多表连接的几种类型,通过
例子说明了以前的多表连接语法和新的Sql99标准中的连接语法
的差异。
.笛卡尔积
.等价连接
.不等价连接
.外连接
.ANSI SQL:1999标准的连接语句
.Union操作符
.Union All操作符



2
43

programming
练习

.1.查询员工的编号,姓名,以及部门名称(分别使用Oracle语法,
自然连接,using子句,on子句)。
.2.查询部门名称为Shipping的员工的编号、姓名及所从事的工
作。
.3.查询员工的编号,姓名,以及部门名称,包括没有员工的部
门。
.4.查询员工的编号,姓名,以及部门名称,包括不属于任何部
门的员工。



2
44

programming
谢谢



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值