笔试_oracle(5)

来源:互联网 发布:英克软件售后 编辑:程序博客网 时间:2024/06/03 22:43

一、 单选题(每小题2分,共40分)

1. 下列截取系统日期的年的写法正确的是()

A:

SELECT TO_CHAR(SYSDATE,'yyyy')

FROM dual;

 


 

B: 

SELECT TO_DATE(SYSDATE,'yyyy')

FROM dual;


C: 

SELECT DECODE(SUBSTR(SYSDATE, 8), 'YYYY')

FROM dual;


D: 

SELECT DECODE(SUBSTR(SYSDATE, 8), 'year')

FROM dual;


E: 

SELECT TO_CHAR(SUBSTR(SYSDATE, 8,2),'yyyy')

FROM dual;

参考答案:

A

解析:

输出指定格式的日期用TO_CHAR(date,format):date是待转换的日期,format指定转换的格式。


2. emp的表结构如下:

 

EMPLOYEE_ID NUMBER(4)

EMPNAME VARCHAR2 (25)

SALARY NUMBER(9,2)

HIRE_DATE DATE


用下面的SQL语句查询数据库,结果会以什么顺序排列?

 

SELECT empname,hire_date HIREDATE, salary

FROM EMP

ORDER BY hire_date;

A:随机排列

B:以hire_date升序排列

C:以hire_date降序排列

D:以字母升序排列

E:以字母降序排列

 

参考答案:

B

解析:

题目中的SQL语句是以hire_date排序的,默认不写排序方式时结果以升序排列


3. 下列选项哪一个能够完成给空表(STUDENTS)的STUDENT_ID列添加主键的任务

A: 

ALTER TABLE students

ADD PRIMARY KEY student_id;

B: 

ALTER TABLE students

ADD CONSTRAINT PRIMARY KEY (student_id);

C: 

ALTER TABLE students

ADD CONSTRAINT stud_id_pk PRIMARY KEY student_id;

D: 

ALTER TABLE students

ADD CONSTRAINT stud_id_pk PRIMARY KEY (student_id);

E: 

ALTER TABLE students

MODIFY CONSTRAINT stud_id_pk PRIMARY KEY (student_id);

 

参考答案:

D

解析:

给已存在的表添加主键的语法:ALTER TABLE  table_name
ADD CONSTRAINT  约束名  PRIMARY KEY  (字段名);注:字段名必须用括号括起来


4. 下面排序的说法不正确的是:

A:asc是升序排列

B:默认是升序排序

C:desc是降序排序

D:  默认是降序排序

 

参考答案:

D

解析:

数据库查询中默认是asc升序排列


5. 下列解锁hr账户的命令正确的是()

A:update user hr account unlock;

B:alter user hr account unlock;

C:alter user hr unlock;

D:update user hr unlock;

 

参考答案:

B

解析:

固定语法。


6.  能查询年龄小于15岁的女学生信息:

A: select * from users where age<15 and sex=女

B: select * from users where age<15 or sex='女'

C: select * from users where id<15 and sex='女'

D: select * from users where age<15 and sex='女'

 

参考答案:

D

解析:

 题目要求<15岁 和 女生两个条件同时满足 所以用and 进行条件连接。


7. EMP表包含以下字段:
LAST_NAME VARCHAR2 (25)
SALARY NUMBER (6,2)
DEPARTMENT_ID NUMBER (6)

以下关于查询没有被分配部门的员工的SQL语句描述说法正确的有


SELECT LAST_NAME, SALARY, DEPARTMENT_ID

WHERE DEPARTMENT_ID = NULL;

 

 

A:该SQL语句能够满足需求

B:应该更改WHERE子句中的列以显示所需的结果

C:应该更改WHERE子句中的运算符以显示所需的结果。

D:应该更改WHERE子句以使用外部联接来显示所需的结果。

 

参考答案:

C

解析:

查询空值的运算符只能是IS或IS NOT;
能够满足要求的查询语句是: 

SELECT LAST_NAME, SALARY, DEPARTMENT_ID

WHERE DEPARTMENT_ID IS NULL;


