Oracle表连接
SQL/Oracle使用表连接从多个表中查询数据
语法格式:
select 字段列表
from table1,table2
where table1.column1=table2.column2;
说明:
在where子句中指定连接条件
当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀.
连接的类型
Oracle8i之前的表连接:
等值连接(Equijoin)
非等值连接(Non-Equijoin)
外连接(Outer join):-->左外连接-->右外连接
自然连接(Self join)
Oracle9之后新引入的连接形式(支持SQL99规范)
交叉连接(Cross join)
自然连接(Natural join)
使用Using子句建立连接
使用on子句建立连接
外连接(Outer join):-->左外连接-->右外连接-->全外连接
等值连接(Equijoin)
select empno,ename,sal,emp.deptno,dname from emp,dept
where emp.deptno = dept.deptno;
多表连接中:
- 可使用AND操作符增加查询条件
- 使用表别名可以简化查询
- 使用表名(表别名)前缀可提高查询效率
- 为了连接n个表,至少需要n-1个连接条件
非等值连接(Non-Equijoin)
外连接(Outer join)
使用外连接可以看到参与连接的某一方不满足连接条件的记录
外连接运算符为(+)
传统的外连接分为左外连接和右外连接两种
语法格式:
select 字段列表
from table1,table2
where table1.column1(+)=table2.column2;
select 字段列表
from table1,table2
where table1.column1=table2.column2(+);
自连接(Self join)
select a.enpno,a.ename,a.ngr,b.ename
from emp a,emp b
where a.ngr = b.enpno;
SQL99连接语法
SQL1999规范中规定的连接查询语法
select 字段列表
from table1
[cross join table2] |
[natural join table2] |
[join table2 using(字段名)] |
[join table2 on(table.column_name=table2.column_name)] |
[(left | right | full out ) join table2
on(table1.column_name=table2.column_name)];
交叉连接(Cross join)
Cross join 产生了一个笛卡尔集,其效果等同于再两个表进行连接时未使用where子句限定连接条件;
select empno,ename,sal,emp.deptno,dname
from emp cross join dept;
自然连接(Natural join)
Natural join基于两个表中的全部同名列建立连接
- 从两个表中选出同名列的值均对应相等的所有行
- 如果两个表中的同名列的所有数据类型不同,则出错
- 不允许在参照列上使用表名或者别名作为前缀
select empno,ename,sal,emp.deptno,dname
from emp natural join dept;
Using子句
如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名.
select empno,ename,sal,emp.deptno,dname
from emp join dept
using(deptno);
不允许在参照列上使用表名或者别名作为前缀
On子句
如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用On子句
select empno,ename,sal,emp.deptno,dname
from emp join dept
on(emp.deptno=dept.deptno);
多表连接
使用SQL99连接语法,两个以上的表进行连接时应依次/分别指定相临的两个表之间的连接条件.
select 字段列表
from table1
[cross join table2] |
[natural join table2] |
[join table2 using(字段名)] |
[join table2 on(table.column_name=table2.column_name)] |
[(left | right | full out ) join table2
on(table1.column_name=table2.column_name)]
[cross join table3] |
[natural join table3] |
[join table3 using(字段名)] |
[join table3 on(table.column_name=table3.column_name)] |
[(left | right | full out ) join table3
on(table2.column_name=table3.column_name)]...;
内连接和外连接
内连接(Inner join)
在SQL99规范中,内连接只返回满足连接条件的数据.
外连接(Outer join)
左外连接(Left Outer Join)
两个表在连接过程中除返回满足连接条件的行为外,还返回左表中不满足条件的行为,这种连接称为左外连接.
右外连接(Right Outer Join)
两个表在连接过程中除返回满足连接条件的行为外,还返回右表中不满足条件的行为,这种连接称为右外连接.
满外连接(Full Outer Join)
Oracle9开始新增功能,两个表在连接过程中除返回满足连接条件的行为外,还返回两个表中不满足条件的所有行为,这种连接称为满外连接.
子查询(Sub Query)
子查询子查询在主查询前执行一次
主查询使用子查询的结果
select 字段列表
from table
where 表达式 operator (select 字段列表 from table);
使用子查询注意事项
单行子查询
单行子查询只返回一行记录
对单行子查询可使用单行记录比较运算符
=--------------等于
>--------------大于
>=------------大于等于
<--------------小于
<=--------------小于等于
<>--------------不等于
select * from emp
where sal>(select sal from emp where empno=7000);
子查询空值/多值问题
-
如果子查询未返回任何行,则主查询页不会返回任何结果
-
如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符
-
如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符
多行子查询
多行子查询返回多行记录
对多行子查询只能使用多行记录比较运算符
in--------------等于列表中的任何一个
any--------------和子查询返回的任意一个值比较
all--------------和子查询返回的所有值比较
select * from emp
where sal>any(select avg(sal) from emp group by deptno);
select * from emp
where sal>all(select avg(sal) from emp group by deptno);
select * from emp
where job in(select job from emp where ename='martin' or ename='ssss');
TopN查询
在oracle中通常采用子查询的方式来实现Top n查询
select 字段列表
from(select 字段列表 from table order by 排序字段)
where rownum <=n;
------------------------------------------------------------
select *
from(select * from emp order by sal desc)
where rownum <=5;
分享到:
相关推荐
实验结果表明,数据库连接查询和子查询可以帮助我们从多个表中检索数据,实现复杂的查询操作。实验结果也表明,使用正确的查询语句和查询方式可以提高查询效率和减少数据冗余。 实验步骤: 1. 设计查询语句:设计...
实验报告主要涵盖了数据库系统的基本操作,特别是MySQL中的分组查询、多表连接和子查询的运用。以下是对这些知识点的详细解释: 1. **GROUP BY 语句与聚合函数**: GROUP BY 语句用于将数据分组,通常与聚合函数如...
oracle sql 多表连接和子查询 oracle sql 多表连接和子查询
在Oracle中,表连接和子查询是两种关键的查询技术,用于从多个表中获取数据和执行复杂的逻辑。 首先,我们来看看表连接。表连接允许我们将两个或多个相关表的数据合并在一起,以便在一个查询中同时获取多个表的信息...
里面有很多案例,有比较详细的注释。一般用于初学者、
### Oracle 表连接和子查询实例解析 #### 一、最大薪资部门的员工信息 **SQL语句**: ```sql SELECT ename, sal FROM emp JOIN (SELECT MAX(sal) max_sal, deptno FROM emp GROUP BY deptno) t ON (emp.sal = t....
在Oracle数据库系统中,多表连接与子查询是SQL查询中的关键概念,它们...总之,掌握Oracle的多表连接和子查询是成为熟练的数据库开发者的重要步骤,这有助于理解和操作复杂的数据库结构,提高数据查询和分析的效率。
【SQL子查询、内连接和外连接查询】 在SQL中,子查询、内连接和外连接是进行复杂数据检索的关键工具。这些概念的理解和熟练应用对于数据库管理与数据分析至关重要。 **子查询** 是一个嵌套在其他SQL语句中的查询,...
在SQL Server 2005中,多表查询和子查询是数据库操作的重要组成部分,用于从多个相关的数据源中获取信息。这些技术是数据分析和业务智能的基础,对于数据库管理员和开发人员来说至关重要。 多表查询,也称为联接...
在MySQL数据库的学习中,多表查询是至关重要的一个环节,它涵盖了外键、表连接、子查询以及索引等多个核心概念。这些知识点是理解和优化数据库性能的基础,对于任何数据库管理员或者开发人员来说都是必备技能。 ...
### MySQL多表查询和子查询知识点详解 #### 1. 列出至少有4个员工的部门名称 ...以上示例涵盖了从简单的多表连接到复杂的子查询和聚合函数的应用,有助于深入理解 MySQL 多表查询和子查询的相关技术细节。
6. 使用子查询替代部分连接:在某些情况下,子查询可能比连接更高效。 7. 分区表:对于大数据量的表,使用分区技术可以显著提高查询性能。 8. 使用临时表:在复杂的查询中,将中间结果存入临时表,可以减少内存消耗...
在SQL查询语言中,子查询与连表查询是两种非常重要的查询技术,广泛应用于各种复杂的业务场景中。为了更好地理解这两种查询方式的特点以及如何优化它们的性能,我们先对它们进行一个简要的介绍。 **子查询...
MySQL数据库在设计复杂的业务系统时,常常涉及到多表设计,以满足数据的关联性和完整性。在本主题中,我们将深入探讨多表设计的策略、不同的查询方式,以及数据库的备份和恢复方法。 首先,让我们来看多表设计。在...
在数据库操作中,连接查询用于合并两个或更多表的数据,根据它们之间的关联来获取所需的结果。主要有内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)和自连接等类型。内连接返回两个表中匹配的行...
oracle select group 子查询 表连接
在实验过程中,你会遇到各种查询场景,如供应工程J1零件的供应商号码(子查询应用)、特定条件下的供应商号码筛选(连接查询)。通过对这些操作的实践,你的SQL技能将得到提升,能够熟练地进行数据的检索、更新和...
连接查询允许用户从多个相关表中检索数据,而子查询则允许用户在查询中嵌套另一个查询。下面是对这两种查询方式的详细介绍。 连接查询 连接查询是一种检索多个相关表中的数据的方式。它可以将多个表中的数据组合...
- 表子查询:返回一个完整表结构的子查询,常用于FROM子句中,相当于临时表。 2. 子查询的位置: - FROM子句:子查询可以作为一个临时表替代实际的表。 - WHERE子句:用于筛选满足特定条件的行。 - SELECT子句...