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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章