一、 填空題
- Not Only SQL數據庫 泛指 非關系型數據庫 。
- SYS和SYSTEM用戶都是Oracle 的系統用戶,它們都使用SYSTEM表空間,其中
sys 擁有更大的權限。
- Oracle提供了兩種類型的權限:系統權限和 對象權限 。
- 系統權限 提供了在Oracle數據庫系統范圍內執行某種任務的操作能力,
- 對象權限 則是一種賦予用戶在指定的數據庫對象(如表、視圖、過程等)。
- SQL語言分類:DQL(數據查詢語言) 、 DML(數據操縱語言)、 DDL(數據定義語言) 、 DCL(數據控制語言)、 TCL(事務控制語言) 。
- SQL語言分類中DML指的是:數據操作語言例如 insert delete update 共三個語句。
- SQL語言分類中DQL指的是:數據查詢語言 例如: select 語句。
- 使用 order by 子句對查詢結果進行排序。
- 排序方式包括升序(asc,缺省)和 降序(desc) 兩種。
- 使用 is null 運算符進行空值判斷。
- Oracle函數分為單行函數和 多行函數 兩大類。
- 單行函數分類:字符函數、 數值函數、日期函數 、 轉換函數 和 通用函數。
- 在需要濾除查詢結果中重復的行時,必須使用關鍵字 distinct 。
- 當進行模糊查詢時,應使用關鍵字 like 和通配符問號(_)或百分號"%"。其中 %表示 任意個字符(包括零個) ; _ 表示一個任意字符;
- 在SQL語句中,用於向表中插入數據的語句是 insert 。
- 使用 desc 命令可以顯示表的結構信息。
- 外連接的內連接的區別在於, 內連接 只能顯示匹配的數據,而另外一個連接還可以顯示不匹配的數據。
- 兩個表在連接過程中除返回滿足連接條件的行以外,還返回左表中不滿足條件的行,這種連接稱為 左外連接 。
- 兩個表在連接過程中除返回滿足連接條件的行以外,還返回右表中不滿足條件的行,這種連接稱為 右外連接 。
二、 選擇題
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表中產品類型為toys的profits列的列值( 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 dname,ename FROM dept d,emp e WHERE d.deptno=e.deptno ORDER BY dname,ename;( 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 "從學生選課信息表中找出無成績的元組"的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 在"查詢選修課程號為4,且成績在80分以上的所有學生的學號和姓名"的SQL語句中,將使用的表是( D )(選擇一項) |
|
|
|
|
|
A. |
學生信息表S |
|
B. |
學生信息表S和課程信息表c |
|
C. |
學生信息表S、課程信息表c和學生選課信息表sc |
|
D. |
學生信息表S和學生選課信息表sc |
29. |
關於子查詢以下哪兩種說法是正確的( BD )。(選擇二項) |
|
|
|
|
|
A. |
外層查詢返回結果之后,執行內層查詢 |
|
B. |
先執行子查詢,再執行外層查詢 |
|
C. |
對於子查詢返回的結果,外層查詢只執行一次 |
|
D. |
外層查詢返回的每行結果都與內層查詢結果進行比較 |
三、 判斷題
- 數據庫系統提供了對數據庫進行有效處理的方法。它由四大部分組成:數據庫、數據庫管理系統、數據庫應用程序和數據庫管理員。( T )
- 數據完整性是指數據庫中的數據在邏輯上的一致性和合理性。通過完整性約束機制,當用戶對數據庫數據進行操作時,系統可以在一定程序上保證數據的正確性。( T )
- 建立數據庫中的表時,將年齡字段值限制在18-25歲之間。這種約束屬於參照完整性約束。( F )
- Oracle數據庫管理系統是Oracle公司的核心產品,是目前最流行的數據庫,基於C/S系統結構。( T )
- 每個啟動的數據庫都對應一個或者多個數據庫實例,由這些實例來訪問和控制數據庫。( F )
- Oracle采用服務器/客戶端訪問方式,服務器端使用監聽器對客戶端的訪問進行監聽。客戶端訪問服務器端時必須明確四個參數,包括:訪問協議、服務器IP地址、服務器監聽端口、服務器端的哪個數據庫實例。( T )
- 在安裝Oracle服務器軟件時自動配置一個監聽器,並且自動創建了和數據庫實例名相同的本地網絡服務名。( T )
- 數據操作語言針對表中的數據,而數據定義語言針對數據庫對象(表、索引、視圖、觸發器、存儲過程、函數、表空間等)。( T )
- DML(數據操作語言)包括了:insert、update、delete、select。( F )
- SQL(Structured Query Language)是最重要的關系數據庫操作語言,是所有關系數據庫管理系統的標准語言。許多數據庫廠商在使用SQL的同時,都對SQL進行了擴展,比如ORACLE的PL/SQL語言,MS SQL-Server的T-SQL語言。( T )
- 字段別名如果含有空格或其他特殊字符或大小寫敏感,需用中括號括起來。( F )
- 連接運算符‘||’可以把列與字符、或其它表達式連接在一起,得到一個新的字符串,實現‘合成’列的功能。( T )
- 缺省情況下,查詢結果中包含所有符合條件的記錄行,但是不包括重復行。( F )
- 運算符:BETWEEN...AND...含義:界於兩值之間(不包括邊界);LIKE含義:模糊查詢。( F )
- 使用LIKE運算符執行模糊查詢(通配查詢),’%’ 表示零或多個字符,‘_’ 表示一個字符.( T )
- 函數只是將取出的數據進行處理,也會改變數據庫中的值。( F )
- 多行函數:sum() 和 avg() 僅適用數值型,count() 、max() 、min() 適用任何類型數據。( T )
- Oracle的類型轉換分為自動類型轉換和強制類型轉換。( T )
- 數據類型之間可以進行自動轉換,所以不建議使用顯示轉換函數,以保持良好的設計風格。常用類型轉換函數有to_char(),、to_date(),、to_number()。( F )
- NVL()函數用於將指定的某些值替換為指定的缺省值,適用於字符、數字、日期等類型數據。( F )
- 多行函數:對一組數據進行運算,針對一組數據(多行記錄)只返回一個結果,也稱分組函數。( T )
- 對分組查詢的結果進行過濾,要使用having從句。( T )
- 往表中插入數據的語句是insert語句,方式有兩種,一種是記錄值的插入,一種是查詢結果的插入。( T )
- 如果想從表中刪除所有的行,只能使用delete語句完成。( F )
- 進行多表等值查詢時,當被連接的多個表中存在同名字段時,須在該字段前加上"表名."前綴。使用表名(表別名)前綴不能提高查詢效率。( F )
- 為了連接n個表,至少需要n個連接條件。( F )
- Natural join基於兩個表中的全部同名列建立連接。從兩個表中選出同名列的值均對應相等的所有行。自然連接的結果保留重復的屬性。( F )
- 在查詢是基於未知值時應考慮使用子查詢,子查詢必須包含在括號內。( T )
- 如果子查詢返回多行結果,則為多行子查詢,此時不允許對其使用單行記錄比較運算符。( T )
- 單行子查詢只返回一行記錄。對單行子查詢可使用單行記錄比較運算符。( T )
四、 編碼題
- 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);
- 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';