資料庫應用題庫
⑴ 資料庫原理及應用試題
1.B 2.C 3.B 4.C 5.D 6.C 7.C 8.D 9.C 10.A
11.A 12.A 13.A --不太確定 14.B 15.C 16.A 17.B 18.A 19.D 20.C
1.試述事務的概念及事務的四個特性。
答:
事務是用戶定義的一個資料庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。
事務具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這個四個特性也簡稱為ACID特性。
原子性:事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性:事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。
隔離性:一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對其他並發事務是隔離的,並發執行的各個事務之間不能互相干擾。
持續性:持續性也稱永久性(Permanence),指一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其執行結果有任何影響。
2.為什麼事務非正常結束時會影響資料庫數據的正確性,請列舉一例說明之。
答:
事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。如果資料庫系統運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是不一致的狀態。
例如某工廠的庫存管理系統中,要把數量為Q的某種零件從倉庫1移到倉庫2存放。
則可以定義一個事務T,T包括兩個操作;Q1=Q1-Q,Q2=Q2+Q。如果T非正常終止時只做了第一個操作,則資料庫就處於不一致性狀態,庫存量無緣無故少了Q。
3.資料庫中為什麼要有恢復子系統?它的功能是什麼?
答:
因為計算機系統中硬體的故障、軟體的錯誤、操作員的失誤以及惡意的破壞是不可避免的,這些故障輕則造成運行事務非正常中斷,影響資料庫中數據的正確性,重則破壞資料庫,使資料庫中全部或部分數據丟失,因此必須要有恢復子系統。
恢復子系統的功能是:把資料庫從錯誤狀態恢復到某一已知的正確狀態(亦稱為一致狀態或完整狀態)。
4.資料庫運行中可能產生的故障有哪幾類?哪些故障影響事務的正常執行?哪些故障破壞資料庫數據?
答:資料庫系統中可能發生各種各樣的故障,大致可以分以下幾類:
(1)事務內部的故障;
(2)系統故障;
(3)介質故障;
(4)計算機病毒。
事務故障、系統故障和介質故障影響事務的正常執行;介質故障和計算機病毒破壞數據
庫數據。
5.據庫恢復的基本技術有哪些?
答:
數據轉儲和登錄日誌文件是資料庫恢復的基本技術。
當系統運行過程中發生故障,利用轉儲的資料庫後備副本和日誌文件就可以將資料庫恢復到故障前的某個一致性狀態。
6. 資料庫轉儲的意義是什麼? 試比較各種數據轉儲方法。
答:
數據轉儲是資料庫恢復中採用的基本技術。所謂轉儲即DBA定期地將資料庫復制到磁帶或另一個磁碟上保存起來的過程。當資料庫遭到破壞後可以將後備副本重新裝入,將資料庫恢復到轉儲時的狀態。
靜態轉儲:在系統中無運行事務時進行的轉儲操作。靜態轉儲簡單,但必須等待正運行的用戶事務結束才能進行。同樣,新的事務必須等待轉儲結束才能執行。顯然,這會降低資料庫的可用性。
動態轉儲:指轉儲期間允許對資料庫進行存取或修改。動態轉儲可克服靜態轉儲的缺點,它不用等待正在運行的用戶事務結束,也不會影響新事務的運行。但是,轉儲結束時後援副本上的數據並不能保證正確有效。因為轉儲期間運行的事務可能修改了某些數據,使得後援副本上的數據不是資料庫的一致版本。
為此,必須把轉儲期間各事務對資料庫的修改活動登記下來,建立日誌文件(log file)。這樣,後援副本加上日誌文件就能得到資料庫某一時刻的正確狀態。
轉儲還可以分為海量轉儲和增量轉儲兩種方式。
海量轉儲是指每次轉儲全部資料庫。增量轉儲則指每次只轉儲上一次轉儲後更新過的數據。從恢復角度看,使用海量轉儲得到的後備副本進行恢復一般說來更簡單些。但如果資料庫很大,事務處理又十分頻繁,則增量轉儲方式更實用更有效。
7. 什麼是日誌文件?為什麼要設立日誌文件?
答:
(1)日誌文件是用來記錄事務對資料庫的更新操作的文件。
(2)設立日誌文件的目的是: 進行事務故障恢復;進行系統故障恢復;協助後備副本進行介質故障恢復。
8. 登記日誌文件時為什麼必須先寫日誌文件,後寫資料庫?
答:
把對數據的修改寫到資料庫中和把表示這個修改的日誌記錄寫到日誌文件中是兩個不同的操作。有可能在這兩個操作之間發生故障,即這兩個寫操作只完成了一個。
如果先寫了資料庫修改,而在運行記錄中沒有登記這個修改,則以後就無法恢復這個修改了。如果先寫日誌,但沒有修改資料庫,在恢復時只不過是多執行一次UNDO操作,並不會影響資料庫的正確性。所以一定要先寫日誌文件,即首先把日誌記錄寫到日誌文件中,然後寫資料庫的修改。
9. 針對不同的故障,試給出恢復的策略和方法。(即如何進行事務故障的恢復?系統故障的恢復?介質故障恢復?)
答:
事務故障的恢復:
事務故障的恢復是由DBMS自動完成的,對用戶是透明的。
DBMS執行恢復步驟是:
(1)反向掃描文件日誌(即從最後向前掃描日誌文件),查找該事務的更新操作。
(2)對該事務的更新操作執行逆操作。即將日誌記錄中「更新前的值」寫入資料庫。
(3)繼續反向掃描日誌文件,做同樣處理。
(4)如此處理下去,直至讀到此事務的開始標記,該事務故障的恢復就完成了。
答:
系統故障的恢復:
系統故障可能會造成資料庫處於不一致狀態:
一是未完成事務對資料庫的更新可能已寫入資料庫;
二是已提交事務對資料庫的更新可能還留在緩沖區,沒來得及寫入資料庫。
因此恢復操作就是要撤銷(UNDO)故障發生時未完成的事務,重做(REDO)已完成的事務。
系統的恢復步驟是:
(1)正向掃描日誌文件,找出在故障發生前已經提交的事務隊列(REDO隊列)和未完成的事務隊列(UNDO隊列)。
(2)對撤銷隊列中的各個事務進行UNDO處理。
進行UNDO處理的方法是,反向掃描日誌文件,對每個UNDO事務的更新操作執行逆操作,即將日誌記錄中「更新前的值」(Before Image)寫入資料庫。
(3)對重做隊列中的各個事務進行REDO處理。
進行REDO處理的方法是:正向掃描日誌文件,對每個REDO事務重新執行日誌文件登記的操作。即將日誌記錄中「更新後的值」(After Image)寫入資料庫。
*解析:
在第(1)步中如何找出REDO隊列和UNDO隊列?請大家思考一下。
下面給出一個演算法:
1) 建立兩個事務隊列:
· UNDO-LIST: 需要執行undo操作的事務集合;
· REDO-LIST: 需要執行redo操作的事務集合;
兩個事務隊列初始均為空。
2) 從日誌文件頭開始,正向掃描日誌文件
· 如有新開始(遇到Begin Transaction)的事務Ti,把Ti暫時放入UNDO-LIST隊列;
· 如有提交的事務(遇到End Transaction)Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列;
直到日誌文件結束
答:
介質故障的恢復:
介質故障是最嚴重的一種故障。
恢復方法是重裝資料庫,然後重做已完成的事務。具體過程是:
(1)DBA裝入最新的資料庫後備副本(離故障發生時刻最近的轉儲副本),使資料庫恢復到轉儲時的一致性狀態。
(2)DBA裝入轉儲結束時刻的日誌文件副本
(3)DBA啟動系統恢復命令,由DBMS完成恢復功能,即重做已完成的事務。
*解析
1)我們假定採用的是靜態轉儲,因此第(1)步裝入資料庫後備副本便可以了。
2)如果採用的是靜動態轉儲,第(1)步裝入資料庫後備副本還不夠,還需同時裝入轉儲開始時刻的日誌文件副本,經過處理後才能得到正確的資料庫後備副本。
3)第(2)步重做已完成的事務的演算法是:
a. 正向掃描日誌文件,找出故障發生前已提交的事務的標識,將其記入重做隊列
b. 再一次正向掃描日誌文件,對重做隊列中的所有事務進行重做處理。即將日誌記錄中「更新後的值」寫入資料庫。
10. 具有檢查點的恢復技術有什麼優點?
答:
利用日誌技術進行資料庫恢復時,恢復子系統必須搜索日誌,確定哪些事務需要REDO,哪些事務需要UNDO。一般來說,需要檢查所有日誌記錄。這樣做有兩個問題:
一是搜索整個日誌將耗費大量的時間。
二是很多需要REDO處理的事務實際上已經將它們的更新操作結果寫到資料庫中了,恢復子系統又重新執行了這些操作,浪費了大量時間。
檢查點技術就是為了解決這些問題。
11. 試述使用檢查點方法進行恢復的步驟。
答:
① 從重新開始文件中找到最後一個檢查點記錄在日誌文件中的地址,由該地址在日誌文件中找到最後一個檢查點記錄。
② 由該檢查點記錄得到檢查點建立時刻所有正在執行的事務清單ACTIVE-LIST。
這里建立兩個事務隊列:
· UNDO-LIST: 需要執行undo操作的事務集合;
· REDO-LIST: 需要執行redo操作的事務集合;
把ACTIVE-LIST暫時放入UNDO-LIST隊列,REDO隊列暫為空。
③ 從檢查點開始正向掃描日誌文件
· 如有新開始的事務Ti,把Ti暫時放入UNDO-LIST隊列;
· 如有提交的事務Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列,直到日誌文件結束;
④ 對UNDO-LIST中的每個事務執行UNDO操作, 對REDO-LIST中的每個事務執行REDO操作。
12. 什麼是資料庫鏡像?它有什麼用途?
答:
資料庫鏡像即根據DBA的要求,自動把整個資料庫或者其中的部分關鍵數據復制到另一個磁碟上。每當主資料庫更新時,DBMS自動把更新後的數據復制過去,即DBMS自動保證鏡像數據與主數據的一致性。
資料庫鏡像的用途有:
一是用於資料庫恢復。當出現介質故障時,可由鏡像磁碟繼續提供使用,同時DBMS自動利用鏡像磁碟數據進行資料庫的恢復,不需要關閉系統和重裝資料庫副本。
二是提高資料庫的可用性。在沒有出現故障時,當一個用戶對某個數據加排它鎖進行修改時,其他用戶可以讀鏡像資料庫上的數據,而不必等待該用戶釋放鎖。
⑵ 求資料庫應用題
資料庫語言的目標
要說清這個目標,先要理解資料庫是做什麼的。
資料庫這個軟體,名字中有個「庫」字,會讓人覺得它主要是為了存儲的。其實不然,資料庫實現的重要功能有兩條:計算、事務!也就是我們常說的 OLAP 和 OLTP,資料庫的存儲都是為這兩件事服務的,單純的存儲並不是資料庫的目標。
我們知道,sql 是目前資料庫的主流語言。那麼,用 SQL 做這兩件事是不是很方便呢?
事務類功能主要解決數據在寫入和讀出時要保持的一致性,實現這件事的難度並不小,但對於應用程序的介面卻非常簡單,用於操縱資料庫讀寫的代碼也很簡單。如果假定目前關系資料庫的邏輯存儲模式是合理的(也就是用數據表和記錄來存儲數據,其合理性與否是另一個復雜問題,不在這里展開了),那麼 SQL 在描述事務類功能時沒什麼大問題,因為並不需要描述多復雜的動作,復雜性都在資料庫內部解決了。
但計算類功能卻不一樣了。
這里說的計算是個更廣泛的概念,並不只是簡單的加加減減,查找、關聯都可以看成是某種計算。
什麼樣的計算體系才算好呢?
還是兩條:寫著簡單、跑得快。
寫著簡單,很好理解,就是讓程序員很快能寫出來代碼來,這樣單位時間內可以完成更多的工作;跑得快就更容易理解,我們當然希望更短時間內獲得計算結果。
其實 SQL 中的 Q 就是查詢的意思,發明它的初衷主要是為了做查詢(也就是計算),這才是 SQL 的主要目標。然而,SQL 在描述計算任務時,卻很難說是很勝任的。
SQL為什麼不行
先看寫著簡單的問題。
SQL 寫出來很象英語,有些查詢可以當英語來讀和寫(網上多得很,就不舉例了),這應當算是滿足寫著簡單這一條了吧。
且慢!我們在教科書上看到的 SQL 經常只有兩三行,這些 SQL 確實算是寫著簡單的,但如果我們嘗試一些稍復雜化的問題呢?
這是一個其實還不算很復雜的例子:計算一支股票最長連續上漲了多少天?用 SQL 寫出來是這樣的:
- selectmax(consecutive_day)from(selectcount(*) (consecutive_dayfrom(selectsum(rise_mark) over(orderbytrade_date) days_no_gainfrom(selecttrade_date,case when closing_price>lag(closing_price) over(order by trade_date)then 0 else 1 END rise_markfrom stock_price ) )group by days\_no\_gain)
- SELECTTOP 10x FROMT ORDERBYx DESC
- stock_price.sort(trade_date).group@o(closing_price
- T.groups(;top(-10,x))
這個語句的工作原理就不解釋了,反正有點繞,同學們可以自己嘗試一下。
這是潤乾公司的招聘考題,通過率不足 20%;因為太難,後來被改成另一種方式:把 SQL 語句寫出來讓應聘者解釋它在算什麼,通過率依然不高。
這說明什麼?說明情況稍有復雜,SQL 就變得即難懂又難寫!
再看跑得快的問題,還是一個經常拿出來的簡單例子:1 億條數據中取前 10 名。這個任務用 SQL 寫出來並不復雜:
但是,這個語句對應的執行邏輯是先對所有數據進行大排序,然後再取出前 10 個,後面的不要了。大家知道,排序是一個很慢的動作,會多次遍歷數據,如果數據量大到內存裝不下,那還需要外存做緩存,性能還會進一步急劇下降。如果嚴格按這句 SQL 體現的邏輯去執行,這個運算無論如何是跑不快的。然而,很多程序員都知道這個運算並不需要大排序,也用不著外存緩存,一次遍歷用一點點內存就可以完成,也就是存在更高性能的演算法。可惜的是,用 SQL 卻寫不出這樣的演算法,只能寄希望於資料庫的優化器足夠聰明,能把這句 SQL 轉換成高性能演算法執行,但情況復雜時資料庫的優化器也未必靠譜。
看樣子,SQL 在這兩方面做得都不夠好。這兩個並不復雜的問題都是這樣,現實中數千行的 SQL 代碼中,這種難寫且跑不快的情況比比皆是。
為什麼 SQL 不行呢?
要回答這個問題,我們要分析一下用程序代碼實現計算到底是在干什麼。
本質上講,編寫程序的過程,就是把解決問題的思路翻譯成計算機可執行的精確化形式語言的過程。舉例來說,就象小學生解應用題,分析問題想出解法之後,還要列出四則運算表達式。用程序計算也是一樣,不僅要想出解決問題的方法,還要把解法翻譯成計算機能理解執行的動作才算完成。
用於描述計算方法的形式語言,其核心在於所採用的代數體系。所謂代數體系,簡單說就是一些數據類型和其上的運算規則,比如小學學到的算術,就是整數和加減乘除運算。有了這套東西,我們就能把想做的運算用這個代數體系約定的符號寫出來,也就是代碼,然後計算機就可以執行了。
如果這個代數體系設計時考慮不周到,提供的數據類型和運算不方便,那就會導致描述演算法非常困難。這時候會發生一個怪現象:翻譯解法到代碼的難度遠遠超過解決問題本身。
舉個例子,我們從小學慣用阿拉伯數字做日常計算,做加減乘除都很方便,所有人都天經地義認為數值運算就該是這樣的。其實未必!估計很多人都知道還有一種叫做羅馬數字的東西,你知道用羅馬數字該怎麼做加減乘除嗎?古羅馬人又是如何上街買菜的?
代碼難寫很大程度是代數的問題。
再看跑不快的原因。
軟體沒辦法改變硬體的性能,CPU 和硬碟該多快就是多快。不過,我們可以設計出低復雜度的演算法,也就是計算量更小的演算法,這樣計算機執行的動作變少,自然也就會快了。但是,光想出演算法還不夠,還要把這個演算法用某種形式語言寫得出來才行,否則計算機不會執行。而且,寫起來還要比較簡單,都要寫很長很麻煩,也沒有人會去用。所以呢,對於程序來講,跑得快和寫著簡單其實是同一個問題,背後還是這個形式語言採用的代數的問題。如果這個代數不好,就會導致高性能演算法很難實現甚至實現不了,也就沒辦法跑得快了。就象上面說的,用 SQL 寫不出我們期望的小內存單次遍歷演算法,能不能跑得快就只能寄希望於優化器。
我們再做個類比:
上過小學的同學大概都知道高斯計算 1+2+3+…+100 的小故事。普通人就是一步步地硬加 100 次,高斯小朋友很聰明,發現 1+100=101、2+99=101、…、50+51=101,結果是 50 乘 101,很快算完回家午飯了。
聽過這個故事,我們都會感慨高斯很聰明,能想到這么巧妙的辦法,即簡單又迅速。這沒有錯,但是,大家容易忽略一點:在高斯的時代,人類的算術體系(也是一個代數)中已經有了乘法!象前面所說,我們從小學習四則運算,會覺得乘法是理所當然的,然而並不是!乘法是後於加法被發明出來的。如果高斯的年代還沒有乘法,即使有聰明的高斯,也沒辦法快速解決這個問題。
目前主流資料庫是關系資料庫,之所以這么叫,是因為它的數學基礎被稱為關系代數,SQL 也就是關系代數理論上發展出來的形式語言。
現在我們能回答,為什麼 SQL 在期望的兩個方面做得不夠好?問題出在關系代數上,關系代數就像一個只有加法還沒發明乘法的算術體系,很多事做不好是必然的。
關系代數已經發明五十年了,五十年前的應用需求以及硬體環境,和今天比的差異是很巨大了,繼續延用五十年前的理論來解決今天的問題,聽著就感覺太陳舊了?然而現實就是這樣,由於存量用戶太多,而且也還沒有成熟的新技術出現,基於關系代數的 SQL,今天仍然是最重要的資料庫語言。雖然這幾十年來也有一些改進完善,但根子並沒有變,面對當代的復雜需求和硬體環境,SQL 不勝任也是情理之中的事。
而且,不幸的是,這個問題是理論上的,在工程上無論如何優化也無濟於事,只能有限改善,不能根除。不過,絕大部分的資料庫開發者並不會想到這一層,或者說為了照顧存量用戶的兼容性,也沒打算想到這一層。於是,主流資料庫界一直在這個圈圈裡打轉轉。
SPL為什麼能行
那麼該怎樣讓計算寫著更簡單、跑得更快呢?
發明新的代數!有「乘法」的代數。在其基礎上再設計新的語言。
這就是 SPL 的由來。它的理論基礎不再是關系代數,稱為離散數據集。基於這個新代數設計的形式語言,起名為SPL(Structured Process Language)。
SPL 針對 SQL 的不足(更確切地說法是,離散數據集針對關系代數的各種缺陷)進行了革新。SPL 重新定義了並擴展許多結構化數據中的運算,增加了離散性、強化了有序計算、實現了徹底的集合化、支持對象引用、提倡分步運算。
限於篇幅,這里不能介紹 SPL(離散數據集)的全貌。我們在這里列舉 SPL(離散數據集)針對 SQL(關系代數)的部分差異化改進:
游離記錄
離散數據集中的記錄是一種基本數據類型,它可以不依賴於數據表而獨立存在。數據表是記錄構成的集合,而構成某個數據表的記錄還可以用於構成其它數據表。比如過濾運算就是用原數據表中滿足條件的記錄構成新數據表,這樣,無論空間佔用還是運算性能都更有優勢。
關系代數沒有可運算的數據類型來表示記錄,單記錄實際上是只有一行的數據表,不同數據表中的記錄也不能共享。比如,過濾運算時會復制出新記錄來構成新數據表,空間和時間成本都變大。
特別地,因為有游離記錄,離散數據集允許記錄的欄位取值是某個記錄,這樣可以更方便地實現外鍵連接。
有序性
關系代數是基於無序集合設計的,集合成員沒有序號的概念,也沒有提供定位計算以及相鄰引用的機制。SQL 實踐時在工程上做了一些局部完善,使得現代 SQL 能方便地進行一部分有序運算。
離散數據集中的集合是有序的,集合成員都有序號的概念,可以用序號訪問成員,並定義了定位運算以返回成員在集合中的序號。離散數據集提供了符號以在集合運算中實現相鄰引用,並支持針對集合中某個序號位置進行計算。
有序運算很常見,卻一直是 SQL 的困難問題,即使在有了窗口函數後仍然很繁瑣。SPL 則大大改善了這個局面,前面那個股票上漲的例子就能說明問題。
離散性與集合化
關系代數中定義了豐富的集合運算,即能將集合作為整體參加運算,比如聚合、分組等。這是 SQL 比 Java 等高級語言更為方便的地方。
但關系代數的離散性非常差,沒有游離記錄。而 Java 等高級語言在這方面則沒有問題。
離散數據集則相當於將離散性和集合化結合起來了,既有集合數據類型及相關的運算,也有集合成員游離在集合之外單獨運算或再組成其它集合。可以說 SPL 集中了 SQL 和 Java 兩者的優勢。
有序運算是典型的離散性與集合化的結合場景。次序的概念只有在集合中才有意義,單個成員無所謂次序,這里體現了集合化;而有序計算又需要針對某個成員及其相鄰成員進行計算,需要離散性。
在離散性的支持下才能獲得更徹底的集合化,才能解決諸如有序計算類型的問題。
離散數據集是即有離散性又有集合化的代數體系,關系代數只有集合化。
分組理解
分組運算的本意是將一個大集合按某種規則拆成若干個子集合,關系代數中沒有數據類型能夠表示集合的集合,於是強迫在分組後做聚合運算。
離散數據集中允許集合的集合,可以表示合理的分組運算結果,分組和分組後的聚合被拆分成相互獨立的兩步運算,這樣可以針對分組子集再進行更復雜的運算。
關系代數中只有一種等值分組,即按分組鍵值劃分集合,等值分組是個完全劃分。
離散數據集認為任何拆分大集合的方法都是分組運算,除了常規的等值分組外,還提供了與有序性結合的有序分組,以及可能得到不完全劃分結果的對位分組。
聚合理解
關系代數中沒有顯式的集合數據類型,聚合計算的結果都是單值,分組後的聚合運算也是這樣,只有 SUM、COUNT、MAX、MIN 等幾種。特別地,關系代數無法把 TOPN 運算看成是聚合,針對全集的 TOPN 只能在輸出結果集時排序後取前 N 條,而針對分組子集則很難做到 TOPN,需要轉變思路拼出序號才能完成。
離散數據集提倡普遍集合,聚合運算的結果不一定是單值,仍然可能是個集合。在離散數據集中,TOPN 運算和 SUM、COUNT 這些是地位等同的,即可以針對全集也可以針對分組子集。
SPL 把 TOPN 理解成聚合運算後,在工程實現時還可以避免全量數據的排序,從而獲得高性能。而 SQL 的 TOPN 總是伴隨 ORDER BY 動作,理論上需要大排序才能實現,需要寄希望於資料庫在工程實現時做優化。
有序支持的高性能
離散數據集特別強調有序集合,利用有序的特徵可以實施很多高性能演算法。這是基於無序集合的關系代數無能為力的,只能寄希望於工程上的優化。
下面是部分利用有序特徵後可以實施的低復雜度運算:
1) 數據表對主鍵有序,相當於天然有一個索引。對鍵欄位的過濾經常可以快速定位,以減少外存遍歷量。隨機按鍵值取數時也可以用二分法定位,在同時針對多個鍵值取數時還能重復利用索引信息。
2) 通常的分組運算是用 HASH 演算法實現的,如果我們確定地知道數據對分組鍵值有序,則可以只做相鄰對比,避免計算 HASH 值,也不會有 HASH 沖突的問題,而且非常容易並行。
3) 數據表對鍵有序,兩個大表之間對位連接可以執行更高性能的歸並演算法,只要對數據遍歷一次,不必緩存,對內存佔用很小;而傳統的 HASH 值分堆方法不僅比較復雜度高,需要較大內存並做外部緩存,還可能因 HASH 函數不當而造成二次 HASH 再緩存。
4) 大表作為外鍵表的連接。事實表小時,可以利用外鍵表有序,快速從中取出關聯鍵值對應的數據實現連接,不需要做 HASH 分堆動作。事實表也很大時,可以將外鍵表用分位點分成多個邏輯段,再將事實表按邏輯段進行分堆,這樣只需要對一個表做分堆,而且分堆過程中不會出現 HASH 分堆時的可能出現的二次分堆,計算復雜度能大幅下降。
其中 3 和 4 利用了離散數據集對連接運算的改造,如果仍然延用關系代數的定義(可能產生多對多),則很難實現這種低復雜的演算法。
除了理論上的差異, SPL 還有許多工程層面的優勢,比如更易於編寫並行代碼、大內存預關聯提高外鍵連接性能等、特有的列存機制以支持隨意分段並行等。
再把前面的問題用 SPL 重寫一遍有個直接感受。
一支股票最長連續上漲多少天:
計算思路和前面的 SQL 相同,但因為引入了有序性後,表達起來容易多了,不再繞了。
1 億條數據中取前 10 名:
SPL 有更豐富的集合數據類型,容易描述單次遍歷上實施簡單聚合的高效演算法,不涉及大排序動作。
這里還有更多 SPL 代碼以體現其思路及大數據演算法:
重磅!開源SPL交流群成立了
簡單好用的SPL開源啦!
為了給感興趣的小夥伴們提供一個相互交流的平台,
特地開通了交流群(群完全免費,不廣告不賣課)
需要進群的朋友,可長按掃描下方二維碼
⑶ 資料庫SQ習題
最佳答案:
習題
一、選擇題
1.關於查詢語句中ORDER BY子句使用正確的是( D )。
A.如果未指定排序欄位,則默認按遞增排序
B.表的欄位都可用於排序
C.如果在SELECT子句中使用了DISTINCT關鍵字,則排序欄位必須出現在查詢結果中
D.聯合查詢不允許使用ORDER BY子句
第2~4題使用7.7節「示例分析」中數據表。
2.使用查詢語句:
SELECT STUDENT.學號,STUDENT.姓名,SUM(分數)
FROM STUDENT,GRADE
WHERE STUDENT.學號=GRADE.學號
GROUP BY STUDENT.學號,STUDENT.姓名
查詢結果是(A )。
A.按學號分類的每個學生所有課程成績的總分 B.按學號分類的每個學生各課程成績
C.全體學生的按各課程分類的成績總分 D.所有學生所有課程成績總分
3.使用查詢語句:
SELECT MAX(分數) AS 最高分
FROM STUDENT,curriculum,GRADE
WHERE STUDENT.學號=GRADE.學號
AND curriculum.課程編號=GRADE.課程編號
AND 課程名稱='資料庫技術及應用'
查詢的結果是( )。
A.87 B.91 C.82 D.90
很遺憾!不知道表中的記錄數據,無法判斷是哪個選項,但是題意是檢索出:選修課程'資料庫技術及應用'的學生中成績最高的。看一下表就知道了。
4.查詢選修了課程編號為「0002」的學生的學號和姓名,以下( A )語句是錯誤的。
A.
SELECT 學號,姓名FROM STUDENT
WHERE 學號=(SELECT 學號FROM GRADE WHERE 課程編號='0002')
B.
SELECT STUDENT.學號,STUDENT.姓名
FROM STUDENT,GRADE
WHERE STUDENT.學號=GRADE.學號AND 課程編號='0002'
C.
SELECT STUDENT.學號,STUDENT.姓名
FROM STUDENT JOIN GRADE ON STUDENT.學號=GRADE.學號
WHERE GRADE.課程編號='0002'
D.
SELECT 學號,姓名FROM STUDENT
WHERE 學號IN (SELECT 學號FROM GRADE WHERE 課程編號='0002')
5.下列關於查詢結果錯誤的是( D )。
A.查詢結果可以顯示在表格中
B.查詢結果可以按文本方式顯示
C.以文本和表格顯示的查詢結果在保存時,其文件格式不同
D.不管以哪種方式查看,查詢結果都會顯示在查詢結果窗口中
6.在T-SQL語句中,與表達式「倉庫號NOT IN ('wh1','wh2')」功能相同的表達式是( D )。
A.倉庫號='wh1' AND 倉庫號='wh2' B.倉庫號!='wh1' OR 倉庫號# 'wh2'
C.倉庫號<>'wh1' OR 倉庫號!='wh2' D.倉庫號!='wh1' AND 倉庫號!='wh2'
7.在T-SQL 的SELECT語句中用於實現關系的選擇運算的短語是( C )。
A.FOR B.WHILE C.WHERE D.CONDITION
8.使用SQL語句進行分組檢索時,為了去掉不滿足條件的分組,應當( B )。
A.使用WHERE子句 B.在GROUP BY後面使用HAVING子句
C.先使用WHERE子句,再使用HAVING子句 D.先使用HAVING子句,再使用WHERE子句
二、填空題
1.在查詢語句中,應在__SELECT____子句中指定輸出欄位。
2.如果要使用SELECT語句返回指定條數的記錄,則應使用_TOP__關鍵字來限定輸出欄位。
3.當一個子SELECT的結果作為查詢的條件,即在一個SELECT命令的WHERE子句中出現另一個SELECT命令,這種查詢稱為__嵌套____查詢。
4.連接查詢可分為3種類型:_內連接___、__外連接__和交叉連接。
5.若要把查詢結果存放到一個新建的表中,可使用__into tabale 或into dbf____子句。
三、判斷題
1.在關系資料庫SQL Server中,用於檢索數據的語句是T-SQL的定義語言。 (× )
2.邏輯運算符(AND、NOT、OR)的運算順序是AND→OR→NOT。 ( × )
3.用於WHERE子句的查詢條件表達式可用的比較運算符為:=(等於)、!=或<>(不等於)、>(大於)、>=(大於等於)、<(小於)、<=(小於等於)。 ( √ )
4.SELECT語句的DISTINCT參數表示輸出無重復結果的記錄。 ( √ )
5.如果要使SELECT的查詢結果有序輸出,需要用GROUP BY子句配合。 ( × )
⑷ 資料庫原理及應用基礎的常見類型題
1.B 2.C 3.B 4.C 5.D 6.C 7.C 8.D 9.C 10.A
11.A 12.A 13.A - 不知道14。乙evogue2006 - 10 - 24 11點47分01秒15?16.A 17.B 18.A 19.D 20.C
試述事務的概念和事務的四個特性。
A:
事務是一個用戶定義的資料庫操作序列,這些操作要麼全部做或不做的整體,是一個不可分割的工作單元。
事務有四個特點:原子性(原子性),一致性(一致性),隔離(隔離)和持久性(Durability)。這四個特點也被稱為ACID屬性。
原子性:事務資料庫的邏輯工作單元,該交易包括所有的操作,無論是做還是不做。
一致性:事務執行的結果必須更改資料庫從一個一致狀態轉換到另一個一致的狀態。
隔離:一個事務的執行不能被其他事務的干擾。一個事務內的操作和使用其他並發事務的數據分離出來,並發執行的個別交易不能互相干擾。
持續性:持續性的,也被稱為永久(持久性),指的到交易提交其數據存儲在資料庫中的變化應該是永久性的。接下來的操作或故障不應該有任何影響其執行結果。
2。為什麼事務非正常時間的推移,會影響資料庫中數據的正確性,舉了一個例子。
A:
事務的執行結果必須更改資料庫從一個一致狀態轉換到另一個一致狀態。如果出現故障的資料庫系統的操作,一些尚未完成的交易被迫中斷,這些未完成的交易的一部分已被寫入到物理資料庫對資料庫所做的更改,然後在資料庫中不正確的狀態,或者是不一致的狀態。
如一個工廠的庫存管理系統,它是必要的量Q的某些部分從倉庫1倉庫2個存儲。
你可以定義一個事務T,T包括兩個操作; Q1 = Q1-Q,Q2 = Q2 + Q. T改變的終??止,只有當第一個操作,資料庫是不一致Q庫存沒有理由。
3。資料庫中為什麼要有恢復子系統?它的功能是什麼?
A:
是不可避免的,因為計算機系統的硬體故障,軟體錯誤,操作錯誤和惡意破壞所造成的這些故障從正在運行的事務中發生非正常中斷,影響資料庫中的數據正確性,而破壞了資料庫中,因此,在資料庫中的數據的全部或部分損失,因此必須有一個恢復子系統。功能
恢復子系統:資料庫從錯誤狀態恢復到一個已知的良好狀態(也被稱為一致的狀態或完整狀態)。
4。在資料庫中可能出現的故障運行幾類?什麼故障影響正常執行的交易嗎?什麼故障破壞資料庫中的數據?
A:資料庫系統的各種可能發生的故障大致可分為如下幾類:
(1)內部交易失敗;
(2)系統故障; />(3)介質故障;
(4)計算機病毒。的
交易失敗,系統故障和介質故障影響事務的正常執行;介質故障和計算機病毒破壞的數據
庫。
5。根據回收技術?
A:
數據轉儲和登錄日誌文件是資料庫恢復的基本技術。
當一個故障在系統運行過程中,轉儲資料庫的日誌文件,你可以將資料庫恢復到一致狀態,在發生故障之前的備份副本。
6。資料庫的轉儲的意義是什麼?各種數據轉儲方法的比較。
答案:
數據轉儲是基本的技術,在恢復的資料庫。所謂的轉儲資料庫DBA定期復制到磁帶或其他磁碟保存。可以重新載入資料庫破壞的資料庫的備份副本恢復時的狀態轉儲。
靜態轉儲:轉儲系統操作運行的事務。靜態轉儲,但必須等待用戶交易結束之前運行。同樣,新的事務必須等待執行轉儲結束。顯然,這將減少資料庫的可用性。
動態轉儲:轉儲期間允許資料庫訪問或。動態的轉儲可以克服靜態轉儲的缺點,它並不需要等待正在運行的用戶交易的結束,也不會影響新事務的操作。然而,備份的數據副本結束時的轉儲和不能保證正確和有效的。 ,因為轉儲運行在交易過程中可能會一些數據,備份的數據副本是不符合版本的資料庫。
為此,我們必須活動期間注冊使用mp transaction資料庫,以創建一個日誌文件(日誌文件)。在這樣的日誌文件的備份副本可以得到正確的資料庫狀態的時刻。
轉儲海量轉儲和增量轉儲可以分為兩種方式。
大規模傾倒每一個轉儲所有資料庫。增量轉儲每次更新只轉儲上次轉儲數據。從恢復的角度來看,大量的轉儲的備份副本恢復一般更容易。如果該資料庫,事務處理,是非常頻繁,增量轉儲方式更實用,更有效。
7。日誌文件?為什麼要建立一個日誌文件?
答案:
(1)日誌文件是用來記錄交易文件對資料庫的更新操作。
(2)建立的日誌文件的目的:交易故障恢復系統故障恢復;協助媒體恢復的備份副本。
登記日誌文件為什麼要寫入日誌文件後,寫入到資料庫?
A:
的數據寫入到資料庫中,兩種不同的操作,這個後的日誌記錄被寫入到日誌文件中。這兩個操作之間可能發生了故障,即這兩個寫操作只完成了。
先寫一個資料庫,而不是變化的運行記錄中,小數點後不能被恢復這一。如果你寫的日誌,但沒有資料庫,恢復執行UNDO操作,不影響資料庫的正確性。所以一定要確保你寫的日誌文件,日誌記錄寫入到日誌文件中,然後寫入到資料庫的變化。
9,測試是針對不同的故障恢復策略和方法。 (也就是說,如何進行交易系統故障恢復故障恢復介質恢復?)
A:
交易故障恢復:
事務故??障的恢復是自動完成的DBMS ,是對用戶透明。
DBMS執行恢復步驟:
(1)反向掃描文件日誌(即從最後一次掃描日誌文件),則該事務更新操作。
(2)事務的更新操作執行逆操作。關於日誌記錄更新前值嗎?寫入到資料庫中。
(3)反向掃描日誌文件,做同樣的。
(4)?下去,直到你讀的開始標記本次交易,交易失敗恢復完整。
A:
系統故障恢復:
系統出現故障可能會導致資料庫處於不一致的狀態:
首先,沒有完成的交易資料庫的更新可能已被寫入到資料庫中;
已提交的交易資料庫的更新可能還留在緩沖區中,並沒有寫入到資料庫。
恢復操作(UNDO)的未竟事業出現故障,重做(REDO)已完成的交易。
恢復步驟:
(1)正向掃描日誌文件,以確定該交易已提交在故障發生前隊列中(REDO隊列的)和未完成的事務隊列(UNDO隊列)。
(2)UNDO處理隊列中的個別交易的。
UNDO處理方法是反向掃描日誌文件,更新操作執行相反的操作,每一個UNDO事務迫在眉睫的「價值」(前映像)記錄寫入到資料庫中,然後再更新。
(3)治療重做重做隊列事務。
REDO處理方法:正向掃描日誌文件,每個REDO事務重新執行操作的日誌文件登記。即將推出的日誌記錄寫入到資料庫中的更新值「(後映像)。
解析度:
步驟(1)如何確定的REDO隊列和UNDO隊列,請考慮一下吧。 BR />的演算法如下:
1)創建兩個事務隊列:
·UNDO-LIST:需要執行undo操作的事務集;
·REDO-LIST:需要執行重做操作事務集;
事務隊列最初是空的。
)從日誌文件頭,正向掃描日誌文件
是否有新的開始(遇到BEGIN TRANSACTION)交易鈦,鈦暫時放入UNDO-LIST隊列;
·如果提交的事務(遇到結束事務)TJ TJ從隊列undo-list中的REDO-LIST隊列;
直到最後的日誌文件A:
介質故障恢復:
介質故障是最嚴重的故障。
恢復方法是重裝資料庫,然後重做已完成交易的過程是:
(1 )DBA裝入最新的資料庫備份(從故障時間最近的轉儲副本),將資料庫恢復到一致的狀態轉儲。
(2)DBA的日誌文件的副本載入轉儲結束時間
(3)DBA啟動系統恢復命令來完成還原的DBMS的功能,重做已完成的交易。
解析
1)我們假設靜態轉儲的步驟(1)安裝資料庫的備份副本。
2)如果您使用的是靜態和動態轉儲步驟(1)將資料庫的備份副本是不夠的,需要同時載入的副本日誌文件的轉儲開始治療後的時間,以獲得正確的資料庫的備份副本。
3)(2)步演算法來重做已完成的交易:
正向掃描日誌文件,以找出識別在故障發生之前提交的交易中,計入的重量隊列
B。再次向前掃描日誌文件,重做重做隊列中的所有交易。即將推出的日誌記錄寫入到資料庫中的更新值。
>
10。檢查點恢復技術的優勢是什麼?
A:
測井技術進行資料庫恢復,恢復子系統必須搜索日誌,以確定哪些事務需要重做,哪些事務需要。一般來說,你需要檢查所有的記錄。這樣做有兩個問題:
首先,搜索整個日誌將花費大量的時間。
REDO處理的事務實際上寫的更新操作資料庫恢復子系統又執行這些操作,浪費了大量的時間。
檢查點技術,以解決這些問題。
11。師叔檢查點的恢復步驟。
①從啟動文件的最後一個檢查點記錄在日誌文件中的地址找到最後一個檢查點記錄在日誌文件中找到的地址。
②檢查站的檢查點記錄的建立時間列表中的所有運行的事務ACTIVE-LIST。
創建兩個事務隊列:
·UNDO-LIST:需要執行undo操作的事務集;
·REDO-LIST:集交易需要執行恢復操作;
ACTIVE-LIST暫時到UNDO-LIST隊列,REDO隊列暫時空。
③從檢查點開始正向掃描日誌文件
任何新的起點事務鈦undo-list中的Ti暫時放置在隊列中;
·如果提交事務TJ,TJ移動從UNDO-LIST隊列,REDO-LIST隊列,直到最後的日誌文件;
>④UNDO操作執行undo-list中的每一筆交易REDO-LIST中的每個事務執行REDO操作。
12。資料庫鏡像?使用?
答案:
資料庫鏡像是根據對DBA的要求,自動復制到另一個磁碟上的關鍵數據在整個資料庫或部分。每當主資料庫更新時,DBMS自動復制更新後的數據,在過去,DBMS自動保證鏡像的一致性
使用資料庫鏡像的數據和主數據。:
一個用於資料庫恢復。當介質故障的鏡像磁碟繼續提供使用的資料庫管理系統自動鏡像磁碟數據恢復的資料庫,並且不需要關閉系統並重新安裝該資料庫的副本。
二是要提高無故障,當用戶的數據加排他鎖來其他用戶可以讀取的數據的資料庫的可用性。鏡像資料庫,無需等待用戶釋放該鎖。
⑸ 幾個資料庫技術及應用題目
單選題 1.下面哪個不是資料庫技術的主要特點 (D)
A.數據的結構化 B.數據的冗餘度小 C.較高的數據獨立性 D.程序的標准化
2.下列敘述正確的為(B)
A.關系中允許有重復的元組,也允許有重復的屬性名
B.關系中允許有重復的元組,不允許有重復的屬性名
C.關系中不允許有重復的元組,允許有重復的屬性名
D.關系中不允許有重復的元組,也不允許有重復的屬性名
3.如果兩個實體之間的聯系是1:M,則實現l:M聯系的方法是 (C)
A.將兩個實體轉換成一個關系
B.將兩個實體轉換的關系中,分別加入另一個關系的主碼。
C.將「1」端實體轉換的關系的主碼,放入「M」端實體轉換的關系中
D.將「M」端實體轉換的關系的主碼,放入「1」端實體轉換的關系中
4.SQL的標准庫函數COUNT,SUM,AVG,MAX與MIN等,不允許出現在下列語句 (D)中 A.SEIECT
B.HAVING C.GROUP……HAVING D.WHERE
填空題
1、班級和學生之間的聯系是(一對多)聯系,班級和班長之間的聯系是( 一對一 )聯系,學生和課程之間的
聯系是( 多對多 )聯系。
2、在資料庫的三級模式結構中,外模式有( 多個 ),模式和內模式只有( 一個 )。
3、DB的含義是( 資料庫 ),DBS的含義是( 資料庫系統 ),DBMS的含義是( 資料庫管理系統 )。
簡答題:
1、SQL Server中的語句許可權的含義及內容。
語句許可權主要指用戶是否具有許可權來執行某一語句,這些語句通常是一些具有管理性的操作,如創建資料庫、表、存儲過程、觸發器等。
2、SQL Server中資料庫和應用程序的安全機制有哪四種?
用戶標識與鑒別;存取控制;視圖機制;審計機制等
3、事務故障的恢復方法。
反向掃描日誌文件,查找該事務的更新操作;對該事務的更新操作進行逆向操作;繼續反向掃描日誌文件,查找該事務的其他更新操作並逆向操作;繼續處理,直到事務的開始標記。
4、E-R圖設計中,合並分E-R圖時可能產生的沖突及解決辦法。
沖突主要有三種:屬性沖突、命名沖突和結構沖突。屬性沖突需要靠各部門協商討論解決,但也非易事;命名沖突通常也像處理屬性沖突一樣,通過討論協商等行政手段進行解決;結構沖突主要是根據應用的語義對實體聯系
的類型進行綜合或調整。
5、事務的四個性質。
(1)原子性(Atomicity)
事務的原子性是指事務中包含的所有操作要麼全做,要麼全不做(all or none)。
(2) 一致性(Consistency)在事務開始以前,資料庫處於一致性的狀態,事務結束後,資料庫也必須處於一致性狀態。 事務應該把資料庫從一個一致埋運性狀態轉換到另外一個一致性狀態。
(3) 隔離性(Isolation)事務隔離性要求系統必須保證事務不受其他並發執行的事務的影響,也即要達到這樣一種效果:對於任何一對事務T1 和 T2,在事務 T1 看來,T2 要麼在 T1 開始之前已經結束,要麼在 T1 完成之
後才開始執行。這樣,每個事務都感覺不到系統中有其他事務在並發地執行。
(4)持久性(Durability)一個事務一旦成功源液唯完成,它對資料庫的改變必須是永久的,即便是在系統遇雹培到故障的情況下也不會丟失。數據的重要性決定了事務持久性的重要性。
6、有兩個實體集,若它們之間存在著一個M:N聯系、1:M聯系和1:1聯系,根據ER模型轉換成關系資料庫的規則,這個ER結構轉換成表的個數分別是多少?
M:N聯系:三個表,1:M聯系:兩個表,1:1聯系:兩個表
7、舉例說明參照完整性規則中對外碼有何要求。
若屬性F是基本關系R的外碼,它與基本關系S的主碼KS相對應,則對於R中每一元組在F上的值必須為:或者為空,或者等於S中某個元組的主碼值。比如:學生關系中每個元組的專業號屬性只能取下面兩類值:空值,表示未給該
學生分配專業;非空值,這時該值必須是專業關系中某個元組的專業號值。
8、舉例說明SQL Server中有哪3類觸發器。
INSERT觸發器、UPDATE觸發器和DELETE觸發器 (不再舉例)
SQL語言設計題
將借書日期在2006年4月以前的借閱記錄存入臨時的超期借閱表。
select * into #超期借閱表 from 借閱記錄表 where 日期<'2006-04-01'
設有如下三個關系模式,用SQL語句完成:
學生(學號,姓名,性別,年齡,專業)
課程(課程號,課程名,學分,先行課)
選課(學號,課程號,任課教師,成績)
1、創建電子商務專業學生成績視圖,屬性包括學號、姓名、課程名和成績。
create view '電子商務專業學生成績視圖' as
select s.學號,s.姓名,c.課程名,s_c.成績 from table 學生 s,課程 c,選課 s_c where
s.學號=s_c.學號 and s_c.課程號=c.課程號 and s.專業='電子商務'
2、創建計算機應用專業的學生成績統計視圖,屬性包括學號、姓名、總成績和平均成績。
create view 『計算機專業學生成績統計視圖』 as
select s.學號,s.姓名,sum(成績),avg(成績) from 學生 s,選課 s_c
where s.學號=s_c.學號 and 專業='計算機應用'
group by 學號,姓名
3、查詢沒有成績的學生的學號、姓名和課程號。
select distinct s.學號,s.姓名,s_c.課程號 from s,s_c where s.學號=s_c.學號 where s_c.成績=0
4、查詢選修課程號為001且成績為最好的學生的學號、姓名和成績
select s.學號,s.姓名,max(s_c.成績) from 學生 s,選課 s_c where s.學號=s_c.學號 and s_c.課程號=『001』
5、查詢至少選修了二門及二門以上課程的學生的學號
select 學號 from 選課表 group by 學號 having count(*)>=2
⑹ 哪位大俠可以提供一些mysql資料庫的題庫,一定要帶答案的!將感激不盡!!
一、不定項選擇題(共40題,每小題2.5分,總分100分)
1. 資料庫管理系統的發展歷經了如下那些模型階段( ACDE )
A. 層次模型 B. 結構模型 C. 關系模型
D. 網狀模型 E.對象模型
2. 關系型資料庫的核心單元是( B )
A. 對象 B. 表
C. 行 D. 列
3. 對於關系型資料庫來說,表之間存在下面那些關系( ABC )
A. 一對一關系 B. 一對多關系
C. 多對多關系 D. 繼承關系
4. 在SQL中,下面對於數據定義語言(DDL)描述正確的是( D )。
A. DDL關心的是資料庫中的數據 B. 完成數據的增、刪、改、查操作
C. 控制對資料庫的訪問 D. 定義資料庫的結構
5. MySQL是一種( C )資料庫管理系統。
A. 層次型 B. 網路型 C. 關系型 D. 對象型
6. SQL中,下列操作有語法錯誤的是( B )
A. AGE IS NOT NULL B. NOT(AGE IS NULL)
C. SNAME=『王五』 D. SNAME=『王%』
7. SQL中,下列關於創建、管理資料庫的操作語句不正確的是( CDE )
A. CREATE DATABASE Instant B. USE Instant C. NEW DATABASE Instant
D. Connection Instant E. Delete DATEBASE Instant
8. 在MySQL中,不存在的數據類型是( F )。
A. INT B. TEXT C. DECIMAL
D. VARCHAR E. DATETIME F. VARCHAR2
9. 在MySQL中,下列關於創建資料庫表的描述正確的是( C )。
A. 在創建表時必須設定列的約束
B. 在刪除表的時候通過外鍵約束連接在一起的表會被一同刪除
C. 在創建表時必須設置列類型
D. 通過CREATE TABLE new_t SELECT * FROM old_t復製表的同時,表的約束能夠一起被復制到新表中
10. 根據數據完整性實施的方法,可以將其分為( ACDF )
A. 實體完整性 B. 表完整性 C.域完整性
D. 引用完整性 E. 記錄完整性 F.用戶自定義完整性
11. 下面關於域完整性的方法,不正確的是( A )。
A. 主鍵約束 B. 外鍵約束 C.檢查約束
D. 非空約束 E. 默認值
12. 下面關於創建和管理索引正確的描述是( C )。
A. 創建索引是為了便於全表掃描
B. 索引會加快DELETE、UPDATE和INSERT語句的執行速度
C. 索引被用於快速找到想要的記錄
D. 大量使用索引可以提高資料庫的整體性能
13. SQL中,「AGE IN(20,22)」的語義是( D )。
A. AGE<=22 AND AGE >=20 B. AGE <22 AND AGE >20
C. AGE =20 AND AGE =22 D. AGE =20 OR AGE =22
14. 有一個關系:學生(學號,姓名,系別),規定學號的值域是8個數字組成的字元串,這一規則屬於( C )
A. 實體完整性約束 B. 參照完整性約束
C. 用戶自定義完整性約束 D. 關鍵字完整性約束
15. 下面SQL是來源於考試成績表t_exam:學號stuId、科目編號subId、成績score,考試日期:ex_date。有以下sql,它表示的意思是:( B )
Select stu_id,subId,count(*) as x
From t_exam
Where ex_date=』2008-08-08』
Group stu_id,subId
Having count(*)>1
Order by x desc
A. 找出』2008-08-08』這天某科考試2次及以上的學生記錄
B. 找出』2008-08-08』這天,某科考試2次及以上的學生記錄,考試次數多的放在前面
C. 找出』2008-08-08』這天,某科考試2次及以上的學生記錄,考試次數少的放在前面
D. 根據學號和學科分組,找出每個人考試科數,最後考試次數多的放在前面
16. EMP表如下所示,下面哪些SQL語句的返回值為3:( BD )
EMP
雇員號 雇員名 部門號 工資
001 張山 022000
010 王宏達01 1200
056 馬林生02 1000
101 趙敏 04
A. select count(*) from emp
B. select count(distinct 部門號) from emp
C. select count(*) from emp group by 雇員號
D. select count(工資) from emp
17. 下面那一項不是SELECT語句對數據的操作:( D )
A. 投影 B. 聯接 C. 並 D. 級聯
18. 下面關於SQL數據查詢操作描述正確的有:( ABD )
A. 投影操作是選擇對表中的哪些列進行查詢操作
B. 使用DISTINCT關鍵字可以過濾查詢中重復的記錄
C. 在模糊查詢中,通配符「%」表示匹配單個字元,而「_」表示匹配零個或多個字元
D. 在MySQL中使用LIMIT關鍵字限制從資料庫中返回記錄的行數
19. 在SQL語言中,條件「BETWEEN 20 AND 30」表示年齡在20到30之間,且( A )。
A. 包括20歲和30歲 B. 不包括20歲和30歲
C. 包括20歲,不包括30歲 D. 不包括20歲,包括30歲
20. SQL語言中,刪除EMP表中全部數據的命令正確的是( C )。
A. delete * from emp B. drop table emp
C. truncate table emp D. 沒有正確答案
21. 有關索引的說法錯誤的是( AD )
A. 索引的目的是為增加數據操作的速度
B. 索引是資料庫內部使用的對象
C. 索引建立得太多,會降低數據增加刪除修改速度
D. 只能為一個欄位建立索引
22. 下列哪個關鍵字在Select語句中表示所有列( A )
A. * B. ALL C. DESC D. DISTINCT
23. 在表中設置外鍵實現的是哪一類數據完整性( B )
A. 實體完整性 B. 引用完整性
C. 用戶定義的完整性 D. 實體完整性、引用完整性和用戶定義的完整性
24. 下面正確表示Employees表中有多少非NULL的Region列的SQL語句是( B )
A. SELECT count(* ) from Employees
B. SELECT count(ALL Region) from Employees
C. SELECT count(Distinct Region) from Employees
D. SELECT sum(ALL Region) from Employees
25. 下面可以通過聚合函數的結果來過濾查詢結果集的SQL子句是( C )
A. WHERE子句 B. GROUP BY子句
C. HAVING 子句 D. ORDER BY子句
26. t_score(stu_id,sub_id,score),即成績表(學號,科目編號,成績)。學生如果某科沒有考試,則該科成績錄入null。能夠獲取各位學生的平均成績的選項是( A )
A. select avg(nvl(socre,0)) from score group by stu_id
B. select stu_id,avg(sorce) from score
C. select stu_id,avg(score) from score
D. select stu_id,sum(score)/count(score) from score
27. 若要求查找S表中,姓名的第一個字為'王'的學生學號和姓名。下面列出的SQL語句中,哪個是正確的( B )
A. SELECT Sno,SNAME FROM S WHERE SNAME=′王%′
B. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王%′
C. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王_′
D. 全部
28. 若要求「查詢選修了3門以上課程的學生的學生號」,正確的SQL語句是( B )
A. SELECT Sno FROM SC GROUP BY Sno WHERE COUNT(*)> 3
B. SELECT Sno FROM SC GROUP BY Sno HAVING( COUNT(*)> 3)
C. SELECT Sno FROM SC ORDER BY Sno WHERE COUNT(*)> 3
D. SELECT Sno FROM SC ORDER BY Sno HAVING COUNT(*)>= 3
29. 對下面的查詢語句描述正確的是( D )
Select StudentID,Name,
(select count(*) from StudentExam
where StudentExam.StudentID = Student.StudentID) as ExamsTaken
from Student
order by ExamsTaken desc
A. 從Student表中查找StudentID和Name,並按照升序排列
B. 從Student表中查找StudentID和Name,並按照降序排列
C. 從Student表中查找StudentID、Name和考試次數
D. 從Student表中查找StudentID、Name,並從StudentExam表中查找與StudentID一致的學生考試次數,並按照降序排列
30. 下面題基於學生-課程資料庫中的三個基本表:
學生信息表:s(sno, sname, sex, age, dept) 主鍵為sno
課程信息表:c(cno, cname, teacher) 主鍵為cno
學生選課信息表:sc(sno, cno, grade) 主鍵為(sno, cno)
「從學生選課信息表中找出無成績的學生信息」的SQL語句是( C d )
A.
SELECT * FROM sc WHERE grade=NULL
B.
SELECT * FROM sc WHERE grade IS 『 』
C.
SELECT * FROM sc WHERE grade IS NULL
D.
SELECT * FROM sc WHERE grade =『 』
31. 當子查詢返回多行時,可以採用的解決辦法是( C )。
A. 使用聚合函數 B. Where條件判斷
C. 使用IN運算符 D. 使用Group by進行分組
32. 下面關於在子查詢中使用運算符描述不正確的是( D )。
A. 使用IN運算符用於查找欄位值屬於某一組值的行
B. 使用Exists運算符用於測試子查詢是否返回行,如果返回其值就為真
C. 使用ALL運算符用於測試子查詢結果集的所有行是否滿足指定的條件
D. 使用Any運算符用於測試子查詢結果集中的一行或多行不滿足指定的條件
33. 下面關於組合查詢描述不正確的是( D )。
A. 從一個表中獲取的數據必須和其它表中的數據具有相同的列數
B. 兩個表中相對應的列必須具有相同的數據類型
C. UNION的結果集列名與第一個SELECT語句的結果集中的列名相同
D. UNION的結果集列名與第二個SELECT語句的結果集中的列名相同
E. UNION ALL運算符返回每個數據集的所有成員
34. 下面關於聯接的描述正確的是( A )。
A. 內聯接使用比較運算符根據每個表共有的列值來匹配兩個表中的行
B. 左外聯接結果集包含從右邊的表返回的所有行
C. 右外聯接結果集包含從左邊的表返回的所有行
D. 全外聯接返回左表和右表中的所有匹配的行
35. 下面關於資料庫設計過程正確的順序描述是( C )。
A. 需求收集和分析、邏輯設計、物理設計、概念設計
B. 概念設計、需求收集和分析、邏輯設計、物理設計
C. 需求收集和分析、概念設計、邏輯設計、物理設計
D. 需求收集和分析、概念設計、物理設計、邏輯設計
36. ER圖屬於下面哪一種資料庫設計模型( B )。
A. 物理數據模型
B. 概念數據模型
C. 邏輯數據模型
D. 需求模型
37. 非主鍵必須完全依賴於主鍵列,這屬於下列範式的內容( BC )
A. 1NF B. 2NF C. 3NF D. 都沒有的
38. 如果一個欄位的數據必須來源另一個表的主鍵,那麼要在這個欄位上建立( B )。
A. PK(主鍵) B. FK(外鍵) C. UK(唯一鍵) D. 復合主鍵
39. 根據三個範式的定義,下面哪個選項的設計是正確的( C )
職工編號 姓名 工種 車間 車間主任
1001 李寧 車工 一車間 周傑
1002 王海 銑工 一車間 周傑
1003 趙亮 鉗工 二車間 吳明
1001 李寧 鉗工 二車間 吳明
A. 員工表、工種表、車間表
B. 員工表、工種表、車間表、車間主任表
C. 員工表、工種表、車間表、員工工種表、員工車間表
D. 以上設計均不正確
40. 下列說法中,哪些是正確的( BD )
A. RDBMS是資料庫管理系統的簡稱
B. 各行記錄都不能重復,是第二範式要求的
C. 在資料庫設計中一定要滿足第三範式
D. 索引越多,查詢越快,數據更新越慢