当前位置:文档之家› Oracle 基础

Oracle 基础

使用“*”效率不高

54 、什么是 java 序列化,如何实现 java 序列化?
答: 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

Oracle 面试 笔试题


1. 解释冷备份和热备份的不同点以及各自的优点

解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)

2. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?

解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。

3. 如何转换init.ora到spfile?解答:使用create spfile from pfile 命令。

4. 解释data block , extent 和 segment的区别(这里建议用英文术语)

解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.

5. 给出两个检查表结构的方法

解答:1.describe命令

2.dbms_metadata.get_ddl 包

6. 怎样查看数据库引擎的报错

解答:alert log.

7. 比较truncate和delete 命令

解答:两者都可以用来删除表中所有的记录。区别在于:truncate是ddl操作,它移动hwk,不需要 rollback segment .而delete是dml操作, 需要rollback segment 且花费较长时间。

8. 使用索引的理由

解答:快速访问表中的data block

9. 给出在star schema中的两种表及它们分别含有的数据

解答:fact tables 和dimension tables. fact table 包含大量的主要的信息而 dimension tables 存放对fact table 某些属性描述的信息

10. fact table上需要建立何种索引?

解答:位图索引(bitmap index)

11. 给出两种相关约束?

解答:主键和外键

12.

如何在不影响子表的前提下,重建一个母表

解答:子表的外键强制实效,重建母表,激活外键

13. 解释归档和非归档模式之间的不同和它们各自的优缺点

解答:归档模式是指你可以备份所有的数据库 transactions并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高。

14. 如何建立一个备份控制文件?

解答:alter database backup control file to trace.

15. 给出数据库正常启动所经历的几种状态 ?

解答:startup nomount 数据库实例启动

startup mount 数据库装载

startup open 数据库打开

16. 哪个column可以用来区别v$视图和gv$视图?

解答: inst_id 指明集群环境中具体的某个instance .

17. 如何生成explain plan?

解答:运行utlxplan.sql. 建立plan 表

针对特定sql语句,使用 explain plan set statement_id = ’tst1’ into plan_table

运行utlxplp.sql 或 utlxpls.sql察看explain plan

18. 如何增加buffer cache的命中率?

解答:在数据库较繁忙时,适用buffer cache advisory 工具,查询v$db_cache_advice . 如果有必要更改,可以使用 alter system set db_cache_size 命令

19. ora-01555的应对方法?

解答:具体的出错信息是snapshot too old within rollback seg , 通常可以通过增大rollback seg来解决问题。当然也需要察看一下具体造成错误的sql文本

20. 解释$oracle_home和$oracle_base的区别?

解答:oracle_base是oracle的根目录,oracle_home是oracle产品的目录。

数据库 2007-05-27 21:13:07 阅读167 评论0 字号:大中小 订阅



、选择题(20分,每小题2分):

1.数据库系统的核心是_B___。

A.数据库 B.数据库管理系统

C.数据模型 D.软件工具

2.SQL语言具有__B__的功能。

A.关系规范化、数据操纵、数据控制

B.数据定义、数据操纵、数据控制

C.数据定义、关系规范化、数据控制

D.数据定义、关系规范化、数据操纵

3.SQL语言的数据操纵语句包括 SELECT,INSERT,UPDATE和 DELETE,

最重要的,也是使用最频繁的语句是__A__。

A.SELECT B.INSERT C.UPDATE D.DELETE

4.在关系数据库设计中,设计关系模式是__C__的任务。

A.需求分析阶段 B.概念设计阶段 C.逻辑设计阶段 D.物理设计阶段

5.__C__是DBMS的基本单位,它是用户定义的一组逻辑一致的程序序列。

A.程序 B.命令 C.事务 D.文件

6.在数据库中,产生数据不一致的根本原因是__D__。????

A.数据存储量太大

B.没有严格保护数据

C.未对数据进行完整性控制

D.数据冗余

7.下列SQL语句中,创建关系表的是__B__



A.ALTER B.CREATE

C.UPDATE D.INSERT

8.数据库的__B__是为了保证由授权用户对数据库所做的修改不会影响数据一致性的损失。

A.安全性 B.完整性 C.并发控制 D.恢复

9.事务是数据库进行的基本工作单位。如果一个事务执行成功,则全部更新提交;如果一个事务执行失败,则已做过的更新被恢复原状,好像整个事务从未有过这些更新,这样保持了数据库处于_____B___状态。

A.安全性 B.一致性 C.完整性 D.可靠性

10.对并发操作若不加以控制,可能会带来数据的___D_问题。

A.不安全 B.死锁 C.死机 D.不一致

二、填空题(12分,4小题)

1.数据冗余可能导致的问题有____________________和_____________________。

答案:①浪费存储空间及修改麻烦 ②潜在的数据不一致性

2.数据库在运行过程中可能产生的故障有____________、_______________、___________。

答案:①Transaction failure ②System crash ③Disk failure

3.视图是一个虚表,它是从_________中导出的表。在数据库中,只存放视图的________,不存放视图的_____________。

答案:一个或几个基本表、定义、视图对应的数据

4.关系操作的特点是____________操作。

答案:集合

三、简答题(共48分,每小题6分):

1、 如何创建表、修改表、删除表?

Create table 表名

Alter table 表名

Drop table 表名

2、 存储过程的优点是什么?

存储过程的优点:

1.提高性能

2.减轻网络拥塞

3.一致性较好

4.改善安全机制

