【题目描述】
Oracle 数据库表空间与数据文件的关系描述正确的是( )
【选项】
A.一个表空间只能对应一个数据文件
B.一个表空间可以对应多个数据文件
C.一个数据文件可以对应多个表空间
D.表空间与数据文件没任何对应关系
【正确答案】 B
【解释】
表空间和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件, 而一个数据文件只能隶属一个表空间
【题目描述】
你判断下面语句,有什么作用?(单选)
GRANT update ON inventory TO joe WITH GRANT OPTION;
【选项】
A. 一个系统权限被授予用户 JOE
B. 一个对象权限被授予用户 JOE
C. 用户 JOE 被授予在这个对象上的所有权限
D. 一个系统权限和一个对象权限被授予用户 JOE
【正确答案】 B
【解释】
with admin option 只能在赋予 system privilege 的时使用
with grant option 只能在赋予 object privilege 的时使用
【题目描述】
表 CLASSES 和 表 SCHEDULE 结构如下: CLASSES:
ID NUMBER(9)
CLASS_NAME VARCHAR2(20) TEACHER_ID NUMBER(9) SCHEDULE:
CLASS_TIME DATE CLASS_ID NUMBER(9)
你建一个视图显示每一课的课名、课时,并按教师 ID 排序,判断下面语句将返回何种结果? (选择 1项)
CREATE VIEW class_schedule AS
SELECT C.class_name, s.class_time FROM classes c, schedule s WHERE C.id = s.class_id;
【选项】
A .语句创建视图 CLASS_SCHEDULE 且可产生预期结果.
B .语句创建视图 CLASS_SCHEDULE 但不能产生预期结果.
C .语法错误,因为视图不可基于连接查询.
D .语法错,因为语句未包含 ORDER BY 子句.
【正确答案】 B
【解释】
上述试图显示每一课的课名、课时,但是没有按教师 ID 排序
【题目描述】
Oracle 数据库中,在 SQL 语句中连接字符串的方法是哪个?
【选项】
A. cat B. concat C. join D. +
【正确答案】 B
【题目描述】
表 TEACHER 包含如下字段:
列名 可为空否? 数据类型
TEACHER_ID NOT NULL NUMBER(9)
NAME VARCHAR2(25)
SALARY NUMBER(7,2)
SUBJECT_ID NOT NULL NUMBER(3)
SUBJECT_DESCRIPTION VARCHAR2(2)
你需要将理科教师的工资上浮 8%,理科教师的 SUBJECT_ID 是 011,你需用哪一句实现?
【选项】
A.UPDATE teacher SET salary = salary * 1.08 WHERE subject_description LIKE ‘SCIENCE'
B.UPDATE teacher SET salary = salary * .08 WHERE subject_description LIKE 'SCIENCE' AND
subject_id = 011
C.UPDATE teacher SET salary = salary * 1.08 WHERE subject_id = 011;
D.UPDATE teacher SET salary = salary + (salary * .08) WHERE subject_description LIKE 'SCIENCE' OR subject_id = 011
【正确答案】 C
【解释】无
【题目描述】
定义游标如下:
DECLARE
CURSOR query_cursor(v_salary) IS SELECT last_name, salary, dept_no FROM employee
WHERE salary>v_salary;
这条语句为什么会错误?(选择 1 项)
【选项】
A. 在游标定义中不允许出现 where 子句
B. select 语句中缺少 into 子句
C. 参数未指定为变量数据类型
D. 定义 cursor 的语法写错了
【正确答案】 C
【题目描述】
哪句可以实现显示id和description ,条件满足订单时间在January 1, 1997 以前的,且单价小于 1.00 或者大于 5.00 的, 结果用订单时间降序排列。
【选项】
A.SELECT id_number, description FROM inventory WHERE price IN
(1.00, 5.00) OR order_date < '01-JAN-97' ORDER BY order_date DESC;
B.SELECT id_number, description FROM inventory
WHERE price BETWEEN 1.00 AND 5.00 OR order_date < '01-JAN-1997'
ORDER BY order_date;
C.SELECT id_number, description FROM inventory
WHERE price < 1.00 OR price > 5.00 AND order_date < '01 -Jan-97'
ORDER BY order_date ASC;
D.SELECT id_number, description FROM inventory
WHERE (price <1.00 OR price > 5.00) AND order_date < '01-JAN-1997'
ORDER BY order_date DESC;
【正确答案】 D
【题目描述】
判断下面句子,将返回什么值?
SELECT id_number, description, price FROM inventory
WHERE manufacturer_id IN (SELECT manufacturer_id FROM inventory
WHERE price > 8.00 OR quantity > 1000);
【选项】
A 返回单价大于 8.00 且数量大于 1000 的存货的货号、种类、单价信息
B 返回单价大于 8.00 或者数量大于 1000 的存货的货号、种类、单价信息.
C 返回单价大于8.00或者数量大于 1000且有制造商号的存货的货号、种类、单价信息.
D 返回单价大于8.00或者数量大于1000的制造商的所有存货的货号、种类、单价信息.
【正确答案】 C
【题目描述】
表(TEACHER)包含以下列:
ID NUMBER(7) PK SALARY NUMBER(7,2) SUBJECT_ID NUMBER(7) 判断以下两个 SQL 语句:
(1)SELECT ROUND(SUM(salary),-2) FROM teacher ;
(2)SELECT subject_id, ROUND(SUM(salary),-2) FROM teacher GROUP BY subject_id ;
有什么不同结果?
【选项】
A. 语句 1 将返回每个老师一个结果
B. 语句 2 将返回多个结果
C. 结果相同,显示不同
D. 将有一个句子产生错误
【正确答案】 B
【解释】
语句 1 会返回一个结果,就是所有老师的工资和,使用了四舍五入函数,语句 2 是按照 subject_id 进行分组,那么分几组就会有几个结果
【题目描述】
游标的哪一种属性指示 fetch 语句是否从活动集中返回行,如未能返回行,则此属性的值为true?
【选项】
A. %FOUND B. %NOTFOUND
C. %ROWCOUNT D. %ISOPEN
【正确答案】 B
【解释】
%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为 TRUE;
%NOTFOUND 布尔型属性,与%FOUND 相反;
%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
%ROWCOUNT 数字型属性,返回已从游标中读取的记录数
【题目描述】
你试图用下面句子查询数据:SELECT 100/NVL(quantity, 0) FROM inventory; 为何 QUANTITY 为 null 空值时,将导致出错?
【选项】
A. 表达式企图被空值除. B.换函数参数数据类型不一致.
C.空值不能被转成实际值 D. 表达式企图被零除.
【正确答案】 D
【解释】
nvl(表达式1,表达式2)这个函数的作用是如果表达式1的值为null,那么取表达式2的值。
【题目描述】
下列哪个集合操作符返回两个查询所选择的所有的行。
【选项】
A. Union B. Union all C.Union only D.connect by
【正确答案】 B
【解释】
Union 集合操作符返回两个查询所选择的去除重复行。
【题目描述】
在 Oracle 中,当需要使用显式游标更新或删除游标中的行时,UPDATE 或 DELETE 语句必须使用( )子句。
【选项】
A.WHERE CURRENT OF B.WHERE CURSOR OF
C.FOR UPDATE D.FOR CURSOR OF
【正确答案】 C
【解释】
为了对正在处理(查询)的行不被另外的用户改动,ORACLE 提供一个 FOR UPDATE 子句来对所选择的 行进行锁住。该需求迫使 ORACLE 锁定游标结果集合的行,可以防止其他事务处理更新或删除相同的行,直到您的事务处理提交或回退为止。
如果使用 FOR UPDATE 声明游标,则可在 DELETE 和 UPDATE 语句中使用 WHERE CURRENT OF cursor_name子句,修改或删除游标结果集合当前行对应的数据库表中的数据行。
【题目描述】
在 Oracle 中,使用下列的语句:CREATE PUBLIC SYNONYM parts FOR Scott.inventory;
完成的任务是()。
【选项】
A.将 Scott.inventory 对象的访问权限赋予所有用户
B.指定了新的对象权限
C.指定了新的系统权限
D.给 Scott.inventory 对象创建一个公用同义词 parts
【正确答案】 D
【解释】
使用同义词访问相同的对象,方便访问其它用户的对象,短对象名字的长度。
【题目描述】
有如下 SQL 片段
a.select * from asdfh a where a.kehhao in (select kehhao from retail_vip )
b.select * from asdfh a where exists (select r. kehhao from retail_vip r where r.kehhao
= a.kehhao) 则以下哪些描述是正确的:
【选项】
A.a,b 含义相同
B.a 的效率高于 b
C.b 的效率高于 a
D.a,b 效率高低依赖于表 asdfh 和 kehhao 的结构
E.a,b 效率高低需考虑表 asdfh 和 kehhao 的数据量
【正确答案】 E
【解释】
in 可以分为三类:
形如 select * from t1 where f1 in ( a ,b ),应该和以下两种比较效率
select * from t1 where f1= a or f1= b
或者 select * from t1 where f1 = a union all select * from t1 f1= b
形如 select * from t1 where f1 in (select f1 from t2 where t2.fx= x);其中子查询的 where 里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成 exist 语 句,也就是效率和 exist 一样。
形如 select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),其中子查询的 where 里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情 况和数据量多少,一般认为效率不如 exists.除了第一类 in 语句都是可以转化成 exists 语句的,一般编程习惯应该是用 exists 而不 in。
【题目描述】
有如下表结构 客户号(kehhao),日期(riqi),账户余额(zhhuye)
说明表 a 中记录客户不同日期账户余额,但仅在相邻两天任一客户(kehhao)账户余额(zhhuye)发 生变化时,才在表 a 中添加新记录。日期(riqi),其中包含多条日期:如 20050101,20050110 等 则如下 SQL 片段含义为:
Select a.kehhao,c.riqi,a.zhhuye
(Select b.riqi as riqi , max(a.riqi) as riqix from b,a where a.riqi <= b.riqi) c
Left join a
On a.riqi = c. riqix
【选项】
A.选择表 a 中各个客户在给定日期(给定日期由表 b 存储)的余额信息
B.选择表 a 中各个客户在除给定日期(给定日期由表 b 存储)的余额信息
C.选择表 a 中各个客户最接近给定日期(给定日期由表 b 存储)的余额信息
D.以上都不对
【正确答案】 D
【解释】
所有包含于SELECT列表中,而未包含于组函数中的列都必须包含于GROUP BY子句中。
【题目描述】
有如下 SQL 片段
Delete from asdfh a where a.kaihrq > ‘20091214’ and a.jiluzt <> ‘1’其含义为:
【选项】
A.从表 asdfh 中删除 kaihrq 不小于 2009 年 12 月 14 日,且 jiluzt 不为 1 的记录
B.从表 asdfh 中删除 kaihrq 和 jiluzt 列
C.对表 asdfh 中删除 kaihrq 不小于 2009 年 12 月 14 日,且 jiluzt 不为 1 的记录打删除标记
D.以上都不正确
【正确答案】 C
【解释】
提交或回滚前的数据状态改变前的数据状态是可以恢复的
执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正 其他会话不能看到当前用户所做的改变,直到当前会话结束事务。 DML 语句所涉及到的行被锁定, 其他会话不能操作。
【题目描述】
只有满足联接条件的记录才包含在查询结果中,这种联接为?
【选项】
A.左联接 B.右联接 C.内部联接 D.完全联接
【正确答案】 C
【解释】
内连接 :内连接查询操作列出与连接条件匹配的数据行 外连接:返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左连接)、右表(右 连接)或两个边接表(全外连接)中的所有数据行。
【题目描述】
分机构统计 VIP 客户的数量下面 SQL 语句正确的是? 其中
表 a:jigou(机构),kehhao(客户号),jiaoyrq(交易日期),jioyje(交易金额)
表 b: kehhao(客户号),表 b 为 VIP 客户号表
Select
from a inner join b on a.kehhao = b.kehhao
【选项】
A.Count(a.kehhao), group by jigou
B.Count(a.kehhao), order by jigou
C.Sum(a.kehhao), order by jigou
D.Count(a.kehhao), having jigou
E.以上都不正确
【正确答案】 A
【解释】
因为是统计各个分机构的 VIP 客户数量 所以要按照机构进行分组,而有多少条记录那么就有多少个 VIP 客户所以使用 count。
【题目描述】
Select 语句中用来连接字符串的符号是( ).
【选项】
A. “+” B. “&” C.“||” D.“|”
【正确答案】 C
【题目描述】
在关系数据库的询问优化中,事先处理文件,如排序、建立索引的目的是()
【选项】
A 优化表达式 B 减少中间结果
C 扩大缓冲数据 D 减少扫描文件的时间
【正确答案】 D
【题目描述】
Delete 和 truncate 都可以用来删除表内容,一下描述正确的是?
【选项】
A.Truncate 不需要 rollbacksegment
B.Delete 需要 rollbacksegment
C.Truncate 在 提交 commit 之前仍可回滚
D.Truncate 还可以删除表结构
【正确答案】 AB
【解释】
TRUNCATE TABLE 语句:删除表中所有的数据并且释放表的存储空间,可以使用 DELETE 语句删除数据, DELETE 产生 rollback ,如果删除大数据量的表速度会很慢,同时会占用很多的 rollback segments .truncate 是 DDL 操作,不产生 rollback,速度快一些。
【题目描述】
请给出两个影响系统效率的函数(选两个答案)。
【选项】
A.UPPER
B.SUM
C.MAX
D.LOWER
【正确答案】 BC
【题目描述】
QUESTION. description of the students table:
sid_id nu
mber
start_date date
end_date date
which two function are valid on the start_date column?
【选项】
A. sum(start_date)
B. avg(start_date)
C. count(start_date)
D. avg(start_date,end_date) E. min(start_date)
【正确答案】 CE
【解释】
sum 和 avg 要求数字数据类型。
【题目描述】
which are DML statements(choose all that apply) _.
【选项】
A.commit
B.merge
C.update
D.delete
E.creat
F.drop
【正确答案】 BCD
【解释】
DML:Data manipulation language 数据操众语言 insert delete update merge
DDL:data definition language 数据定义语言 create alter drop
DCL:data control language 数据控制语言 grant revoke
【题目描述】
目前几种主流数据库软件的应用特点、适用范围各是什么?
【正确答案】
国际国内的主导关系型数据库管理系统有 SQL Server、ORACLE、SYBASE、INFORMIX 和 DB2。我们主要从性能,可伸缩性和并行性,安全性,操作简便,使用风险,开放性,易维护性和价格,数据库二次开发方面比较了 SQL Server,Oracle、SYBASE、DB2、INFORMIX 数据库:
1)性能
SQL Server:老版本多用户时性能不佳,新版本的性能有了明显的改善,各项处理能力都有了明显的提高。保持了多项 TPC-C(TPC-C 值被广泛用于衡量 C/S 环境下,由服务器和客户端构筑的整体系统的性能,它由事物处理性能委员会(TPC,Transaction Processing Corp)制定,TPC 为非赢利性国际组织。)纪录。
Oracle:性能最高,保持Windows NT 下的 TPC-C 的世界记录。
SYBASE:性能较高,支持 Sun、IBM、HP、Compaq 和 Veritas 的集群设备的特性,实现高可用性。适应于安全性要求极高的系统。
DB2 :适用于数据仓库和在线事物处理,性能较高。客户端支持及应用模式。
INFORMIX:性能较高,支持集群,实现高可用性。适应于安全性要求极高的系统,尤其是银行,证券系统的应用。
2)可伸缩性,并行性
SQL Server:以前版本 SQL Server 并行实施和共存模型并不成熟。很难处理大量的用户数和数据 卷。伸缩性有限。新版本性能有了较大的改善,在 Microsoft Advanced Servers 上有突出的表现,超过了他的主要竞争对手。
Oracle:平行错误!超链接引用无效。过使一组结点共享同一簇中的工作来扩展 Window NT 的能力,提供高可用性和高伸缩性的簇的解决方案。如果 Windows NT 不能满足需要, 用户可以把数据库移到 UNIX 中,具有很好的伸缩性。
SYBASE:新版本具有较好的并行性,速度快,对巨量数据无明显影响,但是技术实现复杂,需要程序支持,伸缩性有限。
DB2 :DB2 具有很好的并行性。DB2 把数据库管理扩充到了并行的、多节点的环境。数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点或数据库节点,伸缩性有限。
INFORMIX:采用单进程多线程的技术,具有较好的并行性。但是仅运行于 UNIX 平台,伸缩性有限。
3)安全性
SQL server:Microsoft Advanced Server 获得最高安全认证,服务器平台的稳定性是数据库的稳定性的基础,新版本的 SQL 的安全性有了极大的提高。
Oracle:获得最高认证级别的 ISO 标准认证。
SYBASE:通过 Sun 公司 J2EE 认证测试,获得最高认证级别的 ISO 标准认证。
DB2 :获得最高认证级别的 ISO 标准认证。
INFORMIX:获得最高认证级别的 ISO 标准认证。
4)操作简便
SQL Server:操作简单,采用图形界面。管理也很方便,而且编程接口特别友好(它的 SQL-DMO 让编 程变得非常方便!) ,从易维护性和价格上 SQL Server 明显占有优势。
Oracle:较复杂, 同时提供 GUI 和命令行,在 Windows NT 和 Unix, Linux 下操作相同。对数据库管理人员要求较高。
SYBASE:复杂,使用命令行操作,对数据库管理人员要求较高。
DB2 :操作简单,同时提供 GUI 和命令行,在 Windows NT 和 Unix 下操作相同。
INFORMIX:使用和管理复杂,命令行操作。对数据库管理人员要求较高。
5)使用风险
SQL Server:完全重写的代码,性能和兼容性有了较大的提高,与 Oracle,DB2 的性能差距明显减小。该产品的出台经历了长期的测试,为产品的安全和稳定进行了全面的检测,安全稳定性有了明显的提高。
Oracle:长时间的开发经验,完全向下兼容,可以安全的进行数据库的升级,在企业,政府中得到广泛的应用。并且如果在 WINNT 上无法满足数据的要求,可以安全的把数据转移到 UNIX 上来。
SYBASE:开发时间较长,升级较复杂,稳定性较好,数据安全有保障。风险小。在安全要求极高的银行,证券行业中得到了广泛的应用。
DB2 :在巨型企业得到广泛的应用,向下兼容性好。风险小。
INFORMIX:开发时间较长,升级较复杂,稳定性较好,数据安全有保障。风险小。在安全要求极高的银行,证券行业中得到了广泛的应用。
6)开放性
SQL Server:只能在Windows 上运行,C/S 结构,只支持 Windows 客户,可以用 ADO,DAO,OLEDB,ODBC 连接。Windows9X 系列产品是偏重于桌面应用,NT server 适合各种大中小型企业。 操作系统的稳定对数据库是十分重要的。Windows 平台的可靠性,安全性经过了最高级别的 C2 认证的。在处理大数据量的关键业务时提供了较好的性能。
Oracle :能在所有主流平台上运行(包括 Windows)。完全支持所有的工业标准。采用完全开放策略。多层次网络计算,支持多种工业标准,可以用 ODBC,JDBC,OCI 等网络客户连接。可以使客户选择最适合的解决方案。对开发商全力支持。
SYBASE :能在所有主流平台上运行,在银行业中得到了广泛的应用。
DB2 :有较好的开放性,最适于海量数据。跨平台,多层结构,支持 ODBC,JDBC 等客户。在大型的国际企业中得到最为广泛的应用,在全球的 500 家最大的企业中,大部分采用 DB2 数据库服务器。 IINFORMIX:仅运行在 UNIX 平台,包括 SUNOS、HPUX、 ALFAOSF/1。在银行中得到广泛的应用。
7)易维护性和价格
SQL Server:从易维护性和价格上 SQL Server 明显占有优势。基于 Microsoft 的一贯风格,SQL Server 的图形管理界面带来了明显的易用性, 微软的数据库管理员培训进行的比较充分,可以轻松的找到很好的数据库管理员,数据库管理费用比较低,SQL Server 的价格也是很低的,但是在 License 的购买上会抬高价格。总体来说 SQL Server 的价格在商用数据库中是最低的。
Oracle:从易维护性和价格上来说 Oracle 的价格是比较高的,管理比较复杂,由于 Oracle 的应用很广泛,经验丰富的 Oracle 数据库管理员可以比较容易的找到,从而实现 Oracle 的良好管理。因此 Oracle 的性能价格比在商用数据库中是最好的。
SYBASE :SYBASE 的价格是比较低的,但是 SYBASE 的在企业和政府中的应用较少,很难找到经验丰富的管理员,运行管理费用较高。
DB2 :价格高,管理员少,在中国的应用较少,运行管理费用都很高,适用于大型企业的数据仓库应用。
INFORMIX:价格在这些系统中居于中间,与 SYBASE 一样,在企业和政府中应用较少,仅在银行中得到了广泛的应用。经验丰富的管理人员较少,运行管理费用高。
8)数据库二次开发
SQL Server:数据库的二次开发工具很多,包括 Visual C++, Visual Basic 等开发工具,可以实现很好的 Windows 应用,开发容易。
Oracle:数据库的二次开发工具很多,涵盖了数据库开发的各个阶段,开发容易。
SYBASE:开发工具较少,经验丰富的人员很少。
DB2 :在国外巨型企业得到广泛的应用,中国的经验丰富的人员很少。
INFORMIX:在银行业中得到广泛的应用,但是在中国的经验丰富的人员很少。
【题目描述】
试述数据库完整保护的主要任务和措施。
【正确答案】
数据库的完整性保护也就是数据库中数据正确性的维护。数据库完整性包括三个内容:实体完整性规则,参照物完整性规则以及用户定义完整性规则。前两个是有DBMS 自动处理。
实体完整性规则是说针对于基表中的关键字中属性值不能为空值,是数据库完整性的基本要求,主关键字和元组的唯一性对应。
参照物完整性规则是不允许引用不存在的元组:即基表中的外关键字要么为空,要么关联基 表中必存在元组。 用户定义完整性规则针对具体的数据环境由用户具体设置的规则,它反应了具体应用中的语义要求。
一个完整性规则一般由下面三部分组成:完整性约束条件设置,完整性约束条件的检查以及 完整性约束条件的处理.后两部分在数据库中一般有相应的模块处理。另外触发器也可以做完整性的保护,但触发器大量用于主动性领域。
【题目描述】
请说明 Oracle中 delete from tablea & truncate table tablea 的区别
【正确答案】
两者都可以用来删除表中所有的记录。区别在于:truncate 是 DDL 操作,它移动 HWK,使 HWK值为 0,不需要 rollback segment .而 Delete 是 DML 操作需要 rollback segment 且花费较长时间。
【题目描述】
Oracle 安装完成后,如何用命令行启动和关闭数据库?
【正确答案】
打开:STARTUP [FORCE] [RESTRICT] [PFILE= filename] [OPEN [RECOVER][ database] | MOUNT| NOMOUNT]
STARTUP OPEN:STARTUP 缺省的参数就是 OPEN,打开数据库,允许数据库的访问。当前实例的控制文件中所描述的所有文件都已经打开。
STARTUP MOUNT:MOUNT 数据库,仅仅给 DBA 进行管理操作,不允许数据库的用户访问。仅仅只是当前实例的控制文件被打开,数据文件未打开。
STARTUP NOMOUNT:仅仅通过初始化文件,分配出 SGA 区,启动数据库后台进程,没有打开控制文件和数据文件。不能访问任何数据库。
STARTUP PFILE= filename:以 filename 为初始化文件启动数据库,不是采用缺省初始化文件。
STARTUP FORCE:中止当前数据库的运行,并开始重新正常的启动数据库。 STARTUP RESTRICT:只允许具有 RESTRICTED SESSION 权限的用户访问数据库。 STARTUP RECOVER:数据库启动,并开始介质恢复关闭
SHUTDOWN 有四个参数:NORMAL、TRANSACTIONAL、IMMEDIATE、ABORT。缺省不带任何参数时表示是 NORMAL。 命令 SHUTDOWN NORMAL:不允许新的连接、等待会话结束、等待事务结束、做一个检查点并关闭数据文件。启动时不需要实例恢复。
SHUTDOWN TRANSACTIONAL:不允许新的连接、不等待会话结束、等待事务结束、做一个检查点并关闭数据文件。启动时不需要实例恢复。
SHUTDOWN IMMEDIATE:不允许新的连接、不等待会话结束、不等待事务结束、做一个检查点并关闭数 据文件。没有结束的事务是自动 rollback 的。启动时不需要实例恢复。
SHUTDOWN ABORT:不允许新的连接、不等待会话结束、不等待事务结束、不做检查点且没有关闭数据文件。启动时自动进行实例恢复。
另外,对于 NORMAL、TRANSACTIONAL、IMMEDIATE,DB Buffer Cache 的内容写入了数据文件,没有提交的事务被回滚,所有的资源被释放,数据库被“干净”的关闭。
对于 ABORT,DB Buffer Cache 的内容没有写入数据文件,没有提交的事务也没有回滚。数据库没有dismount 和关闭,数据文件也没有关闭。当数据库启动时,需要通过 redo log 恢复数据,通过回滚段对事务回滚,对资源进行释放。
【题目描述】
事务是什么?有哪些属性,并简要说明这些属性的含义。
【正确答案】
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务 通常由高级数据库操纵语言或编程语言(如 SQL,C++或 Java)书写的用户程序的执行所引起,并用形如 begin transaction 和 end transaction 语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务应该具有 4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为 ACID 特性。 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
【题目描述】
在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL 语句、java 等层面的解决方案。
【正确答案】
1)数据库设计方面:
a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:
select id from t where num=0
c. 并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询可能不会去利用索引,如一表中有字段 sex,male、female 几乎各一半,那么即使在 sex 上 建了索引也对查询效率起不了作用。
d. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert及update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过 6 个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
e. 应尽可能的避免更新索引数据列,因为索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新索引数据列,那么需要考虑是否应将该索引建为索引。
f. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
g. 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
h. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
i. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
j. 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
k. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table, 避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先 create table,然后 insert。
l. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table , 然后 drop table,这样可以避免系统表的较长时间锁定。
2)SQL 语句方面:
a. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
b. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
c. in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3
d. 下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
e. 如果在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量, 但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描: select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
f. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
g. 应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。 如:
select id from t where substring(name,1,3)='abc'--name 以 abc 开头的 id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的 id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
h. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法 正确使用索引。
i. 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样: create table #t(...)
j. 很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
k. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
l. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过 1 万行,那么就应该考虑改写。
m. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
n. 尽量避免大事务操作,提高系统并发能力。
3)java 方面:
a.尽可能的少造对象。 b.合理摆正系统设计的位置。大量数据操作,和少量数据操作一定是分开的。大量的数据操作,肯定不是 ORM 框架搞定的。c.使用 jDBC 链接数据库操作数据 d.控制好内存,让数据流起来,而不是全部读到内存再处理,而是边读取边处理;e.合理利用内存,有的数据要缓存
【题目描述】
请解释分布式事务管理?
【正确答案】
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。为了实现分布式事务,需要使用下面将介绍的两阶段提交协议。阶段一:开始向事务涉及到的全部资源发送提交前信息。此时,事务涉及到的资源还有最后一次机会来异常结束事务。如果任意一个资源决定异常结束事务,则整个事务取消,不会进行资源的更新。否则,事务将正常执行,除非发生灾难性的失败。为了防止会发生灾难性的失败,所有资源的更新都会写入到日志中。这些日志是永久性的,因此,这些日志会幸免遇难并且在失败之后可以重新对所有资源进行更新。阶段二:只在阶段一没有异常结束的时候才会发生。此时,所有能被定位和单独控制的资源管理器都将开始执行真正的数据更新。在分布式事务两阶段提交协议中,有一个主事务管理器负责充当分布式事务协调器的角色。事务协调器负责整个事务并使之与网络中的其他事务管理器协同工作。 为了实现分布式事务,必须使用一种协议在分布式事务的各个参与者之间传递事务上下文信息, IIOP便是这种协议。这就要求不同开发商开发的事务参与者必须支持一种标准协议,才能实现分布式的事务。
【题目描述】
你认为在表上建立索引可以提高数据库系统的效率吗,为什么?
【正确答案】
不一定
建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的 where 子句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
【题目描述】
什么是数据库的参照完整性?
【正确答案】
数据库的参照完整性是指表与表之间的一种对应关系,通常情况下可以通过设置两表之间的主键、外键关系,或者编写两表的触发器来实现。有对应参照完整性的两张表格,在对他们进行数据插入、更新、删除的过程中,系统都会将被修改表格与另一张对应表格进行对照,从而阻止一些不正确的数据的操作。
【题目描述】
如何优化数据库,如何提高数据库的性能?
【正确答案】
1) 硬件调整性能: 最有可能影响性能的是磁盘和网络吞吐量,解决办法扩大虚拟内存,并保证有足够可以扩充的空间; 把数据库服务器上的不必要服务关闭掉;把数据库服务器和主域服务器分开;把 SQL 数据库服务器的吞吐量调为最大;在具有一个以上处理器的机器上运行 SQL。
2)调整数据库: 若对该表的查询频率比较高,则建立索引;建立索引时,想尽对该表的所有查询搜索操作,按照 where 选择条件建立索引,尽量为整型键建立为有且只有一个簇集索引,数据在物理上按顺序在数据页上,缩短查找范围,为在查询经常使用的全部列建立非簇集索引,能最大地覆盖查询;但是索引不可太多,执行 UPDATE DELETE INSERT 语句需要用于维护这些索引的开销量急剧增加;避免在索引中有太多的索引键;避免使用大型数据类型的列为索引;保证每个索引键值有少数行。
3)使用存储过程: 应用程序的实现过程中,能够采用存储过程实现的对数据库的操作尽量通过存储过程来实现,因为存储过程是存放在数据库服务器上的一次性被设计、编码、测试,并被再次使用,需要执行该任务的应用可以简单地执行存储过程,并且只返回结果集或者数值,这样不仅可以使程序模块化,同时提高响应速度,减少网络流量,并且通过输入参数接受输入,使得在应用中完成逻辑的一致性实现。
4)应用程序结构和算法: 建立查询条件索引仅仅是提高速度的前提条件,响应速度的提高还依赖于对索引的使用。因为人们在使用 SQL 时往往会陷入一个误区,即太关注于所得的结果是否正确,特别是对数据量不是特别大的数据库操作时,是否建立索引和使用索引的好坏对程序的响应速度并不大,因此程序员在书写程序时就忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在数据量特别大时或者大型的或是复杂的数据库环境中(如联机事务处理 OLTP 或决策支持系统 DSS)中表现得尤为明显。在工作实践中发现,不良的 SQL 往往来自于不恰当的索引设计、不充份的连接条件和不可优化的 where 子句。在对它们进行适当的优化后,其运行速度有了明显地提高!
【题目描述】
例举在诊断 Oracle 性能问题时,常用的工具、方法
【正确答案】
1)简单一点的可以用 toad 及 dbartisan 这样的工具。
2)纯做性能监测,比较出色的有 spolight 和 emc 的 I3,这两个软件都比较贵。
3)一些网管系统这方面也不错,如 hp 的 openview。不过定制起来不太容易,且很贵。
4)不用花钱又好用的就是 Oracle 的 statpack 了。
5)再有就是自己写脚本了,大多数有经验的 DBA 都喜欢这样的方式。优点是实用灵活。缺点是如果想出一个性能变化的曲线图等图表,且做的美观就需要些 delphi,c++builder 或是 pb 的开发功底了。
【题目描述】
Oracle 启动中,startup nomount、 startup mount 有什么差别?
【正确答案】
startup nomount:启动实例,读取参数文件,分配内存空间,启动后台进程,打开跟踪文 件和报警文件。startup mount:装载数据库,打开控制文件。nomount 方式下还没有读取控制文件, 该选项用于在数据库的控制文件全部损坏,需要重新创建数据库控制文件或创建一个新的数据库时使用。mount 选项下并没有打开数据文件,该选项可以用来修改数据库的运行模式或进行数据库恢复。
【题目描述】
Oracle 启动中,spfile.orA. init
【正确答案】
启动数据库,使用 startup 命令,Oralce 将会按照以下顺序在缺省目录中搜索参数文件:spfile
【题目描述】
说明 Oracle 数据库逻辑备份和物理备份的方式。
【正确答案】
Oracle 备份包括逻辑备份和物理备份。
1).逻辑备份 数据库的逻辑备份包含读一个数据库记录集和将记录集写入文件。 a.输出(Export)输出可以是整个数据库、指定用户或指定表。 b.输入(Import)输入将输出建立的二进制转储文件读入并执行其命令。
2).物理备份 物理备份包含拷贝构成数据库的文件而不管其逻辑内容。
Oracle 支持两种不同类型的物理文件备份:脱机备份(offline backup)和联机备份(online backup)。 a.脱机备份: 脱机备份用在当数据库已正常关闭,数据库处于"offline"时,要备份下列文件: 所有数据文件、所有控制文件、所有联机日志 init.ora(可选的)
b 联机备份:联机备份可用来备份任何运作在 ARCHIVELOG 方式下的数据库。在这种方式下,联机日志被归档,在数据库内部建立一个所有作业的完整记录。联机备份过程具备强有力的功能。第一,提供 了完全的时间点(point-in-time)恢复。第二,在文件系统备份时允许数据库保持打开状态。
【题目描述】
谈一下聚簇索引和非聚簇索引的区别以及各自的优缺点。
【正确答案】
聚集索引,表中存储的数据按照索引的顺序存储,检索效率比普通索引高,但对数据新增/修改/删除的影响比较大非聚集索引,不影响表中的数据存储顺序,检索效率比聚集索引低,对数据新增/修改/删除的影响很小
【题目描述】
描述重做与回滚的认识。
【正确答案】
重做日志生成日志文件,是为将来恢复数据库使用的. 回滚段保存未提交数据,是为支持事务而起作用的。
【题目描述】
对触发器的认识。
【正确答案】
触发器是表上的程序,主要提供数据添加、修改与删除后的程序处理方法,可以用来检查数据及进行数据更新,也可以分担一些前端应用程序撰写的逻辑规则。用场景: 触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。 触发器的主要应用场合概括起来讲有以下几种:
1).当向一张表中添加或删除记录时,需要在相关表中进行同步操作。比如,当为应用系统添加一个系统用户时,需要同时向权限表中添加该用户的缺省权限,此时就编写系统用户表的触发器在添加记录动作时触发。
2).当表上某列数据的值与其他表中的数据有联系时。比如,当某客户进行欠款消费,可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。
3).当需要对某张表进行跟踪时。比如,当人事表中有人离职时,第一时间通知或更改相关表的值。
【题目描述】
将 ORACLE 数据库更改为归档模式;写出步骤。
【正确答案】
具体步骤如下:
1),以 exp 方式在线备份数据库到指定位置;
2),观察当前数据库是以服务器参数文件(spfile)方式启动还是以参数文件(pfile)方式启动:
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /ho me/db/oracle/10g/dbs/spfile
XXXX.ora
value 后有内容,说明数据库以服务器参数文件方式启动,这里的 spfile 文件对应的裸设备为/dev/vgdata/rspfile(通过查看/home/db/oracle/10g/dbs/initSID.ora 文件内容获得);
3),关闭所有实例(shutdown immediate);
4),任意选取一个实例,创建参数文件到指定路径:
SQL>create pfile='/home/db/oracle/pfile.ora' from spfile;
5),修改 pfile.ora 文件,添加参数 cluster_database=false;
6),以修改之后的参数文件按 nomount 方式启动数据库:
SQL>startup nomount pfile='/home/db/oracle/pfile.ora';
7),使数据库以 exclusive 方式启动:SQL>alter database mount exclusive;
8),改变归档模式:SQL>alter database archivelog;
9),将 pfile 参数中的 cluster_database 重新更改为“true”;
10),更新服务器参数文件:SQL>create spfile from pfile='/home/db/oracle/pfile.ora';
11),关闭数据库实例;SQL>shutdowm immediate;
12),分别在两个节点上启动数据库:SQL>startup;
13),在两个节点上分别检查归档模式是否更改成功:
SQL>archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /home/db/oracle/10g/dbs/arch
Oldest online log sequence 489
Next log sequence to archive 491
Current log sequence 491
完成。
【题目描述】
把表 A 从表空间 TSP1 更改成表空间 TSP2 的方法
【正确答案】
alter table A move tablespace TSP2
【题目描述】
删除表的列;
【正确答案】
alert table 表名 drop 列名
【题目描述】
删除表空间的数据文件?
【正确答案】
用 SQLPLUS 命令: drop tablespace tablename including contents
就可以把所有相关的数据删除
【题目描述】
如何用 ALTER 命令把表数据加到缓存表里,清除呢?
【正确答案】
添加:alert table 表名 cache
清除:alert table 表名 nocache
【题目描述】
数据的复制实现办法?
【正确答案】
数据复制,就是将数据库中的数据拷贝到另外一个或多个不同的物理站点上,从而保持源数据库与目标数据库中指定数据的一致性。 数据复制的实现方法:在具体的实现之前,首先要做好设计与规划。这就需要细致分析具体的业务情况,设计出一套能够满足业务需要的方案。通常在设计过程中,需要确定出要建立的数据库站点,各站点的类型,需要复制的数据对象,以及同步方式、冲突解决方案等内容。 数据复制的实现主要包括以下几步:(1)创建复制站点。(2)创建组对象。(3)配置冲突解决方案。
【题目描述】
建立 ORACLE 数据库后,系统自带的两个用户是什么,相应的密码是什么?他们的身份是什么?
【正确答案】
用户 密码 身份
System manager SYSDBA
Sys change_on_instal SYSDPER
【题目描述】
在建立 ORACLE 数据库时,选择“事务处理”模板与选用“数据仓库”模板的。区别是什么?
【正确答案】
事物处理型:经常反馈给客户信息,处理大容量或超大容量的数据.数据仓库型:主要频繁处理小型数据库,只是进行一些查询等操作.
【题目描述】
请说出两种以上扩大数据库的方式
【正确答案】
1) 修改现有表空间的大小;
2)向表空间插入一个新的数据文件.
【题目描述】
在 ORACLE 中的物理文件包含哪四种?
【正确答案】
1)数据文件 扩展名为*.dbf
2)控制文件 扩展名为*.rtl
3)配置文件 扩展名为*.ora
4)日志文件 扩展名为*.dbf
【题目描述】
日志文件(记录文件)有哪几种,分别介绍他们的工作模式。
【正确答案】
归档日志:当日志写满,完成一次循环之前建立一个副本。这样数据库就可以在损坏中得到恢复。恢复的过程相当于把建库的所有动作重新做一次。最安全的数据库工作方式,占用空间也最大非归档日志:日志写满后,直接覆盖,它只是部分地记录数据库操作,所以恢复能力有限。
【题目描述】
简要写出在 system 方案中建立序列 xl 的步骤。
【正确答案】
create squence system.xl start whith 1
increment by 1
minvalue 1
nomaxvalue
nocycle nocache order;
【题目描述】
写出 SQL 语句,向表中插入一条记录,其中 ID 字段的值来自序列 XL。
【正确答案】
Insert into system.table1 values (xl.nextval,’tom’,21,’男’,2000);
【题目描述】
解释冷备份和热备份的不同点以及各自的优点
【正确答案】
热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库 关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用 并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由 于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将 archive log 写入硬盘)
【解释】无
【题目描述】
如何在不影响子表的前提下,重建一个母表
【正确答案】
子表的外键强制失效,重建母表,激活外键
【题目描述】
如何建立一个备份控制文件?
【正确答案】
Alter database backup control file to trace.
【题目描述】
给出数据库正常启动所经历的几种状态 ?
【正确答案】
STARTUP NOMOUNT – 数据库实例启动
STARTUP MOUNT - 数据库装载
STARTUP OPEN – 数据库打开
【题目描述】
如何判断数据库的时区?
【正确答案】
SELECT DBTIMEZONE FROM DUAL
【题目描述】
解释 GLOBAL_NAMES 设为 TRUE 的用途
【正确答案】
GLOBAL_NAMES 指明连接数据库的方式。如果这个参数设置为 TRUE,在建立数据库链接时就必须用相同的名字连结远程数据库
【题目描述】
如何重构索引?
【正确答案】
ALTER INDEX
【题目描述】
什么是数据库系统?
【正确答案】
数据库系统是储存、管理、处理和维护数据的软件系统,它由数据库、数据库管理员和有关软件组成。数据库系统的结构框架由外部层(单个用户的视图)、概念层(全体用户的公共视图)和内部层(存储视图)组成。
【解释】无
【题目描述】
数据连接池的工作机制是什么?
【正确答案】
J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
【题目描述】
消耗资源的 SQL 的定位方法。
【正确答案】
select sql_text from v$sql where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000); SELECT * FROM ( SELECT sql_text,buffer_gets,disk_reads FROM v$sql ORDER BY buffer_gets,disk_reads DESC) WHERE ROWNUM<=10; |
【题目描述】
用 SQL 语句创建个一个视图,这个视图用来显示 ID>1000 的记录;
【正确答案】
create view st as select * from table1 where id>1000;
【题目描述】
为管理业务培训信息,建立3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄
C(C#,CN)C#,CN分别代表课程编号,课程名称
SC(S#,C#,G)S#,C#,G分别代表学号,所选的课程编号,学习成绩
【正确答案】
1) SELECT SN,SD FROM S WHERE [S#] IN(
SELECT [S#] FROM C,SC WHERE C.[C#]=SC.[C#] AND CN=N'税收基础')
2) SELECT S.SN,S.SD FROM S,SC WHERE S.[S#]=SC.[S#] AND SC.[C#]='C2'
3) SELECT SN,SD FROM S WHERE [S#] NOT IN( SELECT [S#] FROM SC WHERE [C#]='C5')
4) SELECT SN,SD FROM S WHERE [S#] IN(
SELECT [S#] FROM SC GROUP BY [S#] HAVING COUNT(DISTINCT [C#])>5)
【题目描述】
数据库测验:管理业务培训信息,建立3个表:
学生表S |
学号S# |
学员姓名SN |
所属单位SD |
年龄SA |
课程表C |
课程编号C# |
课程名称CN |
|
|
课程表C |
课程编号C# |
课程名称CN |
|
|
学号表SC |
学号S# |
课程编号C# |
学习成绩G |
|
1) 使用标准SQL嵌套语句查询选修课程名称为‘税收基础’的学员学号和姓名
2)使用标准SQL嵌套语句查询选修课程编号为“C2”的学员姓名和所属单位
【正确答案】
1)Select SN,SD from S where S# in(select S# from C,SC where C.C#=SC.C# and CN=”税收基础”)
2) Select S.SN,S.SD from S,SC where S.S#=SC.S# AND SC.C#=’C2’
【题目描述】
用一条SQL语句查询出每门课都大于80分的学生姓名 。
准备数据的sql代码:
create table score(
id int primary key auto_increment,
name varchar(20),
subject varchar(20),
score int);
insert into score values
(null,'张三','语文',81),
(null,'张三','数学',75),
(null,'李四','语文',76),
(null,'李四','数学',90),
(null,'王五','语文',81),
(null,'王五','数学',100),
(null,'王五 ','英语',90);
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
【正确答案】
SELECT DISTINCT Name |
【题目描述】
存在一张表A, 其中有一个字段为col,存储的值为”A”,”B”,”C”,”D”…
要求:查询出A表中的记录,将col为A的显示为 OK,将col为B的显示为NO,
其余的显示为OTHER.请写出SQL语句。
【正确答案】
select decode(“A”,”OK”, “B”,”NO”, “OTHER”) from A |
【题目描述】
(1)--今天是当月的第几天
(2)--今天是周几(周日是数字1表示)
(3)--今年的第一天是周几
(4)--今天是当年的第几天
【正确答案】
【题目描述】
举例说明GROUP BY 和HAVING 子句的意义和使用方法。
每个部门有多少人就要用到GROUP BY
显示每个地区的总面积.仅显示那些面积超过1000000的地区。
【正确答案】
select DepartmentID as ‘部门名称‘, |
SELECT region, SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000 |
【题目描述】
编写SQL语句,为管理岗位业务培训信息,建立3个表。
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号、学员姓名、所属单位、学员年龄C(C#,CN)C#,CN分别代表课程编号,课程名称。
SC(S#,C#,G)S#,C#,G 分别代表学号,课程编号、学习成绩
问题1:使用标准嵌套SQL语句查询选修课程名称为“税收基础“的学员学号和姓名。
问题2:查询选修课程为“C2″的所有学员的学号、姓名、所属单位、成绩,并按照所属单位升序、成绩降序排列。
问题3:查询所有学员选修课程的数量,列出学号、姓名、所选课程数,并按照课程数降序排列。
问题4:查询选修课程数超过5次学员的学号、姓名、所属单位、所选课程数,并按照学号升序排列。
【正确答案】
1)
Select ssc s#, ssc.sn from c left join ( select s.*,sc.c# From sc Left join s on s.s#=sc.s# ) as ssc on ssc.c#=c.c# where c.cn=’税收基础‘ |
2)
select sc.c#,s.sn,s.sd,sc.g From sc Left join s on s.s#=sc.s# where c. c#=’ C2′ order by s.sd asc,sc.g.desc |
3)
Select sc.s#,s.sn, sc.count ( select count(s#) as count,s# from sc group by sc.s# ) sc Left join s on s.s#=sc.s# order by sc.count desc |
4)
SELECT S#, SN, SD, (SELECTCOUNT(DISTINCT C#)FROM SC Where S#=s. S# ) as count FROM S WHERE S# IN( SELECT [S#] FROM SC GROUP BY [S#] HAVING COUNT(DISTINCT [C#])>5) |
【题目描述】
有3个表(15分钟):【基础】
Student 学生表 (学号,姓名,性别,年龄,组织部门)
Course 课程表 (编号,课程名称)
Sc 选课表 (学号,课程编号,成绩)
表结构如下:
1)写一个SQL语句,查询选修了’计算机原理’的学生学号和姓名(3分钟)
2)写一个SQL语句,查询’周星驰’同学选修了的课程名字(3分钟)
3)写一个SQL语句,查询选修了5门课程的学生学号和姓名(9分钟)
【正确答案】
1)建表语句如下(mysql数据库):
create table s(id integer primary key, name varchar(20)); create table c(id integer primary key, name varchar(20)); create table sc( sid integer references s(id), cid integer references c(id), primary key(sid,cid) ); |
2)SQL语句如下:
select stu.id, stu.name from s stu where (select count(*) from sc where sid=stu.id) = (select count(*) from c); |
3)SQL语句如下:
select stu.id, stu.name from s stu where (select count(*) from sc where sid=stu.id)>=5; |
【题目描述】
数据库表(Test)结构如下:【基础】
ID NAME AGE MANAGER(所属主管人ID)
106 A 30 104
109 B 19 104
104 C 20 111
107 D 35 109
112 E 25 120
119 F 45 NULL
要求:列出所有年龄比所属主管年龄大的人的ID和名字?
【正确答案】
SQL语句如下:
select employee.name from test employee where employee.age > (select manager.age from test manager where manager.id=employee.manager);
|
【题目描述】
有三张表,学生表S,课程C,学生课程表SC,学生可以选修多门课程,一门课程可以被多个学生选修,通过SC表关联。【基础】
1)写出建表语句;
2)写出SQL语句,查询选修了所有选修课程的学生;
3)写出SQL语句,查询选修了至少5门以上的课程的学生。
【正确答案】
1)建表语句如下(mysql数据库):
create table s(id integer primary key, name varchar(20)); create table c(id integer primary key, name varchar(20)); create table sc( sid integer references s(id), cid integer references c(id), primary key(sid,cid) ); |
2)SQL语句如下:
select stu.id, stu.name from s stu where (select count(*) from sc where sid=stu.id) = (select count(*) from c); |
3)SQL语句如下:
select stu.id, stu.name from s stu where (select count(*) from sc where sid=stu.id)>=5; |
【题目描述】
有如下两张表:
表city:
CityNo |
CityName |
StateNo |
BJ |
北京 |
(Null) |
SH |
上海 |
(Null) |
GZ |
广州 |
GD |
DL |
大连 |
LN |
表state
State No |
State Name |
GD |
广东 |
LN |
辽宁 |
SD |
山东 |
NMG |
内蒙古 |
预得到如下结果:
City No City Name State No State Name
BJ 北京 (Null) (Null
DL 大连 LN 辽宁
GZ 广州 GD 广东
SH 上海 (Null) (Null)
写相应的SQL语句。
【正确答案】
SQL语句为:
SELECT C.CITYNO, C.CITYNAME, C.STATENO, S.STATENAME FROM CITY C, STATE S WHERE C.STATENO=S.STATENO() ORDER BY(C.CITYNO); |
【题目描述】
根据下面两个表,编写SQL查询语句,列出符合特定条件(非女性,年龄不到50)的age_desc组及其用户数,deposit汇总及平均值,要求查询结果包含如下数据
● 年龄组(age_desc)描述
● 该组内的用户数
● 该组内用户的deposit汇总值
● 该组内用户的deposit平均值
显示结果示例:
“6—15岁” 20 300 76
年龄段名称表:d_age
age_id |
sub_id |
min_value |
max_value |
age_desc |
sub1_desc |
1 |
1 |
6 |
10 |
6-15岁 |
6-10岁 |
1 |
2 |
11 |
15 |
6-15岁 |
11-15岁 |
2 |
3 |
16 |
20 |
16-25岁 |
16-20岁 |
2 |
4 |
21 |
25 |
16-25岁 |
21-25岁 |
······ |
······ |
|
|
|
|
用户资料表:dw_user
cust_id |
gender |
age |
deposit |
owe |
1 |
女 |
7 |
100.00 |
200 |
2 |
男 |
21 |
150.25 |
0 |
3 |
男 |
19 |
20 |
0 |
4 |
男 |
17 |
-25.45 |
245 |
······ |
······ |
|
|
|
|
|
|
|
|
【正确答案】
select b.age_desc, count(a.cust_id),sum(a.deposit),avg(a.deposit) from dw_user a , d_age b where a.age between b.min_value and b.max_value and a.age < 50 and a.gender != '女' group by b.age_desc; |
【题目描述】
数据库中有一张表ismg_icp_flow,结构如下:
SQL> desc ismg_icp_flow
Name Null Type
————————————————————————————————
ICPNO NOT NULL VARCHAR2(6)
SERVICE_ID NOT NULL VARCHAR2(10)
STAT_MIN NOT NULL DATETIME
MT_RECV_OK NOT NULL NUMBER(10)
请写出一条SQL语句同时满足以下3个条件:
期望的输出结果如下:
ICPNO SERVICE_ID TOTAL
———— —————— ————————————
901001 7700 271965
901001 7800 3857795
【正确答案】
select ICPNO,SERVICE_ID,sum(MT_RECV_OK) TOTAL from ismg_icp_flow where STAT_MIN between to_date('2003-1-1','yyyy-mm-dd') and to_date('2003-2-1','yyyy-mm-dd') group by ICPNO,SERVICE_ID order by TOTAL; |
【题目描述】
假设现在有表system.table1,表中有三个字段:id(数值型)、name(字符型)、age(数值型)写出SQL语句完成如下功能:在表中查出年龄大于20,且名字以“王”开头的记录,并且按照年龄的倒叙排列出来(年龄大的在前面)。
【正确答案】
Select * from system.table1 where age>20 and name like ‘王%’ order by age DESC; |
【解释】无
【题目编号】 jsd-02-201-5017
【知 识 点】 数据库-Oracle SQL-级联删除、左外连接、SQL基础
【难易程度】 50
【题目描述】
STOMERS表,字段为:ID:(非空,主键)bigint,NAME:(非空)varchar,AGE:int类型;创建ORDERS表,字段为:ID:(非空,主键,)bigint,ORDER_NUMBER:(非空)varchar,PRICE:double,CUSTOMER_ID :(外键)bigint,设置级连删除;
【正确答案】
create table CUSTOMBERS( ID bigint not null, NAME varchar(15), AGE int, primary key (ID) ); create table ORDERS( ID bigint not null, ORDER_NUMBER varchar(15) not nulll, PRICE double precision, CUSTOMER_ID bigint, primary key(ID), ); alter table ORDERS add constraint FK_CUSTOMER foreign key (CUSTOMER_ID) references CUSTOMERS(ID) on delete cascade; |
1)
select c.ID, o.CUSTOMER_ID,c.NAME, o.ID ORDER_ID,ORDER_NUMBER from CUSTOMERS c leftouter join ORDERS o no c.ID=o.CUSTOMER_ID; |
2) truncate 语句执行速度快,占资源少,并且只记录页删除的日志;
delete 对每条记录的删除均需要记录日志
【题目描述】表1:book表,字段有id(主键),name (书名);
表2:bookEnrol表(图书借出归还登记),字段有id,bookId(外键),dependDate(变更时间),state(1.借出 2.归还)。
id |
name |
1 |
English |
2 |
Math |
3 |
JAVA |
(表1)
id |
bookId |
dependDate |
State |
1 |
1 |
2009-01-02 |
1 |
2 |
1 |
2009-01-02 |
2 |
3 |
2 |
2009-01-14 |
1 |
4 |
1 |
2009-01-17 |
1 |
5 |
2 |
2009-02-14 |
2 |
6 |
2 |
2009-02-15 |
1 |
7 |
3 |
2009-02-18 |
1 |
8 |
3 |
2009-02-19 |
2 |
(表2)
1) 要求查询结果应为:(查询出被借出的书和被借出的日期)
id |
name |
dependDate |
1 |
English |
2009-01-17 |
2 |
Math |
2009-02-15 |
2) 第二个表是用来登记的,不管你是借还是还,都要添加一条记录。
请写一个SQL语句,获取到现在状态为已借出的所有图书的相关信息。
【正确答案】
1)
/*方案一*/ select a.id,a.name,b. dependDate from book a, bookEnrol b where a.id=b.bookId and b. dependDate in(select max(dependDate) from bookEnrol group by bookId ) and b.State =1
/*方案二*/ select k.id,k.name,a. dependDate from bookEnrol a, book k where a.id in (select max(b.id) from bookEnrol b group by b.bookId) and a.state = 1 and a.bookId = k.id; |
2)
select book.id,book.name,max(dependDate) from book inner join bookEnrol on book.id=bookEnrol.bookid AND booker.state=1 group by book.id ; |
【题目描述】
查询语句排名问题:
名次 |
姓名 |
月积分(char) |
总积分(char) |
1 |
WhatIsJava |
1 |
99 |
2 |
水王 |
76 |
981 |
3 |
新浪网 |
65 |
96 |
4 |
牛人 |
22 |
9 |
5 |
中国队 |
64 |
89 |
6 |
北林信息 |
66 |
66 |
7 |
加太阳 |
53 |
66 |
8 |
中成药 |
11 |
33 |
9 |
西洋参 |
25 |
26 |
10 |
大拿 |
33 |
23 |
如果用总积分做降序排序,因为总积分是字符型,所以排出来是这样子(9,8,7,6,5...),要求按照总积分的数字大小排序。
【正确答案】
select * from tablename order by cast(总积分 as int) desc |
【解释】无
【题目描述】
按要求写 SQL 语句:根据集团成员培训业务,建立以下三张表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩 要求如下:
1)使用标准 SQL 语句查询成员名单中所属单位叫“技术一部”的人员总数及平均年龄;
2)使用标准的 SQL 语句更新学号为‘S#1’的姓名为“Mike”;
3)使用嵌套语句查询选修课程编号为‘C2’的学员姓名和所属单位;
4)使用嵌套语句查询不选修课程编号为‘C5’的学员姓名和所属单位;
5)查询选修课程超过 5 门的学员学号和所属单位;
【正确答案】
1) select count(SN),avg(SA) from S where SD='技术一部'; 2) update S set SN='Mike' where S#='S#1'; 3) select SN,SD from S where S#=(select S# from SC where C#='C2'); 4) select SN,SD from S where S# not in(select S# from SC where C#='C5'); 5) select S#,SD from S where S#= (select S# from SC group by S# having count(S#)>=5); |
【题目描述】
请根据以下四张表(其中 course_t 表的 teacher_id 字段是 teacher_t 表的 id 字段的外键引用), 拼写出相应的 sql 语句(oracle 语法)。
学生表:students_t
id name sex
001 赵学生 Male
002 钱学生 Male
003 孙学生 Male
004 李学生 Female
005 周学生 Female
? ? ?
教师表:teacher_t
id name sex
001 吴老师 Male
002 郑老师 Male
003 王老师 Male
004 刘老师 Female
005 张老师 Female
课程表:course_t
id name credit teacher_id
001 语文 3 001
002 数学 3 002
003 英语 4 003
004 物理 3 004
005 化学 2 005
006 政治 1 001
007 生物 1 005
008 计算机 2 005
选课表:student_course_t
id student_id course_id
001 001 001
002 001 002
003 001 003
004 002 001
005 002 007
? ? ?
1)统计每个学生选修的学分,并按学分降序排序
2)统计每个学生选修的所有课程和对应的任课老师;并按学生 Id 和课程 Id 排序
3)统计所有学生、所有课程和所有任课老师的对应关系;并按学生 Id 和课程 Id 排序
【正确答案】
1)select sc.student_id,count(c.credit) from students_t s, course_t c, student_course_t sc where s.id=sc.student_id and c.id=sc.course_id group by sc.student_id order by count(c.credit); 2) select s.name as s_name,c.name as c_name ,t.name as t_name from students_t s, course_t c, student_course_t sc,teacher_t t where s.id=sc.student_id and c.id=sc.course_id and t.id=c.teacher_id order by s.id,c.id; 3)与 2)相同 |
【题目描述】
SAL 是 Product 表中的索引列,请优化如下 SQL 语句,并简述原因。原语句:
SELECT*
FROM Product
WHERE SAL * 12 〉25000;
【正确答案】
Select * from product where sal>(25000/12);
【解释】无
WHERE 子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
【题目描述】
有一张表,字段有用户名、口令及备注,请用 SQL 选择出用户名和口令完全相同的记录(应包括用户名和数量的出现次数)
T_USER(USER_NAME,PASSWORD)
显示
USER_NAME COUNT(*) QWE 4
WER 5
【正确答案】
select user_name,count(*) from t_user group by user_name,password;
【题目描述】
有一张表,T_MONEY,字段有 ID,FEE,请用 SQL 语言选择出 FEE 值为前三条记录。
T_MONEY(ID,FEE)
显示
ID FEE
2 100
1 90
2 80
【正确答案】
Select Id,fee from (Select id,fee from t_money order by fee desc) where rownum<=3;
【题目描述】
table_name temp
Id name
1 a
2 b
3 a
4 a
结果为
Id name
1 a
2 b
写出 sql 语句。
【正确答案】
select rownum as id , name from(select distinct name from temp); |
【题目描述】
已知原表(t_salary)
year salary
2000 1000
2001 2000
2002 3000
2003 4000
先要实现显示结果(salary 为以前的工资和)
year salary
2000 1000
2001 3000
2002 6000
写出 sql 语句。
【正确答案】
select t.year, sum(t.salary) over (order by t.year) as sum_salary from salary_t t; |
【题目描述】
有两个表 A 和 B,均有 key 和 value 两个字段,如果 B 的 key 在 A 中也有,就把 B 的 value 换为 A中对应的 value。这道题的 SQL 语句怎么写?
【正确答案】
merge into A a using B b on (a.key=b.key) when matched then update set a.value=b.value |
【题目描述】
创建一张数据表,并插入如下数据。
购物人 商品名称 数量
A 甲 2
B 乙 4
C 丙 1
A 乙 2
B 丙 5
1)写出创建表和插入内容的 sql 语句
2)写出 sql 语句使其产生如下结果
购物人 商品甲 商品乙 商品丙
A 2 2 Null
B Null 4 5
C Null Null 1
【正确答案】
create table tb_order( customer varchar2(20), product_name varchar2(20), quantity number(2) ) Insert into tb_order(customer,product_name,quantity)values(‘A’,’甲’,2); Insert into tb_order(customer,product_name,quantity)values(‘B’,’乙’,4); Insert into tb_order(customer,product_name,quantity)values(‘C’,’丙’,1); Insert into tb_order(customer,product_name,quantity)values(‘A’,’甲’,2); Insert into tb_order(customer,product_name,quantity)values(‘B’,’乙’,5);
2)select customer "购物人", sum(decode(product_name,'甲',quantity,0)) "商品甲", sum(decode(product_name,'乙',quantity,0)) "商品乙", sum(decode(product_name,'丙',quantity,0)) "商品丙" from tb_order group by customer; |
【题目描述】
有如下两张表:部门表和职员表,每个职员都属于一个部门,表结构如下:
Dept 表
Deptno Deptname
? ?
Emp 表
Empno Empname Deptno
? ? ?
请使用 SQL 语句查询每个部门有多少职员,要求查询结果包含两例(部门名称,人数)?
【正确答案】
select d.deptname,count(*) from dept d,emp e where d.deptno=e.deptno group by d.deptno,d.deptname; |
【解释】无
【题目描述】
业务场景:存在下面的表及记录
GOODS(进货表)
GOODSID(主键) GOODSNAME MEMO
1 青霉素
2 西瓜霜
3 创可贴
4 西洋参
SU(进货表)
GOODSID(主键) SUQTY
1 60
2 70
SA(销售表)
GOODSID(主键) SAQTY
3 80
4 90
要求一:进货记录,给出 SQL 达到以下结果
GOODSID(主键) GOODSNAME SUQTY
1 青霉素 60
2 西瓜霜 70
3 创可贴 0
4 西洋参 0
要求二:进销对比,给出 SQL 达到以下结果
GOODSID(主键) GOODSNAME SUQTY SAQTY
1 青霉素 60 0
2 西瓜霜 70 70
3 创可贴 0 80
要求三:将 GOODS.MEMO 更新为[进货数量 SU.SUQTY]
【正确答案】
1)select g.goodsid,g.goodsname,s.quqty from goods g inner join su s on g.goodsid=s.goodsid; 2 ) select g.goodsid,g.goodsname,s.quqty,a.saqty From goods g, su s,sa a on g.goodsid=s.goodsid and g.goodsid=a.goodsid; 3)update goods set demo=(select s.suqty from su s where s.goodsId=goods.goodsId) |
【题目描述】
表结构:
1) 表名:apply
字段(字段名/类型/长度):
applyno varchar 8;//申请单号(关键字)
applydate bigint 8;//申请日期
state varchar 2;//申请状态
2) 表名:applydetail
字段(字段名/类型/长度):
applyno varchar 8;//申请单号(关键字)
name varchar 30;//申请人姓名
idcard varchar 18;//申请人身份证号 state varchar 2;//申请状态 其中,两个表的关联字段为申请单号。
题目:
1)查询身份证号码为 440401430103082 的申请日期
2)查询同一个身份证号码有两条以上记录的身份证号码及记录个数
3)删除 applydetail 表中所有姓李的记录
【正确答案】
1) Select applydate from apply a join applydetail d on a.applyno=d.applyno and Idcard='440401430103082'; 2) select idcard,count(*) from applydetail group by idcard having count(*)>2; 3) delete from applydetail where name='李%'; |
【题目描述】
某公司的机构结构为树型结构,对应的表结构为TableCompany(ComCode—机构代码, UpperComCode—上级机构代码),如何查询出总公司的所有下级机构?(java 或者 SQL 均可)。你觉得这种思维和设计是否合理?有什么好建议的?
【正确答案】
select t1.* from TableCompany t1, TableCompany t2
Where t1.ComCode = t2.UpperComCode
这种设计比较容易让人理解,但是表中的数据联系过于紧密,数据量很大,会给后期维护造成不便,如果根据第三范式要求,将每一子公司独立成一张表,对于关系的维护和数据的管理都会变得比较方便。
【题目描述】
一个简单的论坛系统,以数据库存储如下数据: 用户名,发帖标题,发帖内容,回复标题,回复内容。 每天论坛访问量 200 万左右,更新帖子 10 万左右。 请给出数据库表结构设计,并结合范式简要说明设计思路。
【正确答案】
用户表:存储用户信息;
用户所发的帖子表:存储用户所发的帖子; 回复表:存储对帖子所做的回复。
设计:
User: Create table tb_user( id number(10) primary key, Uname varchar2(20) not null unique );
Comments: Create table tb_comments( id number(10), comments_id number(20) not null unique, title varchar2(20) not null, comments varchar2(255) not null, foreign key(id) references tb_user(id) );
Replay: Create table tb_replay( id number(10), comments varchar2(255) not null, foreign key(id) references tb_comments(comments_id) ); |
思路:因为此应用所要存储的数据量比较大,所以为了避免数据的冗余,表的设计依托于第三范式。
【题目描述】
有一个数据表 userinfo,包含 userid,username 字段,其中 userid 是唯一的,username 可能 重复,请写一句 sql 查询语句,把重复的记录全部取出来。
userid username
1 老王
2 老王
3 老李
4 老李
5 小张 要求返回记录集 userid username
1 老王
2 老王
3 老李
4 老李
【正确答案】
select * from userinfo where username in (select username from userinfo group by username having count(username)>1); |
【题目描述】
有一个表 LEANR,表里有三个字段分别是学号(student_id),
课程(kc),成绩(grade)。
1).查询每一门课程的前两名
2).查询以 Grade 降序排列的第 31 至 40 条记录(不需要区分课程)
3).查询表中存在课程重复 4 次以上的记录,显示课程和重复的次数,并且按照重复次数的降序排列
【正确答案】
1).select student_id,kc,grade from (select student_id,kc,grade, row_number() over(partition by kc order by grade desc)rn from LEANR) where rn<=2; 2)select student_id,grade from ( select lea.*,rownum rm from ( select * from LEANR order by grade desc ) lea where rownum < 41 ) where rm between 31 and 40; 3). select kc,count(kc) from LEANR group by kc having count(kc)>=2 order by count(kc) desc; |
【题目描述】
a 部门表 b 员工表
a 表字段( id --部门编号 departmentName-部门名称 ) b 表字段( id--部门编号 employee- 员工名称 ) 问题:如何一条 sql 语句查询出每个部门共有多少人
【正确答案】
create table a( id number primary key, departmentName varchar(20) ); create table b( id number, employee varchar(20) ); insert into a values(1,'部门 1'); insert into a values(2,'部门 2'); insert into a values(3,'部门 3'); insert into b values(1,'emp1'); insert into b values(1,'emp2'); insert into b values(1,'emp3'); insert into b values(2,'emp4'); insert into b values(2,'emp5'); insert into b values(3,'emp6'); select departmentName,count(employee) from a,b where a.id=b.id group by departmentName; |
【题目描述】
为管理岗位业务培训信息,建立 3 个表:
S (SID,SN,SD,SA) SID,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (CID,CN ) CID,CN 分别代表课程编号、课程名称
SC ( SID,CID,G ) SID,CID,G 分别代表学号、所选修的课程编号、学习成绩
1. 使用标准 SQL 嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名
2. 使用标准 SQL 嵌套语句查询选修课程编号为’02’的学员姓名和所属单位
3. 使用标准 SQL 嵌套语句查询不选修课程编号为’03’的学员姓名和所属单位
4. 使用标准 SQL 嵌套语句查询选修全部课程的学员姓名和所属单位
5. 查询选修课程超过 5 门的学员学号和所属单位
【正确答案】
create table s( sid int(10) primary key, sn varchar(20) not null, sd varchar(20) not null, sa int(3) not null ); create table c( cid int(10) primary key, cn varchar(20) not null ); create table sc( sid int(10) references s(sid), cid int(10) references c(cid), g int(10), primary key(sid,cid) ); insert into s values(1,"zhangsan","project",25); insert into s values(2,"lisi","mis",26); insert into s values(3,"wangwu","manager",27); insert into s values(4,"zhaoliu","mis",26); insert into c values(01,"税收基础"); insert into c values(02,"Core Java"); insert into c values(03,"NetWork"); insert into sc values(1,01,70); insert into sc values(1,02,75); insert into sc values(1,03,80); insert into sc values(2,01,80); insert into sc values(2,03,69); insert into sc values(3,02,73); 1) select s.sid,s.sn from s,c,sc where s.sid=sc.sid and c.cid=sc.cid and c.name='税收基础'; 2) select a.sn,a.sd from s a, c b where b.cid in(select c.cid from sc c where a.sid=c.sid and b.cid=c.cid) and b.cid=02; 3) select a.sn,a.sd from s a, c b where b.cid not in(select c.cid from sc c where a.sid=c.sid and b.cid=c.cid) and b.cid=03; 4) select sn,sd from s where sid in (select sid from sc group by sid having count(cid)=(select count(cid) from c)); 5) select sn,sd from s where sid in(select sid from sc group by sid having count(distinct cid)>5);
|
【题目描述】
请根据以下要求来完成题目: 会议室预定模块:某公司有多个会议室,以房间号区分。如果某部门需要预定会议室,则会提交预定请求(包含预定开始使用时间、预定结束使用,所预定会议室房间号)。 设计一个表,保存会议室预定信息。
要求采用 SQL 语句及JAVA 代码段判断在 2003-3-10 下午 3:00~4:00 3 号会议室是否空闲。 请写出有关 SQL 语句以及相关 JAVA 的代码段。
【正确答案】
1)Sql 语句:
create table meeting( id number primary key , room_id varchar(10), isUsed char, begin timestamp, end timestamp ); insert into meeting values( 1,'201',1,to_date('2003-03-10 15:00:00','yyyy-mm-dd hh24:mi:ss') ,to_date('2003-03-10 16:00:00','yyyy-mm-dd hh24:mi:ss')); insert into meeting values( 2,'201',1,to_date('2003-03-10 17:00:00','yyyy-mm-dd hh24:mi:ss') ,to_date('2003-03-10 22:00:00','yyyy-mm-dd hh24:mi:ss')); |
2)
package com.tarena; import java.sql.*; public class Test { public static void main(String[] args) { String driverName = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String username = "scott"; String pwd = "tiger"; Connection con = null; Statement stmt = null; ResultSet rs = null; try { Class.forName(driverName); con = DriverManager.getConnection(url, username, pwd); stmt = con.createStatement(); String sql = "select isUsed from " + "meeting " +"where ((begin between to_date( '2003-03-10 15:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2003-03-10 16:00:00','yyyy-mm-dd hh24:mi:ss')) " +"or(end between to_date( '2003-03-10 15:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2003-03-10 16:00:00','yyyy-mm-dd hh24:mi:ss')))" +" and room_id=201"; if (stmt.execute(sql)) { rs = stmt.getResultSet(); } StringBuffer sb = new StringBuffer(); while (rs.next()) { sb.append("isFree:" + rs.getInt(1) + " "); } System.out.print(sb.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { con.close(); } catch (Exception e1) { e1.printStackTrace(); } } } } |
【题目描述】
下面是两个数据库表,分别记录员工姓名和工资
T_EMPLOYEE
ID NAME
2 张三
3 李四
5 王五
????? ?????
T_SALARY
ID SALARY
2 3400
3 4300
5 2500
????? ?????
1.查询表 T_EMPLOYEE 中 id = 3 的员工记录
2.查询表 T_EMPLOYEE 中所有员工记录
3.联合查询表 T_EMPLOYEE 和 T_SALARY 中所有员工的姓名和工资记录,并按照薪水从高到低排列
【正确答案】
1).select * from t_employee where id = 3; 2).select * from t_employee; 3).select e.name,s.salary from t_employee e,t_salary s where e.id=s.id order by s.salary; |
【题目描述】
有三张表,学生表 S,课程表 C,学生课程表 SC,学生可以选修多门课程,一门课程可能被多个 学生选修,通过 SC 表关联。
1)写出建表以及插入语句;
2)写出 SQL 语句,查询选修了所有选修课程的学生;
3)写出 SQL 语句,查询选修了至少 2 门以上的课程的学生
【正确答案】
1) create table student (id number(10) primary key,name varchar2(20)); create table course (id number(10) primary key,name varchar2(20)); create table sc(sid number(10) references student(id),cid number(10 references course(id),grade number(4,2)); insert into student values(1,'feifei'); insert into student values(2,'jingjing'); insert into student values(3,'nannan'); insert into student values(4,'yuanyuan'); insert into student values(5,'jiejie'); insert into course values(1,'corejava'); insert into course values(2,'c++');insert into course values(3,'jdbc'); insert into course values(4,'hibernate'); insert into sc values(1,1,98); insert into sc values(2,1,97); insert into sc values(3,1,94); insert into sc values(4,1,92); insert into sc values(5,1,93);insert into sc values(1,2,94);insert into sc values(2,2,92); insert into sc values(3,2,95); insert into sc values(5,2,97); insert into sc values(1,3,92); insert into sc values(2,3,92); insert into sc values(4,3,91); insert into sc values(1,4,99); insert into sc values(3,4,89); 2)select sid,count(*) from sc group by sid having count(*)=(select count(*) from course); 3)select sid,count(*) from sc group by sid having count(*)>=2; |
SQL 题
--操作员表
select pkid,name,sys_corp_id '单位主键' from base_operator
--角色表
select pkid,sys_corp_id '单位主键',name from base_role
--角色与操作员的对应关系表
select pkid,base_role_id '角色主键',base_operator_id '操作员主键' from base_role_operator
--单位表
select pkid,name from sys_corps
--问题:
--1.显示出'开发'公司所拥有的操作员
--2.显示出'开发'公司每个角色所对应的操作员信息
--3.显示出'开发'公司每个角色所对应的操作员的个数
【正确答案】
答:1).Select name from base_operator; 2).Select op.pkid,op.name,op.sys_corp_id From base_operator op,base_role_operator ro ,base_role br Where ro.base_operator_id =op.pkid And br.pkid=ro.base_role_id; 3).Select max(br.name) ,count(*) From base_role_operator ro,base_role br Where ro.base_role_id=br.pkid Group by br.base_role_id; |
【题目描述】
说明在一个系统中权限管理中应该有哪些表、表间关系、各表哪些功能?
【正确答案】
角色和权限表是 m:n 的关系 操作表和权限表是 1:m 的关系模块表和操作表是 1:m 的关系表的大体设计如下:
-- 角色表 create table roles ( id number primary key, name varchar2(20) ); -- 系统模块表 create table modules ( id number primary key, name varchar2(50), url varchar2(50) ); -- 模块操作表 create table operations ( id number primary key, name varchar2(20), mid number, constraint foreign key (mid) references modules(id) ); -- 权限表 create table rights ( id number primary key, name varchar2(20), url varchar2(50), operationid int references operations(id) ); -- 角色权限设置表 create table rolerights ( id number primary key, roleid number references roles(id), rightid number references rights(id) ); |
【题目描述】
说出下面语句的作用:
Select rownum,last_name,salary
From (select last_name,salary from s_emp order by salary desc) Where rownum<=10;
【正确答案】
选出 s_emp 表中工资前 10 名员工的姓名和工资。
【解释】无
【题目描述】
判断这 PL/SQL 代码块:BEGIN
FOR i IN 1..6 LOOP IF i = 2 OR i = 3 THEN null; ELSE INSERT INTO example(one) VALUES (i); END IF; ROLLBACK; END LOOP; COMMIT; END; |
有多少行被插入到表 EXAMPLE ?
【选项】
A. 0 B. 1 C. 2 D. 3
【正确答案】 A
【解释】
在循环结束前执行了 ROLLBACK 语句,数据被回滚。
【题目描述】
关于 PL/SQL 块的执行部分下列说法正确的是?
【选项】
A.PL/SQL 表达式可以包含分组函数.
B. PL/SQL 表达式不可以包含 SQL 函数.
C. 在 SQL 语句中部分分组函数可用.
D. 以上都不对
【正确答案】 A
【题目描述】
PL/SQL 的哪一部分实现对数据的操作?
【选项】
A. 头部分 B. 列外部分 C. 执行部分 D. 声明部分
【正确答案】 C
【题目描述】
在 Oracle 中,执行如下 PL/SQL 语句后
CREATE TYPE car AS OBJECT ( id NUMBER, model VARCHAR2(25), color VARCHAR2(15) ); DECLARE myvar car.model%TYPE; BEGIN END; |
变量 myvar 的数据类型为()。
【选项】
A.NUMBER B.car 类型 C.VARCHAR2 D.OBJECT
【正确答案】 C
【解释】
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。
【题目描述】
表 CUSTOMER 包含如下列: CUSTOMER_ID NUMBER(9) ;LAST_NAME VARCHAR2(20) ;FIRST_NAME VARCHAR2(20) ;CREDIT_LIMIT NUMBER(9,2)
如下代码:
DECLARE CURSOR cust_cursor IS SELECT customer_id, last_name, first_name FROM customer; cust_rec cust_cursor%ROWTYPE; |
你如何操纵 CUST_REC 中的记录?
【选项】
A.添加一个 LOOP 到游标声明中.
B.在 PL/SQL 块的执行部分,使用 INSERT INTO 语句.
C.在 PL/SQL 块的执行部分,使用一个 LOOP 和 FETCH 语句.
D.在 PL/SQL 块的执行部分,使用 SELECT 语句使用 INTO 操作.
【正确答案】 D
【解释】
%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致,
在这里就和游标查询语句中的数据结果保持一致。例如:
DECLARE CURSOR cust_cursor IS SELECT CUSTOMER_ID, last_name, first_name FROM customer; cust_rec cust_cursor%ROWTYPE; begin open cust_cursor; LOOP FETCH cust_cursor INTO cust_rec; EXIT WHEN cust_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(cust_rec.last_name); END LOOP; end; |
【题目描述】
定义存储过程如下:
CREATE OR REPLACE PROCEDURE INSERT_TEAM (V_ID in NUMBER,V_CITY in VARCHER2 DEFAULT 'AUSTIN', V_NAME in VARCHER2) IS BEGIN INSERT INTO TEAM (id, city,name) VALUES (v_id,v_city,v_name); COMMIT; END; |
以下哪些 PL/SQL 语句能够正确调用该过程?
【选项】
A. EXECUTE INSERT_TEAM;
B. EXECUTE INSERT_TEAM (V_NAME=.>"LONG HORNS");
C. V_CITY=>"AUSTIN";
D. EXECUTE INSERT_TEAM (3,"AUSTIN","LONG HORNS")
【正确答案】 D
【题目描述】
关于存储过程参数,正确的说法是( )
【选项】
A. 存储过程的输出参数可以是标量类型,也可以是表类型。
A. 可以是表类型
B. 存储过程输入参数可以不输入信息而调用过程
C. 可以指定字符参数的字符长度(函数的()或者过程的(number/varchar2))
D. 以上说法都不对
【正确答案】 b
【题目描述】
PL/SQL块中不能直接使用的SQL命令是( )。
【选项】
A.SELECT B.INSERT C.UPDATE D.DROP
【正确答案】 D
【题目描述】
以下不属于命名的PL/SQL块的是( )。
【选项】
A.程序包 B.过程 C.游标 D.函数
【正确答案】 C
【解释】
游标充当一个指示返回多条记录集合中某一条的指针。不能单独的使用,不能被声明它以外的程序。
【题目描述】
()包用于显示PL/SQL块和存储过程中的调试信息。
【选项】
A.DBMS_OUTPUT B.DBMS_STANDARD
C.DBMS_INPUT D.DBMS_SESSION
【正确答案】 A
【题目描述】
在 PL/SQL 块的哪部分可以对初始变量赋予新值?
【选项】
A.结尾部分 B.开头部分 C.执行部分 D.声明部分
【正确答案】 C
【题目描述】
用于调用存储过程的对象是。
【选项】
A.ResultSet B.DriverManager C.CallableStatemet D.PreparedStatement
【正确答案】 C
【解释】
ResultSet 是结果集对象;DriverManager 管理一组驱动程序;PreparedStatement 预编译的,用来发送和执行 SQL 语句的。
【题目描述】
在 PL/SQL 中使用哪几种语句来对变量进行赋值?
【选项】
A. := B. SELECT INTO C. FETCH INTO D. =
【正确答案】 ABC
【题目描述】
下列说法正确的是( )
【选项】
A. 在PLSQL自定义函数中如果包含UPDATE、DELETE、INSERT语句,不必在函数体内给出COMMIT;
B. 自定义函数可以在SQL语句中调用、也可以在PLSQL块中调用
C. 自定义函数可以返回表类型
D. 自定义函数中的参数可以是OUT类型
【正确答案】 ABCD
【题目描述】
考虑下列声明,那些是不合法的:
【选项】
A. DECLARE v_name, v_dept VARCHAR2(14);
B. DECLARE v_test NUMBER(5);
C. DECLARE V_MAXSALARY NUMBER(7, 2) = 5000;
D. DECLARE V_JOINDATE BOOLEAN := SYSDATE;
【正确答案】 ACD
【解释】
A.v_name 没有数据类型
C.:=是赋值
D.V_JOINDATE 是 boolean 类型,sysdate 是 Date 类型
【题目描述】
解释 TABLE Function 的用途
【正确答案】
TABLE Function 是通过 PL/SQL 逻辑返回一组纪录,用于普通的表/视图。他们也用于pipeline和 ETL(ETL,Extraction-Transformation-Loading 的缩写,中文名称为数据提取、转换和加载)过程。
【题目描述】
创建过程语法
CREATE [OR REPLACE] PROCEDURE Procedure_name
[ (argment [ { IN | IN OUT }] Type,
argment [ { IN | OUT | IN OUT } ] Type ]
{ IS | AS }
<类型.变量的说明>
BEGIN
<执行部分>
EXCEPTION
<可选的异常错误处理程序>
END;
请问,IN、OUT、IN OUT分别表示什么。
【正确答案】
【解释】无
1) IN: 表示该参数不能被赋值(只能位于等号右边);
2) OUT:表示该参数只能被赋值(只能位于等号左边);
3) IN OUT: 表示该类型既能被赋值也能传值;
【题目描述】
如何调用存储过程
【正确答案】
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、ORACLE开发工具或第三方开发工具中来调用运行。
ORACLE 使用EXECUTE 语句来实现对存储过程的调用:
EXEC[UTE] Procedure_name( parameter1, parameter2…);
【题目描述】
plSql循环遍历的几种方式?
【正确答案】
1).loop循环
declare v_i number; begin v_i:=1; loop v_i:=v_i+1; if v_i=10 then exit; --退出循环还可以 exit when v_i=10; end if; end loop; dbms_output.put_line(v_i); end; |
2).while循环
Declare v_i number; v_sum number; begin v_i:=1;v_sum:=0; while v_i<=10 loop v_i:=v_i+1; v_sum:=v_i+v_sum; end loop; dbms_output.put_line(v_sum); end; |
3).for循环
declare v_sum number:=0; begin for v_i in 1..10 loop v_sum:=v_i+v_sum; end loop; dbms_output.put_line(v_sum); end; |
【题目描述】
plsql有什么用?
【正确答案】
plsql主要用来写存储过程的,它包含了SQL语句没有的那些逻辑的语句,像if end,while...之类的,可以实现更强大的功能。在某些情况下,比如说现在我要给某个表插入10000行的测试数据(有规律),写1000个insert 语句太麻烦,就用plsql实现。
【题目描述】
怎么用plsql创建序列
【正确答案】
create sequence 序列名 increment by 其实位置 start with 每次增加
Nomaxvalue nocycle
【题目描述】
存储过程和函数的区别
【正确答案】
从参数的返回情况来看:
如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数。 从调用情况来看:如果在 SQL 语句(DML 或 SELECT)中调用的话一定是存储函数或存储的封装函数不可以是存储过程, 但调用存储函数的时候还有好多限制以及函数的纯度等级的问题,如果是在过程化语句中调用的话, 就要看你要实现什么样的功能。函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些 DDL 语句等等),所以虽然他们的语法 上很相似但用户在使用他们的时候所需要完成的功能大部分情况下是不同的。
【题目描述】
你刚刚编译了一个 PL/SQL Package 但是有错误报道,如何显示出错信息?
【正确答案】
SHOW ERRORS
【题目描述】
写出一个匿名的 SQL 程序块,完成如下任务:向表中插入 3000 条记录,在 salary 字段中有 500条记录的值为 1000,500 条记录的值为 1200,1000 条记录的值为 1500,1000 条记录的值为 1800,Id 字段的值来自序列 xl,其他字段的值任意。
【正确答案】
declare x number:=0; begin for x in 1..3000 loop If(x<=500) then Insert into system.test values(x1.nextval,'jim',24,'m',1000); elsif((x>500)and (x<1001)) then Insert into system.test values(system.xl1.nextval,'jim',24,'m',1200); elsif((x>1000)and (x<2001)) then Insert into system.test values(system.xl1.nextval,'jim',24,'m',1500); Else Insert into system.test values(system.xl1.nextval,'jim',24,'m',1800); end if; end loop; end; |
【题目描述】
写出一个存储过程,这个存储过程的作用是修改特定 id 编号的记录,将该条记录的 salary 字 段的值加上 500;
【正确答案】
Create or replace procedure system.update_age (vid in number) is Begin Update table1 set salary=salary+500 where id=vid; End; |
【题目描述】
创建一个 system 方案中的函数 fn1,函数作用为:将指定 ID 号的记录中的 salary 字段值乘以1.05。
【正确答案】
Create or replace function system.fn1(salary1 system.table1 salary &type) Return number as V1 numbre:=1.05; V2 numbre; Begin V2=v1*salary1; Return v2; End ; |
【解释】无
【题目描述】
假设有以下的两个表:
Cus_A
ID* Name Address
? ? ?
Cus_B
ID* Name Address
? ? ?
*主键
表 Cus_A 和表 Cus_B 的结构完全相同,表 Cus_A 和表 Cus_B 中既存在 ID 相同的记录,也存在 ID 不 同的记录。现要求将 ID 只存在于表表 Cus_A 中而不存在于表 Cus_B 中的记录全部插入到 Cus_B 表中, 并用表 Cus_A 中的记录更新 Cus_B 中相同的 ID 的记录,请写出完成这一功能的存储过程。
【正确答案】
create or replace procedure test is cust_record cus_a%rowtype ; cursor cust_cursor is select id,name,address from cus_a; Begin Open cust_cursor; LOOP Fetch cust_cursor into cust_record; EXIT WHEN cust_cursor %NOTFOUND; --先删除在插入 delete from cus_b where id=cust_record.id; insert into cus_b values(cust_record.id, cust_record.name, cust_record.address); END LOOP; end; |
【解释】无
【题目描述】
请用数据库语言求1-100之间的素数
【正确答案】
set serverout on create or replace procedure is_prime(inp number) as i number; j number; is_prim boolean; begin dbms_output.new_line; dbms_output.put(to_char(2)||' '); for i in 3..inp loop begin is_prim:=true; for j in 2..trunc(sqrt(i)) loop if mod(i,j)=0 then begin is_prim:=false; exit; end; end if; end loop; if is_prim then dbms_output.put(to_char(i)||' '); end if; end; end loop; dbms_output.new_line; end; |
【题目描述】
完成以下PL/SQL块,功能是:创建一个函数dept_name,其功能是接受职员编号后返回职员所在部门名称。(注:部门名称在dept表中,而职员信息在emp表中,职员所在部门号的列名为deptno)
【正确答案】
CREATE OR REPLACE FUNCTION dept_name (emp_no NUMBER) RETURN VARCHAR2 AS dept_no NUMBER(2); result dept.dname%TYPE; BEGIN ____SELECT deptno INTO dept_no FROM emp WHERE empno=emp_no_______ SELECT dname INTO result FROM dept WHERE deptno = dept_no; ___RETURN result____; EXCEPTION WHEN OTHERS THEN RETURN NULL; END |
【题目描述】
对所有员工,如果该员工职位是MANAGER,并且在DALLAS工作那么就给他薪金加15%;如果该员工职位是CLERK,并且在NEW YORK工作那么就给他薪金扣除5%;其他情况不作处理
【正确答案】
declare cursor c1 is select * from emp; c1rec c1%rowtype; v_loc varchar2(20); begin for c1rec in c1 loop select loc into v_loc from dept where deptno = c1rec.deptno; if c1rec.job = 'MANAGER' and v_loc = 'DALLAS' then update emp set sal = sal * 1.15 where empno = c1rec.empno; elsif c1rec.job='CLERK' and v_loc = 'NEW YORK' then update emp set sal = sal * 0.95 where empno = c1rec.empno; else null; end if; end loop; end; |
【题目描述】
对直接上级是'BLAKE'的所有员工,按照参加工作的时间加薪:
81年6月以前的加薪10% ;81年6月以后的加薪5%
【正确答案】
declare cursor c1 is select * from emp where mgr = (select empno from emp where ename='BLAKE'); --直接上级是'BLAKE'的所有员工 c1rec c1%rowtype; begin for c1rec in c1 loop if c1rec.hiredate < '01-6月-81' then update emp set sal = sal * 1.1 where empno = c1rec.empno; else update emp set sal = sal * 1.05 where empno = c1rec.empno; end if; end loop; end; |
【题目描述】
编写一个触发器实现如下功能:
对修改职工薪金的操作进行合法性检查:
a) 修改后的薪金要大于修改前的薪金
b) 工资增量不能超过原工资的10%
c) 目前没有单位的职工不能涨工资
【正确答案】
create or replace trigger tr1 after update of sal on emp for each row begin if :new.sal <= :old.sal then raise_application_error(-20001,'修改后的薪金要大于修改前的薪金'); elsif :new.sal > :old.sal * 1.1 then raise_application_error(-20002,'工资增量不能超过原工资的10%'); elsif :old.deptno is null then raise_application_error(-20003,'没有单位的职工不能涨工资'); end if; end; |
【题目描述】
编写一个PL/SQL程序块,对名字以"A"或"S"开始的所有雇员按他们的基本薪水的10%加薪。
【正确答案】
DECLARE CURSOR c1 IS SELECT * FROM emp WHERE SUBSTR(ename,1,1)=′A′ OR SUBSTR(ename,1,1)=′S′ FOR UPDATE OF sal; BEGIN FOR i IN c1 LOOP UPDATE emp SET sal=NVL(sal,0)+NVL(sal,0)*0.1 WHERE CURRENT OF c1; END LOOP; END; |
【题目描述】
函数的helloworld:返回一个“helloworld”的字符串
【正确答案】
create or replace function hello_func return varchar2 is begin return "helloworld"; end; 执行函数 begin dbms_output.out_line(hello_func()); end; 或者: select hello_func() from dual; |
【题目描述】
更新指定员工工资,增加100;若该员工不存在则跑出用户自定义异常:no_result
【正确答案】
declare no_result exception; begin update employees set salary = salary+100 where employee_id=1001; if sql%notfound then raise no_result; end if; exception when no_result then dbms_output.put_line("更新失败"); |
【题目描述】
利用游标,调整公司中员工的工资:
工资范围 调整基数
0-5000 5%
5000-10000 3%
10000-150000 2%
15000- 1%
【正确答案】
declare cursor emp_sal_cursor is select salary,employee_if from employees; temp number(4,2); v_sal employees.salary%type; v_id employees.employee_id%type; begin open emp_sal_cursor; fetch emp_sal_cursor into v_sal,v_id; while emp_sal_cursor%found loop dbms_output.put_line(v_id || ':' v_sal); if v_sal <=5000 then temp :=0.05; elsif v_sal<=10000 then temp:=0.03; elsif v_sal<=15000 then temp:=0.02; else temp:=0.01; end if; dbms_output.put_line(v_id||':'|| v_sal||','||temp); update employees set salary = salary*(1+temp) where employee_id=v_id; fetch emp_sal_cursor into v_sal,v_id; end loop; close emp_sal_cursor; end; update employees set salary = * (1 + decode(trunc(salary/5000), 0, 0.05,1, 0.03, 2, 0.02, 0.01)) |
【题目描述】
提供 Java 存取数据库能力的包是()
【选项】
A.java.sql B.java.awt C.java.lang D.java.swing
【正确答案】 A
【解释】
java.sql 是 JDBC 的编程接口;java.awt 和 java.swing 是做图像界面的类库;java.lang: Java 编程语言进行程序设计的基础类。
【题目描述】
写出执行下面代码后的正确结果
interface MyDB { public void getConnection(); } class MyDBDriver implements MyDB { public void getConnection() { System.out.println("getConnection()"); } } public class MyClass { public static void aMethod(MyDB db) { db.getConnection(); } public static void main(String args[]) { MyDBDriver db_driver = new MyDBDriver(); aMethod(db_driver); } } |
【正确答案】 getConnection()
【题目描述】
Java 数据库编程包含哪些类?Java数据库编程的基本过程是什么?
【正确答案】
用到的类:Connection、ResultSet、错误!超链接引用无效。错误!超链接引用无效。Java 中访问数据库的步骤如下:
1)注册驱动;
2)建立连接;
3)创建 Statement;
4)执行 sql 语句;
5)处理结果集(若 sql 语句为查询语句);
6)关闭连接。
【题目描述】
Statement,PreparedStatement,CallableStatment 的区别。
【正确答案】
区别有以下几点:
1) Statement 是 PreparedStatement 和 CallableStatement 的父类;
2)Statement 是直接发送 Sql 语句到数据库,事先没有进行预编译。PreparedStatement 会将 sql 进 行预编译,当 sql 语句要重复执行时,数据库会调用以前预编译好的 sql 语句,所以 PreparedStatement 在性能方面会更好;
3)PreparedStatement 在执行 sql 时,对传入的参数可以进行强制的类型转换。以保证数据格式与底 层的数据库格式一致。
4)CallableStatement 适用与存储过程的查询表达语句
【题目描述】
JAVA 中如何进行事务的处理?
【正确答案】
Connection 类中提供了 3 个事务处理方法:
setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交,即为 true,通 过设置 false 禁止自动提交事务;
commit():提交事务;
rollback():回滚事务。
【题目描述】
请简单写出用 JAVA 连接 Oracle 数据库,并执行一条/SQL 语句。(只需要写关键几条语句即可,/SQL语句:SELECT*FROM t_users WHERE users_id=‘1111’)
【正确答案】
Class.forName("oracle.jdbc.OracleDriver"); String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String user = "scott"; String password = "tiger"; Connection con = DriverManager.getConnection(url, user, password); Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery("SELECT*FROM t_users WHERE users_id='1111'"); while (rs.next()) { // 取值 } rs.close(); stm.close(); con.close(); |