oracle(4)

一、 单选题

1.顾客表(customers)中有一存储顾客姓名的字段(customerName),现在想显示"欢迎customerName光临小店"的字样,下列SQL语句能够满足该需求的是()

A:

SELECT "欢迎"||customerName||"光临小店" FROM customers;

B:

SELECT '欢迎'||customerName||'光临小店' FROM customers;

C:

SELECT '欢迎'|customerName|'光临小店' FROM customers;

D:

SELECT "欢迎"|customerName|"光临小店'"FROM customers;

参考答案:B

解析:
在select中显示的字符用单引号引起来,字符之间的连接用||

2.需要创建一个订单(ORDERS)表,该表包含如下4列
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
要求:当一行插入到表中时,如果没有提供任何值,则应使用今天的日期。
下列选项符合要求的是()

A:

  CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE = SYSDATE);

B:

  CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE DEFAULT SYSDATE);

C:

  CREATE OR REPLACE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE DEFAULT SYSDATE);

D:

  CREATE OR REPLACE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE = SYSDATE);

E:

   CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status NUMBER (10),
  date_ordered DATE = SYSDATE);

F:

  CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status NUMBER (10),
  date_ordered DATE DEFAULT SYSDATE);

参考答案:B

解析:
1、oracle数据库可以用create or replace的对象有:functions,procedures, packages, types, synonyms, trigger and views,就是没有table,也没有sequence。据此排除C、D选项。
2、添加默认值的方式是在字段的数据类型之后用“default”,而不是用“=”。据此排除A、E。
3、选项F是ORDER_STATUS 字段的数据类型错误。

3.观察customers表的表结构
在这里插入图片描述
其中CUSTOMER_ID是表的主键。下列哪个选项能够查询出“Los Angeles”和“San Francisco”的城市地址(city_address),以及每个城市里顾客的数量()

A:

  SELECT city_address, COUNT(*)
  FROM customers
  WHERE city_address IN ('Los Angeles', 'San Francisco');

B:

  SELECT city_address, COUNT(*)
  FROM customers
  WHERE city_address IN ('Los Angeles', 'San Francisco')
  GROUP BY city_address;

C:

  SELECT city_address, COUNT(customer_id)
  FROM customers
  WHERE city_address IN ('Los Angeles', 'San Francisco')
  GROUP BY city_address, customer_id;

D:

  SELECT city_address, COUNT(customer_id)
  FROM customers
  GROUP BY city_address IN ('Los Angeles', 'San Francisco');

参考答案:B

解析:
若要查询出这两个城市的顾客数量,必须先按城市分组,再统计数量

4.观察orders表和customers表,哪个SQL语句能够检索出与Martin同一天下订单的订单ID,客户ID和订单总额?
在这里插入图片描述
A:

  SELECT ord_id, cust_id, ord_total
  FROM orders, customers
  WHERE cust_name='Martin'
  AND ord_date IN ('18-JUL-2000','21-JUL-2000');

B:

  SELECT ord_id, cust_id, ord_total
  FROM orders
  WHERE ord_date IN (SELECT ord_date
  FROM orders
  WHERE cust_name ='Martin')

C:

  SELECT ord_id, cust_id, ord_total
  FROM orders
  WHERE ord_date IN (SELECT ord_date
  FROM orders, customers
  WHERE cust_name ='Martin');

D:

  SELECT ord_id, cust_id, ord_total
  FROM orders
  WHERE cust_id IN (SELECT cust_id
  FROM customers
  WHERE cust_name = 'Martin');

参考答案:B

解析:
订单(orders)表中没有cust_name ,所以要通过子查询查出cust_name ='Martin’的顾客的ID(cust_id ),然后在orders表中查询出该顾客在那天下过订单,最后查询出在这一天下的订单的订单ID,客户ID和订单总额

