1. 程式人生 > >部分常見ORACLE面試題以及SQL注意事項

部分常見ORACLE面試題以及SQL注意事項

一、表的建立:

一個通過單列外來鍵聯絡起父表和子表的簡單例子如下:

CREATE TABLE parent(id INT NOT NULL,

                     PRIMARY KEY (id)

)

CREATE TABLE child(id INT, parent_id INT,

                    INDEX par_ind (parent_id),

                    FOREIGN KEY (parent_id) REFERENCES parent(id)

                      ON DELETE CASCADE

)

建表時注意不要用關鍵字當表名或欄位名,如insert,use等。

CREATE TABLE parent(id INT NOT NULL,

                     PRIMARY KEY (id)

) TYPE=INNODB;

InnoDB  Tables 概述

   InnoDBMySQL提供了具有事務(commit)、回滾(rollback)和崩潰修復能力(crash   recovery   capabilities)的事務安全(transaction-safe   (ACID   compliant))型表。  
   InnoDB  

提供了行鎖(locking   on   row   level),提供與   Oracle   型別一致的不加鎖讀取(non-locking   read   in   SELECTs)。這些特性均提高了多使用者併發操作的效能表現。在InnoDB表中不需要擴大鎖定(lock   escalation)因為   InnoDB   的列鎖定(row   level   locks)適宜非常小的空間。  
   InnoDB  
   MySQL   上第一個提供外來鍵約束(FOREIGN   KEY   constraints)的表引擎。    
   InnoDB  
的設計目標是處理大容量資料庫系統,它的CPU利用率是其它基於磁碟的關係資料庫引擎所不能比的。

從一個表中查詢出資料插入到另一個表中的方法:

select * into destTbl from srcTbl ;
insert into destTbl(fld1, fld2) select fld1, 5 from srcTbl ;
以上兩句都是將 srcTbl 的資料插入到 destTbl,但兩句又有區別的。第一句(select into from)要求目標表(destTbl)不存在,因為在插入時會自動建立。第二句(insert into select from)要求目標表(destTbl)存在,由於目標表已經存在,所以我們除了插入源表(srcTbl)的欄位外,還可以插入常量,如例中的:5

如果只想要結構而不要資料。

         create table s_emp_42  as  select * from s_emp  where 1=2;//永假式

SQL查詢練習題

1.

1book表,欄位有id(主鍵)name (書名)

2bookEnrol表(圖書借出歸還登記),欄位有idbookId(外來鍵),dependDate(變更時間),state1.借出 2.歸還)。

id  name               

1   English

2   Math

3   JAVA


    id   bookId   dependDate  state

1      1      2009-01-02    1

2      1      2009-01-12    2

3      2      2009-01-14    1

4      1      2009-01-17    1

5      2      2009-02-14    2

6      2      2009-02-15    1

7      3      2009-02-18    1

8      3      2009-02-19    2

要求查詢結果應為:(被借出的書和被借出的日期)

Id    Name     dependDate

1    English    2009-01-17

2    Math      2009-02-15

Select e.bookId,b.name,e.dependDate from book b,bookEnrol e where 

第二個表是用來登記的,不管你是借還是還,都要新增一條記錄。

請寫一個SQL語句,獲取到現在狀態為已借出的所有圖書的相關資訊。

參考語句:

select book.id,book.name,max(dependDate)

from book inner join bookEnrol on book.id=bookEnrol.bookid AND booker.state=1

group by book.id ;

2

(1)題練習使用group by /having 子句。類似的筆試題還有:

表一:各種產品年銷售量統計表  sale

產品銷量  
   2005       a             700  
   2005       b             550  
   2005       c             600  
   2006       a             340  
   2006       b             500  
   2007       a             220  
   2007       b             350  
  
要求得到的結果應為:

產品銷量  
   2005       a           700  
   2006       b           500  
   2007       b           350  

即:每年銷量最多的產品的相關資訊。