3、 什么是触发器?触发器有哪几种?触发器有什么优点?

一个触发器是由T-SQL语句集组成的代码块,在响应某些动作时激活该语句集

有insert,delete,update触发器

它防止了对数据的不正确、未授权的和不一致的改变

4、 常见的几种约束有哪些?分别代表什么意思?如何使用?

主键约束,外键约束,检查约束,唯一约束,默认约束

约束:在Create table或alter table时加约束

(1)主键:PRIMARY KEY (主键字段) 保证了实体完整性,一个表只有一个主键,但一个主键可有包 含多个字段,主键字段不能为空

(2)唯一:UNIQUE (约束字段) 保证了实体完整性,一个表只有多个唯一约束,一个唯一约束可有包含多个字段

(3)外键:FOREIGN KEY (外键字段) REFERENCES 主键表(主键字段) 保证了引用完整性,一个表可以有多个外键

(4)检查:CHECK(检查表达式) 保证了域完整性, 一个表中可以有多个检查性约束

(5)默认值:DEFAULT

(默认值的表达式或NULL) for 字段名 保证了域完整性,一个表可以有多个默认值约束,但是一个字段只有一个 默认值

5、什么是数据库的安全性?(5分)

数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。

6、简要说明事务的原子性。(5分)

事务的所有操作必须完成,否则事务将被撤消。也就是说,事务是作为一个整体的单位处理,不可以被分割

7、事务中的提交和回滚是什么意思?(5分)

事务中的提交(COMMIT)是提交事务的所有操作。具体说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。

事务中的回滚(ROLLBACK)是数据库滚回到事务开始时的状态。具体地说就是,在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤消,使数据库回滚到事务开始时的状态。

8、什么是数据库的数据独立性?(5分)

数据独立性表示应用程序与数据库中存储的数据不存在依赖关系,包括逻辑数据独立性和物理数据独立性。

逻辑数据独立性是指局部逻辑数据结构(外视图即用户的逻辑文件)与全局逻辑数据结构(概念视图)之间的独立性。当数据库的全局逻辑数据结构(概念视图)发生变化(数据定义的修改、数据之间联系的变更或增加新的数据类型等)时,它不影响某些局部的逻辑结构的性质,应用程序不必修改。

物理数据独立性是指数据的存储结构与存取方法(内视图)改变时,对数据库的全局逻辑结构(概念视图)和应用程序不必作修改的一种特性,也就是说,数据库数据的存储结构与存取方法独立。

数据独立性的好处是,数据的物理存储设备更新了,物理表示及存取方法改变了,但数据的逻辑模式可以不改变。数据的逻辑模式改变了,但用户的模式可以不改变,因此应用程序也可以不变。这将使程序维护容易,另外,对同一数据库的逻辑模式,可以建立不同的用户模式,从而提高数据共享性,使数据库系统有较好的可扩充性,给 DBA维护、改变数据库的物理存储提供了方便。



一﹑选择题

(1)系统软件一般包括( D )

1.服务性程序 2.语言处理程序

3. 操作系统 4.数据库管理系统

A.1,2,3 B. 1,3,4

C.2,3,4 D.全部

(2)为提高产品质量,降低生产成本,利用计算机控制,操作和管理生产设备的系统称为 ( D )

A. CAT

B. CAI C. CAD D. CAM

(3)计算机输出设备的功能是 ( D )

A. 将计算机运算的二进制结果信息打印输出

B. 将计算机内部的二进制信息显示输出

C. 将计算机运算的二进制结果信息打印输出和显示输出

D. 将计算机内部的二进制信息转换为人和设备能识别的信息
(4)Internet上的计算机,在通信之前需要 ( C )

A.建立主页 B.指定一个IP地址 C.使用WWW服务 D.发送电子邮件

(5)信息传输的安全应保证信息在网络传输的过程中不被泄漏和不被攻击,下列哪些属于攻击方法 ( D )

1.复制信息 2.剪裁信息 3.窃听信息

A.1,2 B. 2,3 C. 1,3 D. 全部

(6)计算机病毒是一种具有破坏性的程序,它是 ( C )

A. 最初由系统自动生成的程序 B. 具有恶毒内容的文件

C. 具有自我在生能力的程序 D. 只通过网络传播的文件

(7)以下关于数据的存储结构的叙述哪一条是正确的? ( B )

A. 数据的存储结构是数据间关系的抽象描述

B. 数据的存储结构是逻辑结构在计算机存储器中的实现

C. 数据的存储结构分为线性结构和非线性结构

D. 数据的存储结构对数据运算的具体实现没有影响

(8)以下关于队列的叙述中哪一条是不正确的? ( D )

A. 先进先出 B. 即能用顺序存储,也能用链接存储

C. 适用于二叉树的对称序周游算法的实现 D. 适用于树的层次次序周游算法的实现
(9)单链表的每个结点中包括一个指针link,它指向该结点的后继结点。现要将指针q指向的新结点插入到指针p的单链表结点之后,下面的哪条操作是对的? ( C )

A. q:=p^.link; p^.link:=q^.link; B. p^.link:=q^.link; q:=p^.link;

C. q^.link:=p^.link; p^.link:=q; D. p^.link:=q; q^.link:=p^.link;

(10)按行优先序存储下三角矩阵的非零元素,则计算非零元素Aij的地址的公式为( D )

A. LOC(Aij)=LOC(a11)+I*(I+1)/2+j

B. LOC(Aij)=LOC(a11)+I*(I+1)/2+(j-1)

