SQL語句題庫


一、    填空題

  1. Not Only SQL數據庫 泛指  非關系型數據庫 
  2. SYS和SYSTEM用戶都是Oracle 的系統用戶,它們都使用SYSTEM表空間,其中

 sys 擁有更大的權限。

  1. Oracle提供了兩種類型的權限:系統權限和  對象權限 
  2.   系統權限  提供了在Oracle數據庫系統范圍內執行某種任務的操作能力,
  3.   對象權限  則是一種賦予用戶在指定的數據庫對象(如表、視圖、過程等)。
  4. SQL語言分類:DQL(數據查詢語言)  、 DML(數據操縱語言)   DDL(數據定義語言)   、  DCL(數據控制語言)、  TCL(事務控制語言)  。
  5. SQL語言分類中DML指的是:數據操作語言例如  insert delete update   共三個語句。
  6. SQL語言分類中DQL指的是:數據查詢語言  例如:   select  語句。
  7. 使用   order by   子句對查詢結果進行排序。
  8. 排序方式包括升序(asc,缺省)和  降序(desc)   兩種。
  9. 使用  is null  運算符進行空值判斷。
  10. Oracle函數分為單行函數和   多行函數   兩大類。
  11. 單行函數分類:字符函數、 數值函數、日期函數 、  轉換函數  和 通用函數。
  12. 在需要濾除查詢結果中重復的行時,必須使用關鍵字   distinct  
  13. 當進行模糊查詢時,應使用關鍵字  like  和通配符問號(_)或百分號"%"。其中  %表示   任意個字符(包括零個)  ; _ 表示一個任意字符;
  14. 在SQL語句中,用於向表中插入數據的語句是  insert  
  15. 使用  desc  命令可以顯示表的結構信息。
  16. 外連接的內連接的區別在於,  內連接  只能顯示匹配的數據,而另外一個連接還可以顯示不匹配的數據。
  17. 兩個表在連接過程中除返回滿足連接條件的行以外,還返回左表中不滿足條件的行,這種連接稱為  左外連接 
  18. 兩個表在連接過程中除返回滿足連接條件的行以外,還返回右表中不滿足條件的行,這種連接稱為   右外連接 

 

二、    選擇題

 

1.

數據庫(DB),數據庫系統(DBS)和數據庫管理系統(DBMS)三者之間的關系是(  A  )。(選擇一項)

 

 

 

 

A.

DBS包括DB和DBMS

 

B.

DBMS包括DB和DBS

 

C.

DB包括DBS和DBMS

 

D.

DBS就是DB,也就是DBMS

 

 

2.

在下列 RDMBS 產品中,屬於小型數據庫系統的是  A  )。(選擇一項)

 

 

 

 

A.

Access

 

B.

Oracle

 

C.

Sybase

 

D.

Informix

 

3.

下列哪種數據庫系統更適合於在大、中型計算機系統上使用(  C  )。(選擇一項)

 

 

 

 

A.

FoxPro

 

B.

Access

 

C.

Oracle

 

D.

Microsoft SQL Server

 

4.

數據庫系統的日志文件用於記錄下述哪類內容(  D  )。(選擇一項)

 

 

 

 

A.

程序運行過程

 

B.

數據查詢操作

 

C.

程序執行結果

 

D.

數據更新操作

 

5.

 SQL語言是什么語言  C )。(選擇一項)

 

 

 

 

A.

層次數據庫

 

B.

網絡數據庫

 

C.

關系數據庫

 

D.

非數據庫

 

6.

數據庫管理系統的數據操縱語言(DML)所實現的操作一般包括(  D  )(選擇一項)

 

 

 

 

A.

建立、授權、修改

 

B.

建立、授權、刪除

 

C.

建立、插入、修改、排序

 

D.

插入、修改、刪除

 

7.

在數據庫中可以創建和刪除表、視圖、索引,可以修改表。這是因為數據庫管理系統提供了(  A  )。(選擇一項)

 

 

 

 

A.

數據定義功能

 

B.

數據操縱功能

 

C.

數據維護功能

 

D.

數據控制功能

 

8.

在數據操縱語言(DML)的基本功能中,不包括的是  B  )。(選擇一項)

 

 

 

 

A.

插入新數據

 

B.

描述數據庫結構

 

C.

