笔试_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)
经理要求查询出不在20或30号部门的员工姓名及所在部门,下列能够完成该需求的是?(请选出两项)
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 、SUBJ12、SUBJ13是学生三门课的成绩,下列选项正确的有?(请选出两项)
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.删除表时,需要先删除子表,再删除父表
- 笔试_oracle(5)
- 笔试_oracle(2)
- 笔试_oracle(4)
- 笔试_oracle(6)
- 笔试_oracle(7)
- 笔试_oracle(8)
- 笔试_oracle(1)
- 笔试_oracle(3)
- oracle_(培训)1_oracle数据库基本概念
- oracle学习笔记(1)_oracle的安装
- oracle学习笔记(2)_Oracle 自带的客户端工具
- pl/sql _oracle 学习
- 黑马程序员_Oracle
- 01_oracle基础
- 分页之二_Oracle
- MyBatis批量操作_ORACLE
- 2_Oracle体系结构概述
- 909422229_Oracle条件语句
- 2017.10.10 第一天总结
- vue、angular、react前端三大框架的区别
- oracle学习总结(三)
- uniVocity-parsers:速度最快功能最全的CSV开发库
- Comparable 与 Comparator
- 笔试_oracle(5)
- Mysql 慢查询参数
- ubuntu下安装配置python3
- [NLP技术]关键词提取算法实现
- 嵌入式Linux驱动笔记(十五)------编译使用tslib支持LCD触摸屏
- GIT教程 — 详解本地库的使用以及原理(二)
- HashSet 和 TreeSet 的区别
- Git带你回到过去和未来【2】
- Firfox:bootstrap小图标无法显示