C. LOC(Aij)=LOC(a11)+I*(I-1)/2+j

D. LOC(Aij)=LOC(a11)+I*(I-1)/2+(j-1)



(11)二叉数的结点前序序列为E,A,C,B,D,G,F,对称序序列为A,B,C,D,E,F,G。责该二叉树的后序序列为 ( A )

A. B,D,C,A,F,G,E

B. B,D,C,F,A,G,E

C. E,G,F,A,C,D,B

D. E,G,A,C,D,F,B

(12)上题中的

二叉树对应的树林包括多少棵树? ( C )

A. 1 B. 2 C. 3 D. 4
(13)顺序表中(3,6,8,10,12,15,16,18,21,25,30),用二分法查找11,所需的比较次数为 ( C )

A. 2 B. 3 C. 4 D. 5

(14)散列表的地址空间为0到10,散列函数为h(k)=k mod 11,依次插入95,14,27,68,82,责82的地址为 ( C )

A. 4 B. 5 C. 6 D. 7

(15)引入多道程序设技技术的目的是 ( C )

A. 增强系统的用户友好性 B. 提高系统实时性

C. 充分利用处理器资源 D. 扩充内存容量

(16)在程序状态字PSW中设置了一位,用于控制用户程序不能执行特权指令,这一位是 ( C )

A. 保护位 B. CPU状态位 C. 屏蔽位 D. 条件位

(17)关于当前目录的说法中,哪个错的? ( D )

A. 每个用户可以有一个当前目录 B. 引入当前目录可以加快索引速度

C. 查找文件时可以使用部分路径名 D. 当前目录不能随意改变

(18)文件系统的多级目录结构是 ( B )

A. 线性结构 B. 树形结构 C. 散列结构 D. 双链表结构

(19)构成文件的基本单位是字符,这一类文件称为 ( A )

A. 流式文件 B. 记录式文件 C. 顺序文件 D. 索引文件
(20)在数据库技术中,反映现实世界中事物的存在方式和运动状态的是 ( A )

A. 信息 B. 数据 C. 消息 D. 命令



(21)在关系模式中,视图是三级模式结构中的 ( D )

A. 内模式 B. 模式 C. 存储模式 D. 外模式

(22)在数据库的三级模式中,内模式有 ( A )

A. 1 B. 2 C. 3 D. 多个

(23)在关系数据库中,当关系的型改变时,用户程序也可以不变。这是 ( B )

A. 物理独立性 B. 逻辑独立性 C. 位置独立性 D. 存储独立性

(24)有关系 R ,S ( A ) R S

A B C B E

A1 b1 5 b1 3

A1 b2 6 b2 7

A2 b3 8 b3 10

A2 b4 12 b4 2

B5 2

若R,S操作结果如下,是执行了哪种条件的连接

A R.B C S.B E

A1 b1 5 b2 7

A1 b1 5 b3 10

A1 b2 6 b2 7

A1 b2 6 b3 10

A2 b3 8 b3 10

A. R (CE)S C. R(R.B=S.B)S D. R S
(25)若R,S操作结果如下,是执行了哪种条件的连接 ( C )

A B C E

A1 b1 5 3

A1 b

2 6 7

A2 b3 8 10

A2 b4 12 2

A. R (CE)S C. R(R.B=S.B)S D. R S

(26)对于学生—选课—课程的三个关系