5.观察EMPLOYEES表,其中在EMPLOYEES表上,EMPLOYEE_ID是主键。 MGR_ID是经理的ID,并引用EMPLOYEE_ID。JOB_ID列是一个NOT NULL列。
在这里插入图片描述
下面的DELETE语句为何删除失败

  DELETE employee_id, salary, job_id
  FROM employees
  WHERE dept_id = 90;

A:在EMPLOYEES 表中没有dept_id 为90的行
B:不能删除JOB_ID 列,因为该列不能为空
C:不能在删除语句的DELETE子句中指定列名
D:不能删除EMPLOYEE_ID列,因为它是表的主键。

参考答案:C

解析:
删除语句只能用于整行删除,不能再delete子句中指定列名。

6.观察下表(EMP)
在这里插入图片描述
需要查询出奖金(COMM)为空,正确的SQL语句是()

A:

SELECT * FROM EMP WHERE COMM = NULL;

B:

SELECT * FROM EMP WHERE COMM = 0;

C:

 SELECT * FROM EMP WHERE COMM IS NULL;

D:

SELECT * FROM EMP WHERE COMM IS 0;

参考答案:C

解析:
判断某列的值为空用IS null

7.观察下表ORDERS和CUSTOMERS
在这里插入图片描述
下面SQL语句的执行结果是()

  SELECT *
  FROM orders
  WHERE cust_id = (SELECT cust_id
  FROM customers
  WHERE cust_name = 'Smith');

A:
在这里插入图片描述
B:
在这里插入图片描述
C:
在这里插入图片描述
D:查询失败,因为子查询的返回结果不止一行
E:查询失败,因为子查询和主查询用的不是同一张表

参考答案:D

解析:
主查询的where子句的运算符为“=”,所以其后面的值不能是多个,但是在customers表中Smith有两个,所以查询失败。

8.关于drop关键字下面说法错误的是:
A:删除某个用户是需要此关键字
B:删除表中的某个字段时需要此关键字
C:删除某张表时需要此关键字
D:删除表中的某条数据时需要此关键字

参考答案:D

解析:
删除表中数据使用delete关键字

9.下面关于Oracle的说法正确的是
A: Oracle的默认的SID是ORCL
B: Oracle的测试用户scott的默认密码是123456
C: Oracle的测试用户hr的密码是123456
D: Oracle的默认端口号是1520

参考答案:A

解析:
Oracle的测试用户是scott,默认密码是tiger。 Oracle的默认端口号是1521

10.使用哪个SELECT语句从系统日期中提取年份并以“1998”格式显示?
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,fmt)函数,date是将被转换的日期,fmt指定转换后的格式。

11.下列哪项不属于关系型数据库?
A:Oracle
B:SQL Server
C:HBase
D:MySql

参考答案:C

解析:
常见关系型数据库有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
HBase是列式非关系型数据库

12.观察employees表的表结构
在这里插入图片描述
选项中哪个update语句是有效的()
A:

  UPDATE employees
  SET first_name = 'John'
  SET last_name ='Smith'
  WHERE employee_id = 180;

B:

  UPDATE employees
  SET first_name = 'John',
  SET last_name ='Smith'
  WHERE employee_id = 180;

C:

  UPDATE employees
  SET first_name = 'John'
  AND last_name ='Smith'
  WHERE employee_id = 180;

D:

  UPDATE employees
  SET first_name = 'John', last_name ='Smith'
  WHERE employee_id = 180;

参考答案:D

解析:
一个update语句中只需写一个SET子句,多个被更新的字段用逗号隔开。

13.观察表EMPLOYEES 和NEW_EMPLOYEES的表结构
在这里插入图片描述

选项中哪个更新操作是有效的()
A:

  UPDATE new_employees SET name = (SELECT last_name||
  first_name
  FROM employees
  WHERE employee_id
  =180)
  WHERE employee_id =180;

B:

  UPDATE new_employees SET name = (SELECT
  last_name||first_name
  FROM employees )
  WHERE employee_id =180;

C:

  UPDATE new_employees SET name = (SELECT last_name ||
  first_name
  FROM employees
  WHERE employee_id
  =180)
  WHERE employee_id =(SELECT employee_id
  FROM new_employees);

