ORACLE高级查询

发布 2021-04-27 21:10:28 阅读 8123

本章目标:

多表查询。联接查询:

inner join(内联接)

left outer join(左外联接)

right outer join(右外联接)

full join(全联接)

子查询。集合操作。

union(联合)

union all(联合所有)

intersect(交集)

minus(减集)

一、连接类型。

oracle遵循sql1999语法标准,同时oracle还提供了一些额外的特性。

oracle支持的连接类型包括:

1. equijoin:等值连接。

2. non-equijoin:非等值连接。

3. inner join:内连接。

4. left join:左外连接。

5. right join:右外连接。

6. full join:全连接。

7. self join:自连接。

二、多表查询。

1. oracle连接语法。

使用一个连接从多个表中查询数据。

在 where 子句中编写连接条件。

当多个表中有相同的列名时,将表名作为列名的前缀。

当n个表进行连接时,所需的连接条件至少为:n-1个连接条件。

限制不明确的列名。

在多表中使用表前缀限制修饰列名。

用表前缀改善性能。

用列别名区别有相同名称,但在不同表中的列。

1. 等值连接。

通过员工表的部门外键与部门表的主键进行连接。

1. 使用 and 操作符附加搜索条件。

1. 多于两个表的连接。

为了连接 n 个表,你最少需要 n-1 个连接条件。

例如:连接 3 个表,最少需要3-1个连接条件。

1. 非等值连接。

用非等值连接返回记录。

1. 笛卡尔乘积。

1. 产生。

第一个表的所行与第二个表每一行进行联接。

在实际应用中笛卡尔乘积极为罕见。

1. 形成原因。

笛卡尔乘积的形成,当:

1. 一个连接条件被遗漏时。

2. 一个连接条件不正确时。

3. 在第一个表中的所有行被连接到第二个表的所有行时。

1. 避免措施。

为了避免笛卡尔乘积的形成,在 where 子句中应当总是包含正确的连接条件。

一、内联接。

用on创建连接子句。

用on创建三个表的连接。

增加连接条件。

举例。-建立测试数据

create table a(id number);

create table b(id number);

insert into a values(1);

insert into a values(2);

insert into a values(3);

insert into b values(1);

insert into b values(2);

insert into b values(4);

commit;

-主流数据库通用的方法

select * from a join b on

-where关联

select * from a, b where

二、外联接。

你可以用一个外连接查看那些不满足连接条件的行。

oracle提供了独特的连接语法,外连接运算符是加号 (+加号 (+出现在右边为左外连接,出现在左边为右外连接。

1. sql1999右外连接和oracle独特的右外连接。

1. sql1999右外连接标准语法。

1. oracle独特的右连接语法。

举例:-主流数据库通用的方法

select * from a right join b on

-oracle特有的方法

select * from a, b where

1. sql1999左外连接和oracle独特的左外连接。

1. sql1999左外连接标准语法。

1. oracle独特的左连接语法。

举例:-主流数据库通用的方法

select * from a left join b on

-oracle特有的方法

select * from a, b where

扩展知识:-注意这里没有第二个加号,会直接过滤掉数据,只显示符合条件的记录

select *

from a, b

where =

and = 2;

-注意where上第二个加号,它的作用是修改右边表记录的显示,例如如果 = 2,显示为2,否则显示null

select *

from a, b

where =

and = 2;

1. 左外连接和右外连接的区别。

左外连接将会返回左边表中的所有数据,而右表中不匹配条件的行将会得到空值。

右外连接将会返回右边表中的所有数据,而左表中不匹配条件的行将会得到空值。

三、全外连接。

举例:-主流数据库通用的方法

select * from a full join b on

-oracle特有的方法

select *

from a, b

where =

union

select *

from a, b

where =

扩展知识:交叉连接(cross join)

完全,也叫交叉连接或者笛卡尔积

-主流数据库通用的方法

select * from a,b;

-或者 select * from a cross join b;

四、自连接。

自连接是多表连接的一种特例。

同一张表的外键字段引用了本表的主键字段。

例如:查询员工和他的管理者信息。

五、总结。inner join

-内连接和where相同

left join

-左向外连接,返回左边表所有符合条件的

right join

-右向外连接,返回右边表所有符合条件的

full join

-完整外部连接,左向外连接和右向外连接的合集

cross join

-交叉连接,也称笛卡儿积。返回左表中的每一行与右表中所有行的组合

一、子查询。

1. 为什么需要子查询?

在实际应用中一个查询(主查询,外查询)的条件需要基于另一个查询(子查询,内查询)的结果来进行,这时就需要用子查询。

例如:谁的工资比abel 高?

2. 子查询语法。

3. 子查询(内查询) 在主查询之前一次执行完成。

4. 子查询的结果被主查询使用(外查询)。

5. 单行子查询和多行子查询。

o 子查询要包含在括号内。

o 将子查询放在比较条件的右侧。

o 单行操作符对应单行子查询,多行操作符对应多行子查询。

6. 单行子查询。

只返回一行。

使用单行比较操作符。

执行单行子查询。

7. 多行子查询。

返回多行。使用多行比较操作符。

在多行子查询中使用any操作符。

一、集合操作。

集合操作符将两个查询的结果组合成一个结果。

集合操作符专门用于合并多条select 语句的结果,包括:union, union all, intersect , minus。

当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配。

集合操作符具有以下注意事项:

1. 集合操作符不适用于lob、varray和嵌套表列。

2. union、intersect、minus操作符不使用于 long列。

3. 如果选择列表中包含有表达式或者函数,那么必须为表达式或者函数定义列别名。

4. union 操作符(无重复并集)

当执行union 时,自动去掉结果集中的重复行,返回两个查询的结果集的并集,并以第一列的结果进行升序排序。

5. union all操作符(有重复并集)

不去掉重复行,并且不对结果集进行排序。返回两个查询的结果集的并集以及两个结果集的重复部分。

6. intersect 操作符(交集)

取两个结果集的交集,并且以第一列的结果进行升序排列。只返回两个查询的公共行。

7. minus 操作符(差集)

只显示在第一个集合中存在,在第二个集合中不存在的数据。并且以第一列的结果进行升序排序。

扩展知识:可以使用order by

order by 必须放在最后一条select 语句之后,当列名相同时,可以直接用列名排序,如果不同可以使用别名使其相同。

/列名不同时使用别名排序。

select id, name x from new_emp

union all

select empno, ename x from emp order by x;

/列名不同时使用别名使其相同后排序。

select id, name ename from new_emp

union all

select empno, ename from emp order by ename;

/合并后列名显示以前一个表为主。

select id, name ename from new_emp

union all

select empno, ename from emp ;

oracle常见查询练习

以下作业要求将每一题的执行命令脚本按顺序保存起来,并且加上适当的注释说明。均为使用pl sql完成的作业!1 编写带输入参数的过程,实现员工查询,根据雇员编号,查询雇员的姓名,职务和部门名称,如果没有找到,要提示雇员编号未找到!使用exec命令进行测试。create or replace proce...

Oracle简单查询笔记

一 数据库查询语言sql 1.基本select语句 select 内容 from 表 集合 where 条件 1 内容 是所选定的数据项。2 条件 是选择数据的过滤规则。1 内容 1 代表所有字段 2 若希望单独列出某几个字段,可以使用 col1,col2,的方式。3 不能与 col1,col2,的...

oracle3复杂查询

第三天连接查询和多表查询 1.分组函数。gmax minsum count执行顺序 select wheregroup by h ing order by 返回不重复的部门编号数。sql select count distinct deptno from emp 得到每个部门的人数和最低薪水,平均薪...