8. 关于下列SQL语句,说法正确的是? 

CREATE TABLE dept

(deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13));

ROLLBACK;

DESCRIBE DEPT;

A:执行DESCRIBE DEPT  显示表DEPT的结构

B:执行ROLLBACK 能够释放被表DEPT 占用的存储空间

C:执行 DESCRIBE DEPT 会返回一个 ORA-04043错误: 因为表DEPT已经不存在

D:只有当在执行ROLLBACK之前执行COMMIT才能正确用DESCRIBE DEPT来显示表DEPT的表结构

 

参考答案:

A

解析:

DDL会被隐式提交,而rollback回退到没有被提交的地方,所以DDL不会受到rollback的影响;
DESCRIBE DEP  的作用是显示表DEPT的表结构 ;
当然建表语句是DDL
结合以上两点不难得出正确结论是A。


9. 观察下列三张表(分别为学生表STUDENT,课程表SUBJECT,成绩表SCORE)的表结构

下列SQL语句能正确运行的是()

A: 

SELECT stuId,stuName,subName,SCORE FROM STUDENT stu,SUBJECT sub,SCORE1 sc 

  WHERE SC.stuId=STU.stuId AND SC.subId=SUB.subId;

B: 

SELECT STU.stuId,stuName,subId,subName,SCORE FROM STUDENT stu,SUBJECT sub,SCORE1 sc 

  WHERE SC.stuId=STU.stuId AND SC.subId=SUB.subId;

C: 

SELECT stuId,stuName,subName,subId,SCORE FROM STUDENT stu,SUBJECT sub,SCORE1 sc 

  WHERE SC.stuId=STU.stuId AND SC.subId=SUB.subId;

D: 

SELECT STU.stuId,stuName,subName,SCORE FROM STUDENT stu,SUBJECT sub,SCORE1 sc 

  WHERE SC.stuId=STU.stuId AND SC.subId=SUB.subId;

 

参考答案:

D

解析:

当我们要连接的表含有相同的列名是,在select子句中一定要给该列指定一个表名,以防出现列名相同带来的歧义


10. 观察employees表的表结构

经理要求你创建一个视图EMP_VU,该视图允许用户通过视图向表中插入数据,选项中符合要求的是()

A: 

CREATE VIEW emp_vu AS

SELECT employee_id, emp_name,

department_id

FROM employees

WHERE mgr_id IN (102, 120);

B: 

CREATE VIEW emp_vu AS

SELECT employee_id, emp_name, job_id,

department_id

FROM employees

WHERE mgr_id IN (102, 120);

C: 

CREATE VIEW emp_vu AS

SELECT department_id, SUM(sal) TOTALSAL

FROM employees

WHERE mgr_id IN (102, 120)

GROUP BY department_id;

D: 

CREATE VIEW emp_vu AS

SELECT employee_id, emp_name, job_id,

DISTINCT department_id

FROM employees;

 

参考答案:

B

解析:

在视图上使用INSERT语句添加数据时,要符合以下规则。
1)使用INSERT语句向数据表中插入数据时,用户必须有插入数据的权利。
2)由于视图只引用表中的部分字段,所以通过视图插入数据时只能明确指定视图中引用的字段的取值。而那些表中并未引用的字段,必 须知道在没有指定取值的情况下如何填充数据,因此视图中未引用的字段必须具备下列条件之一。
该字段允许空值。(A错误原因:job_id不允许为空,视图中又没有该字段)
该字段设有默认值。
该字段是标识字段,可根据标识种子和标识增量自动填充数据。
该字段的数据类型为timestamp或uniqueidentifier。
3)视图中不能包含多个字段值的组合,或者包含使用统计函数的结果。(C的错因:视图字段中使用了组函数)
4)视图中不能包含DISTINCT或GROUP BY子句。(D的错因:视图包含了DISTINCT 子句)
5)如果视图中使用了WITH CHECK OPTION,那么该子句将检查插入的数据是否符合视图定义中SELECT语句所设置的条件。如果插入的数据不符合该条件,SQL Server会拒绝插入数据。
6)不能在一个语句中对多个基础表使用数据修改语句。因此,如果要向一个引用了多个数据表的视图添加数据时,必须使用多个INSERT 语句进行添加。


