轉一篇數據庫面試題

原址:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921911.html

 

1.用一條SQL語句 查詢出每門課都大於80分的學生姓名javascript

name   kecheng   fenshu
張三     語文       81
張三     數學       75
李四     語文       76
李四     數學       90
王五     語文       81
王五     數學       100
王五     英語       90

A:第一種方式:html

[sql]   view plain  copy
 
  1. select distinct name from table where name not in (select distinct name from table where fenshu<=80)  

 

B: 第二種方式:(推薦使用)java

 

[sql]   view plain  copy
 
  1. select name from table group by name having min(fenshu)>80  

2.學生表 以下:
自動編號   學號   姓名 課程編號 課程名稱 分數
1        2005001 
張三 0001      數學    69
2        2005002 
李四 0001      數學    89
3        2005001 
張三 0001      數學    69
刪除除了自動編號不一樣,其餘都相同的學生冗餘信息:(先分組,保留最小編號的數據,其餘刪除)
面試

[sql]   view plain  copy
 
  1. A: delete tablename where 自動編號 not in(select min( 自動編號) from tablename group by 學號, 姓名, 課程編號, 課程名稱, 分數)  



 

3.一個叫team的表,裏面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,如今四個球對進行比賽,用一條sql語句顯示全部可能的比賽組合.
你先按你本身的想法作一下,看結果有個人這個簡單嗎?sql

答:數據庫

[sql]   view plain  copy
 
  1. select a.name, b.name  
  2. from team a, team b  
  3. where a.name < b.name  

 

4.請用SQL語句實現:從TestDB數據表中查詢出全部月份的發生額都比101科目相應月份的發生額高的科目。請注意:TestDB中有不少科目,都有1-12月份的發生額。
AccID:科目代碼,Occmonth:發生額月份,DebitOccur:發生額。
數據庫名:JcyAudit,數據集:Select * from TestDB編程

答:c#

[sql]   view plain  copy
 
  1. select a.*  
  2. from TestDB a,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b  
  3. where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur  


**********************************************************************************************************************************************************************數據結構

 5.面試題:怎麼把這樣一個表兒
year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成這樣一個結果
year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4 

答案1、
併發

 