對數據庫中數據排序

 

D.

刪除數據庫中數據

 

9.

在SQL查詢時,使用WHERE子句指出的是  B  )。(選擇一項)

 

 

 

 

A.

查詢目標

 

B.

查詢條件

 

C.

查詢視圖

 

D.

查詢結果

 

10.

下面哪條SQL語句將為計算列SAL*12生成別名Annual Salary  B  )。(選擇一項)

 

 

 

 

A.

SELECT ename,sal*12 ‘Annual Salary’ FROM emp;

 

B.

SELECT ename,sal*12 “Annual Salary” FROM emp;

 

C.

SELECT ename,sal*12 AS Annual Salary FROM emp;

 

D.

SELECT ename,sal*12 AS INITCAP(“Annual Salary”) FROM emp;

 

11.

請根據PRODUCT_NAME列從PRODUCT表查詢中過濾返回的數據。下列哪個子句包含相應過濾條件的引用  C  。(選擇一項)

 

 

 

 

A.

select     

 

B.

from     

 

C.

where     

 

D.

Having

 

12.

請從訂單表中取得數據,包括三個列:客戶名、訂單時間與訂單費用。可以用下列哪個where子句查詢ORDERS表,取得客戶A超過2700的訂單  D  )。(選擇一項)

 

 

 

 

A.

where 客戶名= ‘A’;

 

B.

where 客戶名= ‘A’ and 訂單費用 < 2700;

 

C.

where 客戶名= ‘A’ or 訂單費用 > 2700;

 

D.

where 客戶名= ‘A’ and 訂單費用 > 2700;

 

13.

在SELECT語句中使用哪個子句來只顯示工資超過5000的員工  D  )。(選擇一項)

 

 

 

 

A.

ORDER BY SALARY > 5000

 

B.

GROUP BY SALARY > 5000

 

C.

HAVING SALARY > 5000

 

D.

WHERE SALARY > 5000

 

14.

在 SQL 語句中,與 X BETWEEN 20 AND 30 等價的表達式是  D  )。(選擇一項)

 

 

 

 

A.

X>=20 AND X<30

 

B.

X>20 AND X<30

 

C.

X>20 AND X<=30

 

D.

X>=20 AND X<=30

 

15.

用下列代碼塊回答問題:

SQL> select ______(-45) as output from dual;

OUTPUT

------

-45

下列哪個單行函數無法產生這個輸出(  A  )。(選擇一項)

 

 

 

 

A.

abs()

 

B.

ceil()

 

C.

floor()

 

D.

round()

 

16.

對表中的某一行VARCHAR2列包含數值SMITHY應用程序在右側填充七個空格。length()函數處理這個列值時,返回什么值(  B  )。(選擇一項)

 

 

 

 

A.

6

 

B.

13

 

C.

30

 

D.

60

 

17.

SQL *Plus中發出的下列語句

SQL> select ceil(256.342),floor(256.342),round(256.342),trunc(256.342)

from dual;

下列哪個函數不返回結果256  A  (選擇一項)

 

 

 

 

A.

ceil()

 

B.

floor() 

 

C.

round()

 

D.

trunc()

 

18.

Oracle中,下面哪條語句當COMM字段為空時顯示0,不為空時顯示COMM的值  A  )。(選擇一項)

 

 

 

 

A.

select ename, nvl(comm,0) from emp;

 

B.

select ename, null(comm.,0) from emp;

 

C.

SELECT ename,NULLIF(comm,0)FROM emp;

 

D.

SELECT ename,DECODE(comm.,NULL,0)FROM emp;

 

19.

TEST表包含兩個列TESTCOL定義為數據類型NUMBER(10)TESTCOL_2定義為數據類型VARCHAR2(10)。在Oracle中發出下列語句insert into test(testcol, testcol_2) values (null, FRANCIS)然后對表進行下列查詢select nvl(testcol, EMPTY) as testcol from test where testcol_2 = FRANCIS。下列選項哪個是得到的結果(  D )。(選擇一項)

 

 

 

 

A.

Oracle返回結果0

 

B.

Oracle返回結果EMPTY

 

C.

Oracle返回結果NULL

 

D.

Oracle返回錯誤結果

20.

Oracle中,對分組函數的返回數據進行篩選的關鍵字是(  B  )。(選擇一項)

 

 

 

 

