oracle(6)

一、 单选题

1.观察下表(EMP)
在这里插入图片描述
本月老板要在所有员工原有奖金的基础上多发500元的奖金,查询出所有员工姓名以及他的奖金,下列SQL语句能够满足该需求的是()
A:

SELECT ENAME,COMM+500 FROM EMP;

B:

SELECT ENAME,NVL(COMM,0)+500 FROM EMP;

C:

SELECT ENAME,NVL(COMM+500,0) FROM EMP;

D:

SELECT ENAME,NVL2(COMM,0)+500 FROM EMP;

参考答案:B
解析:
有null参与的数学运算,其结果都是null。为了达到给每位员工都加500元奖金的目的,必须对null值做处理,将其用0替换,再加500,也即NVL(comm,0)+500。

NVL2(exp,value1,value2): NVL2函数的参数必须是三个,其作用是如果exp的值为null,则表达式的值为value2,否则为value1。请务必记牢!

2.您需要创建一个视图EMP_VU。 该视图应允许用户仅操作部门10或20工作的员工的记录。您将使用哪个SQL语句创建视图EMP_VU?
A:

CREATE VIEW emp_vu AS
SELECT *
FROM employees
WHERE department_id IN (10,20);

B:

CREATE VIEW emp_vu AS
SELECT *
FROM employees
WHERE department_id IN (10,20)
WITH READ ONLY;

C:

CREATE VIEW emp_vu AS
SELECT *
FROM employees
WHERE department_id IN (10,20)
WITH CHECK OPTION;

D:

CREATE FORCE VIEW emp_vu AS
SELECT *
FROM employees
WHERE department_id IN (10,20);

E:

CREATE FORCE VIEW emp_vu AS
SELECT *
FROM employees
WHERE department_id IN (10,20)
NO UPDATE;

参考答案:C
解析:
创建视图语句里含有 with check option 子句时,当你操作视图时就会受到创建视图的where子句的限制。

3.观察customers表的表结构
在这里插入图片描述
CUSTOMER_ID列是表的主键。您需要确定您的客户群如何分散。 哪个表达式能够找出CUSTOMERS表中不同国家/地区的数量?
A:COUNT(UPPER(country_address))
B:COUNT(DIFF(UPPER(country_address)))
C:COUNT(UNIQUE(UPPER(country_address)))
D:COUNT DISTINCT UPPER(country_address)
E:COUNT(DISTINCT (UPPER(country_address)))

参考答案:E
解析:
查找国家/地区的数量,首先应该排除国家/地区大小写的影响,然后剔除重复,最后计数即可。

4.SQL语言具有( )的功能
A:关系规范化、数据操纵、数据控制
B:数据定义、数据操纵、数据控制
C:数据定义、关系规范化、数据控制
D:数据定义、关系规范化、数据操纵

参考答案:B