[sql]   view plain  copy
 
  1. select year,  
  2. (select amount from   aaa m where month=1   and m.year=aaa.yearas m1,  
  3. (select amount from   aaa m where month=2   and m.year=aaa.yearas m2,  
  4. (select amount from   aaa m where month=3   and m.year=aaa.yearas m3,  
  5. (select amount from   aaa m where month=4   and m.year=aaa.yearas m4  
  6. from aaa   
  7. group by year  

*******************************************************************************
6.
說明:複製表(只複製結構,源表名:a新表名:b) 

 

答案:

[sql]   view plain  copy
 
  1. SQL:  
  2. select * into b   
  3. from a   
  4. where 1<>1       (where1=1,拷貝表結構和數據內容)  
  5. <span style="font-family:宋體;">===================================================================  
  6. </span>ORACLE:  
  7. create table b  
  8. As  
  9. Select * from a where 1=2  
  10.   
  11.    

7.說明:拷貝表(拷貝數據,源表名:a目標表名:b) 

 

答案:

[sql]   view plain  copy
 
  1. insert into b(a, b, c)   
  2. select d,e,f   
  3. from a;   


8.說明:顯示文章、提交人和最後回覆時間

 

答案:

[sql]   view plain  copy
 
  1. select a.title,a.username,b.adddate  
  2. from table a,(select max(adddate) adddate from table where table.title=a.title) b   



11.
說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 

 

答案:

[sql]   view plain  copy
 
  1. Delete from info where not exists (select * from infobz where info.infid=infobz.infid )   

 

12.有兩個表A和B,均有key和value兩個字段,若是B的key在A中也有,就把B的value換爲A中對應的value
這道題的SQL語句怎麼寫?

[sql]   view plain  copy
 
  1. update b set b.value=(select a.value from a where a.key=b.key)   
  2. where b.id in(select b.id from b,a where b.key=a.key);  
  3.   
  4. ***************************************************************************   

 

[sql]   view plain  copy
 
  1. 13. 高級sql 面試題  
  2.   
  3. 原表:  
  4. courseid coursename score  
  5. -------------------------------------  
  6. 1 java 70  
  7. 2 oracle 90  
  8. 3 xml 40  
  9. 4 jsp 30  
  10. 5 servlet 80  

爲了便於閱讀,查詢此表後的結果顯式以下(及格分數爲60):

[sql]   view plain  copy
 
  1. courseid coursename score mark  
  2. ---------------------------------------------------  
  3. 1 java 70 pass  
  4. 2 oracle 90 pass  
  5. 3 xml 40 fail  
  6. 4 jsp 30 fail  
  7. 5 servlet 80 pass  
  8. ---------------------------------------------------  


寫出此查詢語句

[sql]   view plain  copy
 
  1. select courseid, coursename ,score ,decode (sign(score-60),-1,'fail','pass'as mark   
  2. from course   

 

[sql]   view plain  copy
 
  1. SQL面試題(1)  
  2.   
  3. create table testtable1  
  4. (  
  5. id int IDENTITY,  
  6. department varchar(12)  
  7. )  
  8.   
  9. select * from testtable1  
  10. insert into testtable1 values('設計')  
  11. insert into testtable1 values('市場')  
  12. insert into testtable1 values('售後')  
  13. /*  
  14. 結果  
  15. id department  
  16. 1   設計  
  17. 2   市場  
  18. 3   售後  
  19. */  
  20. create table testtable2  
  21. (  
  22. id int IDENTITY,  
  23. dptID int,  
  24. name varchar(12)  
  25. )  
  26. insert into testtable2 values(1,'張三')  
  27. insert into testtable2 values(1,'李四')  
  28. insert into testtable2 values(2,'王五')  
  29. insert into testtable2 values(3,'彭六')  
  30. insert into testtable2 values(4,'陳七')  
  31. /*  
  32. 用一條SQL語句,怎麼顯示以下結果  
  33. id dptID department name  
  34. 1   1      設計        張三  
  35. 2   1      設計        李四  
  36. 3   2      市場        王五  
  37. 4   3      售後        彭六  
  38. 5   4      黑人        陳七  
  39. */  


答案:

[sql]   view plain  copy
 
  1. SELECT testtable2.* , ISNULL(department,'黑人')  
  2. FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID  

 

 

也作出來了可比這方法稍複雜。

sql面試題(2)

有表A,結構以下: 
A: p_ID p_Num s_id 
1 10 01 
1 12 02 
2 8 01 
3 11 01 
3 8 03 
其中:p_ID爲產品ID,p_Num爲產品庫存量,s_id爲倉庫ID。請用SQL語句實現將上表中的數據合併,合併後的數據爲: 
p_ID s1_id s2_id s3_id 
1 10 12 0 
2 8 0 0 
3 11 0 8 
其中:s1_id爲倉庫1的庫存量,s2_id爲倉庫2的庫存量,s3_id爲倉庫3的庫存量。若是該產品在某倉庫中無庫存量,那麼就是0代替。

答案:

 

[sql]   view plain  copy
 
  1. select p_id ,  
  2. sum(case when s_id=1 then p_num else 0 endas s1_id,  
  3. sum(case when s_id=2 then p_num else 0 endas s2_id,  
  4. sum(case when s_id=3 then p_num else 0 endas s3_id  
  5. from myPro   
  6. group by p_id  

 

 

SQL面試題(3)

1.觸發器的做用?

  答:觸發器是一中特殊的存儲過程,主要是經過事件來觸發而被執行的。它能夠強化約束,來維護數據的完整性和一致性,能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如,某表上的觸發器上包含對另外一個表的數據操做,而該操做又會致使該表觸發器被觸發。

2。什麼是存儲過程?用什麼來調用?

答:存儲過程是一個預編譯的SQL語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次SQL,使用存儲過程比單純SQL語句執行要快。能夠用一個命令對象來調用存儲過程。

3。索引的做用?和它的優勢缺點是什麼?

答:索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。

3。什麼是內存泄漏?

答:通常咱們所說的內存泄漏指的是堆內存的泄漏。堆內存是程序從堆中爲其分配的,大小任意的,使用完後要顯示釋放內存。當應用程序用關鍵字new等建立對象時,就從堆中爲它分配一塊內存,使用完後程序調用free或者delete釋放該內存,不然就說該內存就不能被使用,咱們就說該內存被泄漏了。

4。維護數據庫的完整性和一致性,你喜歡用觸發器仍是自寫業務邏輯?爲何?

答:我是這樣作的,儘量使用約束,如check,主鍵,外鍵,非空字段等來約束,這樣作效率最高,也最方便。其次是使用觸發器,這種方法能夠保證,不管什麼業務系統訪問數據庫均可以保證數據的完整新和一致性。最後考慮的是自寫業務邏輯,但這樣作麻煩,編程複雜,效率低下。

5。什麼是事務?什麼是鎖?

答:事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。

  鎖:在因此的DBMS中,鎖是實現事務的關鍵,鎖能夠保證事務的完整性和併發性。與現實生活中鎖同樣,它可使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。固然鎖還分級別的。

6。什麼叫視圖?遊標是什麼?

答:視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,試圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。

  遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。

7。爲管理業務培訓信息,創建3個表:

     S(S#,SN,SD,SA)S#,SN,SD,SA分別表明學號,學員姓名,所屬單位,學員年齡

     C(C#,CN)C#,CN分別表明課程編號,課程名稱

      SC(S#,C#,G) S#,C#,G分別表明學號,所選的課程編號,學習成績

    (1)使用標準SQL嵌套語句查詢選修課程名稱爲’稅收基礎’的學員學號和姓名?

          答案:

[sql]   view plain  copy
 
  1. select s# ,sn   
  2.  from s  
  3.  where S# in(select S# from c,sc where c.c#=sc.c# and cn=’稅收基礎’)  

 

      (2) 使用標準SQL嵌套語句查詢選修課程編號爲’C2’的學員姓名和所屬單位?

答:

[sql]   view plain  copy
 
  1. select sn,sd   
  2.  from s,sc   
  3.  where s.s#=sc.s# and sc.c#=’c2’  

 

      (3) 使用標準SQL嵌套語句查詢不選修課程編號爲’C5’的學員姓名和所屬單位?

答:

 

[sql]   view plain  copy
 
  1. select sn,sd   
  2.  from s  
  3.  where s# not in(  
  4.         select s#   
  5.         from sc   
  6.         where c#=’c5’)  

 

       (4)查詢選修了課程的學員人數

答:

[sql]   view plain  copy
 
  1. select 學員人數=count(distinct s#)  
  2.  from sc  

 

       (5) 查詢選修課程超過5門的學員學號和所屬單位?

答:

[sql]   view plain  copy
 
  1. select sn,sd from s   
  2. where s# in(  
  3.      select s# from sc  
  4.      group by s#   
  5.      having count(distinct c#)>5)  

 

SQL面試題(4)

1.查詢A(ID,Name)表中第31至40條記錄,ID做爲主鍵多是不是連續增加的列,完整的查詢語句以下:

[sql]   view plain  copy
 
  1. select top 10 * from A  
  2. where ID >(select max(ID) from (select top 30 ID from A order by A ) T)   
  3. order by A  




2.查詢表A中存在ID重複三次以上的記錄,完整的查詢語句以下:

[sql]   view plain  copy
 
  1. select *   
  2. from(  
  3.     select count(ID) as count   
  4.     from table   
  5.     group by ID)  
  6. where T.count > 3  



SQL面試題(5)

在面試應聘的SQL Server數據庫開發人員時,我運用了一套標準的基準技術問題。下面這些問題是我以爲可以真正有助於淘汰不合格應聘者的問題。它們按照從易到難的順序排列。當你問到關於主鍵和外鍵的問題時,後面的問題都十分有難度,由於答案可能會更難解釋和說明,尤爲是在面試的情形下。

你能向我簡要敘述一下SQL Server 2000中使用的一些數據庫對象嗎?

你但願聽到的答案包括這樣一些對象:表格、視圖、用戶定義的函數,以及存儲過程;若是他們還可以提到像觸發器這樣的對象就更好了。若是應聘者不能回答這個基本的問題,那麼這不是一個好兆頭。

NULL是什麼意思?

NULL(空)這個值是數據庫世界裏一個很是難纏的東西,因此有很多應聘者會在這個問題上跌跟頭您也不要以爲意外。

NULL這個值表示UNKNOWN(未知):它不表示「」(空字符串)。假設您的SQL Server數據庫裏有ANSI_NULLS,固然在默認狀況下會有,對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 UNKNOWN值進行比較,並在邏輯上但願得到一個答案。您必須使用IS NULL操做符。

什麼是索引?SQL Server 2000裏有什麼類型的索引?

任何有經驗的數據庫開發人員都應該可以很輕易地回答這個問題。一些經驗不太多的開發人員可以回答這個問題,可是有些地方會說不清楚。

簡單地說,索引是一個數據結構,用來快速訪問數據庫表格或者視圖裏的數據。在SQL Server裏,它們有兩種形式:彙集索引和非彙集索引。彙集索引在索引的葉級保存數據。這意味着不論彙集索引裏有表格的哪一個(或哪些)字段,這些字段都會按順序被保存在表格。因爲存在這種排序,因此每一個表格只會有一個彙集索引。非彙集索引在索引的葉級有一個行標識符。這個行標識符是一個指向磁盤上數據的指針。它容許每一個表格有多個非彙集索引。

什麼是主鍵?什麼是外鍵?

主鍵是表格裏的(一個或多個)字段,只用來定義表格裏的行;主鍵裏的值老是惟一的。外鍵是一個用來創建兩個表格之間關係的約束。這種關係通常都涉及一個表格裏的主鍵字段與另一個表格(儘管多是同一個表格)裏的一系列相連的字段。那麼這些相連的字段就是外鍵。

什麼是觸發器?SQL Server 2000有什麼不一樣類型的觸發器?

讓將來的數據庫開發人員知道可用的觸發器類型以及如何實現它們是很是有益的。

觸發器是一種專用類型的存儲過程,它被捆綁到SQL Server 2000的表格或者視圖上。在SQL Server 2000裏,有INSTEAD-OF和AFTER兩種觸發器。INSTEAD-OF觸發器是替代數據操控語言(Data Manipulation Language,DML)語句對錶格執行語句的存儲過程。例如,若是我有一個用於TableA的INSTEAD-OF-UPDATE觸發器,同時對這個表格執行一個更新語句,那麼INSTEAD-OF-UPDATE觸發器裏的代碼會執行,而不是我執行的更新語句則不會執行操做。

AFTER觸發器要在DML語句在數據庫裏使用以後才執行。這些類型的觸發器對於監視發生在數據庫表格裏的數據變化十分好用。

您如何確一個帶有名爲Fld1字段的TableB表格裏只具備Fld1字段裏的那些值,而這些值同時在名爲TableA的表格的Fld1字段裏?

這個與關係相關的問題有兩個可能的答案。第一個答案(並且是您但願聽到的答案)是使用外鍵限制。外鍵限制用來維護引用的完整性。它被用來確保表格裏的字段只保存有已經在不一樣的(或者相同的)表格裏的另外一個字段裏定義了的值。這個字段就是候選鍵(一般是另一個表格的主鍵)。

另一種答案是觸發器。觸發器能夠被用來保證以另一種方式實現與限制相同的做用,可是它很是難設置與維護,並且性能通常都很糟糕。因爲這個緣由,微軟建議開發人員使用外鍵限制而不是觸發器來維護引用的完整性。

對一個投入使用的在線事務處理表格有過多索引須要有什麼樣的性能考慮?

你正在尋找進行與數據操控有關的應聘人員。對一個表格的索引越多,數據庫引擎用來更新、插入或者刪除數據所須要的時間就越多,由於在數據操控發生的時候索引也必需要維護。

你能夠用什麼來確保表格裏的字段只接受特定範圍裏的值?

這個問題能夠用多種方式來回答,可是隻有一個答案是「好」答案。您但願聽到的回答是Check限制,它在數據庫表格裏被定義,用來限制輸入該列的值。

觸發器也能夠被用來限制數據庫表格裏的字段可以接受的值,可是這種辦法要求觸發器在表格裏被定義,這可能會在某些狀況下影響到性能。所以,微軟建議使用Check限制而不是其餘的方式來限制域的完整性。

若是應聘者可以正確地回答這個問題,那麼他的機會就很是大了,由於這代表他們具備使用存儲過程的經驗。

返回參數老是由存儲過程返回,它用來表示存儲過程是成功仍是失敗。返回參數老是INT數據類型。

OUTPUT參數明確要求由開發人員來指定,它能夠返回其餘類型的數據,例如字符型和數值型的值。(能夠用做輸出參數的數據類型是有一些限制的。)您能夠在一個存儲過程裏使用多個OUTPUT參數,而您只可以使用一個返回參數。

什麼是相關子查詢?如何使用這些查詢?

經驗更加豐富的開發人員將可以準確地描述這種類型的查詢。

相關子查詢是一種包含子查詢的特殊類型的查詢。查詢裏包含的子查詢會真正請求外部查詢的值,從而造成一個相似於循環的情況。

SQL面試題(6)

原表: 
courseid coursename score 
------------------------------------- 
1 java 70 
2 oracle 90 
3 xml 40 
4 jsp 30 
5 servlet 80 
------------------------------------- 
爲了便於閱讀,查詢此表後的結果顯式以下(及格分數爲60): 
courseid coursename score mark 
--------------------------------------------------- 
1 java 70 pass 
2 oracle 90 pass 
3 xml 40 fail 
4 jsp 30 fail 
5 servlet 80 pass 
--------------------------------------------------- 
寫出此查詢語句 

ORACLE :

[sql]   view plain  copy
 
  1. select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass'as mark   
  2. from course  



(DECODE函數是ORACLE PL/SQL是功能強大的函數之一,目前還只有ORACLE公司的SQL提供了此函數)

SQL:

[sql]   view plain  copy
 
  1. select courseid, coursename ,score ,(case when score<60 then 'fail' else 'pass' endas mark   
  2. from course   

其餘一些面試題:

4.有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按如下條件顯示出來(並寫出您的思路):  

   大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。  
       顯示格式:  
       語文              數學                英語  
       及格              優秀                不及格    

------------------------------------------

 

[sql]   view plain  copy
 
  1. select  
  2. (case when 語文>=80 then '優秀'  
  3.       when 語文>=60 then '及格'  
  4.       else '不及格'as 語文,  
  5. (case when 數學>=80 then '優秀'  
  6.       when 數學>=60 then '及格'  
  7.       else '不及格'as 數學,  
  8. (case when 英語>=80 then '優秀'  
  9.       when 英語>=60 then '及格'  
  10.       else '不及格'as 英語,  
  11. from table  

 

[sql]   view plain  copy
 
  1. 5.在sqlserver2000中請用sql建立一張用戶臨時表和系統臨時表,裏面包含兩個字段ID和IDValues,類型都是int型,並解釋下二者的區別?  
  2. ------------------------------------------  
  3. 用戶臨時表:create table #xx(ID int, IDValues int)  
  4. 系統臨時表:create table ##xx(ID int, IDValues int)  

8.華爲一道面試題
一個表中的Id有多個記錄,把全部這個id的記錄查出來,並顯示共有多少條記錄數。

 

[sql]   view plain  copy
 
  1. select id, Count(*) from tb group by id having count(*)>1  
  2. select *   
  3. from(  
  4. <span style="font-family:Courier New;">    </span>select count(ID) as count   
  5.      from table   
  6. <span style="font-family:Courier New;">    </span>group by ID) T   
  7. where T.count>1  

 

[sql]   view plain  copy
 
  1. 表形式以下:  
  2. Year      Salary  
  3. 2000        1000  
  4. 2001        2000  
  5. 2002        3000  
  6. 2003        4000  
  7. 想獲得以下形式的查詢結果  
  8. Year      Salary  
  9. 2000      1000  
  10. 2001      3000  
  11. 2002      6000  
  12. 2003      10000  
  13. sql語句怎麼寫?  
  14. 鏈接查詢  
  15. SELECT b.YEARSUM(a.salary) salary  
  16.  FROM hello a, hello b  
  17.  WHERE a.YEAR <= b.YEAR   
  18. GROUP BY b.YEAR
原址:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921911.html

1.用一條SQL語句 查詢出每門課都大於80分的學生姓名

name   kecheng   fenshu
張三     語文       81
張三     數學       75
李四     語文       76
李四     數學       90
王五     語文       81
王五     數學       100
王五     英語       90

A:第一種方式:

[sql]   view plain  copy
 
  1. select distinct name from table where name not in (select distinct name from table where fenshu<=80)  

 

B: 第二種方式:(推薦使用)

 

[sql]   view plain  copy
 
  1. select name from table group by name having min(fenshu)>80  

2.學生表 以下:
自動編號   學號   姓名 課程編號 課程名稱 分數
1        2005001 
張三 0001      數學    69
2        2005002 
李四 0001      數學    89
3        2005001 
張三 0001      數學    69
刪除除了自動編號不一樣,其餘都相同的學生冗餘信息:(先分組,保留最小編號的數據,其餘刪除)

[sql]   view plain  copy
 
  1. A: delete tablename where 自動編號 not in(select min( 自動編號) from tablename group by 學號, 姓名, 課程編號, 課程名稱, 分數)  



 

3.一個叫team的表,裏面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,如今四個球對進行比賽,用一條sql語句顯示全部可能的比賽組合.
你先按你本身的想法作一下,看結果有個人這個簡單嗎?

答:

[sql]   view plain  copy
 
  1. select a.name, b.name  
  2. from team a, team b  
  3. where a.name < b.name  

 

4.請用SQL語句實現:從TestDB數據表中查詢出全部月份的發生額都比101科目相應月份的發生額高的科目。請注意:TestDB中有不少科目,都有1-12月份的發生額。
AccID:科目代碼,Occmonth:發生額月份,DebitOccur:發生額。
數據庫名:JcyAudit,數據集:Select * from TestDB

答:

[sql]   view plain  copy
 
  1. select a.*  
  2. from TestDB a,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b  
  3. where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur  


**********************************************************************************************************************************************************************

 5.面試題:怎麼把這樣一個表兒
year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成這樣一個結果
year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4 

答案1、

 

[sql]   view plain  copy
 
  1. select year,  
  2. (select amount from   aaa m where month=1   and m.year=aaa.yearas m1,  
  3. (select amount from   aaa m where month=2   and m.year=aaa.yearas m2,  
  4. (select amount from   aaa m where month=3   and m.year=aaa.yearas m3,  
  5. (select amount from   aaa m where month=4   and m.year=aaa.yearas m4  
  6. from aaa   
  7. group by year  

*******************************************************************************
6.
說明:複製表(只複製結構,源表名:a新表名:b) 

 

答案:

[sql]   view plain  copy
 
  1. SQL:  
  2. select * into b   
  3. from a   
  4. where 1<>1       (where1=1,拷貝表結構和數據內容)  
  5. <span style="font-family:宋體;">===================================================================  
  6. </span>ORACLE:  
  7. create table b  
  8. As  
  9. Select * from a where 1=2  
  10.   
  11.    

7.說明:拷貝表(拷貝數據,源表名:a目標表名:b) 

 

答案:

[sql]   view plain  copy
 
  1. insert into b(a, b, c)   
  2. select d,e,f   
  3. from a;   


8.說明:顯示文章、提交人和最後回覆時間

 

答案:

[sql]   view plain  copy
 
  1. select a.title,a.username,b.adddate  
  2. from table a,(select max(adddate) adddate from table where table.title=a.title) b   



11.
說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 

 

答案:

[sql]   view plain  copy
 
  1. Delete from info where not exists (select * from infobz where info.infid=infobz.infid )   

 

12.有兩個表A和B,均有key和value兩個字段,若是B的key在A中也有,就把B的value換爲A中對應的value
這道題的SQL語句怎麼寫?

[sql]   view plain  copy
 
  1. update b set b.value=(select a.value from a where a.key=b.key)   
  2. where b.id in(select b.id from b,a where b.key=a.key);  
  3.   
  4. ***************************************************************************   

 

[sql]   view plain  copy
 
  1. 13. 高級sql 面試題  
  2.   
  3. 原表:  
  4. courseid coursename score  
  5. -------------------------------------  
  6. 1 java 70  
  7. 2 oracle 90  
  8. 3 xml 40  
  9. 4 jsp 30  
  10. 5 servlet 80  

爲了便於閱讀,查詢此表後的結果顯式以下(及格分數爲60):

[sql]   view plain  copy
 
  1. courseid coursename score mark  
  2. ---------------------------------------------------  
  3. 1 java 70 pass  
  4. 2 oracle 90 pass  
  5. 3 xml 40 fail  
  6. 4 jsp 30 fail  
  7. 5 servlet 80 pass  
  8. ---------------------------------------------------  


寫出此查詢語句

[sql]   view plain  copy
 
  1. select courseid, coursename ,score ,decode (sign(score-60),-1,'fail','pass'as mark   
  2. from course   

 

[sql]   view plain  copy
 
  1. SQL面試題(1)  
  2.   
  3. create table testtable1  
  4. (  
  5. id int IDENTITY,  
  6. department varchar(12)  
  7. )  
  8.   
  9. select * from testtable1  
  10. insert into testtable1 values('設計')  
  11. insert into testtable1 values('市場')  
  12. insert into testtable1 values('售後')  
  13. /*  
  14. 結果  
  15. id department  
  16. 1   設計  
  17. 2   市場  
  18. 3   售後  
  19. */  
  20. create table testtable2  
  21. (  
  22. id int IDENTITY,  
  23. dptID int,  
  24. name varchar(12)  
  25. )  
  26. insert into testtable2 values(1,'張三')  
  27. insert into testtable2 values(1,'李四')  
  28. insert into testtable2 values(2,'王五')  
  29. insert into testtable2 values(3,'彭六')  
  30. insert into testtable2 values(4,'陳七')  
  31. /*  
  32. 用一條SQL語句,怎麼顯示以下結果  
  33. id dptID department name  
  34. 1   1      設計        張三  
  35. 2   1      設計        李四  
  36. 3   2      市場        王五  
  37. 4   3      售後        彭六  
  38. 5   4      黑人        陳七  
  39. */  


答案:

[sql]   view plain  copy
 
  1. SELECT testtable2.* , ISNULL(department,'黑人')  
  2. FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID  

 

 

也作出來了可比這方法稍複雜。

sql面試題(2)

有表A,結構以下: 
A: p_ID p_Num s_id 
1 10 01 
1 12 02 
2 8 01 
3 11 01 
3 8 03 
其中:p_ID爲產品ID,p_Num爲產品庫存量,s_id爲倉庫ID。請用SQL語句實現將上表中的數據合併,合併後的數據爲: 
p_ID s1_id s2_id s3_id 
1 10 12 0 
2 8 0 0 
3 11 0 8 
其中:s1_id爲倉庫1的庫存量,s2_id爲倉庫2的庫存量,s3_id爲倉庫3的庫存量。若是該產品在某倉庫中無庫存量,那麼就是0代替。

答案:

 

[sql]   view plain  copy
 
  1. select p_id ,  
  2. sum(case when s_id=1 then p_num else 0 endas s1_id,  
  3. sum(case when s_id=2 then p_num else 0 endas s2_id,  
  4. sum(case when s_id=3 then p_num else 0 endas s3_id  
  5. from myPro   
  6. group by p_id  

 

 

SQL面試題(3)

1.觸發器的做用?

  答:觸發器是一中特殊的存儲過程,主要是經過事件來觸發而被執行的。它能夠強化約束,來維護數據的完整性和一致性,能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如,某表上的觸發器上包含對另外一個表的數據操做,而該操做又會致使該表觸發器被觸發。

2。什麼是存儲過程?用什麼來調用?

答:存儲過程是一個預編譯的SQL語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次SQL,使用存儲過程比單純SQL語句執行要快。能夠用一個命令對象來調用存儲過程。

3。索引的做用?和它的優勢缺點是什麼?

答:索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。

3。什麼是內存泄漏?

答:通常咱們所說的內存泄漏指的是堆內存的泄漏。堆內存是程序從堆中爲其分配的,大小任意的,使用完後要顯示釋放內存。當應用程序用關鍵字new等建立對象時,就從堆中爲它分配一塊內存,使用完後程序調用free或者delete釋放該內存,不然就說該內存就不能被使用,咱們就說該內存被泄漏了。

4。維護數據庫的完整性和一致性,你喜歡用觸發器仍是自寫業務邏輯?爲何?

答:我是這樣作的,儘量使用約束,如check,主鍵,外鍵,非空字段等來約束,這樣作效率最高,也最方便。其次是使用觸發器,這種方法能夠保證,不管什麼業務系統訪問數據庫均可以保證數據的完整新和一致性。最後考慮的是自寫業務邏輯,但這樣作麻煩,編程複雜,效率低下。

5。什麼是事務?什麼是鎖?

答:事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。

  鎖:在因此的DBMS中,鎖是實現事務的關鍵,鎖能夠保證事務的完整性和併發性。與現實生活中鎖同樣,它可使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。固然鎖還分級別的。

6。什麼叫視圖?遊標是什麼?

答:視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,試圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。

  遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。

7。爲管理業務培訓信息,創建3個表:

     S(S#,SN,SD,SA)S#,SN,SD,SA分別表明學號,學員姓名,所屬單位,學員年齡

     C(C#,CN)C#,CN分別表明課程編號,課程名稱

      SC(S#,C#,G) S#,C#,G分別表明學號,所選的課程編號,學習成績

    (1)使用標準SQL嵌套語句查詢選修課程名稱爲’稅收基礎’的學員學號和姓名?

          答案:

[sql]   view plain  copy
 
  1. select s# ,sn   
  2.  from s  
  3.  where S# in(select S# from c,sc where c.c#=sc.c# and cn=’稅收基礎’)  

 

      (2) 使用標準SQL嵌套語句查詢選修課程編號爲’C2’的學員姓名和所屬單位?

答:

[sql]   view plain  copy
 
  1. select sn,sd   
  2.  from s,sc   
  3.  where s.s#=sc.s# and sc.c#=’c2’  

 

      (3) 使用標準SQL嵌套語句查詢不選修課程編號爲’C5’的學員姓名和所屬單位?

答:

 

[sql]   view plain  copy
 
  1. select sn,sd   
  2.  from s  
  3.  where s# not in(  
  4.         select s#   
  5.         from sc   
  6.         where c#=’c5’)  

 

       (4)查詢選修了課程的學員人數

答:

[sql]   view plain  copy
 
  1. select 學員人數=count(distinct s#)  
  2.  from sc  

 

       (5) 查詢選修課程超過5門的學員學號和所屬單位?

答:

[sql]   view plain  copy
 
  1. select sn,sd from s   
  2. where s# in(  
  3.      select s# from sc  
  4.      group by s#   
  5.      having count(distinct c#)>5)  

 

SQL面試題(4)

1.查詢A(ID,Name)表中第31至40條記錄,ID做爲主鍵多是不是連續增加的列,完整的查詢語句以下:

[sql]   view plain  copy
 
  1. select top 10 * from A  
  2. where ID >(select max(ID) from (select top 30 ID from A order by A ) T)   
  3. order by A  




2.查詢表A中存在ID重複三次以上的記錄,完整的查詢語句以下:

[sql]   view plain  copy
 
  1. select *   
  2. from(  
  3.     select count(ID) as count   
  4.     from table   
  5.     group by ID)  
  6. where T.count > 3  



SQL面試題(5)

在面試應聘的SQL Server數據庫開發人員時,我運用了一套標準的基準技術問題。下面這些問題是我以爲可以真正有助於淘汰不合格應聘者的問題。它們按照從易到難的順序排列。當你問到關於主鍵和外鍵的問題時,後面的問題都十分有難度,由於答案可能會更難解釋和說明,尤爲是在面試的情形下。

你能向我簡要敘述一下SQL Server 2000中使用的一些數據庫對象嗎?

你但願聽到的答案包括這樣一些對象:表格、視圖、用戶定義的函數,以及存儲過程;若是他們還可以提到像觸發器這樣的對象就更好了。若是應聘者不能回答這個基本的問題,那麼這不是一個好兆頭。

NULL是什麼意思?

NULL(空)這個值是數據庫世界裏一個很是難纏的東西,因此有很多應聘者會在這個問題上跌跟頭您也不要以爲意外。

NULL這個值表示UNKNOWN(未知):它不表示「」(空字符串)。假設您的SQL Server數據庫裏有ANSI_NULLS,固然在默認狀況下會有,對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 UNKNOWN值進行比較,並在邏輯上但願得到一個答案。您必須使用IS NULL操做符。

什麼是索引?SQL Server 2000裏有什麼類型的索引?

任何有經驗的數據庫開發人員都應該可以很輕易地回答這個問題。一些經驗不太多的開發人員可以回答這個問題,可是有些地方會說不清楚。

簡單地說,索引是一個數據結構,用來快速訪問數據庫表格或者視圖裏的數據。在SQL Server裏,它們有兩種形式:彙集索引和非彙集索引。彙集索引在索引的葉級保存數據。這意味着不論彙集索引裏有表格的哪一個(或哪些)字段,這些字段都會按順序被保存在表格。因爲存在這種排序,因此每一個表格只會有一個彙集索引。非彙集索引在索引的葉級有一個行標識符。這個行標識符是一個指向磁盤上數據的指針。它容許每一個表格有多個非彙集索引。

什麼是主鍵?什麼是外鍵?

主鍵是表格裏的(一個或多個)字段,只用來定義表格裏的行;主鍵裏的值老是惟一的。外鍵是一個用來創建兩個表格之間關係的約束。這種關係通常都涉及一個表格裏的主鍵字段與另一個表格(儘管多是同一個表格)裏的一系列相連的字段。那麼這些相連的字段就是外鍵。

什麼是觸發器?SQL Server 2000有什麼不一樣類型的觸發器?

讓將來的數據庫開發人員知道可用的觸發器類型以及如何實現它們是很是有益的。

觸發器是一種專用類型的存儲過程,它被捆綁到SQL Server 2000的表格或者視圖上。在SQL Server 2000裏,有INSTEAD-OF和AFTER兩種觸發器。INSTEAD-OF觸發器是替代數據操控語言(Data Manipulation Language,DML)語句對錶格執行語句的存儲過程。例如,若是我有一個用於TableA的INSTEAD-OF-UPDATE觸發器,同時對這個表格執行一個更新語句,那麼INSTEAD-OF-UPDATE觸發器裏的代碼會執行,而不是我執行的更新語句則不會執行操做。

AFTER觸發器要在DML語句在數據庫裏使用以後才執行。這些類型的觸發器對於監視發生在數據庫表格裏的數據變化十分好用。

您如何確一個帶有名爲Fld1字段的TableB表格裏只具備Fld1字段裏的那些值,而這些值同時在名爲TableA的表格的Fld1字段裏?

這個與關係相關的問題有兩個可能的答案。第一個答案(並且是您但願聽到的答案)是使用外鍵限制。外鍵限制用來維護引用的完整性。它被用來確保表格裏的字段只保存有已經在不一樣的(或者相同的)表格裏的另外一個字段裏定義了的值。這個字段就是候選鍵(一般是另一個表格的主鍵)。

另一種答案是觸發器。觸發器能夠被用來保證以另一種方式實現與限制相同的做用,可是它很是難設置與維護,並且性能通常都很糟糕。因爲這個緣由,微軟建議開發人員使用外鍵限制而不是觸發器來維護引用的完整性。

對一個投入使用的在線事務處理表格有過多索引須要有什麼樣的性能考慮?

你正在尋找進行與數據操控有關的應聘人員。對一個表格的索引越多,數據庫引擎用來更新、插入或者刪除數據所須要的時間就越多,由於在數據操控發生的時候索引也必需要維護。

你能夠用什麼來確保表格裏的字段只接受特定範圍裏的值?

這個問題能夠用多種方式來回答,可是隻有一個答案是「好」答案。您但願聽到的回答是Check限制,它在數據庫表格裏被定義,用來限制輸入該列的值。

觸發器也能夠被用來限制數據庫表格裏的字段可以接受的值,可是這種辦法要求觸發器在表格裏被定義,這可能會在某些狀況下影響到性能。所以,微軟建議使用Check限制而不是其餘的方式來限制域的完整性。

若是應聘者可以正確地回答這個問題,那麼他的機會就很是大了,由於這代表他們具備使用存儲過程的經驗。

返回參數老是由存儲過程返回,它用來表示存儲過程是成功仍是失敗。返回參數老是INT數據類型。

OUTPUT參數明確要求由開發人員來指定,它能夠返回其餘類型的數據,例如字符型和數值型的值。(能夠用做輸出參數的數據類型是有一些限制的。)您能夠在一個存儲過程裏使用多個OUTPUT參數,而您只可以使用一個返回參數。

什麼是相關子查詢?如何使用這些查詢?

經驗更加豐富的開發人員將可以準確地描述這種類型的查詢。

相關子查詢是一種包含子查詢的特殊類型的查詢。查詢裏包含的子查詢會真正請求外部查詢的值,從而造成一個相似於循環的情況。

SQL面試題(6)

原表: 
courseid coursename score 
------------------------------------- 
1 java 70 
2 oracle 90 
3 xml 40 
4 jsp 30 
5 servlet 80 
------------------------------------- 
爲了便於閱讀,查詢此表後的結果顯式以下(及格分數爲60): 
courseid coursename score mark 
--------------------------------------------------- 
1 java 70 pass 
2 oracle 90 pass 
3 xml 40 fail 
4 jsp 30 fail 
5 servlet 80 pass 
--------------------------------------------------- 
寫出此查詢語句 

ORACLE :

[sql]   view plain  copy
 
  1. select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass'as mark   
  2. from course  



(DECODE函數是ORACLE PL/SQL是功能強大的函數之一,目前還只有ORACLE公司的SQL提供了此函數)

SQL:

[sql]   view plain  copy
 
  1. select courseid, coursename ,score ,(case when score<60 then 'fail' else 'pass' endas mark   
  2. from course   

其餘一些面試題:

4.有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按如下條件顯示出來(並寫出您的思路):  

   大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。  
       顯示格式:  
       語文              數學                英語  
       及格              優秀                不及格    

------------------------------------------

 

[sql]   view plain  copy
 
  1. select  
  2. (case when 語文>=80 then '優秀'  
  3.       when 語文>=60 then '及格'  
  4.       else '不及格'as 語文,  
  5. (case when 數學>=80 then '優秀'  
  6.       when 數學>=60 then '及格'  
  7.       else '不及格'as 數學,  
  8. (case when 英語>=80 then '優秀'  
  9.       when 英語>=60 then '及格'  
  10.       else '不及格'as 英語,  
  11. from table  

 

[sql]   view plain  copy
 
  1. 5.在sqlserver2000中請用sql建立一張用戶臨時表和系統臨時表,裏面包含兩個字段ID和IDValues,類型都是int型,並解釋下二者的區別?  
  2. ------------------------------------------  
  3. 用戶臨時表:create table #xx(ID int, IDValues int)  
  4. 系統臨時表:create table ##xx(ID int, IDValues int)  

8.華爲一道面試題
一個表中的Id有多個記錄,把全部這個id的記錄查出來,並顯示共有多少條記錄數。

 

[sql]   view plain  copy
 
  1. select id, Count(*) from tb group by id having count(*)>1  
  2. select *   
  3. from(  
  4. <span style="font-family:Courier New;">    </span>select count(ID) as count   
  5.      from table   
  6. <span style="font-family:Courier New;">    </span>group by ID) T   
  7. where T.count>1  

 

[sql]   view plain  copy
 
  1. 表形式以下:  
  2. Year      Salary  
  3. 2000        1000  
  4. 2001        2000  
  5. 2002        3000  
  6. 2003        4000  
  7. 想獲得以下形式的查詢結果  
  8. Year      Salary  
  9. 2000      1000  
  10. 2001      3000  
  11. 2002      6000  
  12. 2003      10000  
  13. sql語句怎麼寫?  
  14. 鏈接查詢  
  15. SELECT b.YEARSUM(a.salary) salary  
  16.  FROM hello a, hello b  
  17.  WHERE a.YEAR <= b.YEAR   
  18. GROUP BY b.YEAR
相關文章
相關標籤/搜索