A.

WHRER

 

B.

HAVING 

 

C.

ORDER BY

 

D.

無法限定分組函數的返回

21.

如何刪除sales表中產品類型為toysprofits列的列值  A  )。(選擇一項)

 

 

 

 

A.

UPDATE sales SET profits = NULL WHERE product_type = 'TOYS'

 

B.

DELETE profits FROM sales WHERE product_type = 'TOYS'

 

C.

DELETE FROM sales WHERE product_type = 'TOYS'

 

D.

DELETE FROM sales

 

22.

DELETE FROM S WHERE 年齡>60語句的功能是  B  )。(選擇一項)

 

 

 

 

A.

從S表中徹底刪除年齡大於60歲的記錄 

 

B.

S表中年齡大於60歲的記錄被加上刪除標記

 

C.

刪除S表

 

D.

刪除S表的年齡列

 

23.

哪行代碼有錯誤(  A  )。(選擇一項)

 

 

 

 

A.

SELECT dname,ename

 

B.

FROM emp e,dept d

 

C.

WHERE emp.deptno=dept.deptno  

 

D.

ORDER BY 1,2

 

24.

以下查詢語句是哪種連接,SELECT dnameename FROM dept demp e

WHERE d.deptno=e.deptno ORDER BY dnameename;  B  )。(選擇一項)

 

 

 

 

A.

自連接

 

B.

等值連接

 

C.

外連接

 

D.

不等值連接

 

25.

如果查詢表A(3行數據)和表B(有4行數據),使用

select * from a,b,返回的查詢結果有多少行  D  )。(選擇一項)

 

 

 

 

A.

7

 

B.

1

 

C.

0

 

D.

12

 

26.

檢查下列SQL的輸出

 select a.deptno,a.job,b.loc,sum(a.sal)

 from dmp a,dept b

 where a.deptno = b.depton

 group by a.deptno,a.job,b.loc

 order by sum(a.sal);

這個查詢按哪個列的順序返回輸出( D  )。(選擇一項)

 

 

 

 

A.

Deptno

 

B.

Job

 

C.

Loc

 

D.

sum(a.sal)

27.

已經存在學生信息表:s(sno, sname, sex, age, dept) 主碼為sno
課程信息表:c(cno, cname, teacher) 主碼為cno
學生選課信息表:sc(sno, cno, grade) 主碼為(sno, cno)

"從學生選課信息表中找出無成績的元組"SQL語句是  C  )(選擇一項)

 

 

 

 

A.

SELECT * FROM sc WHERE grade=NULL

 

B.

SELECT * FROM sc WHERE grade IS ' '

 

C.

SELECT * FROM sc WHERE grade IS NULL

 

D.

SELECT * FROM sc WHERE grade =' '

 

28.

已經存在學生信息表:s(sno, sname, sex, age, dept) 主碼為sno
課程信息表:c(cno, cname, teacher) 主碼為cno
學生選課信息表:sc(sno, cno, grade) 主碼為(sno, cno)

"查詢選修課程號為4,且成績在80分以上的所有學生的學號和姓名"SQL語句中,將使用的表是(  D  )(選擇一項)

 

 

 

 

A.

學生信息表S

 

B.

學生信息表S和課程信息表c

 

C.

學生信息表S、課程信息表c和學生選課信息表sc

 

D.

學生信息表S和學生選課信息表sc

 

29.

關於子查詢以下哪兩種說法是正確的  BD  )。(選擇二項)

 

 

 

 

A.

外層查詢返回結果之后,執行內層查詢

 

B.

先執行子查詢,再執行外層查詢

 

C.

對於子查詢返回的結果,外層查詢只執行一次

 

D.

外層查詢返回的每行結果都與內層查詢結果進行比較

 