參考答案:

  Select * from sale a where  not exists(select  * from  sale  where  =a.  and  銷量>a.銷量);
   --or:  
   select *  from sale  a  inner  join (select
,max(銷量) as 銷量from sale  group by ) b  
   on  a.
=b. and a.銷量=b.銷量

3.查詢語句排名問題:

名次姓名月積分(char) 總積分(char
1    WhatIsJava 1   99
2   
水王       76 981
3   
新浪網     65 96
4   
牛人        22 9
5   
中國隊     64 89
6   
北林資訊    66 66
7    
加太陽    53 66
8   
中成藥     11 33
9    
西洋參    25 26
10   
大拿      33 23

如果用總積分做降序排序..因為總積分是字元型,所以排出來是這樣子(9,8,7,6,5...),要求按照總積分的數字大小排序。

select * from tablename order by cast(總積分 as int) desc

tb   
  uid             mark  
   1                   7  
   1                   6  
   2                   3  
   2                   2  
   2                   5  
   3                   4  
   3                   3  
   4                   8  
   4                   1  
   4                   3        
  
想查出uid=4的名次:  
   uid         mc  
   4            3  

select   uid,   sum(mark)   as   total   from   tab_name   group   by   uid   order   by   total   desc;

4

A欄位如下
month  name income
月份人員收入

 1      a    1000

 2      a    2000

 3      a    3000
要求用一個SQL語句(注意是一個)的處所有人(不區分人員)每個月及上月和下月的總收入要求列表輸出為月份當月收入上月收入下月收入
  2    2000    1000    3000

Select (Select Month From Table Where Month = To_Char(Sysdate, 'mm')) 月份,
(Select Sum(Income) From Table Where Month = To_Char(Sysdate, 'mm'))
當月收入,
(Select Sum(Income) From Table Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) - 1)
上月收入,
(Select Sum(Income) From Table Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) + 1)
下月收入
From Dual
5.
刪除重複記錄

方法原理:
1
Oracle中,每一條記錄都有一個rowidrowid在整個資料庫中是唯一的, rowid確定了每條記錄是在ORACLE中的哪一個資料檔案、塊、行上。
2
、在重複的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重複記錄中那些具有最大rowid的就可以了,其餘全部刪除。實現方法:
SQL> create table a (
 2 bm char(4), --
編碼
 3 mc varchar2(20) --
名稱
 4 )
 5 /

SQL> select rowid,bm,mc from a;
ROWID BM MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111
查詢到8記錄.

查出重複記錄
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
ROWID BM MC
------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
刪除重複記錄
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
刪除4個記錄.
SQL> select rowid,bm,mc from a;
ROWID BM MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

其他組合函式

Group by 子句
Distinct
關鍵字偽列ROWNUM,用於為子查詢返回的每個行分配序列值注意:組函式可以處理一組資料,返回一個值。組函式會忽略空值。where 後只能跟單行函式,不能有組函式。

使用TOP-N分析法TOP-N分析法基於條件顯示錶中最上面N條記錄或最下面N條記錄
TOP-N
查詢包含以下內容:
1
,一個用於排序資料的內聯檢視
2
,使用ORDER BY子句或DESC引數的子查詢
3
,一個外層查詢。由它決定最終記錄中行的數目。這包括ROWNUM偽列和用於比較運算子的WHERE子句

//語法:
SELECT ROWNUM,column_list
FROM (SELECT column_list FROM table_name ORDER BY Top-n-column_name)
WHERE ROWNUM <= N

1:查詢Employee表的頂部10條記錄
//
方法1:單表時可以用
select cEmployeeCode,vFirstName,vLastName from employee where rownum <= 10
//
方法2:較複雜的查詢,建議使用這種
select * from (select rownum as num,cEmployeeCode,vFirstName,vLastName from employee)
where num <= 10