S(S#,SNAME,SEX,AGE) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER)

为了提高查询速度,对SC表创建唯一索引,应建哪个组上 ( A )

A. (S#,C#) B. S# C. C# D. GRADE

(27)接上题,为了考虑安全性,每个教师只能存取自己讲授的课程的学生成绩,应创建 ( A )

A. 视图 B. 索引 C. 游标 D. 表



(28)下列哪种方法不是并行数据库物理存储中常用的关系划分方法? ( B )

A. 轮转法 B.. 投影法 C. 散列分布 D. 范围分布

(29)下述哪一个SQL语句用于实现数据存储的安全机知 ( C )

A. COMMIT B. ROLLBACK C. GRANT D. CREATE TABLE
(30)关系模式中R(B,C,M,T,A,G),根据语义有如下函数依赖集:

F={ B-àC, (M,T)--àB,(M,C)-àT,(M,A)-àT,(A,B)--àG }

关系模式R的码是 ( D )

A. (M,T) B. (M,C) C. (M,A) D.(A,B)

(31)R的规范化程度最高达到 ( B )

A. 1NF B. 2NF C. 3NF D. 4NF

(32)下列关于“分布式数据库系统”的叙述中,正确的是 ( C )

A. 分散在各结点的数据是不相关的

B. 用户可以对远程数据进行访问,但必须指明数据的存储结点

C. 每一个结点是一个独立的数据库系统,既能完成局部应用,也支持全局应用

D. 数据可以分散在不同结点的计算机上,但必需在同一台计算机上进行数据处理



02.查询职位(JOB)为'PRESIDENT'的员工的工资
Sql代码 复制代码 收藏代码

select sal from emp where job='PRESIDENT';

03.查询佣金(COMM)为0或为NULL的员工信息
C#代码 复制代码 收藏代码

select * from emp where comm is null or comm=0;

04.查询入职日期在1982-5-1到1981-12-31之间的所有员工信息
Sql代码 复制代码 收藏代码

select * from emp where hiredate between to_date('1981-05-01','YYYY-MM-DD') and to_date('1981-12-31','YYYY-MM-DD');

05.查询所有名字长度为4的员工的员工编号,姓名
Sql代码 复制代码 收藏代码

select empno,ename from emp where length(ename)=4;

06.显示10号部门的所有经理('MANAGER')和20号部门的所有职员('CLERK')的详细信息
Sql代码 复制代码 收藏代码

select * from emp where deptno=10 and job='MANAGER' or deptno=20 and job='CLERK';

07.显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息
Sql代码 复制代码 收藏代码

select * from emp where ename not like '%L%' or ename like '%SM%';

08.显示各个部门经

理('MANAGER')的工资
Sql代码 复制代码 收藏代码

select sal from emp where job='MANAGER';

09.显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
Sql代码 复制代码 收藏代码

select * from emp where comm>sal;

10.把hiredate列看做是员工的生日,求本月过生日的员工(考察知识点:单行函数)
Sql代码 复制代码 收藏代码

select * from emp where to_char(hiredate,'mm')=to_char(sysdate,'mm');

11.把hiredate列看做是员工的生日,求下月过生日的员工(考察知识点:单行函数)
Sql代码 复制代码 收藏代码

select * from emp where to_char(hiredate,'mm')=to_char(add_months(sysdate,1),'mm');

12.求1982年入职的员工(考察知识点:单行函数)
Sql代码 复制代码 收藏代码

select * from emp where hiredate between to_date('1982-01-01','YYYY-MM-DD') and to_date('1982-12-31','YYYY-MM-DD');

--------等效于---------->
Sql代码 复制代码 收藏代码

select * from emp where to_char(hiredate,'yyyy')='1982';

13.求1981年下半年入职的员工(考察知识点:单行函数)
Sql代码 复制代码 收藏代码

select * from emp where hiredate between to_date('1981-07-01','YYYY-MM-DD') and to_date('1981-12-31','YYYY-MM-DD');

14.求1981年各个月入职的员工个数(考察知识点:组函数)
Sql代码 复制代码 收藏代码

select count(*),to_char(trunc(hiredate,'month'),'YYYY-MM-DD') from emp where to_char(hiredate,'yyyy')='1981' group by trunc(hiredate,'month');

15.查询各个部门的平均工资
Sql代码 复制代码 收藏代码

select avg(nvl(sal,0)),deptno from emp group by deptno;

16.显示各种职位的最低工资
Sql代码 复制代码 收藏代码

select job,min(nvl(sal,0)) from emp group by job;

17.按照入职日期由新到旧排列员工信息
Sql代码 复制代码 收藏代码

select * from emp order by hiredate desc;

18.查询员工的基本信息,附加其上级的姓名
Sql代码 复制代码 收藏代码

select e.*,e1.ename as "上级的姓名" from emp e inner join emp e1 on e.mgr=e1.empno;

-------等效于--------->
Sql代码 复制代码 收藏代码

select e.*,e1.ename from emp e,emp e1 where e.mgr=e1.empno;

19.显示工资比'ALLEN'高的所有员工的姓名和工资
Sql代码 复制代码 收藏代码

select ename,sal from emp where sal>(select sal from emp where ename='ALLEN');

20.显示与'SCOTT'从事相同工作的员工的详细信息
Sql代码 复制代码 收藏代码

select * from emp where job=(select job from emp where ename='SCOTT');

21.显示销售部('SALESMAN')员工的姓名
Sql代码 复制代码 收藏代码

select ename from emp e,dept d where e.deptno=d.deptno and d.dname='SALESMAN';

22.显示与30号部门'MARTIN'员工工资相同的员工的

姓名和工资
Sql代码 复制代码 收藏代码

select ename,sal from emp where sal=(select sal from emp where ename='MARTIN' and deptno=30);

23.查询所有工资高于平均工资的销售人员('SALESMAN')
Sql代码 复制代码 收藏代码

select * from emp where job='SALESMAN' and sal>(select nvl(sal,0) from emp);

24.显示所有职员的姓名及其所在部门的名称和工资
Sql代码 复制代码 收藏代码

select ename,dname as "部门名称",sal from emp e inner join dept d on e.deptno=d.deptno;

25查询在研发部('RESEARCH')工作员工的编号,姓名,工作部门,工作所在地
Sql代码 复制代码 收藏代码

select empno,ename,dname,loc from emp,dept where emp.deptno=dept.deptno and dname='RESEARCH';

26.查询各个部门的名称和员工人数
Sql代码 复制代码 收藏代码

select * from (select deptno,count(*) from emp group by deptno) e inner join dept on e.deptno=dept.deptno;

27.查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位
Sql代码 复制代码 收藏代码

select count(*),job from emp where sal>(select avg(sal) from emp) group by job;

28.查询工资相同的员工的工资和姓名
Sql代码 复制代码 收藏代码

select * from emp e where (select count(*) from emp where sal=e.sal group by sal)>1;

29.查询工资最高的3名员工信息
Sql代码 复制代码 收藏代码

select * from (select * from emp order by sal desc) where rownum<=3;

30.按工资进行排名,排名从1开始,工资相同排名相同(如果两人并列第1则没有第2名,从第3名继续排)
Sql代码 复制代码 收藏代码

select e.*,(select count(*) from emp where sal>e.sal)+1 rank from emp e order by rank;

31.求入职日期相同的(年月日相同)的员工
Sql代码 复制代码 收藏代码

select * from emp e where (select count(*) from emp where e.hiredate=hiredate)>1;

32.查询每个部门的最高工资
Sql代码 复制代码 收藏代码

select deptno,max(sal) from emp group by deptno order by deptno;

33.查询每个部门,每种职位的最高工资
Sql代码 复制代码 收藏代码

select deptno,job,max(sal) from emp group by deptno,job order by deptno,job;

34.查询每个部门有多少人
Sql代码 复制代码 收藏代码

select deptno,count(*) from emp group by deptno;



1、select ename, sal * 12 from emp; //计算年薪
2、select 2*3 from dual; //计算一个比较纯的数据用dual表
3、select sysdate from dual; //查看当前的系统时间
4、select ename, sal*12 anuual_sal from emp; //给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。
5、任何含有空值的数学表达式,最后的计算结果都是空值。
6、select ename||sal from emp; //(将sal的查

询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接)
7、select ename||'afasjkj' from emp; //字符串的连接
8、select distinct deptno from emp; //消除deptno字段重复的值
9、select distinct deptno , job from emp; //将与这两个字段都重复的值去掉
10、select * from emp where deptno=10; //(条件过滤查询)
11、select * from emp where empno > 10; //大于 过滤判断
12、select * from emp where empno <> 10 //不等于 过滤判断
13、select * from emp where ename > 'cba'; //字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的
14、select ename, sal from emp where sal between 800 and 1500; //(between and过滤,包含800 1500)
15、select ename, sal, comm from emp where comm is null; //(选择comm字段为null的数据)
16、select ename, sal, comm from emp where comm is not null; //(选择comm字段不为null的数据)
17、select ename, sal, comm from emp where sal in (800, 1500,2000); //(in 表范围)
18、select ename, sal, hiredate from emp where hiredate > '02-2月-1981'; //(只能按照规定的格式写)
19、select ename, sal from emp where deptno =10 or sal >1000;
20、select ename, sal from emp where deptno =10 and sal >1000;
21、select ename, sal, comm from emp where sal not in (800, 1500,2000); //(可以对in指定的条件进行取反)
22、select ename from emp where ename like '%ALL%'; //(模糊查询)
23、select ename from emp where ename like '_A%'; //(取第二个字母是A的所有字段)
24、select ename from emp where ename like '%/%%'; //(用转义字符/查询字段中本身就带%字段的)
25、select ename from emp where ename like '%$%%' escape '$'; //(用转义字符/查询字段中本身就带%字段的)
26、select * from dept order by deptno desc; (使用order by desc字段 对数据进行降序排列 默认为升序asc);
27、select * from dept where deptno <>10 order by deptno asc; //(我们可以将过滤以后的数据再进行排序)
28、select ename, sal, deptno from emp order by deptno asc, ename desc; //(按照多个字段排序 首先按照deptno升序排列,当detpno相同时,内部再按照ename的降序排列)
29、select lower(ename) from emp; //(函数lower() 将ename搜索出来后全部转化为小写);
30、select ename from emp where lower(ename) like '_a%'; //(首先将所搜索字段转化为小写,然后判断第二个字母是不是a)
31、select substr(ename, 2, 3) from emp; //(使用函数substr() 将搜素出来的ename字段从第二个字母开始截,一共截3个字符)
32、select chr(65) from dual; //(函数chr() 将数字转化为AscII中相对应的字符)
33、select ascii('A') from dual; //(函数ascii()与32中的chr()函数是相反的 将相应的字符转化为相应的Ascii编码)

)
34、select round(23.232) from dual; //(函数round() 进行四舍五入操作)
35、select round(23.232, 2) from dual; //(四舍五入后保留的小数位数 0 个位 -1 十位)
36、select to_char(sal, '$99,999.9999')from emp; //(加$符号加入千位分隔符,保留四位小数,没有的补零)
37、select to_char(sal, 'L99,999.9999')from emp; //(L 将货币转化为本地币种此处将显示¥人民币)
38、select to_char(sal, 'L00,000.0000')from emp; //(补零位数不一样,可到数据库执行查看)
39、select to_char(hiredate, 'yyyy-MM-DD HH:MI:SS') from emp; //(改变日期默认的显示格式)
40、select to_char(sysdate, 'yyyy-MM-DD HH:MI:SS') from dual; //(用12小时制显示当前的系统时间)
41、select to_char(sysdate, 'yyyy-MM-DD HH24:MI:SS') from dual; //(用24小时制显示当前的系统时间)
42、select ename, hiredate from emp where hiredate > to_date('1981-2-20 12:24:45','YYYY-MM-DD HH24:MI:SS'); //(函数to-date 查询公司在所给时间以后入职的人员)
43、select sal from emp where sal > to_number('$1,250.00', '$9,999.99'); //(函数to_number()求出这种薪水里带有特殊符号的)
44、select ename, sal*12 + nvl(comm,0) from emp; //(函数nvl() 求出员工的"年薪 + 提成(或奖金)问题")
45、select max(sal) from emp; // (函数max() 求出emp表中sal字段的最大值)
46、select min(sal) from emp; // (函数max() 求出emp表中sal字段的最小值)
47、select avg(sal) from emp; //(avg()求平均薪水);
48、select to_char(avg(sal), '999999.99') from emp; //(将求出来的平均薪水只保留2位小数)
49、select round(avg(sal), 2) from emp; //(将平均薪水四舍五入到小数点后2位)
50、select sum(sal) from emp; //(求出每个月要支付的总薪水)