三、    判斷題

  1. 數據庫系統提供了對數據庫進行有效處理的方法。它由四大部分組成:數據庫、數據庫管理系統、數據庫應用程序和數據庫管理員。(  T  )
  2. 數據完整性是指數據庫中的數據在邏輯上的一致性和合理性。通過完整性約束機制,當用戶對數據庫數據進行操作時,系統可以在一定程序上保證數據的正確性。(  T  )
  3. 建立數據庫中的表時,將年齡字段值限制在18-25歲之間。這種約束屬於參照完整性約束。(  F  )
  4. Oracle數據庫管理系統是Oracle公司的核心產品,是目前最流行的數據庫,基於C/S系統結構。(  T  )
  5. 每個啟動的數據庫都對應一個或者多個數據庫實例,由這些實例來訪問和控制數據庫。(  F  )
  6. Oracle采用服務器/客戶端訪問方式,服務器端使用監聽器對客戶端的訪問進行監聽。客戶端訪問服務器端時必須明確四個參數,包括:訪問協議、服務器IP地址、服務器監聽端口、服務器端的哪個數據庫實例。(  T  )
  7. 在安裝Oracle服務器軟件時自動配置一個監聽器,並且自動創建了和數據庫實例名相同的本地網絡服務名。(  T  )
  8. 數據操作語言針對表中的數據,而數據定義語言針對數據庫對象(表、索引、視圖、觸發器、存儲過程、函數、表空間等)。(  T  )
  9. DML(數據操作語言)包括了:insert、update、delete、select。(  F  )
  10. SQL(Structured Query Language)是最重要的關系數據庫操作語言,是所有關系數據庫管理系統的標准語言。許多數據庫廠商在使用SQL的同時,都對SQL進行了擴展,比如ORACLE的PL/SQL語言,MS SQL-Server的T-SQL語言。(  T  )
  11. 字段別名如果含有空格或其他特殊字符或大小寫敏感,需用中括號括起來。(  F  )
  12. 連接運算符‘||’可以把列與字符、或其它表達式連接在一起,得到一個新的字符串,實現‘合成’列的功能。(  T  )
  13. 缺省情況下,查詢結果中包含所有符合條件的記錄行,但是不包括重復行。(  F  )
  14. 運算符:BETWEEN...AND...含義:界於兩值之間(不包括邊界);LIKE含義:模糊查詢。(  F  )
  15. 使用LIKE運算符執行模糊查詢(通配查詢),’%’ 表示零或多個字符,‘_’ 表示一個字符.(  T  )
  16. 函數只是將取出的數據進行處理,也會改變數據庫中的值。(  F  )
  17. 多行函數:sum() 和 avg() 僅適用數值型,count() 、max() 、min() 適用任何類型數據。(  T  )
  18. Oracle的類型轉換分為自動類型轉換和強制類型轉換。(  T  )
  19. 數據類型之間可以進行自動轉換,所以不建議使用顯示轉換函數,以保持良好的設計風格。常用類型轉換函數有to_char(),、to_date(),、to_number()。(  F  )
  20. NVL()函數用於將指定的某些值替換為指定的缺省值,適用於字符、數字、日期等類型數據。(  F  )
  21. 多行函數:對一組數據進行運算,針對一組數據(多行記錄)只返回一個結果,也稱分組函數。(  T  )
  22. 對分組查詢的結果進行過濾,要使用having從句。(  T )
  23. 往表中插入數據的語句是insert語句,方式有兩種,一種是記錄值的插入,一種是查詢結果的插入。(  T  )
  24. 如果想從表中刪除所有的行,只能使用delete語句完成。(  F  )
  25. 進行多表等值查詢時,當被連接的多個表中存在同名字段時,須在該字段前加上"表名."前綴。使用表名(表別名)前綴不能提高查詢效率。(  F  )
  26. 為了連接n個表,至少需要n個連接條件。(  F  )
  27. Natural join基於兩個表中的全部同名列建立連接。從兩個表中選出同名列的值均對應相等的所有行。自然連接的結果保留重復的屬性。(  F  )
  28. 在查詢是基於未知值時應考慮使用子查詢,子查詢必須包含在括號內。(  T  )
  29. 如果子查詢返回多行結果,則為多行子查詢,此時不允許對其使用單行記錄比較運算符。(  T  )
  30. 單行子查詢只返回一行記錄。對單行子查詢可使用單行記錄比較運算符。(  T  )

 

四、    編碼題

  1. 1.  已知Oracle的Scott用戶中提供了三個測試數據庫表,名稱分別為dept,emp和salgrade。使用SQL語言完成以下操作

1)  試用SQL語言完成下列查詢(單表查詢):

a)    查詢20號部門的所有員工信息:

select * from emp e where e.deptno=20; 

b)    查詢獎金(COMM)高於工資(SAL)的員工信息:

select * from emp where comm>sal; 

c)     查詢獎金高於工資的20%的員工信息:

select * from emp where comm>sal*0.2; 

d)    查詢10號部門中工種為MANAGER和20號部門中工種為CLERK的員工的信息:

select * from emp e  

where (e.deptno=10 and e.job='MANAGER') 

or (e.deptno=20 and e.job='CLERK') ; 

e)     查詢所有工種不是MANAGER和CLERK,且工資大於或等於2000的員工的詳細信息:

select * from emp 

where job not in('MANAGER','CLERK') and sal>=2000; 

f)     查詢沒有獎金或獎金低於100的員工信息:

select * from emp where comm is null or comm<100; 

g)     查詢員工工齡大於或等於10年的員工信息:

select * from emp where (sysdate-hiredate)/365>=10;  

h)     查詢員工信息,要求以首字母大寫的方式顯示所有員工的姓名:

第一種寫法: 

select initcap(ename) from emp;

 

第二種寫法: 

select upper(substr(ename,1,1))||lower(substr(ename,2)) from emp; 

i)   查詢在2月份入職的所有員工信息:

select * from emp where to_char(hiredate,'MM')='02'; 

j)   顯示所有員工的姓名、入職的年份和月份,按入職日期所在的月份排序,若月份相同則按入職的年份排序:

select ename,to_char(hiredate,'yyyy') year,to_char(hiredate,'MM')

month

from emp 

order by month,year;

k)  查詢'JONES'員工及所有其直接、間接下屬員工的信息:

select e.* from emp e 

start with ename='JONES' 

connect by prior empno=mgr; 

l)  查詢SCOTT員工及其直接、間接上級員工的信息:

select e.* from emp e 

start with ename='SCOTT' 

connect by prior mgr=empno; 

2)  試用SQL語言完成下列查詢(多表查詢):

a)   查詢從事同一種工作但不屬於同一部門的員工信息:

select a.ename,a.job,a.deptno,b.ename,b.job,b.deptno 

from emp a,emp b 

where a.job=b.job and a.deptno<>b.deptno; 

b)   查詢各個部門的詳細信息以及部門人數、部門平均工資:

select d.deptno,count(e.empno),avg(e.sal),d.dname,d.loc 

from emp e ,dept d 

where e.deptno=d.deptno 

group by d.deptno,d.dname,d.loc; 

3)  試用SQL語言完成下列查詢(嵌套子查詢):

a)  查詢10號部門員工以及領導的信息:

select * from emp where empno in( 

select mgr from emp where deptno=10) or deptno=10; 

b)   查詢工資為某個部門平均工資的員工信息:

select * from emp 

where sal in(select avg(sal) from emp group by deptno); 

c)  查詢工資高於本部門平均工資的員工的信息: 

select * from emp e1 

where sal >(select avg(sal) from emp e2 where e2.deptno=e1.deptno); 

d)  查詢工資高於本部門平均工資的員工的信息及其部門的平均工資:

select e.*,a.avgsal 

from emp e, 

(select deptno,avg(sal) as avgsal from emp group by deptno) a where a.deptno=e.deptno and e.sal>a.avgsal; 

4)  試用SQL語言完成下列查詢(聚合函數):

a)   統計各個工種的人數與平均工資:

select count(*),e.job,avg(e.sal) from emp e 

group by e.job;                       

b)   統計每個部門中各個工種的人數與平均工資:

select deptno,job,count(empno),avg(sal) from emp e 

group by e.deptno,e.job;

c)  查詢所有員工入職以來的工作期限,用“**年**月**日”的形式表示。 

select e.ename,floor((sysdate-e.hiredate)/365)|| '年'|| floor(mod((sysdate-e.hiredate),365)/30) || '月'|| floor(mod(mod((sysdate-e.hiredate),365),30))|| '日'from emp e;

d)   查詢人數最多的部門信息:

select * from dept 

where deptno in 

(select deptno from 

(select count(*) count,deptno from emp group by deptno) 

where count in

(select max(count) from 

(select count(*) count ,deptno from emp group by   deptno)

)

); 

e)   以樹狀結構查詢所有員工與領導之間的層次關系:

select substr(sys_connect_by_path(ename,'->'),3),level 

from emp 

start with mgr is null 

connect by prior empno=mgr; 