2: 查詢Employee表的1 10記錄,可以用於分頁顯示
//
注意:因為這裡子查詢的rownum需要被外層查詢所使用,因此要使用別名,否則將被認為是兩個不同的rownum
select * from (select rownum as num,Employee.* from Employee) where num between 10 and 20
select * from (select rownum as num,Employee.* from Employee) where num between 1 and 10

SQL注入  1=1永遠成立,相當於查詢所有記錄

select * from person_zdk where 1=1 or name like '%a%' and age=13;

DECODE函式

ORACLE PL/SQL是功能強大的函式之一,目前還只有ORACLE公司的SQL提供了此函式,其他資料庫廠商的SQL實現還沒有此功能。

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

假設我們想給智星職員加工資,其標準是:工資在8000元以下的將加20%;工資在8000元以上的加15%,用DECODE函式,那麼我們就可以把這些流控制語句省略,通過SQL語句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee.

SQL中的單記錄函式

1.CONCAT
連線兩個字串;
SQL>   select   concat('010-','88888888')||'
23'   高乾競電話   from   dual;高乾競電話
----------------
010-88888888
23

2.LTRIMRTRIM
LTRIM  
刪除左邊出現的字串
RTRIM  
刪除右邊出現的字串
SQL>   select   ltrim(rtrim('   gao   qian   jing   ','   '),'   ')   from   dual;
LTRIM(RTRIM('
-------------
gao   qian   jing

3..SUBSTR(string,start,count)
取子字串,start開始,count
SQL>   select   substr('13088888888',3,8)   from   dual;
SUBSTR('
--------
08888888

4日期函式

:LAST_DAY  返回本月日期的最後一天

具體參見oracle筆記.

其他主要函式:.TRUNC 按照指定的精度擷取一個數;SQRT 返回數字n的根;POWERn1,n2)返回n1n2次方根;MOD(n1,n2) 返回一個n1除以n2的餘數;FLOOR 對給定的數字取整數;REPLACE('string','s1','s2')  string   希望被替換的字元或變數   s1 被替換的字串   s2 要替換的字串;LOWER 返回字串,並將所有的字元小寫;UPPER返回字串,並將所有的字元大寫;LENGTH
返回字串的長度。

ORALCE常識 SQL 基本語法

1ORACLE安裝完成後的初始口令?
internal/oracle
sys/change_on_install
system/manager
scott/tiger scott
Oracle的核心開發人員之一,tiger是他家的一隻貓的名字
sysman/oem_temp

2IBMCodd Edgar Frank Codd)博士提出《大型共享資料庫資料的關係模型》

3,ORACLE 9i 中的 i internet)是因特網的意思

4,ORACLE的資料庫的物理結構:資料檔案、日誌檔案、控制檔案

5,ORACLE的資料庫的邏輯結構:表空間——————區間——表空間類似於SQLSERVER中資料庫的概念

6,SYSDATE 返回當前系統日期(說明:當函式沒有引數時可以省略括號)

7,SQL PLUS執行緩衝區中的SQL命令的方式:
SQL> run
SQL> r
SQL> /

8,SQL PLUS修改當前會話的日期顯示格式
SQL> alter session set nls_date_format = 'YYYY-MM-DD'

9,使用臨時變數,提高輸入效率
SQL> insert into emp(empno,ename,sal) values(&employeeno,'&employeename',&employeesal);

10,從其他表中複製資料並寫入表
SQL> insert into managers(id,name,salary,hiredate)
SQL> select empno,ename,sal,hiredate
SQL> from emp
SQL> where job = 'MANAGER';

11,修改表中的記錄
SQL> update table set column = value [,column = value,……] [where condition];

12,刪除表中的記錄
SQL> delete [from] table [where condition];
13,
資料庫事務,事務是資料庫一組邏輯操作的集合一個事務可能是:多個DML語句單個DDL語句單個DCL語句

14,事務控制使用 savepoint,rollback,commit 關鍵字
SQL> savepoint aaa;
SQL> rollback to aaa;
SQL> commit;