/////////////////////////组函数(共5个):将多个条件组合到一起最后只产生一个数据//////min() max() avg() sum() count()/////////////////////////////
51、select count(*) from emp; //求出表中一共有多少条记录
52、select count(*) from emp where deptno=10; //再要求一共有多少条记录的时候,还可以在后面跟上限定条件
53、select count(distinct deptno) from emp; //统计部门编号前提是去掉重复的值
////////////////////////聚组函数group by() //////////////////////////////////////
54、select deptno, avg(sal) from emp group by deptno; //按照deptno分组,查看每个部门的平均工资
55、select max(sal) from emp group by deptno, job; //分组的时候,还可以按照多个字段进行分组,两个字段不相同的为一组
56、select ename from e

mp where sal = (select max(sal) from emp); //求出
57、select deptno, max(sal) from emp group by deptno; //搜素这个部门中薪水最高的的值
//////////////////////////////////////////////////having函数对于group by函数的过滤 不能用where//////////////////////////////////////
58、select deptno, avg(sal) from emp group by deptno having avg(sal) >2000; (order by )//求出每个部门的平均值,并且要 > 2000
59、select avg(sal) from emp where sal >1200 group by deptno having avg(sal) >1500 order by avg(sal) desc;//求出sal>1200的平均值按照deptno分组,平均值要>1500最后按照sal的倒序排列
60、select ename,sal from emp where sal > (select avg(sal) from emp); //求那些人的薪水是在平均薪水之上的。
61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno); //查询每个部门中工资最高的那个人
///////////////////////////////等值连接//////////////////////////////////////
62、select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno; //自连接,把一张表当成两张表来用
63、select ename, dname from emp, dept; //92年语法 两张表的连接 笛卡尔积。
64、select ename, dname from emp cross join dept; //99年语法 两张表的连接用cross join
65、select ename, dname from emp, dept where emp.deptno = dept.deptno; // 92年语法 表连接 + 条件连接
66、select ename, dname from emp join dept on(emp.deptno = dept.deptno); // 新语法
67、select ename,dname from emp join dept using(deptno); //与66题的写法是一样的,但是不推荐使用using : 假设条件太多
///////////////////////////////////////非等值连接///////////////////////////////////////////
68、select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal); //两张表的连接 此种写法比用where更清晰
69、select ename, dname, grade from emp e
join dept d on(e.deptno = d.deptno)
join salgrade s on (e.sal between s.losal and s.hisal)
where ename not like '_A%'; //三张表的连接
70、select e1.ename, e2.ename from emp e1 join emp e2 on(e1.mgr = e2.empno); //自连接第二种写法,同62
71、select e1.ename, e2.ename from emp e1 left join emp e2 on(e1.mgr = e2.empno); //左外连接 把左边没有满足条件的数据也取出来
72、select ename, dname from emp e right join dept d on(e.deptno = d.deptno); //右外连接
73、select deptno, avg_sal, grade from (select deptno, avg(sal) avg_sal from emp group by deptno) t join salgrade s on (t.avg_sal between s.losal and s.hisal);//求每个部门平均薪水的等级
74、select ename from emp where empno in (select mgr from emp); // 在表中搜索那些人是经理
75、select sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on(e1.sal < e2.sal)); // 面试题