f)   部門平均薪水最高的部門編號:

第一種方法:

select * from( 

select avg(sal) avgsal,deptno  

from emp group by deptno order by avgsal desc)  

where rownum=1; 

  

第二種方法:

select deptno,avg(sal) from emp group by deptno having avg(sal)=(

select max(avg(sal)) avgsal 

from emp group by deptno) 

g)  部門平均薪水最高的部門名稱:

select d.* from dept d where deptno 

in(select deptno from emp group by deptno having avg(sal)=

(select max(avg(sal)) avgsal from emp group by deptno)) 

h)  平均薪水最低的部門的部門名稱:

select d.* from dept d where deptno 

in(select deptno from emp group by deptno having avg(sal)=

(select min(avg(sal)) avgsal from emp group by deptno)) 

i)   平均薪水等級最低的部門的部門名稱:

select d.dname from dept d 

where d.deptno in (select a.deptno from 

(select e.deptno from emp e,salgrade s 

where (e.sal between s.losal and s.hisal) 

group by e.deptno order by avg(s.grade)) a 

where rownum=1); 

j)   部門經理人中,薪水最低的部門名稱:

select dname from dept where deptno= 

(select deptno from 

(select deptno from emp where job='MANAGER' group by deptno

order by min(sal)) where rownum=1); 

k)   比普通員工的最高薪水還要高的經理人名稱:

select ename from emp where sal> 

(select max(sal) from emp where job not in 

('MANAGER','PRESIDENT')) and job='MANAGER' or job='PRESIDENT';

5)  試用SQL語言完成下列查詢(嵌套子查詢):

a)   查詢所有員工工資都大於1000的部門的信息:

select * from dept where deptno in 

(select deptno from emp 

where deptno not in 

(select distinct deptno from emp where sal<1000)); 

b)   查詢所有員工工資都大於1000的部門的信息及其員工信息:

select * from emp e join dept d 

on d.deptno 

in (select deptno from emp 

where deptno not in 

(select distinct deptno from emp where sal<1000)) 

and d.deptno=e.deptno; 

c)   查詢所有員工工資都在900~3000之間的部門的信息: 

select * from dept 

where deptno not in

(select deptno from emp 

where sal not between 900 and 3000); 

d)   查詢所有工資都在900~3000之間的員工所在部門的員工信息:

select * from emp a 

where a.deptno in 

(select distinct e.deptno from emp e 

where e.sal between 900 and 3000); 

e)   查詢每個員工的領導所在部門的信息:

select d.* from dept d 

where d.deptno in 

(select distinct e2.deptno from emp e1,emp e2 

where e1.empno=e2.mgr); 

f)  查詢30號部門中工資排序前3名的員工信息:

select * from 

(select sal from emp where deptno=30 order by sal desc) e

where rownum<4

g)   查詢工作等級為2級,1985年以后入職的工作地點為DALLAS的員工編號、姓名和工資:

select e.ename,e.empno,e.sal from emp e,salgrade s,dept d 

where (e.sal between s.losal and s.hisal) 

and (s.grade=2)  

and to_char(e.hiredate,'yyyy')>1985 

and e.deptno=d.deptno 

and d.loc='DALLAS'; 

6)  用SQL語句完成下列操作:

a)   將各部門員工的工資修改為該員工所在部門平均工資加1000:

update emp e set sal= 

1000+(select avg(sal) from emp where deptno=e.deptno); 

b)   刪除重復部門,只留下一項: 

delete from dept d 

where rowid<> 

(select min(rowid) from dept where dname=d.dname and d.loc=loc);

c)  更新員工工資為他的主管的工資,獎金:

第一種方法:

update emp e set sal=(select sal from emp where empno=e.mgr), comm=(select comm from emp where empno=e.mgr) 

第二種方法:

update emp e set (sal,comm)=(select sal,comm from emp whereempno=e.mgr);

 

  1. 2.  (可選題)某大學圖書館為了更好管理圖書,使用Oracle數據庫建立了三個表:

CARD 借書卡表: CNO(卡號),NAME (姓名),CLASS (班級);

BOOKS 圖書表:   BNO(書號),BNAME (書名), AUTHOR (作者),PRICE (單價),QUANTITY (庫存冊數);

BORROW 借書記錄表: CNO (借書卡號),BNO (書號),RDATE (還書日期);

