Oracle(五)多表查询

笛卡尔集的错误(没有连接条件)

select employees.employee_id,employees.department_id,departments.department_name
from employees,departments;

select employees.employee_id,employees.department_id,departments.department_name
from employees,departments
where employees.department_id = departments.department_id;

假设有n个表作为查询,至少连接条件得有n - 1;

select employee_id,last_name,departments.department_id,department_name,departments.location_id,city
from employees,departments,locations
where employees.department_id = departments.department_id and departments.location_id = locations.location_id;

内连接

  • 等值连接 vs 非等值连接
  • 自连接 vs 非自连接

内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行;

等值连接(表可以起别名,可以将别名作为连接条件使用)

select employee_id,last_name,d.department_id,department_name,d.location_id,city
from employees e,departments d,locations l
where e.department_id = d.department_id and d.location_id = l.location_id;

非等值连接

select employee_id,last_name,salary,grade_level
from employees e,job_grades j
where e.salary >= j.lowest_sal and e.salary <= j.highest_sal;

在这里插入图片描述
在这里插入图片描述

自连接

SELECT worker.last_name || ' works for ' 
       || manager.last_name
FROM   employees worker, employees manager
WHERE  worker.manager_id = manager.employee_id ;

外连接

外连接(除了查询到满足条件的行之外,还查询出不满足条件的行,两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+);

使用外连接可以查询不满足连接条件的数据,外连接的符号是 (+):

--右外连接
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(+);

左外连接:除了查询到满足条件的行之外,还查询出左表中不满足条件的行

-- 比如有的员工没有部门
select employee_id,e.department_id,department_name
 from employees e,departments d
 where e.department_id = d.department_id(+);

右外连接:除了查询到满足条件的行之外,还查询出右表中不满足条件的行

--有的部门没有员工
select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id(+) = d.department_id;

像这种情况:
在这里插入图片描述

如下的操作时错误的。

select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id(+) = d.department_id(+);

使用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)];

叉 集

  • 使用CROSS JOIN 子句使连接的表产生叉集。
  • 叉集和笛卡尔集是相同的。

自然连接

  • NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
  • 在表中查询满足等值条件的数据。
  • 如果只是列名相同而数据类型不同,则会产生错误。
--使用在内连接上
--natural join:自动将两个表中所有相同的列名作为连接条件。(有局限性)
select employee_id,last_name,department_id,department_name
from employees natural join departments;

--与下述操作相同
select employee_id,last_name,e.department_id,department_name
from employees e,departments d
where e.department_id = d.department_id and e.manager_id = d.manager_id;

使用 USING 子句创建连接

  • 在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
  • 使用 USING 可以在有多个列满足条件时进行选择。
  • 不要给选中的列中加上表名前缀或别名。
  • JOIN 和 USING 子句经常同时使用。
--join ... using:要求两个表的作为连接条件的列的列名一样。(有局限性)
select employee_id,last_name,department_id,department_name
from employees join departments 
using(department_id);

使用ON 子句创建连接

  • 自然连接中是以具有相同名字的列为连接条件的,可以使用 ON 子句指定额外的连接条件,这个连接条件是与其它条件分开的。
  • ON 子句使语句具有更高的易读性。
--join ... on ...具有通用性,需要掌握。
select employee_id,last_name,e.department_id,department_name
from employees e join departments d
on e.department_id = d.department_id;

select employee_id,department_name,city
from employees e join departments d
on e.department_id = d.department_id
join locations l
on d.location_id = d.location_id;

内连接和外连接

在SQL: 1999中,内连接只返回满足连接条件的数据
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右) 外连接。
两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为满 外连接。

左外连接

select employee_id,last_name,e.department_id,department_name
from employees e left outer join departments d
on e.department_id = d.department_id;

右外连接

select employee_id,last_name,e.department_id,department_name
from employees e right outer join departments d
on e.department_id = d.department_id;

满外连接

select employee_id,last_name,e.department_id,department_name
from employees e full outer join departments d
on e.department_id = d.department_id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中,多关联是指需要在多个之间进行联合查询的操作。多关联的实现方式可以分为以下三种: 1. 内连接:通过指定关联条件,将两个或多个中满足条件的记录进行匹配,返回符合条件的结果集。内连接的语法可以使用Oracle扩展的连接方式来实现。例如,可以使用以下语法实现内连接: SELECT columns_list FROM table_name1 INNER JOIN table_name2 ON join_condition; 2. 外连接:外连接可以分为左外连接和右外连接。左外连接返回左中所有记录以及与右中符合条件的记录,右外连接则返回右中所有记录以及与左中符合条件的记录。外连接的语法和内连接类似,只是在连接条件的写法上稍有不同。 3. 自连接:自连接是指在同一个内进行连接操作。通过给起别名,在连接条件中使用别名来指定不同实例,从而实现内的关联查询。自连接常用于需要对同一个不同记录进行联合查询的情况。 对于多关联的实现,可以按照以下步骤进行操作: 1. 分析需要查询的数据来自哪些,并构成FROM子句。 2. 分析之间的关联关系,如果存在直接关联关系,则使用字段间的等值条件直接关联。如果不存在直接关联关系,则需要通过一个中间进行关联,并在FROM子句中添加关联。 3. 在WHERE子句中补充之间的关联关系,通常n个连接需要n-1个关联关系。根据实际情况,使用等值条件或其他逻辑条件来建立之间的关联关系。 例如,如果需要在A、B和E之间进行多关联,其中A与B有直接关联,B与E也有直接关联,可以使用以下语法实现: SELECT * FROM A INNER JOIN B ON A.c1 = B.c1 INNER JOIN E ON B.c2 = E.c2;<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Oracle】多联查的几种方式](https://blog.csdn.net/River_Continent/article/details/81069093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [多关联查询ORACLE版)](https://blog.csdn.net/weixin_30516243/article/details/98619459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Oracle知识点()--多连接](https://blog.csdn.net/Dou_fu/article/details/120117404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值