oracle学习之多表查询,子查询以及事务处理

多表查询的基础是采用笛卡尔集:

最终的行数 = 表1的行数 * 表2的行数

最终的列数 = 表1的列数 + 表2的列数

过滤笛卡尔集的关键是写连接条件,N张表至少需要N-1个条件。

多表查询例子1,等值与不等值连接,查询员工信息,员工号,姓名,月薪 和部门名称

注意,有歧义的字段必须指定是哪个表,否则将会报错。

当等值连接不成立的时候,想要保留一边的数据,这时需要使用外连接技术!

左外连接的写法,即想保留等号左边的数据,那么在等号右侧添加(+)

自连接,比如查询员工信息,显示为:xxx‘s boss is yyy

解题思路:emp看成2张表,一张员工表,一张老板表

连接条件:员工表的老板(mgr)是老板表的员工(empno)

select e.name||‘‘‘s boss is ‘||nvl(b.ename,‘his wife!‘)
    from emp e,emp b
   where e.mgr = b.empno(+)

  (+)原因在于缺少老板,而使用nvl函数,则是已经是最大的官了

自连接的弊端:即笛卡尔集是平方的增长,大表的时候效率比较低

自连接的使用场景:数据都在同一表;数据不在同一行

子查询,注意事项:

1,合理的书写风格,尤其是较复杂的子查询,要合理的换行和缩进

2,适当的使用()

3,主查询和子查询可以是不同表,只要子查询返回的结果,主查询可以用即可。

//查询部门名称是“SALES”的员工信息
select * from emp where deptno = (select deptno from dept where dname=‘SALES‘);

4,可以在主查询为where ,select,having,from后放置子查询

//查询10号部门员工号,员工姓名,部门编号,部门名称
select e.empno,e.ename,e.deptno,d.dname
    from emp e,dept d
   where e.deptno = d.deptno
    and e.deptno = 10;
//子查询方法:
select empno,ename,deptno,(select dname from dept where deptno=10) from emp where deptno =10;

5,不可以在group by,order by后放置子查询,SQL语法规范

//having后  查询高于30号部门最低薪水的部门及其最低薪水
select deptno,min(sal) from emp group by deptno having min(sal)>(select min(sal) from emp where deptno =30);

6,在from后面放置的子查询(***),要理解为放置的是一个集合

查询员工的性名,薪水和年薪
使用子查询select * from ___________________完成:
即:select * from (select ename,sal,sal*20 from emp);

7,单行子查询只能使用单行操作符 = !=;多行子查询则是使用多行操作符

//查询部门名称为SALES和ACCOUNTING的员工信息
//1,先找到这两的部门编号
select deptno from dept where dname in(‘SALES‘ ,‘ACCOUNTING‘);
//2,变成子查询,IN,取里面的信息
select * from emp where deptno in(select deptno from dept where dname in(‘SALES‘ ,‘ACCOUNTING‘));//多行操作符ANY,取任意一个select * from emp where sal > ANY (select sal from emp where deptno=30);//多行操作符ALL,取所有select * from emp where sal > ALL (select sal from emp where deptno=30);

8,要注意子查询中的NULL值

select * from emp where empno not in (   select distinct mgr from emp where mgr is not null);

9,一般先执行子查询(内查询),然后在执行主查询(外查询)

10,一般不在子查询中使用 order by,但在TOP-N分析问题时,必须使用order by

时间: 2025-01-14 13:21:21

oracle学习之多表查询,子查询以及事务处理的相关文章

Oracle学习(6):子查询

子查询 为何要用子查询 SQL> --查询工资比SCOTT高的员工信息 SQL> --1. 知道SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SAL ---------- 3000 SQL> --2. 查询比3000高的员工 SQL> set linesize 120 SQL> col sal for 9999 SQL> select * from emp where sal>3000; EMP

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.比如SilverStream就是基于数据库的一种中间件.ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能:作为一个关系数据库,它是一个完备关系的产品:作为分布式数据库它实现了分布式处理功能.但它的所有知识,只要在一种机型上学习

Oracle系列:(14)子查询

子查询的作用:查询条件未知的事物 查询条件已知的问题:例如:查询工资为800的员工信息 查询条件未知的问题:例如:查询工资为20号部门平均工资的员工信息 一个条件未知的问题,可以分解为多个条件已知的问题 查询工资比WARD高的员工信息 第一:查询WARD的工资?       select sal from emp where ename = 'WARD'; 第二:查询工资比1250高的员工信息?       select * from emp where sal > 1250; 子查询: sel

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u

sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date desc 逻辑上看着挺对 但是报错: 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效.   只要我们在嵌套子查询视图里面加入: top 100 percent 即可 select * from ( select top 100

除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

报错: 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 只要我们在嵌套子查询视图里面加入:top 100 percent即可 例如: select * from ( select top 100 percent * from tb order by col desc ) as a order by col desc

SQL复杂查询(子查询)

USE STUDY SELECT * from EMP SELECT * FROM SALGRADE --1.查询雇员姓名,所在部门编号和名称 SELECT ename,EMP.deptno,DEPT.deptno FROM EMP INNER JOIN DEPT ON DEPT.deptno =EMP.deptno --2.查询雇员姓名,工作,领导的姓名 SELECT e1.ename,e1.job,e2.ename FROM EMP e1 INNER JOIN EMP e2 on e1.mg

mybatis 嵌套查询子查询column传多个参数描述

mybatis 嵌套查询子查询column传多个参数如下: 1.图解 2.代码示例 备注:注意,相同颜色的单词都是有关联的. <resultMap id="blogResult" type="Blog"> <association property="author" column="{id=author_id,likename=author_name}" javaType="Author"

coding++:mybatis 嵌套查询子查询column传多个参数描述

mybatis 嵌套查询子查询column传多个参数如下: 2.代码示例 备注:注意,相同颜色的单词都是有关联的 <resultMap id="blogResult" type="Blog"> <association property="author" column="{id=author_id,likename=author_name}" javaType="Author" selec