11. 观察EMP的表结构

执行该SQL语句,返回的结果的顺序是怎样的?

 

SELECT empname,hire_date HIREDATE, salary

FROM EMP

ORDER BY hire_date;

A:无序

B:按日期升序

C:按日期降序

D:按字母顺序升序

E:按字母顺序降序

 

参考答案:

B

解析:

当不指定排序方式时,系统默认升序排序


12. 要求有下列表结构

1. an ORDER_ID column of number data type
2. a CUSTOMER_ID column of number data type
3. an ORDER_STATUS column that contains a character data type
4. a DATE_ORDERED column to contain the date the order was placed
并且要求在插入数据时,假如ORDER_STATUS 没有数据,则用默认值'PENDING'代替下列SQL语句正确的是()

A: 

CREATE TABLE orders (

order_id NUMBER(10),

customer_id NUMBER(8),

order_status NUMBER(10) DEFAULT 'PENDING',

date_ordered DATE );

B: 

CREATE TABLE orders (

order_id NUMBER(10),

customer_id NUMBER(8),

order_status VARCHAR2(10) = 'PENDING',

date_ordered DATE );

C:


CREATE OR REPLACE TABLE orders (

order_id NUMBER(10),

customer_id NUMBER(8),

order_status VARCHAR2(10) DEFAULT 'PENDING',

date_ordered DATE );

 

 

D: 

 CREATE OR REPLACE TABLE orders (

order_id NUMBER(10),

customer_id NUMBER(8),

order_status VARCHAR2(10) = 'PENDING',

date_ordered DATE );

E: 

CREATE TABLE orders (

order_id NUMBER(10),

customer_id NUMBER(8),

order_status VARCHAR2(10) DEFAULT 'PENDING',

date_ordered DATE );

F: 

CREATE TABLE orders (

order_id NUMBER(10),

customer_id NUMBER(8),

order_status VARCHAR2(10) DEFAULT 'PENDING',

date_ordered VARCHAR2 );

 

参考答案:

E

解析:

A:order_status数据类型不正确;
B:默认值的定义是用DEFAULT  ‘默认值’
C:创建表没有OR REPLACE子句;
D:同BC;
F:date_ordered数据类型不正确;

 

13. 为了成功查询视图,下列选项什么是必须的()

A:基础表必须具有数据。

B:您需要对视图具有SELECT特权。

C:基础表必须在同一模式中。

D:您只需要对基础表具有SELECT特权。

 

参考答案:

B

解析:

没什么可解释的吧


14. 观察表EMPLOYEES 和表DEPARTMENTS 的表数据

你想检索所有员工的last_name和department_name信息,无论他们在部门表中是否有匹配的部门。下列SQL语句正确的是()

A: 

SELECT last_name, department_name

FROM employees NATURAL JOIN departments;

B: 

SELECT last_name, department_name

FROM employees JOIN departments ;

C: 

SELECT last_name, department_name

FROM employees e

RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);

D: 

SELECT last_name, department_name

FROM employees FULL JOIN departments

ON (e.department_id = d.department_id);

E: 

SELECT last_name, department_name

FROM employees e JOIN departments d

ON (e.department_id = d.department_id);

F: 

SELECT last_name, department_name

FROM employees e LEFT OUTER

JOIN departments d ON

参考答案:

F

解析:

根据题目要求必须用连接查询,将employees 作为基表来连接departments ,连接条件是(e.department_id = d.department_id)。


15. 关于数据库语言下列选项依次是DDL、DML、DCL、TCL的是()

A:CREATE、INSERT、COMMIT、GRANT

B:ALTER、GRANT、SAVEPOINT、UPDATE

C:DROP、DELETE、REVOKE、ROLLBACK

D:TRUNCATE、UPDATE、REVOKE、COMMIT

E:COMMENT、SELECT、REVOKE、RENAME

 

参考答案:

D

解析:

Data Definition Language (DDL):CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME(重新命名对象)
Data Manipulation Language (DML):SELECT、INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE 
Data Control Language (DCL):GRANT(授权)、REVOKE(取消权限)
Transaction Control (TCL):COMMIT、SAVEPOINT(设置以后可以回滚的点)、ROLLBACK、SET TRANSACTION(更改事务选项,如隔离级别和要使用的回滚段)


16. 观察employees表结构

关于下面SQL语句说法正确的是() 

SELECT last_name

FROM employees

WHERE salary IN (SELECT MAX(salary)

FROM employees

GROUP BY department_id);

A:SELECT语句在语法上是准确的。

B:SELECT语句无效,因为没有HAVING子句。

C:SELECT语句无效,因为GROUP BY子句中指定的列不在SELECT列表中。

D:SELECT语句无效,因为GROUP BY子句应在主查询中,而不是在子查询中。

 

参考答案:

A

解析:

值得提醒的也就是C选项,在GROUP BY子句中指定的列不一定非要出现在select子句的列表中,但在select和group by配合使用时,select的查询字段要么是group by中指定的字段,要么是其他字段的组函数。


17. 哪个SQL语句定义了在EMP表的DEPTNO字段上定义了FOREIGN KEY约束

A: 

CREATE TABLE EMP

(

empno NUMBER(4),

ename VARCHAR2(35),

deptno NUMBER(7,2) NOT NULL,

CONSTRAINT emp_deptno_fk FOREIGN KEY deptno

REFERENCES dept deptno

);

B: 

CREATE TABLE EMP

(empno NUMBER(4),

ename VARCHAR2(35),

deptno NUMBER(7,2)

CONSTRAINT emp_deptno_fk REFERENCES dept (deptno));

C: 

CREATE TABLE EMP

(empno NUMBER(4),

ename VARCHAR2(35),

deptno NUMBER(7,2) NOT NULL,

CONSTRAINT emp_deptno_fk REFERENCES dept (deptno)

FOREIGN KEY (deptno));

D: 

CREATE TABLE EMP

(empno NUMBER(4),

ename VARCHAR2(35),

deptno NUMBER(7,2) FOREIGN KEY

CONSTRAINT emp_deptno_fk REFERENCES dept (deptno));

 

参考答案:

B

解析:

外键约束可以定义在表级,也可以定义在列级,本题正确选项B就是把外键约束定义在了列级,外键约束关联的其他表的列必须被小括号括起来;


18. 已知表T1中有2行数据,T2中有3行数据,执行SQL语句"select a.* from T1 a,T2 b"后,返回行数为:()

A:2行

B:3行

C:5行

D:6行

 

参考答案:

D

解析:

查询结果返回的是笛卡尔积;笛卡尔积:列相加,行相乘


19. 观察下列表结构

经理要求你查询出所有部门的信息,这些信息包括:员工的姓名,部门ID,部门名称和部门所在城市,有可能部门没有雇员,或者部门是尚未被分配到地点。下列选项能满足要求的是:

A: 

SELECT e.last_name, d.department_id,

d.department_name, l.city

FROM departments d

RIGHT OUTER JOIN employees e

ON d.department_id = e.department_id

RIGHT OUTER JOIN locations l

ON d.location_id = l.location_id;

B: 

SELECT e.last_name, d.department_id,

d.department_name, l.city

FROM departments d

FULL OUTER JOIN employees e

ON d.department_id = e.department_id

FULL OUTER JOIN locations l

ON d.location_id = l.location_id;

C: 

SELECT e.last_name, d.department_id,

d.department_name, l.city

FROM departments d

LEFT OUTER JOIN employees e

ON d.department_id = e.department_id

LEFT OUTER JOIN locations l

ON d.location_id = l.location_id;

D: 

SELECT last_name, department_id,

department_name, city

FROM departments d

NATURAL JOIN employees e

NATURAL JOIN locations l;

 

参考答案:

C

解析:

很明显需要多表连接查询,按要求需要将departments作为基表