不用组函数max()求薪水的最大值
76、select deptno, max_sal from
(select avg(sal) max_sal,deptno from emp group by deptno)
where max_sal =
(select max(max_sal) from
(select avg(sal) max_sal,deptno from emp group by deptno)
);//求平均薪水最高的部门名称和编号。
77、select t1.deptno, grade, avg_sal from
(select deptno, grade, avg_sal from
(select deptno, avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
) t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
select min(grade) from
(select deptno, grade, avg_sal from
(select deptno, avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
)
)//求平均薪水等级最低的部门的名称 哈哈 确实比较麻烦
78、create view v$_dept_avg_sal_info as
select deptno, grade, avg_sal from
(select deptno, avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal);
//视图的创建,一般以v$开头,但不是固定的
100、---------------修改表结构,添加字段------------------
alter table stu add(addr varchar2(29));
101、---------------删除字段--------------------------

alter table stu drop (addr);
102、---------------修改表字段的长度------------------
alter table stu modify (addr varchar2(50));//更改后的长度必须要能容纳原先的数据
103、----------------删除约束条件----------------
alter table stu drop constraint 约束名
104、-----------修改表结构添加约束条件---------------
alter table stu add constraint stu_class_fk foreign key (class) references class (id);
105、---------------数据字典表----------------
desc dictionary;
//数据字典表共有两个字段 table_name comments
//table_name主要存放数据字典表的名字
//comments主要是对这张数据字典表的描述

105、---------------查看当前用户下面所有的表、视图、约束-----数据字典表user_tables---
select table_name from user_tables;
select view_name from user_views;
select constraint_name from user-constraints;
106、-------------索引------------------
create index idx_stu_email on stu (email);// 在stu这张表的email字段上建立一个索引:idx_stu_email
107、---------- 删除索引 ------------------
drop index index_stu_email;
108、---------查看所有的索引----------------
select index_name from user_indexes;
109、---------创建视图-------------------
create view v$stu as selesct id,name,age from stu;
视图的作用: 简化查询 保护我们的一些私有数据,通过视图也可

以用来更新数据,但是我们一般不这么用 缺点:要对视图进行维护

110、-----------创建序列------------
create sequence seq;//创建序列
select seq.nextval from dual;// 查看seq序列的下一个值
drop sequence seq;//删除序列
111、------------数据库的三范式--------------
(1)、要有主键,列不可分
(2)、不能存在部分依赖:当有多个字段联合起来作为主键的时候,不是主键的字段不能部分依赖于主键中的某个字段
(3)、不能存在传递依赖
==============================================PL/SQL==========================
112、-------------------在客户端输出helloworld-------------------------------
set serveroutput on;//默认是off,设成on是让Oracle可以在客户端输出数据
113、begin
dbms_output.put_line('helloworld');
end;
/
114、----------------pl/sql变量的赋值与输出----
declare
v_name varchar2(20);//声明变量v_name变量的声明以v_开头
begin
v_name := 'myname';
dbms_output.put_line(v_name);
end;
/
115、-----------pl/sql对于异常的处理(除数为0)-------------
declare
v_num number := 0;
begin
v_num := 2/v_num;
dbms_output.put_line(v_num);
exception
when others then
dbms_output.put_line('error');
end;
/
116、----------变量的声明----------
binary_integer:整数,主要用来计数而不是用来表示字段类型 比number效率高
number:数字类型
char:定长字符串
varchar2:变长字符串
date:日期
long:字符串,最长2GB
boolean:布尔类型,可以取值true,false,null//最好给一初值
117、----------变量的声明,使用 '%type'属性
declare
v_empno number(4);
v_empno2 emp.empno%type;
v_empno3 v_empno2%type;
begin
dbms_output.put_line('Test');
end;
/
//使用%type属性,可以使变量的声明根据表字段的类型自动变换,省去了维护的麻烦,而且%type属性,可以用于变量身上
118、---------------Table变量类型(table表示的是一个数组)-------------------
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table type_table_empno;
begin
v_empnos(0) := 7345;
v_empnos(-1) :=9999;
dbms_output.put_line(v_empnos(-1));
end;
119、-----------------Record变量类型
declare
type type_record_dept is record
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
begin
v_temp.deptno:=50;
v_temp.dname:='aaa

a';
v_temp.loc:='bj';
dbms_output.put_line(v temp.deptno || ' ' || v temp.dname);
end;
120、-----------使用 %rowtype声明record变量
declare
v_temp dept%rowtype;
begin
v_temp.deptno:=50;
v_temp.dname:='aaaa';
v_temp.loc:='bj';
dbms_output.put_line(v temp.deptno || '' || v temp.dname)
end;

121、--------------sql%count 统计上一条sql语句更新的记录条数
122、--------------sql语句的运用
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_ename,v_sal from emp where empno = 7369;
dbms_output.put_line(v_ename || '' || v_sal);
end;

123、 -------- pl/sql语句的应用
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=7369;
dbms_output_line(v_emp.ename);
end;
124、-------------pl/sql语句的应用
declare
v_deptno dept.deptno%type := 50;
v_dname dept.dname%type :='aaa';
v_loc dept.loc%type := 'bj';
begin
insert into dept2 values(v_deptno,v_dname,v_loc);
commit;
end;
125、-----------------ddl语言,数据定义语言
begin
execute immediate 'create table T (nnn varchar(30) default ''a'')';
end;
126、------------------if else的运用
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = 7369;
if(v_sal < 2000) then
dbms_output.put_line('low');
elsif(v_sal > 2000) then
dbms_output.put_line('middle');
else
dbms_output.put_line('height');
end if;
end;
127、-------------------循环 =====do while
declare
i binary_integer := 1;
begin
loop
dbms_output.put_line(i);
i := i + 1;
exit when (i>=11);
end loop;
end;
128、---------------------while
declare
j binary_integer := 1;
begin
while j < 11 loop
dbms_output.put_line(j);
j:=j+1;
end loop;
end;
129、---------------------for
begin
for k in 1..10 loop
dbms_output.put_line(k);
end loop;
for k in reverse 1..10 loop
dbms_output.put_line(k);
end loop;
end;
130、-----------------------异常(1)
declare
v_temp number(4);
begin
select empno into v_temp from emp where empno = 10;
exception
when too_many_rows then
dbms_output.put_line('太多记录了');
when others then
dbms_output.put_line('error');
end;
131、-----------------------异常(2)
declare

v_temp number(4);
begin
select empno into v_temp from emp where empno = 2222;
exception
when no_data_found then
dbms_output.put_line('太多记录了');
end;
132、----------------------创建序列
create sequence seq_errorlog_id start with 1 increment by 1;
133、-----------------------错误处理(用表记录:将系统日志存到数据库便于以后查看)


创建日志表:
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
);