D:

UPDATE new_employees SET name = (SELECT last_name||
  first_name
  FROM employees
  WHERE employee_id =
  (SELECT employee_id
  FROM new_employees))
  WHERE employee_id
  =180;

参考答案:A

解析:
B.子查询查出了多行数据;
C.第二个子查询得到了多行数据,但是where子句的运算符“=”只能指定一个值;
D.选项错误同上。

14.观察下面employees表的表结构
在这里插入图片描述
执行下面SQL语句的结果为:DELETE employees;
A:由于主键违规而出现错误。
B:EMPLOYEES表的数据和结构将被删除。
C:EMPLOYEES表中的数据被删除,但表结构依然存在。
D:因为语句在语法上不正确而出错。

参考答案:C

解析:
truncate tablename或 delete tablename:不删除表的结构,只是删除表中的数据;drop tablename:删除表的表结构和数据。

15.您需要更改现有表的定义:
更改COMMERCIALS表的DESCRIPTION列以保存不超过1000字节的变长字符,该列当前每个值可以保存500个字节。 表包含20000行。
哪个SQL语句能够完成该需求()

A:

ALTER TABLE commercials MODIFY (description CHAR2(1000));

B:

ALTER TABLE commercials CHANGE (description CHAR2(1000));

C:

ALTER TABLE commercials CHANGE (description VARCHAR2(1000));

D:

ALTER TABLE commercials MODIFY (description VARCHAR2(1000));

E:如果该列有数据,你不可以增加字段的长多。

参考答案:D

解析:
修改表结构的固定语法:
ALTER TABLE table_name MODIFY (column_name data_type);

16.观察STUDENT_GRADES 表的表结构
在这里插入图片描述
一个学期有多个GPA,下列哪个语句能找到每个学期最高的GPA?

A:

SELECT MAX(gpa) FROM student_grades WHERE gpa IS NOT NULL;

B:

  SELECT (gpa)
  FROM student_grades
  GROUP BY semester_end
  WHERE gpa IS NOT NULL;

C:

  SELECT MAX(gpa)
  FROM student_grades
  WHERE gpa IS NOT NULL
  GROUP BY semester_end;

D:

  SELECT MAX(gpa)
  GROUP BY semester_end
  WHERE gpa IS NOT NULL
  FROM student_grades;

E:

  SELECT MAX(gpa)
  FROM student_grades
  GROUP BY semester_end
  WHERE gpa IS NOT NULL;

参考答案:C

解析:
在使用聚合函数时一定要考虑null值的情况。
想要查询每学期的最高的GPA,必须要以学期(SEMESTER_END)分组,此时要考虑有些学生可能没有参加考试(即GPA为null)的情况,GPA为null,oracle系统就会使某组的max(gpa)结果为null,显然这种情况是不符合要求的,要排除这种情况,就必须对null做处理,要么将null用0代替,要么直接去除null的情况,在这里是求最大值,直接去除null不会影响最大值的情况,而且提前排除null,后续的计算量也会下降,所以此时选择直接去除null,SQL语句的性能更高。

二、 多选题

1.关于where和having子句说法正确的有?(请选出两项)
A:WHERE子句可用于限制行和组。
B:WHERE子句只能用于限制行。
C:HAVING子句可用于限制行和组。
D:HAVING子句只能用于限制组。
E:如果查询使用HAVING子句,则不能在查询中使用WHERE子句。
F:HAVING子句不能在子查询中使用。

参考答案:BD

解析:
where只能用于行数据的筛选;having只能用于组数据的筛选。

2.下列关于视图的说法,正确的有?(选出正确的三项)
A:视图可以防止未经许可的用户访问敏感数据
B:创建视图时,可以将列名改为有意义的名称,使用户更容易理解列所代表的内容
C:定义的视图中可以包含ORDER BY子句
D:不能为视图建立索引

参考答案:ABC