5.观察下列三张表(分别为学生表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子句中一定要给该列指定一个表名,以防出现列名相同带来的歧义

6.您需要设计一个学生注册数据库,其中包含存储学员信息的多个表。STUDENTS表存储有关学生的信息。 STUDENT_GRADES表存储有关学生成绩的信息。 这两个表都有一个名为STUDENT_ID的列。 STUDENTS表中的STUDENT_ID列是主键。
您需要在STUDENT_GRADES表的STUDENT_ID列上创建指向STUDENTS表的STUDENT_ID列的外键。
下列哪个语句完成了建表和上述要求?

A:

CREATE TABLE student_grades
(student_id NUMBER(12),
semester_end DATE,
gpa NUMBER(4,3),
CONSTRAINT student_id_fk REFERENCES (student_id)
FOREIGN KEY students(student_id));

B:

CREATE TABLE student_grades
(student_id NUMBER(12),
semester_end DATE,
gpa NUMBER(4,3),
student_id_fk FOREIGN KEY (student_id)
REFERENCES students(student_id));

C:

CREATE TABLE student_grades
(student_id NUMBER(12),
semester_end DATE,
gpa NUMBER(4,3),
CONSTRAINT FOREIGN KEY (student_id)
REFERENCES students(student_id));

D:

CREATE TABLE student_grades
(student_id NUMBER(12),
semester_end DATE,
gpa NUMBER(4,3),
CONSTRAINT student_id_fk FOREIGN KEY (student_id)
REFERENCES students(student_id));

参考答案:D
解析:
建表时附带外键说明的固定语法是:
create table t_name(
字段列表逗号分割
constraint 约束名 foreign key (本表字段) feferences 主表名(主表字段)
)

7.观察下面的SQL语句,如果把SQL语句中的小括号全部删除,会出现什么情况()

SELECT e.employee_id, (.15* e.salary) + (.5 * e.commission_pct)
+ (s.sales_amount * (.35 * e.bonus)) AS CALC_VALUE
FROM employees e, sales s
WHERE e.employee_id = s.emp_id;

A:CALC_VALUE列中显示的值将减小。
B:CALC_VALUE列中显示的值将增大。
C:CALC_VALUE列中显示的值不会有差异。
D:将报错。

参考答案:C
解析:
SQL语句中涉及到的复合算术运算的运算规则:先乘除后加减······,相同优先级的至右向左结合。

8.通过视图更新数据,下列说法正确的是()
A:您无法通过组函数更新视图
B:更新视图组时,会自动计算函数。
C:当您更新视图时,只有基础表上的约束才会生效。
D:更新视图时,视图上的约束始终覆盖基础表上的约束。

参考答案:A
解析:
视图导出时包含有分组和聚合操作,则不允许对这个视图执行更新操作

9.观察MARKS表的表结构
在这里插入图片描述
SUBJ1 和 SUBJ2代表学生两门课的得分。下面SQL语句的查询结果是

SELECT subj1+subj2 total_marks, std_id
FROM marks
WHERE subj1 > AVG(subj1) AND subj2 > AVG(subj2)
ORDER BY total_marks;

A:语句成功执行,并返回学生ID和每个学生获得超过每个科目中的平均分数的所有标记的总和。
B:该语句在SELECT子句处返回错误。
C:该语句在WHERE子句处返回错误。
D:该语句在ORDER BY子句中返回错误。

参考答案:C
解析:
SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使用order by对结果集进行排序。
根据该原理分析题意可得:where子句中不可有聚合函数AVG,因为where子句在执行的时候,聚合函数还没有进行计算。

10.观察表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字段

11.观察下表(EMP)
在这里插入图片描述
下列SQLSQL语句正确的是()
A:

SELECT ENAME,to_date(SYSDATE-HIREDATE,'yyyy-mm-dd') FROM EMP;

B:

SELECT ENAME,to_date(HIREDATE+10,'yyyy-mm-dd') FROM EMP;

C:

SELECT ENAME,to_char(HIREDATE-10,'yyyy-mm-dd') FROM EMP;

D:

SELECT ENAME,to_char(SYSDATE-HIREDATE,'yyyy-mm-dd') FROM EMP;

参考答案:C
解析:
能运用日期的算术运算:
Date1 – Date2 = Num1
Date1 – Num1 = Date2
Date2 + Num1=Date1
to_date只能作用于日期格式的字符类型;
A选项:SYSDATE-HIREDATE的结果是number,to_date只能作用于日期格式的字符类型,所以错误;
B选项:HIREDATE+10的结果是日期类型,to_date只能作用于日期格式的字符类型,所以错误;
C选项:HIREDATE-10的结果是日期类型,to_char可以将日期类型的数据按指定的格式转换成字符类型输出,所以正确;
D选项:SYSDATE-HIREDATE的结果是number,to_char不能将非日期形式的数据按指定的日期格式转换

12.观察employees表的表结构
在这里插入图片描述
下列事务执行的最后的结果是()

CREATE table new_emp ( employee_id NUMBER, name VARCHAR2(30));
INSERT INTO new_emp SELECT employee_id , last_name from employees;
Savepoint s1;
UPDATE new_emp set name = UPPER(name);
Savepoint s2;
Delete from new_emp;
Rollback to s2;
Delete from new_emp where employee_id =180;
UPDATE new_emp set name = 'James';
Rollback to s2;
UPDATE new_emp set name = 'James' WHERE employee_id =180;
Rollback;

A:表中没有数据。
B:有一个名叫詹姆斯的雇员。
C:不能多次回滚到同一个保存点。
D:您的上一次更新无法更新任何行,因为员工ID 180已被删除。

参考答案:A
解析:
解决这道题,首先要清楚事务提交的一些规则:
DDL和DCL会隐式提交事务;
DML需要显示提交(commit),或者数据库正常关闭时系统自动提交(假如数据库系统非正常关闭,事务会回滚到上一个提交点);
同时也可以回滚到指定的保存点,前提是该保存点之后的内容还未被提交。

13.观察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中指定的字段,要么是其他字段的组函数。

14.假如员工1001的工资salary是17000,下列SQL语句的执行结果是()

SELECT LPAD(salary,10,*)
FROM EMP
WHERE EMP_ID = 1001;

A:17000.00
B:17000*****
C:****170.00
D:**17000.00
E:报错

参考答案:C
解析:
lpad( string, padded_length, pad_string):假如string的长度小于padded_length,string左端用pad_string来填充以达到长度padded_length;
假如string的长度大于padded_length,该函数会从左向右截取padded_length长度的字符。

15.观察EMPLOYEES表和TAX表的表结构
在这里插入图片描述
您需要查找适用于每个员工的百分比税。 你将使用哪个SQL语句?
A:

SELECT employee_id, salary, tax_percent
FROM employees e JOIN tax t
ON e.salary BETWEEN t.min_salary AND t.max_salary;

B:

SELECT employee_id, salary, tax_percent
FROM employees e JOIN tax t
WHERE e.salary > t.min_salary AND < t.max_salary;

C:

SELECT employee_id, salary, tax_percent
FROM employees e JOIN tax t
ON (MIN(e.salary) = t.min_salary
AND MAX(e.salary) = t.max_salary);

D:无法查出结果,因为两张表没有相同的列

参考答案:A
解析:
使用连接查询是可以实现题目要求的,连接的条件是员工的工资(salary)在某个税率(tax_percent)的最高工资(min_salary )和最低工资(max_salary)之间

16.STUDENT表里存在3条数据,在SQL plus里执行下列SQL语句

SELECT * FROM STUDENT;  //查询1
savepoint sp1;
DELETE FROM STUDENT;
SELECT * FROM STUDENT;  //查询2
rollback to sp1;
SELECT * FROM STUDENT;  //查询3
truncate STUDENT;
rollback to sp1;
SELECT * FROM STUDENT;  //查询4

查询结果与与查询1相同的查询是()
A:查询2
B:查询3
C:查询4
D:没有与之查询结果相同的查询

参考答案:B
解析:
truncate 和delete都是用来删除表中的数据,前者属于DDL,一次性删除整张表的数据,不可回滚;
后者属于DML逐条删除数据,有记录,可回滚

17.观察下表(score)
在这里插入图片描述
想要得到如下结果,正确的SQL语句是()
在这里插入图片描述
A:

select id,student_name 姓名,
          count(decode(subject, 'Chinese', score)) 语法,
          count(decode(subject, 'Math', score)) 数学,
          count(decode(subject, 'English', score)) 英语
          from score
          group by id, student_name;

B:

select id,student_name 姓名,
          sum(decode(subject, 'Chinese', score)) 语法,
          sum(decode(subject, 'Math', score)) 数学,
          sum(decode(subject, 'English', score)) 英语
          from score
          group by id, student_name;

C:

select id,student_name 姓名,
          decode(subject, 'Chinese', score) 语法,
          decode(subject, 'Math', score) 数学,
          decode(subject, 'English', score) 英语
          from score
          group by id, student_name;

D:无法完成该需求

参考答案:B
解析:
含义解释:
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
    RETURN(返回值1)
ELSIF 条件=值2 THEN
    RETURN(返回值2)
    …
ELSIF 条件=值n THEN
    RETURN(返回值n)
ELSE
    RETURN(缺省值)
END IF
在本题中decode()的返回值要么是对应的分数,要么是缺省的null,题目的需求是查询出对应的分数,所以我们用聚合函数sum将三个返回值合并成我们需要的分数。
A选项语法上没问题,但是计数不是我们想要的结果;
C选项语法上有误

18.观察下表(EMP)
在这里插入图片描述
经理要求你查询出每个部门的不同工种的数目以及部门名称,下列能够满足该需求的SQL语句是()
A:

SELECT DEPTNO,count(JOB) FROM EMP GROUP BY DEPTNO;

B:

SELECT DEPTNO,count(DISTINCT JOB) FROM EMP GROUP BY DEPTNO;

C:

SELECT DEPTNO,DISTINCT(JOB) FROM EMP GROUP BY DEPTNO;

D:

SELECT DEPTNO,DISTINCT(count JOB) FROM EMP GROUP BY DEPTNO;

参考答案:B
解析:
以部门分组,再将该部门中JOB去除重复,最后对其进行计数,就可以得到该部门的工种数目

19.观察下面employees表的表结构
在这里插入图片描述
您想查询JOB_ID列含有’SA_'的行,下列选项正确的是()
A:

SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id LIKE '%SA\_%' ESCAPE '\';

B:

SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id LIKE '%SA_';

C:

SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id LIKE '%SA_' ESCAPE "\";

D:

SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id = '%SA_';

参考答案:A
解析:
要查询JOB_ID列含有’SA_'的行,首先确定使用模糊查询,观察查询的字符中含有特殊字符“_”,必须通过转意字符将其变成普通字符,ESCAPE ''即定义‘\’为转意字符。

20.下面SQL语句的执行结果是()

SELECT ROUND(TRUNC(MOD(1600,10),-1),2) FROM dual;

A:0
B:1
C:0.00
D:SQL语句有误

参考答案:A
解析:
MOD(number1,number2):取(number1/number2)的余数,在本例题中得0;
TRUNC(number,n):截取number,n代表截取到小数点后第n位,在本例题中得0;
ROUND(number,n):四舍五入到小数点后第n位,在本例题中得0。

21.哪个SELECT语句将从字符串“HelloWorld”中获得结果“elloworld”?
A:

SELECT SUBSTR( 'HelloWorld',1) FROM dual;

B:

SELECT INITCAP(TRIM ('HelloWorld', 1,1)) FROM dual;

C:

SELECT LOWER(SUBSTR('HelloWorld', 1, 1) FROM dual;

D:

SELECT LOWER(SUBSTR('HelloWorld', 2, 1) FROM dual;

E:

SELECT LOWER(TRIM ('H' FROM 'HelloWorld')) FROM dual;

参考答案:E
解析:
TRIM(char from ‘string’):从字符串string中剔除首尾的某字符(char),默认不指定字符时TRIM(‘string’)剔除首尾的空格;B选项参数语法错误

SUBSTR(‘string’,n,l):n>0时,从字符串的第n位开始截取长度为l 的子字符串;当n<0时,从字符串的倒数第n(的绝对值)位开始截取长度为l 的子字符串;n=0时,系统强制j将n转换成1;

LOWER(‘string’):将字符串string转换成小写。

CD选项达不到目的,语法正确。

该函数的三个参数都必须提供,所以A选项错误。A选项要更正的话,应写为:
SELECT SUBSTR( ‘HelloWorld’,2,9) FROM dual;

22.关于序列的说法正确的是()
A:一旦创建,序列属于特定模式(schema)。
B:一旦创建,序列链接到特定的表。
C:一旦创建,序列将自动提供给所有用户。
D:只有DBA可以控制某个表使用哪个序列。
E:一旦创建,序列将自动在所有INSERT和UPDATE语句中使用。

参考答案:A
解析:
序列属于模式(schema),为该模式下的所有用户共享

23.观察customers表的表结构
在这里插入图片描述
现在针对France地区的顾客有一个促销活动,下面哪个where子句能够鉴别出France地区的顾客
A:WHERE lower(country_address) = “france”
B:WHERE lower(country_address) = ‘france’
C:WHERE lower(country_address) IS ‘france’
D:WHERE lower(country_address) = ‘%france%’
E:WHERE lower(country_address) LIKE %france%

参考答案:B
解析:
这里要求一个精确查询,并且地区名全为小写,所以like什么的是错的,判断等值用=号而不是is;在sql查询中字符串用单引号,双引号专用于别名。所以正确答案为B

24.观察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和订单总额

二、 多选题

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

参考答案:ABC

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

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

参考答案:BD

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

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

DROP TABLE DEPT; 

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

参考答案:ABDE

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

三、综合题

1.查询所有从事"CLERK"工作的雇员姓名及其部门名称、部门人数。
参考答案:

select ename,dname,count(ename) 
from emp e ,dept d 
where lower(job)='clerk' and e.deptno=d.deptno 
group by ename,dname; 

解析:
先分析主干:查询员工姓名、部门名称、部门人数 select ename,dname,count(ename) from …再根据限制语句编写 where语句和分组语句。

2.查询在部门"sales"(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
参考答案:

select ename from emp 
where deptno= (select deptno from dept where lower(dname)='sales' );

解析:
先查询出销售部的部门编号,再根据部门编号查询员工姓名。

3.查询出king所在部门的工作年限最大的员工名字。

参考答案:

select  ename, hiredate from emp
where  hiredate in(select min(hiredate) from (
      select hiredate from emp where deptno in
           (select deptno from emp where ename='KING') 
      )
 ) 

解析:
子查询中可以再次嵌套子查询。

4.查询出没有员工的那个部门的部门编号和部门名称。

参考答案:

方法一:

select  a.DEPTNO as 部门编号, DNAME as 部门名称
from  Dept a 
          left join Emp b 
          on a.DEPTNO=b.DEPTNO
where  b.EMPNO is null

方法二:

select deptno as 部门编号,DNAME as 部门名称
from  Dept a
where not exists (
          select 1 from Emp b
          where a.deptno=b.deptno
           )

解析:
连接查询有时候可以写为等价的子查询。

5.查询雇员的领导信息,要求领导的薪水要超过3000。

参考答案:

select distinct m.* from emp e,emp m 
           where m.sal >3000 and e.mgr=m.empno; 

解析:
通过自连接在同一张表间进行“多表查询”。

6.显示所有雇员名及其全年收入(工资+补助),并指定列别名“年收入”。

参考答案:

select emp.ename as 雇员名,nvl2(comm,comm+sal,sal)*12 as 年收入 from emp; 

解析:
null的运算结果仍然为null,需要通过nvl()或nvl2()先对null进行运算。

7.显示工资不在1500到2850之间的所有雇员名及工资。

参考答案:

select emp.ename as 雇员名,emp.sal as 工资 from emp 
         where emp.sal not between 1500 and 2850; 

解析:
not可以对where条件进行取反操作。

8.根据工作年限长工资,标准是:为公司工作了几个月就长几个百分点(最终结果保留两位小数,并进行四舍五入操作)。

参考答案:

update  emp
             set  sal= round(sal * (1+(sysdate - hiredate)/365/12/100),2); 

解析:
(sysdate - hiredate)/365/12可以算出工作了多少个整月。

9.查询在每个部门工作的员工数量、平均工资和平均服务年限 。要求对个位数字四舍五入。

参考答案:

select count(ename),round(avg(sal)),round(avg((sysdate-hiredate)/365)) 
from emp 
where deptno in (select deptno from emp group by deptno) ;

解析:
可以嵌套组函数,如round(avg(…))。

10.显示所有雇员名、雇员工资及工资级别。

参考答案:

select emp.ename, emp.sal, salgrade.grade
from emp,salgrade
where emp.sal>salgrade.losal and emp.sal<=salgrade.hisal; 

解析:
对于scott方案中提供的四张表结构,读者必须非常熟悉。

11.查询员工表,使查询结果的格式如下:
SMITH的年薪是9600

参考答案:

select concat(concat(ename,'的年薪是'),sal*12+nvl(comm,0))  年薪 from emp;

select ename || '的年薪是' || (sal*12 +nvl(comm,0)) from emp;

解析:
可以通过concat()或||对列进行拼接;并注意常量需要使用单引号。

12.观察下列表结构:
在这里插入图片描述
完成下列需求:
1.查询所有姓张的学生,并按年龄从小到大排列
2.查询计算机科考成绩不及格的学生
3.向Student表中增加一条学生记录(学号:97005 姓名:赵六 年龄:20)
4.李五的年龄记录错了,应该是21,请写SQL,根据主键进行更新
5.删除Student中没有考试成绩的学生记录,请使用not in条件

参考答案:

1.
SELECT * FROM Student WHERE stuName LIKE '张%' ORDER BY stuage;
2.
SELECT s.STUID,s.STUNAME,r.CLASS,r.SCORE FROM STUDENT s 
LEFT JOIN RESULT r ON (s.STUID=r.STUID) 
WHERE r.SCORE<60;
3.
INSERT INTO StuDENT (STUID,STUNAME,STUAGE) VALUES(97005,'赵六',20);
4.
UPDATE Student SET STUAGE=21 WHERE STUNAME='李五'
5.
DELETE FROM Student WHERE STUID NOT IN 
(SELECT DISTINCT(STUID) FROM RESULT 
WHERE SCORE IS NOT NULL);

13.为所有人长工资,标准是:10部门长10%;20部门长15%;30部门长20%其他部门长18%。

参考答案:

update  emp
set  sal = decode(deptno,'10',sal*(1+0.1), '20',sal*(1+0.15), '30',sal*(1+0.2),sal(1+0.18)); 

解析:
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

14.显示"BLAKE"同部门的所有雇员,但不显示"BLAKE"。

参考答案:

select * from emp 
  where emp.deptno=(select emp.deptno from emp where emp.ename='BLAKE' )
     and emp.ename<>'BLAKE' ; 

解析:
子查询的查询结果,可以作为主查询的查询条件。

15.查询薪金高于30号部门的所有员工薪金的员工姓名、薪金及部门名称。

参考答案:

select ename,sal,dname from emp,dept 
      where sal > (select max(sal) from emp where deptno=30) 
               and emp.deptno=dept.deptno; 

解析:
最高薪金是max(sal),比最高薪金高 就意味着比所有员工的薪金高。

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

猜你喜欢

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