declare
v_deptno dept.deptno%type := 10;
v_errcode number;
v_errmsg varchar2(1024);
begin
delete from dept where deptno = v_deptno;
commit;
exception
when others then
rollback;
v_errcode := SQLCODE;
v_errmsg := SQLERRM;
insert into errorlog values (seq_errorlog_id.nextval, v_errcode,v_errmsg, sysdate);
commit;
end;

133---------------------PL/SQL中的重点cursor(游标)和指针的概念差不多
declare
cursor c is
select * from emp; //此处的语句不会立刻执行,而是当下面的open c的时候,才会真正执行

v_emp c%rowtype;
begin
open c;
fetch c into v_emp;
dbms_output.put_line(v_emp.ename); //这样会只输出一条数据 134将使用循环的方法输出每一条记录
close c;
end;
134----------------------使用do while 循环遍历游标中的每一个数据
declare
cursor c is
select * from emp;
v_emp c%rowtype;
begin
open c;
loop
fetch c into v_emp;
(1) exit when (c%notfound); //notfound是oracle中的关键字,作用是判断是否还有下一条数据
(2) dbms_output.put_line(v_emp.ename); //(1)(2)的顺序不能颠倒,最后一条数据,不会出错,会把最后一条数据,再次的打印一遍
end loop;
close c;
end;
135------------------------while循环,遍历游标
declare
cursor c is
select * from emp;
v_emp emp%rowtype;
begin
open c;
fetch c into v_emp;
while(c%found) loop
dbms_output.put_line(v_emp.ename);
fetch c into v_emp;
end loop;
close c;
end;
136--------------------------for 循环,遍历游标
declare
cursor c is
select * from emp;
begin
for v_emp in c loop
dbms_output.put_line(v_emp.ename);
end loop;
end;