20. 观察表EMPLOYEES和 DEPARTMENTS的表结构

您想要创建一个显示员工姓氏,部门名称和地址的报告。 下列选项哪个符合要求()

A: 

SELECT e.last_name, d. department_name, d.location_id

FROM employees e NATURAL JOIN departments D

USING department_id ;

B:


SELECT last_name, department_name, location_id

FROM employees NATURAL JOIN departments

WHERE e.department_id =d.department_id;

 

 

C: 

SELECT e.last_name, d.department_name, d.location_id

FROM employees e NATURAL JOIN departments d;

D: 

SELECT e.last_name, d.department_name, d.location_id

FROM employees e JOIN departments d

USING (department_id );

 

参考答案:

D

解析:

ABC都用到了natural join,都错在该连接类型的使用上
自然连接(NATURAL JOIN)是一种特殊的等值连接,将表中具有相同名称的列自动进行匹配。

1.自然连接不必指定任何连接条件。AB错误
2.如果两张表中有相同名字的列,但是数据类型不一致,如果能隐式转换,则能正常连接,但如果隐式转换不成功,则报错。
3.使用自然连接时,不能使用表名或表的别名修饰列。
4.自然连接会两张表中相同名称的所有列。C错误
E选项是规范的等值连接,在这题中我们只需连接部门id字段


二、 多选题(每小题3分,共30分)

1.

下列选项哪些是单行函数的属性()

A:不能嵌套

B:操纵每一条数据

C:作用于返回的每一行

D:每行返回一个结果

E:只接受一个参数,并只返回一个值

F:接受的参数可以是列或表达式

 

参考答案:

BCDF

解析:

单行函数可以嵌套;

 

可以接受不止一行数据,然后返回每行处理后的数据。


2. 在哪种情况下,会用到外连接查询?(请选出两项)

A:要连接的表具有NOT NULL列。

B:要连接的表只有匹配的数据

C:要连接的列具有NULL值。

D:要连接的表只有不匹配的数据。

E:要连接的表具有匹配和不匹配的数据。

F:仅当表具有主键 - 外键关系时

 

参考答案:

CE

解析:

外连接是在一个表的基础上,匹配另一个表,当另一张表没有与之匹配的数据时以空值代替。


3.

观察下表(EMP

 

经理要求查询出不在2030号部门的员工姓名及所在部门,下列能够完成该需求的是?(请选出两项)

A: 

SELECT ENAME,DEPTNO FROM EMP WHERE DEPTNO NOT IN(20,30);

B:

SELECT ENAME,DEPTNO FROM EMP WHERE DEPTNO NOT =(20,30);

C:

SELECT ENAME,DEPTNO FROM EMP WHERE DEPTNO <>20 AND DEPTNO <>30;

D: 

SELECT ENAME,DEPTNO FROM EMP WHERE DEPTNO <>20 OR DEPTNO <>30;

 

参考答案:

AC

解析:

查询某列的值不在某些值内最佳的方案就是用not in(不被包含的值)


4. 观察employees表,COMMISSION列显示员工每月获得的佣金。哪两个任务需要子查询或连接才能在一个步骤中执行?(请选出两项)

A:列出与3号员工获得相同佣金额的员工

B:找出10号部门员工的总佣金

C:找到获得高于公司平均佣金的员工人数

D:列出平均佣金超过600的部门

E:列出在部门20工作且没有获得佣金的雇员

F:列出年度佣金6000以上的员工

 

参考答案:

AC

解析:

子查询的应用场景:作为where条件的比较基准不能直接得到,但是知道与该基准关联的条件


5.检查下面创建order表的SQL语句,在执行上述SQL语句时,哪些列将自动创建索引?(请选出两项)


CREATE TABLE orders

(SER_NO NUMBER UNIQUE,

ORDER_ID NUMBER,

ORDER_DATE DATE NOT NULL,

STATUS VARCHAR2(10)

CHECK (status IN ('CREDIT', 'CASH')),

PROD_ID NUMBER

REFERENCES PRODUCTS(PRODUCT_ID),

ORD_TOTAL NUMBER,

PRIMARY KEY (order_id, order_date));

 

 

A:SER_NO

B:ORDER_ID

C:STATUS

D:PROD_ID

E:ORD_TOTAL

F:composite index on ORDER_ID and ORDER_DATE

 

参考答案:

AF

解析:

数据库会对UNIQUE约束和PRIMARY KEY约束自动创建索引。


6.根据下表

 

子查询有效的是?(请选出三项)

A: 

SELECT *

FROM employees

where salary > (SELECT MIN(salary)

FROM employees

GROUP BY department_id);

B: 

SELECT *

FROM employees

WHERE salary = (SELECT AVG(salary)

FROM employees

GROUP BY department_id);

C: 

SELECT distinct department_id

FROM employees

WHERE salary > ANY (SELECT AVG(salary)

FROM employees

GROUP BY department_id);

D:


SELECT department_id

FROM employees

WHERE salary > ALL (SELECT AVG(salary)

FROM employees

GROUP BY department_id);

E: 

SELECT last_name

FROM employees

WHERE salary > ANY (SELECT MAX(salary)

FROM employees

GROUP BY department_id);

F: 

SELECT department_id

FROM employees

WHERE salary > ALL (SELECT AVG(salary)

FROM employees

GROUP BY AVG(SALARY));

 

参考答案:

CDE

解析:

A.选项子查询的结果有三个,用>运算符会报错;
B.选项子查询的结果有三个,用=运算符会报错;
C.>ANY(子查询),>子查询的某一个结果
D.同上
E.>All(子查询),>子查询的所有结果,即大于子查询结果的最大值
F.错在分组函数GROUP BY的值不能是组函数


7.查看Marks表的表结构

STD_ID         NUMBER(4)
STUDENT_NAME        VARCHAR2(30)
SUBJ1           NUMBER(3)
SUBJ2           NUMBER(3)
SUBJ3           NUMBER(3)

SUBJ1 SUBJ12SUBJ13是学生三门课的成绩,下列选项正确的有?(请选出两项)

A:


SELECT SUM(subj1, subj2, subj3)

FROM marks;

B: 

SELECT SUM(subj1 + subj2 + subj3)

FROM marks;

C:

SELECT SUM(subj1), SUM(subj2), SUM(subj3)

FROM marks;

D: 

SELECT MAX(subj1, subj2, subj3)

FROM marks;

E: 

SELECT MINIMUM(subj1)

FROM marks;

F: 

SELECT COUNT(std_id)

FROM marks

WHERE subj1 >= AVG(subj1);

 

参考答案:

BC

解析:

聚合函数,也叫组函数,处理的是多行数据,依据此原则来分析题目,
A:SUM(subj1, subj2, subj3)聚合函数里包含的是多行多列,没办法处理;
BC聚合函数里明显是多行数据;
D的错误原因与A相同;EMINIMUM不是组函数;Fwhere后不能用组函数,因为系统在处理时先处理where再处理select,若想达到选项的需求,可以用having替代where,having在select后执行。


8.根据下面的建表语句,选项中的SQL语句依次执行,哪些能被正确执行?(选出正确的两项) 

CREATE TABLE STUDENT (

  stuId NUMBER(11) primary key,

  stuName nvarchar2(10),

  stuAge NUMBER(4),

  stuSex NUMBER(1) CHECK (stuSex IN(0,1))

);

A: 

INSERT INTO STUDENT (stuId,stuName,stuAge,stuSex) VALUES(1,'Rick',48,0);

B: 

INSERT INTO STUDENT (stuId,stuName,stuAge,stuSex) VALUES(1,'Rick',48,0);

C:

INSERT INTO STUDENT (stuId,stuName,stuAge,stuSex) VALUES(2,'Rick',48,1);

D:

INSERT INTO STUDENT (stuId,stuName,stuAge,stuSex) VALUES(3,'Rick',48,2);

 

参考答案:

AC

解析:

stuId是主键约束,主键约束要求其值不能为空(这点区别唯一约束),也不能重复;B错

stuSex为检查约束,要求stuSex的值只能取0和1。D错


9.下列SQL语句正确的是?(请选出两项)

A:describle view_name;

B:describle table_name;

C:describle column_name;

D:describle sequence_name;

 

参考答案:

AB

解析:

describle 只可以显示表或者视图的结构


10. 关于子查询说法正确的有?(请选出两项)

A:子查询只应检索一行。

B:子查询可以检索零个或多个行。

C:子查询只能在SQL-select语句中使用。

D:子查询不能被多于两个级别嵌套。

E:子查询不能在使用组函数的SQL查询语句中使用。

F:当子查询与外部SQL语句中的不等式比较运算符一起使用时,子查询的SELECT子句中的列只能包含一列。

 

参考答案:

BF

解析:

A.子查询与普通的查询一样,可以查询多行数据;
C.子查询可以用在select、update、insert中;
D.子查询的嵌套不受层数的限制;
E.子查询的使用条件不受组函数的影响。

三、 简答(每小题5分,共5分)

1. 请说明你有哪些办法提高SQL执行效率?

参考答案:

掌握影响sql性能的关键要素:
1、复用的SQL解析结果(SGA缓冲区)——因此要用动态查询并遵循保证书写格式相同,包括大小写,空格位置,表别名等一致的原则
2、FROM从右至左解析表——因此将记录数最少的表作为基础表(放在最右)
3、ORACLE采用自下而上的顺序解析WHERE子句——因此将筛选力度最大的条件写在最后
4、尽最大可能利用索引:
  用IN将启用全表扫描,使用EXISTS将利用索引
  用NOT IN将启用全表扫描,使用NOT EXISTS将利用索引
  用EXISTS替换DISTINCT
  用表连接替换EXISTS
  避免在索引列上使用IS NULL和IS NOT NULL
5、Where优先于having,因为可以尽早限定原始数据集

解析:


2. 请简介数据库事务的四个特性。

参考答案:

事务的原子性(Atomicity)是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.

事务的一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.

独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.

持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.

解析:

事务的原子性(Atomicity)是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.

 

事务的一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.

 

独立性(Isolation:事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.

 

持久性(Durability:事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.

四、 综合题(每小题10分,共10分)

1. 观察下面的表结构:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
回答下列问题:

1. 使用标准SQL嵌套语句查询选修课程名称为’Java基础的学员学号和姓名

2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位

3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位

4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

5. 查询选修了课程的学员人数

6. 查询选修课程超过5门的学员学号和所属单位

 

 

参考答案:
解析:

1.

SELECT SN,S# FROM S

WHERE S# IN(

    SELECT S# FROM C,SC

    WHERE C.C#=SC.C#

        AND CN=N'Java基础')

2.

SELECT S.SN,S.S# FROM S,SC

WHERE S.S#=SC.S#

    AND SC.C#='C2'

3.

SELECT SN,S# FROM S

WHERE S# NOT IN(

    SELECT S# FROM SC 

    WHERE C#='C5')

4.

SELECT SN,S# FROM S

WHERE S# IN(

    SELECT S# FROM SC 

        RIGHT JOIN C ON SC.C#=C.C#

    GROUP BY S#

    HAVING COUNT(*)=COUNT(DISTINCT S#))

5.SELECT COUNT(DISTINCT S#)  ‘学员人数’FROM SC

6.

SELECT SN,S# FROM S

WHERE S# IN(

    SELECT S# FROM SC 

    GROUP BY S#

    HAVING COUNT(DISTINCT C#)>5)

1.  询条件‘Java基础和要查询的内容(学员学号和姓名)不在同一张表中,此时就要考虑使用连表查询或者子查询。在本题中,通过‘Java基础这一条件 在C表查询出课程编号C#;然后将查询出的C#作为查询条件在SC表中查询出选了这门课的学生的学号S#;最后在S表中通过查询条件S#查询出学员学号和 姓名。

2. 课程编号和学员姓名、学员所属单位不在同一张表中,此时想通过课程编号C2查询出学员姓名、所属单位可以使用连接查询或者子查询,这里提供使用连接查询的思路。当然这里的连接是等值连接,连接条件是S.S#=SC.S#,然后筛选出选了C2课程的信息。

3. 这里可以使用反向条件来简化解题步骤 ,首先在SC表中查询出选了C5课程的学生的学号(S#),然后在S表中查询出学号不在上一步查询出的结果集,即S# IS NOT IN (子查询的结果)

4.  一步先查询出选修了全部课程的学生的学号(S#,这时候就要在SC表和C表上做文章了,首先要将SC表以学号(S#)分组,然后对每组计数,与课程数量 相等,则说明该学员选修了全部课程,这样就得到了选修了全部课程的学员的学号(S#,最后在学员信息表(S)中筛选出学号在上一步查询的结果集里的学员 的姓名和所属单位

5. 这个应该是此题中最简单的一道了,直接对SC表查询结果的S#去除重复,然后再计数。

6. 此问跟第4问相识度达85%,只需将having子句中的比较条件改为">5"

 

五、 小练习(每小题5分,共5分)

1. 1.创建班级表class,字段如下:
班级ID(CID) 数据类型 number
班级名称(CNAME)数据类型 varchar2(8)

2.创建学生表Student,字段如下:
学生ID(stuID)数据类型 number
学生姓名(stuName)数据类型 varchar2(8)
学生出生日期(stuBirthday)数据类型 date
所在班级ID(CID) 数据类型 number
学生登录密码(stuPassword)数据类型 char(6)
3.向class表里添加如下三条数据:
1    一班
2    二班
3    三班
4.向student表里添加如下四条数据
1    瑞克    1988-10-10    1    123456
2    格伦    1990-11-11    2    123456
3    玛姬    1990-10-11    3    123456
4    卡尔    1999-04-11    4    123456
5.删除班级ID为4的学生
6.现在升级密码的安全系数,将密码的数据类型改为varchar2(12)
7.将瑞克的密码改为Rick110
8.因业务的改变,现在需要给student表添加一个字段手机号(phoneNumber),数据类型为char(11)
9.为了限制向student表中插入的数据,需要对字段进行修改,使其满足:只有将要插入的学生的班级ID存在于class表中才能被插入到student中
10.本练习完毕,然后把class表和student表删除,删除表之前你也可以试试把student表里的stuName字段和phoneNumber字段删除

 

参考答案:

1.

 

create table class(CID number,CNAME varchar2(8));

2.

 

create table student(stuID number,stuName varchar2(8),stuBirthday date,CID number,stuPassword char(6));

3.

 

insert into class(CID,CNAME)values(1,'一班');

insert into class(CID,CNAME)values(2,'二班');

insert into class(CID,CNAME)values(3,'三班');

4.

 

insert into student(stuID,stuname,stubirthday,cid,stupassword) values(1,'瑞克',to_date('1988-10-10','yyyy-mm-dd'),1,'123456');

insert into student(stuID,stuname,stubirthday,cid,stupassword) values(2,'格伦',to_date('1990-11-11','yyyy-mm-dd'),2,'123456');

insert into student(stuID,stuname,stubirthday,cid,stupassword) values(3,'玛姬',to_date('1988-10-11','yyyy-mm-dd'),3,'123456');

insert into student(stuID,stuname,stubirthday,cid,stupassword) values(4,'卡尔',to_date('1988-04-11','yyyy-mm-dd'),4,'123456');

5.

 

delete from student where cid=4;

6.

 

alter table student modify(stuPassword varchar2(12));

7.

 

update student set stuPassword='Rick110' where stuName='瑞克';

8.

 

alter table student add(phoneNumber char(11));

9.

 

alter table class 

add constraint pk_CID primary key(CID);

 

alter table student 

add constraint fk_sc foreign key (CID) 

references class(CID);

10.

 

alter table student drop(phoneNumber);

alter table student drop(stuname);

drop table student;

drop table class;

 

解析:

9.添加外键约束时,被关联的表的字段一定要是主键,否则不能被当做被关联的外键。
10.删除表时,需要先删除子表,再删除父表 

原创粉丝点击