一、 单选题
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),比最高薪金高 就意味着比所有员工的薪金高。