SQL題(子文章)(持續更新)

-----> 總文章 入口

文章目錄

SQL Server

1. 觸發器的作用?

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

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

存儲過程是一個預編譯的SQL 語句,
優點是允許模塊化的設計,就是說只需創建一次,以後在該程序中就可以調用多次。
如果某次操作需要執行多次SQL ,使用存儲過程比單純SQL 語句執行要快。
可以用一個命令對象來調用存儲過程。

3. 索引的作用?和它的優點缺點是什麼?

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

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

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

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

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

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

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

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

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

7.SQL Server 中使用的一些數據庫對象嗎?

表格、
視圖、
用戶定義的函數,
存儲過程,
觸發器

等等

8. NULL是什麼意思?

NULL(空)這個值是數據庫世界裏一個非常難纏的東西,所以有不少應聘者會在這個問題上跌跟頭您也不要覺得意外。
NULL這個值表示UNKNOWN(未知):它不表示“”(空字符串)。
假設您的SQL Server數據庫裏有ANSI_NULLS,當然在默認情況下會有,對NULL這個值的任何比較都會生產一個NULL值。
您不能把任何值與一個 UNKNOWN值進行比較,並在邏輯上希望獲得一個答案。
您必須使用IS NULL操作符。

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

簡單地說,索引是一個數據結構,用來快速訪問數據庫表格或者視圖裏的數據。

聚集索引

聚集索引在索引的葉級保存數據。這意味着不論聚集索引裏有表格的哪個(或哪些)字段,這些字段都會按順序被保存在表格。由於存在這種排序,所以每個表格只會有一個聚集索引。

非聚集索引

非聚集索引在索引的葉級有一個行標識符。這個行標識符是一個指向磁盤上數據的指針。它允許每個表格有多個非聚集索引。

10.什麼是主鍵?什麼是外鍵?

主鍵是表格裏的(一個或多個)字段,只用來定義表格裏的行;主鍵裏的值總是唯一的。

外鍵是一個用來建立兩個表格之間關係的約束。這種關係一般都涉及一個表格裏的主鍵字段與另外一個表格(儘管可能是同一個表格)裏的一系列相連的字段。那麼這些相連的字段就是外鍵。

11.什麼是觸發器?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語句在數據庫裏使用之後才執行。這些類型的觸發器對於監視發生在數據庫表格裏的數據變化十分好用。

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

第一個答案(而且是您希望聽到的答案)是使用外鍵限制。外鍵限制用來維護引用的完整性。它被用來確保表格裏的字段只保存有已經在不同的(或者相同的)表格裏的另一個字段裏定義了的值。這個字段就是候選鍵(通常是另外一個表格的主鍵)。

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

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

對一個表格的索引越多,數據庫引擎用來更新、插入或者刪除數據所需要的時間就越多,
因爲在數據操控發生的時候索引也必須要維護。

14. 你可以用什麼來確保表格裏的字段只接受特定範圍裏的值?

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

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

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

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

SQL題

1. 查詢出每門課都大於80 分的學生姓名

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

    select distinct name from table 
    	where name not in 
    	(select distinct name from table where fenshu<=80)
    	
    select name from table group by name having min(fenshu)>80

2. 刪除 除了自動編號不同, 其他都相同的學生冗餘信息

自動編號 學號 姓名 課程編號 課程名稱 分數
1 2005001 張三 0001 數學 69
2 2005002 李四 0001 數學 89
3 2005001 張三 0001 數學 69
 delete tablename where 自動編號
 			not in (
 		 			select min(自動編號) from tablename group by 學號, 姓名, 課程編號, 課程名稱, 分數
 		 			)

3.顯示所有可能的比賽組合

一個叫 team 的表,
裏面只有一個字段name,
一共有4 條紀錄,分別是a,b,c,d, 對應四個球隊,
現在四個球隊進行比賽,用一條sql 語句顯示所有可能的比賽組合.

select a.name, b.name
	from team a, team b 
	 where a.name < b.name

4.查詢出所有月份的發生額都比101 科目相應月份的發生額高的科目

從TestDB 數據表中查詢出所有月份的發生額都比101 科目相應月份的發生額高的科目。
請注意:TestDB 中有很多科目,都有1 -12 月份的發生額。

AccID :科目代碼,Occmonth :發生額月份,DebitOccur :發生額。
數據庫名:JcyAudit

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

5.行與列的轉換

year month amount
1 Java 70
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
select year, 
(select amount from aaa m where month=1   and m.year=aaa.year) as m1,
(select amount from aaa m where month=2   and m.year=aaa.year) as m2,
(select amount from aaa m where month=3   and m.year=aaa.year) as m3,
(select amount from aaa m where month=4   and m.year=aaa.year) as m4
from aaa   group by year


6.如果B 的key 在A 中也有,就把B 的value 換爲A 中對應的value

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

update b 
	set b.value=(select a.value from a where a.key=b.key)
	 where b.id in 
	 			(select b.id from b,a where b.key=a.key)

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

 insert into b (a, b, c) select d,e,f from a; 

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

select a.title,a.username,b.adddate 
	from table a, ( select max(adddate) adddate  from table where table.title = a.title) b

9. 日程安排提前五分鐘提醒

select * from 日程安排 where datediff('minute',f 開始時間,getdate())>5

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

Delete from info 
	 where not exists ( select * from infobz where info.infid=infobz.infid )

11. 判斷是否及格

原表

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
select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course

12.關聯數據

id department
1 設計
2 市場
3 售後
id dptID name
1 1 張三
2 1 李四
3 2 王五
4 3 彭六
5 4 陳七

用一條SQL語句,怎麼顯示如下結果

id dptID department name
1 1 設計 張三
2 1 設計 李四
3 2 市場 王五
4 3 售後 彭六
5 4 黑人 陳七
SELECT testtable2.* , ISNULL(department,'黑人')
	FROM testtable1 
	right join 	testtable2 on testtable2.dptID = testtable1.ID

13.合併數據

表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代替。

select p_id ,
sum(case when s_id=1 then p_num else 0 end) as s1_id
,sum(case when s_id=2 then p_num else 0 end) as s2_id
,sum(case when s_id=3 then p_num else 0 end) as s3_id
from myPro group by p_id

14.大題 (很多個sql)

爲管理業務培訓信息,建立3個表:

S表

S#學號 SN學員姓名 SD所屬單位 SA學員年齡

C表

C#課程編號 CN課程名稱

SC表

S#學號 C#所選的課程編號 G學習成績
  1. 使用標準SQL嵌套語句查詢選修課程名稱爲’稅收基礎’的學員學號和姓名?
select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’稅收基礎’)
  1. 使用標準SQL嵌套語句查詢選修課程編號爲’C2’的學員姓名和所屬單位?
select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’
  1. 使用標準SQL嵌套語句查詢不選修課程編號爲’C5’的學員姓名和所屬單位?
select sn,sd from s where s# not in(select s# from sc where c#=’c5’)
  1. 查詢選修了課程的學員人數
select 學員人數=count(distinct s#) from sc
  1. 查詢選修課程超過5門的學員學號和所屬單位?
select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)

15. 查詢A(ID,Name)表中第31至40條記錄,ID作爲主鍵可能不是連續增長的列

select top 10 * from A 
	 where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A

16…查詢表A中存在ID重複三次以上的記錄

select * from(select count(ID) as count from table group by ID)T
	 where T.count>3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章