15,查詢表中的資料
select * from table_name;
select column_list from table_name;

16,Number and Date 可以用於算術運算因為 Date 型別其實儲存為 Number 型別

17,用運算表示式產生新列
SQL> select ename,sal,sal+3000 from emp;
SQL> select ename,sal,12*sal+100 from emp;

18,算術表示式中NULL值錯誤的處理因為任何數與NULL運算無意義,所以為避免錯誤,需要用其他值替換NULL例如:
SQL> select ename "
姓名",12*sal+comm "年薪" from emp where ename = 'KING';
姓名薪水
---------- ----------
KING
因為comm(提成工資)列為NULL值,結果也出現了NULL值,所以需要用0來替換NULL
 
注意函式nvl的使用 NVL(原值,新值)
SQL> select ename "
姓名",12*sal+NVL(comm,0) "年薪" from emp where ename = 'KING';
員工姓名員工薪水
---------- ----------
KING 60000
——————————————

19,使用友好的列名,有下面三種形式
SQL> select ename as
姓名, sal 月薪, sal*12 "年薪" from emp

20,過濾重複行,使用關鍵字 distinct
SQL> select distinct * from emp;
21,SQL PLUS
訪問ORACLE資料庫的原理
SQL*Plus —> Buffer —> Server —> Query Result

22,where 子句中字元型是區分大小寫的,最好都轉成大寫因為在ORACLE庫中,字元會轉換成大寫來儲存

23,比較運算子:等於"=",不等於有兩種"<>"或者"!="

24,複雜的比較運算子:
between …… and ……
in (……value list……)
like
% 代表匹配至多個任意字元,_ 代表單個任意字元)
null
(與NULL進行比較時,需要使用 is null 或者 is not null

25,邏輯運算子,按優先順序從高到低排列
Not , And , Or

26,Order by 子句 asc 表示升序,desc 表示降序)

27,ORACLE 函式,分為單行函式:每條記錄返回一個結果值多行函式:多條記錄返回一個結果值

28,字元函式——轉換函式
LOWER
:轉為小寫
UPPER
:轉為大寫
INITCAP
:將每個單詞的首字母大寫,其他字母小寫

29,字元函式——操縱函式(注意:ORACLEUNICODE儲存字元)
CONCAT:
連線兩個字串,與並置運算子“||”類似
SUBSTR:substr(string,position,length)
string中的position開始取length個字元
LENGTH:
返回字串的長度
INSTR: instr(string,value)
返回 value string 的起始位置
LPAD: lpad(string,number,value)
string不夠number位,從左起用vlaue字串填充(不支援中文)

30,四捨五入函式 round(數值,小數位)
SQL> SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1) FROM DUAL;

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)
--------------- --------------- ----------------
45.92 46 50

31,數值擷取函式 trunct
SQL> SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,-1) FROM DUAL;

TRUNC(45.923,2) TRUNC(45.923,0) TRUNC(45.923,-1)
--------------- --------------- ----------------
45.92 45 40

32,求模函式 MOD(a,b) 返回ab整除後的餘數

33,Oracle內部預設的日期格式: DD-MON-YY 24-9 -06

34,DUAL :啞元系統表,是名義表,只能範圍唯一值

35,Date型別的算術運算,以天為單位例如:部門編號為10的員工分別工作了多少年
SQL> select ename,(sysdate-hiredate)/365 as years from emp where deptno = 10;

ENAME YEARS
---------- ----------
CLARK 25.3108341
KING 24.8697382
MILLER 24.6861766

36,日期函式
MONTHS_BETWEEN
返回兩個日期之間相差多少個月
ADD_MONTHS
在日期上加上月份數
NEXT_DAY
下一個日子 select next_day(sysdate,'星期一') from dual;
LAST_DAY
該月的最後一天
ROUND
四捨五入日期 round(sysdate,'year') 或者 round(sysdate,'month')
TRUNC
擷取日期 trunc(sysdate,'year') 或者 trunc(sysdate,'month')

37,資料型別轉換 —— Oracle 可隱式轉換的情況有:
From To
varchar2 or char —— number
(當字串是數字字元時)
varchar2 or char —— date
number —— varchar2
date —— varchar2

38,資料型別轉換 —— Oracle 資料型別轉換函式
to_char
to_number
to_date

39,日期格式模型字元
YYYY
代表完整的年份
YEAR
年份
MM
兩位數的月份
MONTH
月份的完整名稱
DY
每星期中天的三個字元縮寫
DAY
表示星期日——星期六

另外還有 D,DD,DDD 等。。。

40,NVL(value,substitute)
value:
是可能有null的列,substitute是預設值這個函式的作用就是當出現null值的時候,後預設值替換null

41,Coalesce(exp_name1,exp_name2……exp_n)

42,Decode 函式: Decode(exp,testvalue1,resultvalue1,testvalue2,resultvalue2)
例如,根據國家名稱顯示相應的國家程式碼:
1>
建立國家表
create table countrys
(
vCountryName varchar2(50)
);
2>
寫入幾行,分別為中國、日本、韓國
insert into countrys values ('&name');
3>
DECODE函式,進行匹配和顯示
select vCountryName as "
國家名稱",
DECODE(vCountryName,'
中國','086','日本','116') as "國家編號" from countrys;

國家名稱國家編號
-------------------------------------------------- ---
中國 086
日本 116
韓國

結果,在DECODE中存在且成功匹配的值將會被顯示,否則顯示為NULL

SQL語句書可以提高執行效率的方法

1、操作符號: NOT IN操作符此操作是強列推薦不使用的,因為它不能應用表的索引。推薦方案:用NOT EXISTS 或(外連線+判斷為空)方案代替 "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", "LIKE '%500'",因為他們不走索引全是表掃描。NOT IN會多次掃描表,使用EXISTSNOT EXISTSINLEFT OUTER JOIN來替代,特別是左連線,ExistsIN更快,最慢的是NOT操作。


2
、注意unionunion all的區別。unionunion all多做了一步distinct操作。能用union all的情況下儘量不用union: 兩個表AB都有一個序號欄位ID,要求兩個表中的ID欄位最大的值:

select   max(id)   as   max_id  
   from(  
   select   id   from  
A  
   union   all  
   select   id   from  
B    )   t


3
、查詢時儘量不要返回不需要的行、列。另外在多表連線查詢時,儘量改成連線查詢,少用子查詢。


4
、儘量少用檢視,它的效率低。對檢視操作比直接對錶操作慢,可以用儲存過程來代替它。特別的是不要用檢視巢狀,巢狀檢視增加了尋找原始資料的難度。我們看檢視的本質:它是存放在伺服器上的被優化好了的已經產生了查詢規劃的SQL。對單個表檢索資料時,不要使用指向多個表的檢視,直接從表檢索或者僅僅包含這個表的檢視上讀,否則增加了不必要的開銷,查詢受到干擾.為了加快檢視的查詢,MsSQL增加了檢視索引的功能。

5
、建立合理的索引,對於插入或者修改比較頻繁的表,儘量慎用索引。因為如果表中存在索引,插入和修改時也會引起全表掃描。索引一般使用於where後經常用作條件的欄位上。

6
、在表中定義欄位或者儲存過程、函式中定義引數時,將引數的大小設定為合適即可,勿設定太大。這樣開銷很大。

7
Between在某些時候比IN速度更快,Between能夠更快地根據索引找到範圍。用查詢優化器可見到差別。
select * from chineseresume where title in ('
','')
Select * from chineseresume where between '
' and ''是一樣的。由於in會在比較多次,所以有時會慢些。

8
、在必要是對全域性或者區域性臨時表建立索引,有時能夠提高速度,但不是一定會這樣,因為索引也耗費大量的資源。他的建立同是實際表一樣。

9
WHERE後面的條件順序影響
WHERE
子句後面的條件順序對大資料量表的查詢會產生直接的影響,如
Select * from zl_yhjbqk where dy_dj = '1KV
以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV
以下'
以上兩個SQLdy_dj(電壓等級)及xh_bz(銷戶標誌)兩個欄位都沒進行索引,所以執行的時候都是全表掃描,如果dy_dj = '1KV以下'條件在記錄集內比率為99%,而xh_bz=1的比率只為0.5%,在進行第一條SQL的時候99%條記錄都進行dy_djxh_bz比較,而在進行第二條SQL的時候0.5%條記錄都進行dy_djxh_bz的比較,以此可以得出第二條SQLCPU佔用率明顯比第一條低。所以儘量將範圍小的條件放在前面。。

10
、用OR的字句可以分解成多個查詢,並且通過UNION 連線多個查詢。他們的速度只同是否使用索引有關,如果查詢需要用到聯合索引,用 UNION all執行的效率更高.多個OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個關鍵的問題是否用到索引。

11
、沒有必要時不要用DISTINCTORDER BY,這些動作可以改在客戶端執行。它們增加了額外的開銷。這同UNIONUNION ALL一樣的道理。

12
、使用in時,在IN後面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最後面,這樣可以減少判斷的次數

13
、當用SELECT INTO時,它會鎖住系統表(sysobjectssysindexes等等),阻塞其他的連線的存取。建立臨時表時用顯示宣告語句,在另一個連線中 SELECT * from sysobjects可以看到 SELECT INTO 會鎖住系統表, Create table 也會鎖系統表(不管是臨時表還是系統表)。所以千萬不要在事物內使用它!!!這樣的話如果是經常要用的臨時表請使用實表,或者臨時表變數。

14
、一般在GROUP BYHAVING字句之前就能剔除多餘的行,所以儘量不要用它們來做剔除行的工作。他們的執行順序應該如下最優:select Where字句選擇所有合適的行,Group By用來分組個統計行,Having字句用來剔除多餘的分組。這樣Group ByHaving的開銷小,查詢快.對於大的資料行進行分組和Having十分消耗資源。如果Group BY的目的不包括計算,只是分組,那麼用Distinct更快

15
、一次更新多條記錄比分多次更新每次一條快,就是說批處理好

16
、慎用臨時表,臨時表儲存於tempdb庫中,操作臨時表時,會引起跨庫操作。儘量用結果集和表變數來代替它。

17
、儘量將資料的處理工作放在伺服器上,減少網路的開銷,如使用儲存過程。儲存過程是編譯好、優化過,並且被組織到一個執行規劃裡、且儲存在資料庫中的 SQL語句,是控制流語言的集合,速度當然快。

18
、不要在一段SQL或者儲存過程中多次使用相同的函式或相同的查詢語句,這樣比較浪費資源,建議將結果放在變數裡再呼叫。這樣更快。

19
、按照一定的次序來訪問你的表。如果你先鎖住表A,再鎖住表B,那麼在所有的儲存過程中都要按照這個順序來鎖定它們。如果你(不經意的)某個儲存過程中先鎖定表B,再鎖定表A,這可能就會導致一個死鎖。

oracle Certification Program (OCP認證)的題目(1) A 表中有100條記錄.

Select* FROM A Where A.COLUMN1 = A.COLUMN1

  這個語句返回幾條記錄? (簡單吧,似乎1秒鐘就有答案了:)

(2) Create SEQUENCE PEAK_NO

Select PEAK_NO.NEXTVAL FROM DUAL --> 假設返回1

10秒中後,再次做 Select PEAK_NO.NEXTVAL FROM DUAL --> 返回多少?

(3) SQL> connect sys as sysdba

Connected.


SQL> insert into dual values ( 'Y');

1 row created.

SQL> commit;

Commit complete.

SQL> select count(*) from dual;

COUNT(*)

----------

2

SQL> delete from dual;

commit;

-->DUAL裡還剩幾條記錄?

JUST TRY IT
一些高難度的SQL面試題下的null代表真的null,寫在這裡只是為了讓大家看清楚根據如下表的查詢結果,那麼以下語句的結果是(知識點:not in/not exists+null
SQL> select * from usertable;
USERID           USERNAME
-----------      ----------------
     1          user1
     2          null
     3          user3
     4          null
     5          user5
     6          user6
      
SQL> select * from usergrade;
USERID         USERNAME           GRADE
----------     ----------------   ----------
     1        user1              90
     2        null               80
     7        user7              80
     8        user8              90
執行語句:

select count(*) from usergrade where username not in (select username from usertable);

select count(*) from usergrade g where not exists
(select null from usertable t where t.userid=g.userid and t.username=g.username);

果為:語句1(  0 )   語句2  (  3 )

A: 0     B:1     C:2     D:3      E:NULL


2

在以下的表的顯示結果中,以下語句的執行結果是(知識點:in/exists+rownum
SQL> select * from usertable;
USERID           USERNAME
-----------      ----------------
     1          user1
     2          user2
     3          user3
     4          user4
     5          user5
      
SQL> select * from usergrade;
USERNAME               GRADE
----------------       ----------
user9                  90
user8                  80
user7                  80
user2                  90
user1                  100
user1                  80

執行語句
Select count(*) from usertable t1 where username in
  (select username from usergrade t2 where rownum <=1);
  
Select count(*) from usertable t1 where exists
  (select 'x' from usergrade t2 where t1.username=t2.username and rownum <=1);

以上語句的執行結果是:(  )  (  )
  A:   0        B:   1        C:   2       D:  3

據以下的在不同會話與時間點的操作,判斷結果是多少,其中時間T1原始表記錄為;
select * from emp;
EMPNO         DEPTNO       SALARY
-----         ------       ------
100            1           55
101            1           50

select * from dept;
DEPTNO           SUM_OF_SALARY
------           -------------
1                105
2                

可以看到,現在因為還沒有部門2的員工,所以總薪水為null,現在,有兩個不同的使用者(會話)在不同的時間點(按照特定的時間順序)執行了一系列的操作,那麼在其中或最後的結果為:

time              session 1                            session2
-----------      -------------------------------       -----------------------------------
T1               insert into emp
                 values(102,2,60)
                  
T2                                                     update emp set deptno =2
                                                        where empno=100

T3                                                    update dept set sum_of_salary =
                                                       (select sum(salary) from emp
                                                     where emp.deptno=dept.deptno)
                                                     where dept.deptno in(1,2);
                                                  
T4           update dept set sum_of_salary =
                (select sum(salary) from emp
            where emp.deptno=dept.deptno)
            where dept.deptno in(1,2);
              
T5                                                    commit;

T6                                                    select sum(salary) from emp group by deptno;
                                                    
問題一:這裡會話2的查詢結果為:                                                  
T7          commit;
=======
到這裡為此,所有事務都已完成,所以以下查詢與會話已沒有關係========

T8          select sum(salary) from emp group by deptno;
            
問題二:這裡查詢結果為

T9         select * from dept;
            
問題三:這裡查詢的結果為問題一的結果(  )  問題二的結果是(  )  問題三的結果是(  )

A:                        B:
----------------         ----------------
1        50               1        50
2        60               2        55

C:                        D:
----------------         ----------------
1        50               1       115
2       115               2        50

E:                        F:
----------------         ----------------
1       105               1       110
2        60               2        55


有表一的查詢結果如下,該表為學生成績表(知識點:關聯更新)
select id,grade from student_grade
ID                 GRADE
--------           -----------
1                  50
2                  40
3                  70
4                  80
5                  30
6                  90

表二為補考成績表
select id,grade from student_makeup
ID