Oracle面試題附帶答案

aFakeProgramer發表於2018-08-16

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;

相關文章