`

ORACLE数据库总结04

 
阅读更多

子查询(有函数要用别名)

子查询是嵌套在其他SQL语句之中的,为外层SQL语句提供数据。

 

查看谁的工资比CLARK高?

SELECT ename,sal

FROM emp_brown

WHERE sal>(SELECT sal FROM emp_brown WHERE ename='CLARK')

 

查看与JONES相同部门的员工

SELECT ename,deptno

FROM emp_brown

WHERE deptno=(SELECT deptno FROM emp_brown WHERE ename='JONES')

 

 

 

 

DDL中使用子查询

可以给予一个查询结果集快速创建一张表

 

创建employee,表中的数据来源于emp表

要求的字段:

          empno,ename,sal,deptno,dname,loc

          

CREATE TABLE emp_b

AS

SELECT e.empno,e.ename,e.sal,e.deptno,d.dname,d.loc

FROM emp_brown e JOIN dept_brown d

ON e.deptno=d.deptno(+)

 

或者

 

CREATE TABLE emp_b

AS

SELECT e.empno,e.ename,e.sal,e.deptno,d.dname,d.loc

FROM emp_brown e ,dept_brown d

WHERE e.deptno=d.deptno(+)

 

select *from emp_b

 

当使用子查询创建表时,若SELECT中的字段含有函数或者表达式

必须指定别名

 

 

 

DML中使用子查询

将JONES部门所有人工资提高10%

UPDATE emp_b

SET sal=sal*1.1

WHERE deptno=(SELECT deptno

              FROM emp_b

              WHERE ename='JONES')

              

 

查找薪水比整个机构平均薪水高的员工:

SELECT deptno, ename, sal

FROM emp_brown e

WHERE sal>(SELECT AVG(sal) FROM emp_brown )

 

select * from emp_brown

select * from dept_brown

 

多行单列子查询要配合IN,ANY,ALL进行过滤(不能使用'=')

 

查询出部门中有SALESMAN但职位不是SALESMAN的员工的信息:

SELECT ename,job,deptno

FROM emp_brown

WHERE deptno IN (SELECT deptno FROM emp_brown WHERE job='SALESMAN')

AND job<>'SALESMAN'

 

查看比职位是CLERK与SALESMAN工资都高的员工--职位(WHERE子查询) 工资(WHERE)

SELECT ename,sal

FROM emp_brown

WHERE sal>ALL(SELECT sal FROM emp_brown WHERE job IN ('CLERK','SALESMAN'))

 

 

EXISTS关键字(前面可以加NOT)

EXISTS后面跟一个子查询,当该子查询可以查询出至少一条记录时返回真

 

哪些有员工的部门信息

SELECT deptno,dname 

FROM dept_brown d

WHERE EXISTS(SELECT * FROM emp_brown e

             WHERE d.deptno=e.deptno)

 

查看有下属的员工(先看领导再看下属)

SELECT m.ename,m.mgr,m.empno

FROM emp_brown m

WHERE EXISTS(SELECT * FROM emp_brown e

             WHERE e.mgr=m.empno)

 

查看公司部门的最低薪水,前提是(HAVING)该薪水要高于30号部门的最低薪水

 

SELECT MIN(sal)

FROM emp

WHERE deptno=30

 

SELECT MIN(sal),deptno

FROM emp

WHERE GROUP BY deptno

 

SELECT MIN(sal),deptno

FROM emp_brown

GROUP BY deptno

HAVING MIN(sal)>(SELECT MIN(sal)

                FROM emp_brown

                WHERE deptno=30)

                

 

 

 

FROM当中使用子查询,就是将子查询的结果集

当成一张表看待。

 

查看哪些员工比自己所在部门平均工资高?

1查看每个部门的平均工资

SELECT AVG(sal) avg_sal,deptno

FROM emp

GROUP BY deptno

 

假设有T表

SELECT e.ename,e.sal,e.deptno

FROM emp e,T t

WHERE e.deptno=t.deptno

AND e.sal>avg_sal

即:

SELECT e.ename,e.sal,e.deptno

FROM emp_brown e,(SELECT AVG(sal) avg_sal,deptno

                  FROM emp

                  GROUP BY deptno) t

WHERE e.deptno=t.deptno

AND e.sal>avg_sal

 

 

子查询在SELECT子句中的使用(类似左右外连接)

SELECT e.ename,e.sal,(SELECT d.dname 

                      FROM dept_brown d

                      WHERE d.deptno = e.deptno) dname

FROM emp_brown e                     

 

 

 

 

分页查询

 

当数据库中查询的数据量过大时,会使用分页查询,一次只查询出部分数据,

这样做可以降低系统资源消耗,提高数据库响应速度,减少网络传输等

 

分页查询标准SQL中没有为其定义语法,所以不用的数据库中分页语句写法不同

 

 

 

ROWNUM:伪列

ROWNUM不存在于任何表,但是任何表都可以查询该字段,

该字段的值随着查询结果集的产生而动态生成值。

当查询语句从表中查询出一条记录时,该记录的ROWNUM字段值从1开始,

每当查询出一条记录ROWNUM自增1

 

SELECT ROWNUM,ename,sal,deptno

FROM emp_brown

 

SELECT ROWNUM,ename,sal,deptno

FROM emp_brown

WHERE ROWNUM>6

在使用ROWNUM为结果集编号的查询过程中

不应使用ROWNUM做>1以上数字的判断为过滤条件,否则得不到任何结果。

 

查看公司工资排名的6-10名:

(ORDER BY 执行顺序靠后)

SELECT *

FROM(SELECT ROWNUM rn,ename,sal,deptno

     FROM emp_brown)

WHERE rn BETWEEN 6 AND 10

 

 

select * from emp_brown

(1.先排序)

SELECT ename,sal,deptno

FROM emp_brown

ORDER BY sal desc

(2.编号 3.取范围)

SELECT * 

FROM(SELECT ROWNUM rn,t.* 

     FROM(SELECT * FROM emp_brown 

         ORDER BY sal DESC)t)

WHERE rn BETWEEN 6 AND 10 

 

优化执行速度(2.编号步骤时,10以后的就不用编号了)

SELECT * 

FROM(SELECT ROWNUM rn,t.* 

     FROM(SELECT * FROM emp_brown 

         ORDER BY sal DESC)t

         WHERE ROWNUM <=10)

WHERE rn >= 6

 

 

 

使用子查询进行分页

 

每页显示的条目数:pageSize

页数:page

例如:

pageSize:5

page:2

start:(page-1)*pageSize+1

end=pageSize*page

 

 

 

DECODE函数

DECODE(expr, search1, result1[, search2, result2…][, default])

当第一个参数等于第二个参数值,函数返回第三个参数值,否则判断是否等于第四个参数值,

若相等则返回第五个参数值,以此类推。最后可以单独制定一个参数,当前面的所有判断都不成立时

返回最后单独的参数,若不制定,函数返回NULL。函数要求至少传入三个参数。

SELECT ename,job,sal,

      DECODE(job,

            'MANAGER',sal*1.2,

            'ANALYST',sal*1.1,

            'SALESMAN',sal*1.05,

            sal) bonus

FROM emp_brown

 

和DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。

SELECT ename, job, sal,

     CASE job WHEN 'MANAGER' THEN sal * 1.2

              WHEN 'ANALYST' THEN sal * 1.1

              WHEN 'SALESMAN' THEN sal * 1.05

              ELSE sal END

     bonus

FROM emp_brown;

 

DECODE在GROUP BY中的应用

将MANAGER与ANALYST看做一组,其他职位看做另一组分别统计人数?

SELECT

    COUNT(*),DECODE(job,

                    'MANAGER','VIP',

                    'ANALYST','VIP',

                    'OTHER') job

FROM emp_brown

GROUP BY DECODE(job,

                    'MANAGER','VIP',

                    'ANALYST','VIP',

                    'OTHER');

 

 

DECODE函数也可以按字段内容排序,例如:Dept表中按“OPERATIONS”、“ACCOUNTING”、“SALES”排序

SELECT deptno, dname, loc

FROM dept_brown

ORDER BY 

      DECODE(dname, 'OPERATIONS',1,'ACCOUNTING',2,'SALES',3), loc;

      

 

 

      

排序函数

排序函数可以将结果集按照制定的字段分组

在按照制定的字段对组内记录排序,最终生成组内编号。

 

 

ROW_NUMBER

组内部排序后的顺序编号,组内连续且唯一。

表示根据col1分组,在分组内部根据col2排序。

ROW_NUMBER() OVER(

          PARTITION BY col1 ORDER BY col2)

 

查看每个部门的工资排名      

SELECT ename,sal,deptno,

ROW_NUMBER() OVER(

                  PARTITION BY deptno

                  ORDER BY sal DESC) rank

FROM emp_brown;

 

RANK

组内部排序后的顺序编号,组内不连续且不唯一。

SELECT ename,sal,deptno,

RANK() OVER(

            PARTITION BY deptno

            ORDER BY sal DESC) rank

FROM emp_brown;

 

 

 

 

DENSE_RANK

生成组内连续但不唯一的数字

SELECT ename,sal,deptno,

DENSE_RANK() OVER(

                  PARTITION BY deptno

                  ORDER BY sal DESC) rank

FROM emp_brown; 

 

 

 

集合操作

UNION,UNION ALL

并集(会去掉合并后重复的记录)

SELECT ename,job,sal From emp

WHERE job = 'MANAGER'

UNION

SELECT ename,job,sal From emp

WHERE sal>2500;

并集(不会去掉合并后重复的记录)

SELECT ename,job,sal From emp

WHERE job = 'MANAGER'

UNION ALL

SELECT ename,job,sal From emp

WHERE sal>2500;

 

交集(同时存在于两个结果集中才会显示出)

SELECT ename,job,sal From emp

WHERE job = 'MANAGER'

INTERSECT

SELECT ename,job,sal From emp

WHERE sal>2500;

 

差集(在第一个结果集中存在,第二个结果集中不存在的。相当于2在1中的补集)

SELECT ename,job,sal From emp

WHERE job = 'MANAGER'

MINUS

SELECT ename,job,sal From emp

WHERE sal>2500;

 

 

 

高级分组函数

 

CREATE TABLE sales_brown (

year_id   NUMBER NOT NULL,

month_id   NUMBER NOT NULL,

day_id   NUMBER NOT NULL,

sales_value NUMBER(10,2) NOT NULL

);

 

INSERT INTO sales_brown

SELECT TRUNC(DBMS_RANDOM.value(2010,2012)) AS year_id,

       TRUNC(DBMS_RANDOM.value(1,13)) AS month_id,

       TRUNC(DBMS_RANDOM.value(1,32)) AS day_id,

       ROUND(DBMS_RANDOM.value(1,100),2) AS sales_value

FROM   dual

CONNECT BY level <= 1000;

 

desc sales_brown;

select * from sales_brown;

 

营业额按年月日分组排序

SELECT year_id,month_id,day_id,sales_value

FROM sales_brown

ORDER BY year_id,month_id,day_id;

 

每天的营业额?

SELECT year_id,month_id,day_id,SUM(sales_value)

FROM sales_brown

GROUP BY year_id,month_id,day_id

ORDER BY year_id,month_id,day_id;

 

每月的营业额?

SELECT year_id,month_id,SUM(sales_value)

FROM sales_brown

GROUP BY year_id,month_id

ORDER BY year_id,month_id;

 

每年的营业额?

SELECT year_id,SUM(sales_value)

FROM sales_brown

GROUP BY year_id

ORDER BY year_id;

 

总营业额?

SELECT SUM(sales_value)

FROM sales_brown

 

ROLLUP()函数

GROUP BY ROLLUP(a,b,c)

等同于:

GROUP BY a,b,c

UNION ALL

GROUP BY a,b,

UNION ALL

GROUP BY a,

UNION ALL

全表

 

每年月日和总的的营业额?

SELECT year_id,month_id,day_id,SUM(sales_value)

FROM sales_brown

GROUP BY ROLLUP(year_id,month_id,day_id)

ORDER BY year_id,month_id,day_id;

 

CUBE函数

CUBE会将每个参数的组合都进行一次分组

分组次数为2的参数个数次方

GROUP BY CUBE(a,b,c)

相当于:

a,b,c

a,b

a,c

b,c

a

b

c

全表

 

SELECT year_id,month_id,day_id,SUM(sales_value)

FROM sales_brown

GROUP BY CUBE(year_id,month_id,day_id)

ORDER BY year_id,month_id,day_id;

 

 

 

 

GROUPING SETS()函数

GROUPING SET的每一个参数是一个分组方式

该函数会将这些分组统计的结果并在一个结果集显示

 

只查看每天与每月营业额?

SELECT year_id,month_id,day_id,SUM(sales_value)

FROM sales_brown

GROUP BY GROUPING SETS(

                      (year_id,month_id,day_id),

                      (year_id,month_id)

)

ORDER BY year_id,month_id,day_id;

 

分享到:
评论

相关推荐

    ORACLE数据库学习总结资料.pdf

    Oracle数据库学习总结资料.pdf Oracle数据库学习总结资料.pdf 是一份关于 Oracle 数据库的学习总结资料,涵盖了 Oracle 数据库的各个方面,包括 Oracle 的简介、简单查询、标量函数和算数运算、多表查询、列函数和...

    Oracle数据库总结

    Oracle 数据库总结 Oracle 数据库是甲骨文公司的一款关系数据库管理系统,是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。下面是 Oracle 数据库的总结...

    查看登录oracle数据库用户记录.docx

    "查看登录 Oracle 数据库用户记录" Oracle 数据库是一个强大的关系型数据库管理系统,提供了强大的数据存储和管理功能。为了管理和监控数据库的访问情况,需要对登录 Oracle 数据库的用户记录进行跟踪和查看。本文...

    oracle数据库日志查看方法

    ### Oracle数据库日志查看方法详解 #### 一、概述 Oracle数据库是企业级应用中广泛使用的数据库管理系统之一,为了确保数据库系统的稳定运行和快速定位问题,掌握Oracle数据库日志查看方法至关重要。本文将详细...

    Oracle数据库知识点总结 Oracle数据库架构与组件学习攻略

    Oracle数据库知识点总结 章节目录 一、Oracle数据库概述 二、Oracle数据库架构与组件 三、SQL语言基础 四、PL/SQL编程 五、数据库对象管理 六、数据备份与恢复 七、性能优化与安全管理 八、如何学习Oracle数据库 九...

    oracle数据库

    oracle数据库总结oracle数据库总结oracle数据库总结oracle数据库总结

    oracle数据库总结.sql

    oracle数据库总结

    Oracle数据库的启停

    Oracle 数据库的启停 Oracle 数据库的启停是数据库管理员的重要任务之一。启停数据库的过程可以细分为三个步骤:启动实例、挂载数据库、打开数据库。下面将详细讲解 Oracle 数据库的启停过程。 启动数据库 启动...

    ORACLE数据库设计与优化

    总结,Oracle数据库设计与优化是一个涉及多方面知识的复杂过程,包括但不限于物理结构设计、SQL优化、索引策略、存储过程使用、性能监控以及备份恢复策略。理解这些核心概念并灵活应用,将有助于构建高效、稳定且...

    labview 调用oracle数据库

    总结,LabVIEW调用Oracle数据库涉及的关键点有:使用ODBC连接数据库、构建和执行SQL命令、创建和操作数据库表。理解这些概念和步骤,将有助于在LabVIEW环境中有效地管理和操作Oracle数据库。在实际应用中,还要考虑...

    C#版Oracle数据库通用操作类

    ### C# 版 Oracle 数据库通用操作类解析 在现代软件开发中,数据库操作是必不可少的一部分,而 C# 结合 Oracle 数据库的应用尤为广泛。本文将深入探讨一个用于简化 Oracle 数据库操作的 C# 类——`ConnForOracle`。...

    Oracle数据库开发和设计规范

    本文档总结了 Oracle 数据库开发和设计规范的主要内容,包括命名约定、表名规则、存储过程规则、视图规则、索引规则、序列规则、主键规则和外键规则等。 一、命名约定 Oracle 数据库开发和设计规范中,命名约定是...

    Oracle-新建Oracle数据库并连接(图文,详细).docx

    新建Oracle数据库并连接详细教程 在这篇教程中,我们将学习如何新建Oracle数据库并连接到该数据库。该教程分为两部分:新建Oracle数据库和连接到数据库。 新建Oracle数据库 新建Oracle数据库需要使用Database ...

    Oracle数据库命令 个人总结

    "Oracle数据库命令个人总结" Oracle数据库命令个人总结是徐博文在2014年3月整理的关于Oracle数据库的命令和心得的总结。下面是从该总结中提取的重要知识点: 1. 查询数据库数据文件的基本字段信息:使用DESC DBA_...

    oracle数据库克隆总结

    ### Oracle数据库克隆总结 #### 一、Oracle数据库克隆概述 在企业级应用中,Oracle数据库因其稳定性和高效性而被广泛采用。随着业务需求的变化和技术的发展,Oracle数据库克隆成为了维护和管理数据库的一项重要...

    access数据库MDB数据文件导入oracle数据库操作步骤.pdf

    Access 数据库 MDB 数据文件导入 Oracle 数据库操作步骤 Access 数据库 MDB 文件是 Microsoft Access 应用程序的数据库文件格式,而 Oracle 数据库是关系数据库管理系统。将 Access 数据库 MDB 文件导入 Oracle ...

    oracle数据库学习总结.doc.docx

    Oracle数据库是一种广泛应用于企业级应用中的关系型数据库管理系统,由美国甲骨文公司开发。在学习Oracle数据库的过程中,我们可以从以下几个关键知识点入手: 1. **可移植性和兼容性**: Oracle数据库因其采用...

    Oracle到Mysql数据库迁移总结

    Oracle到Mysql数据库迁移总结Oracle到Mysql数据库迁移总结Oracle到Mysql数据库迁移总结Oracle到Mysql数据库迁移总结

Global site tag (gtag.js) - Google Analytics