備注:限定每人每種書只能借一本;庫存冊數隨借書、還書而改變。

1)  試用SQL語言完成下列操作:

a)  寫出建立BORROW表的SQL語句,要求定義主碼完整性約束和引用完整性約束:

CREATE TABLE BORROW(

CNO NUMBER REFERENCES CARD(CNO),

BNO NUMBER REFERENCES BOOKS(BNO),

    RDATE date,

    PRIMARY KEY(CNO,BNO)

);

b)  假定在建BOOKS表時沒有定義主碼,寫出為BOOKS表追加定義主碼的語句:

ALTER TABLE BOOKS ADD PRIMARY KEY(BNO) ; 

c)  將CARD 表的NAME最大列寬增加到10個字符(假定原為6個字符):

ALTER TABLE CARD MODIFY NAME varchar2(10) ;

d)  為該表增加1列NAME(系名),可變長,最大20個字符:

ALTER TABLE CARD ADD 系名 varchar2(20) ;

2)  試用SQL語言完成下列查詢:

a)  找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數:

SELECT CNO, COUNT(*) FROM BORROW GROUP BY CNO HAVING COUNT(*)>5;

b)  查詢借閱了"水滸"一書的讀者,輸出姓名及班級:

SELECT NAME, CLASS FROM CARD WHERE CNO IN (SELECT CNO FROM BORROW BW, BOOKS BK WHERE BW.BNO=BK.BNO AND BK.BNAME='水滸') ;

c)  查詢過期未還圖書,輸出借閱者(卡號)、書號及還書日期:

SELECT * FROM BORROW WHERE RDATE<SYSDATE;

d)  查詢書名包括"網絡"關鍵詞的圖書,輸出書號、書名、作者:

SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE BNAME LIKE '%網絡%';

e)  查詢現有圖書中價格最高的圖書,輸出書名及作者:

SELECT BNAME,AUTHOR FROM BOOKS WHERE PRICE=(SELECT MAX(PRICE) FROM BOOKS) ;

f)  查詢當前借了"計算方法"但沒有借"計算方法習題集"的讀者,輸出其借書卡號,並按卡號降序排序輸出:

SELECT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME='計算方法' AND a.CNO NOT IN( SELECT aa.CNO FROM BORROW aa,BOOKS bb WHERE aa.BNO=bb.BNO AND bb.BNAME='計算方法習題集')ORDER BY a.CNO DESC;

g)  查詢當前同時借有"計算方法"和"組合數學"兩本書的讀者,輸出其借書卡號,並按卡號升序排序輸出:

SELECT DISTINCT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME IN('計算方法','組合數學') ORDER BY a.CNO;

3)  試用SQL語言完成下列操作:

a)  將"C01"班同學所借圖書的還期都延長一周:

UPDATE BORROW SET RDATE=RDATE+7 WHERE CNO IN (SELECT DISTINCT CNO FROM CARD WHERE CLASS='C01');

b)  從BOOKS表中刪除當前無人借閱的圖書記錄:

DELETE FROM BOOKS WHERE BNO NOT IN(SELECT DISTINCT BK.BNO FROM BORROW BR, BOOKS BK WHERE BR.BNO=BK.BNO);

4)  試用SQL語言完成下列操作:

a)  如果經常按書名查詢圖書信息,請建立合適的索引:

CREATE INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME) ;

b)  在BORROW表上建立一個觸發器,完成如下功能:如果讀者借閱的書名是"數據庫技術及應用",就將該讀者的借閱記錄保存在BORROW_SAVE表中(注ORROW_SAVE表結構同BORROW表):

CREATE TRIGGER TR_SAVE ON BORROWFOR INSERT,UPDATEASIF @@ROWCOUNT>0 INSERT BORROW_SAVE SELECT i.*FROM INSERTED i,BOOKS b WHERE i.BNO=b.BNO AND b.BNAME=N'數據庫技術及應用';

c)  建立一個視圖,顯示"力01"班學生的借書信息(只要求顯示姓名和書名):

CREATE VIEW V_VIEWASSELECT a.NAME,b.BNAMEFROM BORROW ab,CARD a,BOOKS bWHEREab.CNO=a.CNO AND ab.BNO=b.BNO AND a.CLASS=N'力01';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM