本章目标:
多表查询。联接查询:
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 得到每个部门的人数和最低薪水,平均薪...