一、 單選題
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),比最高薪金高 就意味着比所有員工的薪金高。