137---------------------------带参数的游标
declare
cursor c(v_deptn

o emp.deptno%type, v_job emp.job%type)
is
select ename, sal from emp where deptno=v_deptno and job=v_job;
--v_temp c%rowtype;此处不用声明变量类型
begin
for v_temp in c(30, 'click') loop
dbms_output.put_line(v_temp.ename);
end loop;
end;
138-----------------------------可更新的游标
declare
cursor c //有点小错误
is
select * from emp2 for update;
-v_temp c%rowtype;
begin
for v_temp in c loop
if(v_temp.sal < 2000) then
update emp2 set sal = sal * 2 where current of c;
else if (v_temp.sal =5000) then
delete from emp2 where current of c;
end if;
end loop;
commit;
end;
139-----------------------------------procedure存储过程(带有名字的程序块)
create or replace procedure p
is--这两句除了替代declare,下面的语句全部都一样
cursor c is
select * from emp2 for update;
begin
for v_emp in c loop
if(v_emp.deptno = 10) then
update emp2 set sal = sal +10 where current of c;
else if(v_emp.deptno =20) then
update emp2 set sal = sal + 20 where current of c;
else
update emp2 set sal = sal + 50 where current of c;
end if;
end loop;
commit;
end;

执行存储过程的两种方法:
(1)exec p;(p是存储过程的名称)
(2)
begin
p;
end;
/
140-------------------------------带参数的存储过程
create or replace procedure p
(v_a in number, v_b number, v_ret out number, v_temp in out number)
is

begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp := v_temp + 1;
end;
141----------------------调用140
declare
v_a number := 3;
v_b number := 4;
v_ret number;
v_temp number := 5;

begin
p(v_a, v_b, v_ret, v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end;

142------------------删除存储过程
drop procedure p;
143------------------------创建函数计算个人所得税
create or replace function sal_tax
(v_sal number)
return number
is
begin
if(v_sal < 2000) then
return 0.10;
elsif(v_sal <2750) then
return 0.15;
else
return 0.20;
end if;
end;
144-----------------------------创建触发器(trigger) 触发器不能单独的存在,必须依附在某一张表上

//创建

触发器的依附表

create table emp2_log
(
ename varchar2(30) ,
eaction varchar2(20),
etime date
);

create or replace trigger trig
after insert or delete or update on emp2 ---for each row 加上此句,每更新一行,触发一次,不加入则值触发一次
begin
if inserting then
insert into emp2_log values(USER, 'insert', sysdate);
elsif updating then
insert into emp2_log values(USER, 'update', sysdate);
elsif deleting then
insert into emp2_log values(USER, 'delete', sysdate);
end if;
end;
145-------------------------------通过触发器更新数据
create or replace trigger trig
after update on dept
for each row
begin
update emp set deptno =:NEW.deptno where deptno =: OLD.deptno;
end;


//////只编译不显示的解决办法 set serveroutput on;
145-------------------------------通过创建存储过程完成递归
create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is
cursor c is select * from article where pid = v_pid;
v_preStr varchar2(1024) := '';
begin
for i in 0..v_leave loop
v_preStr := v_preStr || '****';
end loop;

for v_article in c loop
dbms_output.put_line(v_article.cont);
if(v_article.isleaf = 0) then
p(v_article.id);
end if;
end loop;

end;
146-------------------------------查看当前用户下有哪些表---
首先,用这个用户登录然后使用语句:
select * from tab;

147-----------------------------用Oracle进行分页!--------------
因为Oracle中的隐含字段rownum不支持'>'所以:
select * from (
select rownum rn, t.* from (
select * from t_user where user_id <> 'root'
) t where rownum <6
) where rn >3
148------------------------Oracle下面的清屏命令----------------
clear screen; 或者 cle scr;

149-----------将创建好的guohailong的这个用户的密码改为abc--------------
alter user guohailong identified by abc
当密码使用的是数字的时候可能会不行


包的创建
--主体:(package body)
create or replace package pkg1
is
--在包里定义集合类型--
type t_rec is record(
c1 number,
c2 number);
v_rec t_rec;
procedure proc1;
function func1 return number;
end;

--body

create or replace package body pkg1
is
procedure proc1
is
begin
dbms_output.put_line(1);
end proc1;
function func1 return number
is
begin

return 1;
end func1;
end;
/




declare

v_rec sid_output.rc_var;
v_b1 boolean:=true;
begin
sid_output.proc_out(v_b1);
v_rec.c1:=1;
v_cec.c2:=2;
sid_output.proc_out(v_rec);
end;












相关主题
文本预览
相关文档 最新文档