1.你要對操縱Oracle數據庫中的數據。下列哪個選項表示Oracle中select語句的功能,
並且不需要使用子查詢(C)
A.可以用select語句改變Oracle中的數據
B.可以用select語句刪除Oracle中的數據
C.可以用select語句和另一個表的內容生成一個表
D.可以用select語句對錶截斷
2. 你要在Oracle中定義SQL查詢。下列哪個數據庫對象不能直接從select語句中引用(C)
A.表 B.序列 C.索引 D.視圖
3. 用下列代碼塊回答問題:
SQL> select ______(-45) as output from dual;
OUTPUT
------
-45
下列哪個單行函數無法產生這個輸出(A)
A.abs() B.ceil() C.floor() D.round()
4. SQL *Plus中發出的下列語句:
SQL> select ceil(-97.342),
2 floor(-97.342),
3 round(-97.342),
4 trunc(-97.342)
5 from dual;
下列哪個函數不返回結果-97(B)
A.ceil() B.floor() C.round() D.trunc()
5. 你要定義外連接,下列哪個選項正確描述了外連接語句?( D )
A.由於外連接操作允許一個表中有NULL值,因此連接這些表時不必指定相等性比較。
B.在表A與B的外連接語句中,如果不管B表有無相應記錄,都要顯示錶A的所有行,則可以使用右外連接。
C.在表A與B的外連接語句中,如果不管A表有無相應記錄,都要顯示錶B的所有行,則可以使用左外連接。
D.儘管外連接操作允許一個表中有NULL值,但連接這些表時仍要指定相等性比較
6. 對數據庫運行下列哪個group by查詢時會從Oracle產生錯誤?( C )
A.select deptno, job, sum(sal) from emp group by job, deptno;
B.select sum(sal), deptno, job from emp group by job, deptno;
C.select deptno, job, sum(sal) from emp;
D. select deptno, sum(sal), job from emp group by job, deptno;
7.若account表中有14條記錄,則用戶執行了以下操作,結果是( A )
declare
cursor mycur is select * from emp;
begin
open mycur;
dbms_output.put_line(mycur%rowcount);
close mycur;
end;
A.0
B.14
C.7
D.編譯不通過,無法執行。
8. 數據庫系統的核心是__B____。
A、數據模型B、數據庫管理系統C、軟件工具D、數據庫
9. 下列敘述中正確的是___C__。
A、數據庫是一個獨立的系統,不需要操作系統的支持
B、數據庫設計是指設計數據庫管理系統
C、數據庫技術的根本目標是要解決數據共享的問題
D、數據庫系統中,數據的物理結構必須與邏輯結構一致
10. SQL 語句中修改表結構的命令是_C___。
A、MODIFY TABLE B、MODIFY STRUCTURE C、ALTER TABLE
D、ALTER STRUCTURE
11. 如果要創建一個數據組分組報表,第一個分組表達式是"部門",第二個分組表達
式是"性別",第三個分組表達式是"基本工資",當前索引的索引表達式應當是___B__。
A、部門+性別+基本工資
B、部門+性別+STR(基本工資)
C、STR(基本工資)+性別+部門
D、性別+部門+STR(基本工資)
12. 數據庫DB、數據庫系統DBS、數據庫管理系統DBMS 三者之間的關係是___A___。
A、DBS 包括DB 和DBMS
B、DBMS 包括DB 和DBS
C、DB 包括DBS 和DBMS
D、DBS 就是DB,也就是DBMS
13. 定位第一條記錄上的命令是__A____。
A、GO TOP B、GO BOTTOM C、GO 6 D、SKIP
14. 在關係模型中,實現"關係中不允許出現相同的元組"的約束是通過__B____。
A、候選鍵B、主鍵C、外鍵D、超鍵
15. 只有滿足聯接條件的記錄才包含在查詢結果中,這種聯接爲__C____。
A、左聯接
B、右聯接
C、內部聯接
D、完全聯接
16. 索引字段值不唯一,應該選擇的索引類型爲____B__。
A、主索引
B、普通索引
C、候選索引
D、唯一索引
17. 10. 從數據庫中刪除表的命令是___A__。
A、DROP TABLE
B、ALTER TABLE
C、DELETE TABLE
D、USE TABLE
18. DELETE FROM S WHERE 年齡>60 語句的功能是___B__。
A、從S 表中徹底刪除年齡大於60 歲的記錄
B、S 表中年齡大於60 歲的記錄被加上刪除標記
C、刪除S 表
D、刪除S 表的年齡列
19. SELECT-SQL 語句是__B___。
A、選擇工作區語句
B、數據查詢語句
C、選擇標準語句
D、數據修改語句
20. SQL 語言是__C___語言。
A、層次數據庫
B、網絡數據庫
C、關係數據庫
D、非數據庫
21. 在SQL 中,刪除視圖用__C____。
A、DROP SCHEMA 命令
B、CREATE TABLE 命令
C、DROP VIEW 命令
D、DROP INDEX 命令
22. 在數據庫設計器中,建立兩個表之間的一對多聯繫是通過以下索引實現的
__ A____。
A、"一方"表的主索引或候選索引,"多方"表的普通索引
B、"一方"表的主索引,"多方"表的普通索引或候選索引
C、"一方"表的普通索引,"多方"表的主索引或候選索引
D、"一方"表的普通索引,"多方"表的候選索引或普通索引
23. 下列函數中函數值爲字符型的是___B___。
A、DATE()
B、TIME()
C、YEAR()
D、DATETIME()
24. 將查詢結果放在數組中應使用___A___短語。
A、INTO CURSOR B、TO ARRAY C、INTO TABLE D、INTO ARRAY
簡答題
1. 如何判斷遊標是否到了末尾。
答: cursor_name%notfound
2.寫一個‘遊標’並使用它。
答:
Declare
cursor cursor_name is
Select real_name from account;
Name varchar2(10);
Begin
open cursor_name;
loop
fetch cursor into name;
exit when cursor_name%notfound;
sql…
end loop;
close cursor_name;
end;
3. 使用存儲過程訪問數據庫比直接用SQL語句訪問有哪些優點?
答:
存儲過程是預編譯過的,執行時勿須編譯,執行速度更快;存儲過程封裝了一批SQL語句,便於維護數據的完整性與一致性;可以實現代碼的複用。
4.簡述數據庫的第一範式,第二範式,第三範式。並舉例
答:
第一範式:(1NF)無重複的列。
第二範式:(2NF)屬性完全依賴於主鍵。
第三範式:(3NF)屬性不依賴於其它非主屬性。
5. 試述事務的概念及事務的四個特性。
答:
事務是用戶定義的一個數據庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。事務具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這個四個特性也簡稱爲ACID特性。
原子性:事務是數據庫的邏輯工作單位,事務中包括的諸操作要麼都做,要麼都不做。一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。隔離性:一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對其他併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
持續性:持續性也稱永久性(Permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其執行結果有任何影響。
6. Truncate與 delete的區別?
答:
delete一般用於刪除少量記錄的操作,而且它是要使用回滾段並且要進行顯示的提交事務。而truncate則使用於大量刪除數據,而且隱式提交事務,其速度要比使用delete快的。
7. Truncate與 delete的區別?
答:
DDL表示數據定義語言,在ORACLE中主要包括CREATE,ALTER,DROP;
DML表示數據操作語言,主要的DML有SELECT,INSERT,UPDATE,DELETE。
8.如何獲取系統時間。
答:
select sysdate from dual;
編程題
1、一個日期判斷的sql 語句?
請取出tb_send 表中日期(SendTime 字段) 爲當天的所有記錄?(SendTime 字段爲
datetime 型,包含日期與時間)
答:select * from tb where datediff(dd,SendTime,getdate())=0
2.一道SQL 語句面試題,關於group by 表內容:
2005-05-09 勝
2005-05-09 勝
2005-05-09 負
2005-05-09 負
2005-05-10 勝
2005-05-10 負
2005-05-10 負
如果要生成下列結果, 該如何寫sql 語句?
勝負
2005-05-09 2 2
2005-05-10 1 2
答:
create table #tmp(rq varchar(10),shengfu nchar(1))
insert into #tmp values('2005-05-09','勝')
insert into #tmp values('2005-05-09','勝')
insert into #tmp values('2005-05-09','負')
insert into #tmp values('2005-05-09','負')
insert into #tmp values('2005-05-10','勝')
insert into #tmp values('2005-05-10','負')
insert into #tmp values('2005-05-10','負')
1)select rq, sum(case when shengfu='勝' then 1 else 0 end)'勝',sum(case when shengfu='負'
then 1 else 0 end)'負' from #tmp group by rq
2) select N.rq,N.勝,M.負from (
select rq,勝=count(*) from #tmp where shengfu='勝'group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu='負'group by rq)M on N.rq=M.rq
3)select a.col001,a.a1 勝,b.b1 負from
(select col001,count(col001) a1 from temp1 where col002='勝' group by col001) a,
(select col001,count(col001) b1 from temp1 where col002='負' group by col001) b
where a.col001=b.col001
3、請用SQL 語句實現:從TestDB 數據表中查詢出所有月份的發生額都比101 科目相應月份的發生額高的科目。請注意:TestDB 中有很多科目,都有1-12 月份的發生額。
AccID:科目代碼,Occmonth:發生額月份,DebitOccur:發生額。
數據庫名:JcyAudit,數據集:Select * from TestDB
答:select a.*
from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group
by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur
4.有一個兩維表,M行N列,請用Oracle的存儲過程,轉置成N行M列。
答: CREATE OR REPLACE PROCEDURE row_col_convert(p_tabname IN VARCHAR2,view_name IN VARCHAR2 DEFAULT 'v_tmp')
AUTHID CURRENT_USER
AS
sqlstr VARCHAR2(4000);
sqlstr1 varchar2(500):='select ''??'' newid';
cur sys_refcursor;
id_col VARCHAR2(30);
id varchar2(100);
BEGIN
if trim(p_tabname) is null then return; end if;
SELECT column_name INTO id_col FROM user_tab_cols WHERE table_name=upper(p_tabname) AND column_id=1;
OPEN cur FOR 'select to_char('||id_col||') from '||p_tabname||' order by 1';
loop
fetch cur INTO ID;
exit WHEN cur%notfound;
sqlstr1:=sqlstr1||',max(decode('||id_col||','''||id||''',to_char(??)))"'||id||'"';
END loop;
sqlstr1:=sqlstr1||' from '||p_tabname;
FOR cur1 IN(SELECT column_name FROM user_tab_cols WHERE table_name=upper(p_tabname) AND column_id>1) loop
sqlstr:=sqlstr||chr(10)||'union all '||REPLACE(sqlstr1,'??',cur1.column_name);
END loop;
execute immediate 'create or replace view '||view_name||' as '||substr(sqlstr,12);
END;
5.請根據以下的描述,編寫存儲過程 sp_terminal
用戶資料表:serv( serv_id number(10), pro_id number(10), user_type varchar2(30), terminal_name varchar2(30) )
其中,serv_id 爲用戶標識,是serv表的主鍵,prod_id爲產品標識;user_type爲用戶類型;terminal_name爲終端類型
終端類型臨時表:terminal(serv_id number(10),terminal_name varchar2(30))
初始化的情況下,serv表的serv_id,prod_id,user_type字段是已知的,terminal_name字段是空的,現在主要根據prod_id,user_type字段的值來更新terminal_name字段
更新條件爲:
當條件滿足“prod_id = 1 and user_type='A'“時,terminal_name更新爲‘固話’
當條件滿足”prod_id = 1 and user_type='B'“時,terminal_name更新爲‘小靈通’
當條件滿足”prod_id = 2“時,terminal_name更新爲‘寬帶’
當條件滿足”user_type=‘C’“時,terminal_name更新爲‘CDMA’
以上條件均不滿足時,terminal_name更新爲 -1;
答:
create or replace procedure sp_terminal
is
begin
update serv t
set t.terminal_name = case when t.pro_id = 1 and t.user_type = 'A' then '固話'
when t.pro_id = 1 and t.user_type = 'B' then '小靈通'
when t.pro_id = 2 then '寬帶'
when t.user_type = 'C' then 'CDMA'
else '-1'
end;
update terminal a
set a.terminal_name = (select t.terminal_name
from serv t
where t.serv_id = a.serv_id)
where exists (select 'x'
from serv t
where t.serv_id = a.serv_id);
end;