解析:
视图上也可以建立索引,以便快速查询

3.关于下面的SQL删除语句,说法正确的是?(请选出四项)

DROP TABLE DEPT; 

A:无法回滚此语句。
B:所有待处理的事务都已提交。
C:基于DEPT表的所有视图都将被删除。
D:将删除基于DEPT表的所有索引。
E:将删除表中的所有数据,并删除表结构。
F:将删除表中的所有数据,但保留表的结构。

参考答案:ABDE

解析:
AB.DROP是DDL,会被隐式提交,所以无法回滚(只能回滚未提交的DML),其上的操作也被一并提交;
C.表被删除,基于表的视图不会被删除,只是执行查询操作的时候会报错;
DEF.删除表,基于表的索引、表结构都会被删除。

4.下列查询姓张的学生的语句不正确的是?(选出正确的三项)
A: select * from 表名 where 姓名 = ‘%张%’
B: select * from 表名 where 姓名 like ‘张’
C: select * from 表名 where 姓名 like ‘张%’
D: select * from 表名 where 姓名 = ‘张’

参考答案:ABD

解析:
LIKE 模糊查询字符匹配操作可以使用通配符 “%” 和 “”:%:表示任意个字符,包括零个;:表示一个任意字符;题目要求查询姓张的,所以需要张开头的姓名。所以c是正确的.

5.我们需要在employee数据表中查出工号emp_no为29346,24323的记录,可以使用的SQL语句有?(选出正确的两项)

A:SELECT * FROM employee WHERE emp_no=29346 OR emp_no=24323;
B:SELECT * FROM employee WHERE emp_no IN(29346,24323);
C:SELECT * FROM employee WHERE emp_no=29346 AND emp_no=24323;
D:SELECT * FROM employee WHERE emp_no NOT IN(29346,24323)=‘dl’);

参考答案:AB

6.观察下表EMP
在这里插入图片描述
下列能够查询工号EMPNO在7300——7500之间的员工的姓名的SQL语句是?(请选出两项)

A:

SELECT ENAME FROM EMP WHERE EMPNO IN(7300,7500);

B:

SELECT ENAME FROM EMP WHERE EMPNO BETWEEN 7300 AND 7500;

C:

SELECT ENAME FROM EMP WHERE EMPNO>7300 OR EMPNO<7500;

D:

SELECT ENAME FROM EMP WHERE EMPNO>7300 AND EMPNO<7500;

参考答案:BD

解析:
between and 的作用和> and <的作用相同

7.观察下面employees表的表结构
在这里插入图片描述
您创建了一个名为EMP_ID_SEQ的序列,以填充EMPLOYEES表的EMPLOYEE_ID列的序列值。 哪两个语句关于EMP_ID_SEQ序列是正确的?(请选出两项)

A:您不能使用EMP_ID_SEQ序列填充JOB_ID列。
B:修改EMPLOYEE_ID列时,EMP_ID_SEQ序列无效。
C:EMP_ID_SEQ序列本身不受对EMPLOYEES表的修改的影响。
D:架构中任何其他NUMBER数据类型的列都可以使用EMP_ID_SEQ序列。
E:删除EMPLOYEES表时,将自动删除EMP_ID_SEQ序列。
F:删除EMPLOYEE_ID列时,将自动删除EMP_ID_SEQ序列。

参考答案:CD

解析:
序列不属于任何一张表,表可以用序列辅助插入一些数据,但是对表的处理不会影响序列

8.观察下面创建订单(order)表的SQL语句
在这里插入图片描述

当你执行上面的SQL语句时候哪些列会自动创建索引(index)?(请选出两项)
A:SER_NO
B:ORDER_ID
C:STATUS
D:PROD_ID
E:ORD_TOTAL
F:基于ORDER_ID and ORDER_DATE创建复合索引

参考答案:AF

解析:
oracle数据库会在唯一约束和主键约束上自动创建索引

三、 综合题

