(4)Oracle尚硅谷:多表查询

笛卡尔集的产生条件:(1)省略连接条件 (2)连接条件无效  (3)所有表中的所有行互相连接

所以:为了避免笛卡尔集,where中加入有效连接

内连接:不返回未匹配的行;——等值连接、非等值连接、自连接

外连接:返回未匹配的行;———(+)、left join、right join、fulljoin

1、等值连接

连接n个表,至少需要n-1个条件。

内连接:不返回未匹配的行;

1 --代码示例:
2 select employee_id,e.department_id,department_name
3 from employees e,departments d
4 where e.department_id=d.department_id;

2、非等值连接

1 --代码示例:
2 select employee_id,last_name,salary,grade_level
3 from employees e,job_grades j
4 where e.salary between j.lowest_sal and j.highest_sal;

3、自连接

内连接:不返回未匹配的行;

1 --查询员工姓名及其对应领导的信息:
2 select e.last_name,m.last_name,m.salary,m.email
3 from employees e,employees m
4 where e. manager_id = m.employee_id;

4、外连接(+)

外连接:返回未匹配的行;(+)只能表示left join、right join,不能表示full join = 左右未连接到的记录都存在。

1 --代码示例:
2 select employee_id,e.department_id,department_name
3 from employees e,departments d
4 where e.department_id=d.department_id(+);
5 --记录少的表后加上(+),上例(+)在右表,employees表含有所有记录,同左外连接left join

5、SQL99语法

 1 --使用cross join,连接表产生叉集,同笛卡尔集。
 2 select last_name,department_name
 3 from employees
 4 cross join departments;
 5 
 6 --使用natural join, 自动用表相同字段作为连接条件
 7 --但2个字段相同时,则默认2个连接条件,不能指定
 8 select last_name,department_name
 9 from employees
10 natural join departments;
11 
12 --使用join……using……,可指定连接条件,同等值连接
13 --但需2个表中字段名称、类型一致,否则不可使用
14 select last_name,department_name
15 from employees 
16 join departments
17 using(department_id);

当连接字段列名、类型不一致时,可使用join……on……

左外连接:left join = 左未连接到的记录存在。

右外连接:right join = 右未连接到的记录存在。

满外连接:full join = 左右未连接到的记录都存在。

1 --连接n个表,至少需要n-1个条件。
2 select employee_id,e.department_id,department_name,city
3 from employees e
4 join departments d
5 on e.department_id = m.department_id
6 join location l
7 on d.location_id = m.location_id;
posted @ 2022-09-17 18:43  七月安生里  阅读(28)  评论(0编辑  收藏  举报