1.有一个学生成绩单,要建立数据表把数据存储此表中:需要包括的字段为:
在这里插入图片描述
1.写出创建表的语法,表名自定
2.查询出生时间在1990-01-01后的学生所有课程成绩
3.查询学生总数
4.查询该班学生Java基础(课程编号为000101)的平均成绩

参考答案:
1、

CREATE TABLE STUDENT (
stuName VARCHAR2(60),
stuID VARCHAR(100),
stuBirthday DATE,
classID NUMBER(8),
stuScore NUMBER(5,2),
stuRemark VARCHAR2(400)
);
SELECT stuName,stuScore 
FROM STUDENT 
WHERE stuBirthday > TO_DATE('1990-01-01','yyyy-mm-dd');
SELECT count(DISTINCT(STUNAME)) "学生总数" FROM STUDENT;
SELECT AVG(stuScore) FROM STUDENT WHERE classID=000101

解析:
1、此处需要注意,oracle数据库里字符的概念是对英文来说的,但是一个汉字占两个字符,所以题目中要求插入n个汉字,在创建表时,字符的数量要写2n。
2、这里一定要注意字符到日期的转换,我们输入的‘1990-01-01’在系统看来是字符,当然字符跟日期是没有办法比较的(数据类型不同嘛),所以在比较之前一定要先将字符类型的‘1990-01-01’转换成日期类型。
3、在学生成绩表中查询出所有学生,然后去除重复再计数,即得出学生总数
4、此题看似简单,实则暗藏杀机,首先要想到一点,有些学生可能缺考,此时他的Java基础的分数就为null,但是系统对null会自动忽略,然后人数就会减少(少了Java基础得分为null的同学),显然这种情况得出的平均分是不正确的(不信的话,假如系统不处理null的情况,老师为了好看的平均分会让成绩差的同学缺考~~)。扯远了,处理null可以用NVL(stuScore,0);假如stuScore为null,就当成0来计算。

2.根据下面创建表的语句完成SQL查询

Create table org_organization(
Organization_id        NUMBER(10)        not null,--组织结构ID(主键)
Parent_organization_id  NUMBER(10)        null,--从属的上级组织结构ID
Organization_name     varchar(60)   not null,--组织机构名称
Organization_desc      varchar(240)  null,--组织机构说
Organization_type      NUMBER(1)       not  null,--组织类型:1=智能型;2=业务型
Primary key(organization_id)
);

1.查询组织结构ID大于“100”的所有组织机构的信息?
2.查询“组织机构名称”中包含“北京”的所有组织机构的信息?
3.查询组织机构ID等于“1000”的组织机构的信息以及从属的上级组织机构的信息?
4.统计“职能型”和“业务型”的组织机构,各有多少个?(注:用一条sql语句实现)

参考答案:
1.

SELECT*FROM org_organization WHERE Organization_id>100;
SELECT*FROM org_organization WHERE Organization_name LIKE '%北京%';
   SELECT ORG1.*,ORG2.* FROM org_organization org1 
   LEFT JOIN org_organization org2 
   ON ORG1.Parent_organization_id=ORG2.Organization_id
   WHERE Organization_id=1000;
 SELECT Organization_type,count(Organization_id) 
 FROM org_organization 
 GROUP BY Organization_type;

解析:
2、模糊查询需要用like关键字,%是正则表达式的概念里的通配符,代表0或多个字符,_代表1个字符。正则表达式在各种程序设计技术里用到的都特别多,有兴趣、学有余力的同学可以到网上自学一下。
3、此题是简单的连接查询,由于组织机构和直接从属上级机构在同一张表里,所以需要将一张表以别名的形式当成两张表来连接查询,连接条件是ORG1.Parent_organization_id=ORG2.Organization_id,需要在结果里筛选出Organization_id=1000的组织机构。
4、很明显要使用分组查询,分组的依据是Organization_type,然后统计出每组里的Organization_id的数量即可。

发布了35 篇原创文章 · 获赞 24 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/thumbs_up_sign_ygj/article/details/105012336