數(shù)據(jù)庫及SQL----常用知識點總結(jié)
? ? ? ?數(shù)據(jù)庫也是計算機類筆試面試中不可避免會遇到的考點,尤其是銀行和部分傳統(tǒng)軟件類公司。這里根據(jù)整理的資料,對數(shù)據(jù)庫的相關(guān)知識也做個總結(jié)吧。希望學(xué)過數(shù)據(jù)庫但長時間不用的同學(xué)根據(jù)這些知識能夠回憶和重拾,沒學(xué)過的同學(xué)能掌握一些數(shù)據(jù)庫的基礎(chǔ)知識。
第一節(jié)
? ? ? 一、相關(guān)概念
? ? ? ?1. Data:數(shù)據(jù),是數(shù)據(jù)庫中存儲的基本對象,是描述事物的符號記錄。
? ? ? ?2. Database:數(shù)據(jù)庫,是長期儲存在計算機內(nèi)、有組織的、可共享的大量數(shù)據(jù)的集合。
? ? ? ?3. DBMS:數(shù)據(jù)庫管理系統(tǒng),是位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件,用于科學(xué)地組織、存儲和管理數(shù)據(jù)、高效地獲取和維護數(shù)據(jù)。
? ? ? ?4. DBS:數(shù)據(jù)庫系統(tǒng),指在計算機系統(tǒng)中引入數(shù)據(jù)庫后的系統(tǒng),一般由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、應(yīng)用系統(tǒng)、數(shù)據(jù)庫管理員(DBA)構(gòu)成。
? ? ? ?5. 數(shù)據(jù)模型:是用來抽象、表示和處理現(xiàn)實世界中的數(shù)據(jù)和信息的工具,是對現(xiàn)實世界的模擬,是數(shù)據(jù)庫系統(tǒng)的核心和基礎(chǔ);其組成元素有數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作和完整性約束。
? ? ? ?6. 概念模型:也稱信息模型,是按用戶的觀點來對數(shù)據(jù)和信息建模,主要用于數(shù)據(jù)庫設(shè)計。
? ? ? ?7. 邏輯模型:是按計算機系統(tǒng)的觀點對數(shù)據(jù)建模,用于DBMS實現(xiàn)。
? ? ? ?8. 物理模型:是對數(shù)據(jù)最底層的抽象,描述數(shù)據(jù)在系統(tǒng)內(nèi)部的表示方式和存取方法,在磁盤或磁帶上的存儲方式和存取方法,是面向計算機系統(tǒng)的。
? ? ? ?9. 實體和屬性:客觀存在并可相互區(qū)別的事物稱為實體。實體所具有的某一特性稱為屬性。
? ? ? ?10.E-R圖:即實體-關(guān)系圖,用于描述現(xiàn)實世界的事物及其相互關(guān)系,是數(shù)據(jù)庫概念模型設(shè)計的主要工具。
? ? ? ?11.關(guān)系模式:從用戶觀點看,關(guān)系模式是由一組關(guān)系組成,每個關(guān)系的數(shù)據(jù)結(jié)構(gòu)是一張規(guī)范化的二維表。
? ? ? ?12.型/值:型是對某一類數(shù)據(jù)的結(jié)構(gòu)和屬性的說明;值是型的一個具體賦值,是型的實例。
? ? ? ?13.數(shù)據(jù)庫模式:是對數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)(數(shù)據(jù)項的名字、類型、取值范圍等)和特征(數(shù)據(jù)之間的聯(lián)系以及數(shù)據(jù)有關(guān)的安全性、完整性要求)的描述。
? ? ? ?14.數(shù)據(jù)庫的三級系統(tǒng)結(jié)構(gòu):外模式、模式和內(nèi)模式。
? ? ? ?15.數(shù)據(jù)庫內(nèi)模式:又稱為存儲模式,是對數(shù)據(jù)庫物理結(jié)構(gòu)和存儲方式的描述,是數(shù)據(jù)在數(shù)據(jù)庫內(nèi)部的表示方式。一個數(shù)據(jù)庫只有一個內(nèi)模式。
? ? ? ?16.數(shù)據(jù)庫外模式:又稱為子模式或用戶模式,它是數(shù)據(jù)庫用戶能夠看見和使用的局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是數(shù)據(jù)庫用戶的數(shù)據(jù)視圖。通常是模式的子集。一個數(shù)據(jù)庫可有多個外模式。
? ? ? ?17.數(shù)據(jù)庫的二級映像:外模式/模式映像、模式/內(nèi)模式映像。
? ? ?
?二、重點知識點
? ? ? ?1.?數(shù)據(jù)庫系統(tǒng)由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、應(yīng)用系統(tǒng)和數(shù)據(jù)庫管理員構(gòu)成。
? ? ? ?2.?數(shù)據(jù)模型的組成要素是:數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作、完整性約束條件。
? ? ? ?3.?實體型之間的聯(lián)系分為一對一、一對多和多對多三種類型。
? ? ? ?4.?常見的數(shù)據(jù)模型包括:關(guān)系、層次、網(wǎng)狀、面向?qū)ο?、對象關(guān)系映射等幾種。
? ? ? ?5.?關(guān)系模型的完整性約束包括:實體完整性、參照完整性和用戶定義完整性。
? ? ? 6.?闡述數(shù)據(jù)庫三級模式、二級映象的含義及作用。
? ? ? ??數(shù)據(jù)庫三級模式反映的是數(shù)據(jù)的三個抽象層次:?模式是對數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述。內(nèi)模式又稱為存儲模式,是對數(shù)據(jù)庫物理結(jié)構(gòu)和存儲方式的描述。外模式又稱為子模式或用戶模式,是對特定數(shù)據(jù)庫用戶相關(guān)的局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述。
? ? ? ??數(shù)據(jù)庫三級模式通過二級映象在?DBMS?內(nèi)部實現(xiàn)這三個抽象層次的聯(lián)系和轉(zhuǎn)換。外模式面向應(yīng)用程序,?通過外模式/模式映象與邏輯模式建立聯(lián)系,?實現(xiàn)數(shù)據(jù)的邏輯獨立性。?模式/內(nèi)模式映象建立模式與內(nèi)模式之間的一對一映射,?實現(xiàn)數(shù)據(jù)的物理獨立性。
第二節(jié)
一、相關(guān)概念
? ? ? ?1.?主鍵:?能夠唯一地標(biāo)識一個元組的屬性或?qū)傩越M稱為關(guān)系的鍵或候選鍵。?若一個關(guān)系有多個候選鍵則可選其一作為主鍵(Primary?key)。
? ? ? ?2.?外鍵:如果一個關(guān)系的一個或一組屬性引用(參照)了另一個關(guān)系的主鍵,則稱這個或這組屬性為外碼或外鍵(Foreign?key)。
? ? ? ?3.?關(guān)系數(shù)據(jù)庫:?依照關(guān)系模型建立的數(shù)據(jù)庫稱為關(guān)系數(shù)據(jù)庫。?它是在某個應(yīng)用領(lǐng)域的所有關(guān)系的集合。
? ? ? ?4.?關(guān)系模式:?簡單地說,關(guān)系模式就是對關(guān)系的型的定義,?包括關(guān)系的屬性構(gòu)成、各屬性的數(shù)據(jù)類型、?屬性間的依賴、?元組語義及完整性約束等。?關(guān)系是關(guān)系模式在某一時刻的狀態(tài)或內(nèi)容,?關(guān)系模型是型,?關(guān)系是值,?關(guān)系模型是靜態(tài)的、?穩(wěn)定的,?而關(guān)系是動態(tài)的、隨時間不斷變化的,因為關(guān)系操作在不斷地更新著數(shù)據(jù)庫中的數(shù)據(jù)。
? ? ? ?5.?.?實體完整性:用于標(biāo)識實體的唯一性。它要求基本關(guān)系必須要有一個能夠標(biāo)識元組唯一性的主鍵,主鍵不能為空,也不可取重復(fù)值。
? ? ? ?6.?參照完整性:?用于維護實體之間的引用關(guān)系。?它要求一個關(guān)系的外鍵要么為空,?要么取與被參照關(guān)系對應(yīng)的主鍵值,即外鍵值必須是主鍵中已存在的值。
? ? ? ?7.?用戶定義的完整性:就是針對某一具體應(yīng)用的數(shù)據(jù)必須滿足的語義約束。包括非空、?唯一和布爾條件約束三種情況。
? ? ? 二、重要知識點
? ? ? 1.?關(guān)系數(shù)據(jù)庫語言分為關(guān)系代數(shù)、關(guān)系演算和結(jié)構(gòu)化查詢語言三大類。
? ? ? 2.?關(guān)系的?5?種基本操作是選擇、投影、并、差、笛卡爾積。
? ? ? 3.關(guān)系模式是對關(guān)系的描述,五元組形式化表示為:R(U,D,DOM,F(xiàn)),其中
? ? ? ? ? ? R?——?關(guān)系名
? ? ? ? ? ??U?——?組成該關(guān)系的屬性名集合
? ? ? ? ? ??D?——?屬性組?U?中屬性所來自的域
? ? ? ? ? ??DOM?——?屬性向域的映象集合
? ? ? ? ? ??F?——?屬性間的數(shù)據(jù)依賴關(guān)系集合
? ? ? ?4.笛卡爾乘積,選擇和投影運算如下
第三節(jié)
一、相關(guān)概念
? ? ? ?1.?SQL:結(jié)構(gòu)化查詢語言的簡稱,?是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。SQL?是一種通用的、?功能極強的關(guān)系數(shù)據(jù)庫語言,?是對關(guān)系數(shù)據(jù)存取的標(biāo)準(zhǔn)接口,?也是不同數(shù)據(jù)庫系統(tǒng)之間互操作的基礎(chǔ)。集數(shù)據(jù)查詢、數(shù)據(jù)操作、數(shù)據(jù)定義、和數(shù)據(jù)控制功能于一體。
? ? ? ?2.?數(shù)據(jù)定義:數(shù)據(jù)定義功能包括模式定義、表定義、視圖和索引的定義。
? ? ? ?3.?嵌套查詢:指將一個查詢塊嵌套在另一個查詢塊的?WHERE?子句或?HAVING?短語的條件中的查詢。
? ? ? 二、重要知識點
? ? ? ?1. SQL 數(shù)據(jù)定義語句的操作對象有:模式、表、視圖和索引。
? ? ? ?2. SQL 數(shù)據(jù)定義語句的命令動詞是:CREATE、DROP 和 ALTER。
? ? ? ?3. RDBMS 中索引一般采用 B+樹或 HASH 來實現(xiàn)。
? ? ? ?4. 索引可以分為唯一索引、非唯一索引和聚簇索引三種類型。
? ? ? ?6.SQL?創(chuàng)建表語句的一般格式為
? ? ? ?? ? ? ?CREATE?TABLE?
? ? ? ?? ? ? ?(?
? ? ? ?? ? ? ?[,
? ? ? ?? ? ? ?[,
其中
? ? 列級完整性約束為針對單個列(本列)的完整性約束,?包括?PRIMARY?KEY、?REFERENCES表名(列名)、UNIQUE、NOT?NULL?等。?
? ? 表級完整性約束可以是基于表中多列的約束,包括?PRIMARY?KEY?(?列名列表)?、FOREIGN?KEY?REFERENCES?表名(列名)?等。
? ? ? ?7.?SQL?創(chuàng)建索引語句的一般格式為
? ? ? ?? ? ? ?CREATE?[UNIQUE]?[CLUSTER]?INDEX?
? ? ? ?? ? ? ?ON?
其中UNIQUE:表示創(chuàng)建唯一索引,缺省為非唯一索引;
? ? ? CLUSTER:表示創(chuàng)建聚簇索引,缺省為非聚簇索引;
? ? ?
? ? ? ??8.?SQL?查詢語句的一般格式為
? ? ? ?? ? ? ?SELECT?[ALL|DISTINCT]?
? ? ? ?? ? ? ?[?WHERE?
? ? ? ?? ? ? ?[?GROUP?BY?
? ? ? ?? ? ? ?[?ORDER?BY?
其中
? ? ??ALL/DISTINCT:?缺省為?ALL,?即列出所有查詢結(jié)果記錄,?包括重復(fù)記錄。?DISTINCT則對重復(fù)記錄只列出一條。
? ? ???算術(shù)表達式列表:一個或多個逗號分隔的算術(shù)表達式,表達式由常量(包括數(shù)字和字符串)、列名、函數(shù)和算術(shù)運算符構(gòu)成。每個表達式后還可跟別名。也可用?*代表查詢表中的所有列。
? ? ??
? ? ??條件表達式?1:包含關(guān)系或邏輯運算符的表達式,代表查詢條件。
? ? ??條件表達式?2:包含關(guān)系或邏輯運算符的表達式,代表分組條件。
? ? ??
? ? ??
? ? ? 關(guān)于SQL語句的知識這里先作如上簡略介紹,具體寫法下次將專門拿出一篇來敘述。
第四節(jié)
一、相關(guān)概念和知識
? ? ? ?1.觸發(fā)器是用戶定義在基本表上的一類由事件驅(qū)動的特殊過程。由服務(wù)器自動激活,?能執(zhí)行更為復(fù)雜的檢查和操作,具有更精細和更強大的數(shù)據(jù)控制能力。使用?CREATE?TRIGGER?命令建立觸發(fā)器。
? ? ? ?2.計算機系統(tǒng)存在技術(shù)安全、管理安全和政策法律三類安全性問題。
? ? ? ?3.?TCSEC/TDI?標(biāo)準(zhǔn)由安全策略、責(zé)任、保證和文檔四個方面內(nèi)容構(gòu)成。
? ? ? ?4.?常用存取控制方法包括自主存取控制(DAC)和強制存取控制(MAC)兩種。
? ? ? ?5.?自主存取控制(DAC)的?SQL?語句包括?GRANT?和?REVOKE?兩個。?用戶權(quán)限由數(shù)據(jù)對象和操作類型兩部分構(gòu)成。
? ? ? ?6.?常見SQL 自主權(quán)限控制命令和例子。
? ? ? ? ?1) 把對 Student 和 Course 表的全部權(quán)限授予所有用戶。
? ? ? ?? ? ? ?GRANT ALL PRIVILIGES ON TABLE Student,Course TO PUBLIC ;
? ? ? ? ?2) 把對 Student 表的查詢權(quán)和姓名修改權(quán)授予用戶 U4。
? ? ? ?? ? ? ?GRANT SELECT,UPDATE(Sname) ON TABLE Student TO U4 ;
? ? ? ? ?3) 把對 SC 表的插入權(quán)限授予 U5 用戶,并允許他傳播該權(quán)限。
? ? ? ?? ? ? ?GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION ;
? ? ? ? ?4) 把用戶 U5 對 SC 表的 INSERT 權(quán)限收回,同時收回被他傳播出去的授權(quán)。
? ? ? ?? ? ? ?REVOKE INSERT ON TABLE SC FROM U5 CASCADE ;
? ? ? ? ?5) 創(chuàng)建一個角色 R1,并使其對 Student 表具有數(shù)據(jù)查詢和更新權(quán)限。
? ? ? ?? ? ? ?CREATE ROLE R1;
? ? ? ?? ? ? ?GRANT SELECT,UPDATE ON TABLE Student TO R1;
? ? ? ? ?6) 對修改 Student 表結(jié)構(gòu)的操作進行審計。
? ? ? ?? ? ? ?AUDIT ALTER ON Student ;
數(shù)據(jù)庫知識總結(jié)(2)范式
?一、相關(guān)概念和知識點
? ? ? ?1.數(shù)據(jù)依賴:反映一個關(guān)系內(nèi)部屬性與屬性之間的約束關(guān)系,是現(xiàn)實世界屬性間相互聯(lián)系的抽象,屬于數(shù)據(jù)內(nèi)在的性質(zhì)和語義的體現(xiàn)。
? ? ? ?2.?規(guī)范化理論:是用來設(shè)計良好的關(guān)系模式的基本理論。它通過分解關(guān)系模式來消除其中不合適的數(shù)據(jù)依賴,以解決插入異常、刪除異常、更新異常和數(shù)據(jù)冗余問題。
? ? ? ?3.?函數(shù)依賴:簡單地說,對于關(guān)系模式的兩個屬性子集X和Y,若X的任一取值能唯一確定Y的值,則稱Y函數(shù)依賴于X,記作X→Y。
? ? ? ?4.?非平凡函數(shù)依賴:對于關(guān)系模式的兩個屬性子集X和Y,如果X→Y,但Y!?X,則稱X→Y為非平凡函數(shù)依賴;如果X→Y,但Y?X,則稱X→Y為非平凡函數(shù)依賴。
? ? ? ?5.?完全函數(shù)依賴:對于關(guān)系模式的兩個屬性子集X和Y,如果X→Y,并且對于X的任何一個真子集X',都沒有X'→Y,則稱Y對X完全函數(shù)依賴。
? ? ? ?6.?范式:指符合某一種級別的關(guān)系模式的集合。在設(shè)計關(guān)系數(shù)據(jù)庫時,根據(jù)滿足依賴關(guān)系要求的不同定義為不同的范式。
? ? ? ?7.?規(guī)范化:指將一個低一級范式的關(guān)系模式,通過模式分解轉(zhuǎn)換為若干個高一級范式的關(guān)系模式的集合的過程。
? ? ? ?8.?1NF:若關(guān)系模式的所有屬性都是不可分的基本數(shù)據(jù)項,則該關(guān)系模式屬于1NF。
? ? ? ?9.?2NF:1NF關(guān)系模式如果同時滿足每一個非主屬性完全函數(shù)依賴于碼,則該關(guān)系模式屬于2NF。
? ? ? ?10.?3NF:若關(guān)系模式的每一個非主屬性既不部分依賴于碼也不傳遞依賴于碼,則該關(guān)系模式屬于3NF。
? ? ? ?11.?BCNF:若一個關(guān)系模式的每一個決定因素都包含碼,則該關(guān)系模式屬于BCNF。
? ? ? ?12.?數(shù)據(jù)庫設(shè)計:是指對于一個給定的應(yīng)用環(huán)境,構(gòu)造優(yōu)化的數(shù)據(jù)庫邏輯模式和物理結(jié)構(gòu),并據(jù)此建立數(shù)據(jù)庫及其應(yīng)用系統(tǒng),使之能夠有效地存儲和管理數(shù)據(jù),滿足各種用戶的應(yīng)用需求,包括信息管理要求和數(shù)據(jù)操作要求。
? ? ? ?13. 數(shù)據(jù)庫設(shè)計的6個基本步驟:需求分析,概念結(jié)構(gòu)設(shè)計,邏輯結(jié)構(gòu)設(shè)計,物理結(jié)構(gòu)設(shè)計,數(shù)據(jù)庫實施,數(shù)據(jù)庫運行和維護。
? ? ? ?14.?概念結(jié)構(gòu)設(shè)計:指將需求分析得到的用戶需求抽象為信息結(jié)構(gòu)即概念模型的過程。也就是通過對用戶需求進行綜合、歸納與抽象,形成一個獨立于具體DBMS的概念模型。
? ? ? ?15.?邏輯結(jié)構(gòu)設(shè)計:將概念結(jié)構(gòu)模型(基本E-R圖)轉(zhuǎn)換為某個DBMS產(chǎn)品所支持的數(shù)據(jù)模型相符合的邏輯結(jié)構(gòu),并對其進行優(yōu)化。
? ? ? ?16.?物理結(jié)構(gòu)設(shè)計:指為一個給定的邏輯數(shù)據(jù)模型選取一個最適合應(yīng)用環(huán)境的物理結(jié)構(gòu)的過程。包括設(shè)計數(shù)據(jù)庫的存儲結(jié)構(gòu)與存取方法。
? ? ? ?17.?抽象:指對實際的人、物、事和概念進行人為處理,抽取所關(guān)心的共同特性,忽略非本質(zhì)的細節(jié),并把這些特性用各種概念精確地加以描述,這些概念組成了某種模型。
? ? ? ?18.?數(shù)據(jù)庫設(shè)計必須遵循結(jié)構(gòu)設(shè)計和行為設(shè)計相結(jié)合的原則。
? ? ? ?19.?數(shù)據(jù)字典主要包括數(shù)據(jù)項、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)流、數(shù)據(jù)存儲和處理過程五個部分。
? ? ? ?20. 三種常用抽象方法是分類、聚集和概括。
? ? ? ?21. 局部 E-R 圖之間的沖突主要表現(xiàn)在屬性沖突、命名沖突和結(jié)構(gòu)沖突三個方面。
? ? ? ?22. 數(shù)據(jù)庫常用的存取方法包括索引方法、聚簇方法和 HASH方法三種。
? ? ? ?23. 確定數(shù)據(jù)存放位置和存儲結(jié)構(gòu)需要考慮的因素主要有:?存取時間、 存儲空間利用率和維護代價等。
二、細說數(shù)據(jù)庫三范式
2.1?第一范式(1NF)無重復(fù)的列
? ? ? ?第一范式(1NF)中數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項
? ? ? ?同一列中不能有多個值
? ? ? ?即實體中的某個屬性不能有多個值或者不能有重復(fù)的屬性。
? ? ? ?簡而言之,第一范式就是無重復(fù)的列。
? ? ? ?在任何一個關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的基本要求,不滿足第一范式(1NF)的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。
2.2?第二范式(2NF)屬性完全依賴于主鍵[消除部分子函數(shù)依賴]
? ? ? 滿足第二范式(2NF)必須先滿足第一范式(1NF)。
? ? ? 第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或行必須可以被惟一地區(qū)分。
? ? ? 為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的惟一標(biāo)識。?
? ? ? 第二范式(2NF)要求實體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實體,新實體與原實體之間是一對多的關(guān)系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的惟一標(biāo)識。簡而言之,第二范式就是屬性完全依賴于主鍵。
2.3?第三范式(3NF)屬性不依賴于其它非主屬性[消除傳遞依賴]
? ? ? 滿足第三范式(3NF)必須先滿足第二范式(2NF)。
? ? ? 簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。
? ? ? 例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。
2.4 具體實例剖析
? ? ? 下面列舉一個學(xué)校的學(xué)生系統(tǒng)的實例,以示幾個范式的應(yīng)用。
? ? ? ?在設(shè)計數(shù)據(jù)庫表結(jié)構(gòu)之前,我們先確定一下要設(shè)計的內(nèi)容包括那些。學(xué)號、學(xué)生姓名、年齡、性別、課程、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話等信息。為了簡單我們暫時只考慮這些字段信息。我們對于這些信息,說關(guān)心的問題有如下幾個方面。
? ? ? ?1)學(xué)生有那些基本信息?
? ? ? ?2)學(xué)生選了那些課,成績是什么?
? ? ? ?3)每個課的學(xué)分是多少?
? ? ? ?4)學(xué)生屬于那個系,系的基本信息是什么。
? ? ? ?首先第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構(gòu)成,包括整型、實數(shù)、字符型、邏輯型、日期型等。在當(dāng)前的任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,不允許你把數(shù)據(jù)庫表的一列再分成二列或多列,因此做出的都是符合第一范式的數(shù)據(jù)庫。?
? ? ? ?我們再考慮第二范式,把所有這些信息放到一個表中(學(xué)號,學(xué)生姓名、年齡、性別、課程、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話)下面存在如下的依賴關(guān)系。?
? ? ? ?1)(學(xué)號)→?(姓名,?年齡,性別,系別,系辦地址、系辦電話)?
? ? ? ?2) (課程名稱)?→?(學(xué)分)?
? ? ? ?3)(學(xué)號,課程)→?(學(xué)科成績)
根據(jù)依賴關(guān)系我們可以把選課關(guān)系表SelectCourse改為如下三個表:?
? ? ? ?學(xué)生:Student(學(xué)號,姓名,?年齡,性別,系別,系辦地址、系辦電話);?
? ? ? ?課程:Course(課程名稱,?學(xué)分);?
? ? ? ?選課關(guān)系:SelectCourse(學(xué)號,?課程名稱,?成績)。
? ? ? ?事實上,對照第二范式的要求,這就是滿足第二范式的數(shù)據(jù)庫表,若不滿足第二范式,會產(chǎn)生如下問題?
數(shù)據(jù)冗余:?同一門課程由n個學(xué)生選修,"學(xué)分"就重復(fù)n-1次;同一個學(xué)生選修了m門課程,姓名和年齡就重復(fù)了m-1次。
更新異常:?1)若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的"學(xué)分"值都要更新,否則會出現(xiàn)同一門課程學(xué)分不同的情況。?
? ? ? ? ? ? ? ? ?2)假設(shè)要開設(shè)一門新的課程,暫時還沒有人選修。這樣,由于還沒有"學(xué)號"關(guān)鍵字,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。
刪除異常?:?假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是,與此同時,課程名稱和學(xué)分信息也被刪除了。很顯然,這也會導(dǎo)致插入異常。
? ? ? ?我們再考慮如何將其改成滿足第三范式的數(shù)據(jù)庫表,接著看上面的學(xué)生表Student(學(xué)號,姓名,?年齡,性別,系別,系辦地址、系辦電話),關(guān)鍵字為單一關(guān)鍵字"學(xué)號",因為存在如下決定關(guān)系:
? ? ? (學(xué)號)→?(姓名,?年齡,性別,系別,系辦地址、系辦電話)?
但是還存在下面的決定關(guān)系?
? ? ? ?(學(xué)號)?→?(所在學(xué)院)→(學(xué)院地點,?學(xué)院電話)?
? ? ? ? 即存在非關(guān)鍵字段"學(xué)院地點"、"學(xué)院電話"對關(guān)鍵字段"學(xué)號"的傳遞函數(shù)依賴。?
? ? ? ?它也會存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況(這里就不具體分析了,參照第二范式中的分析)。根據(jù)第三范式把學(xué)生關(guān)系表分為如下兩個表就可以滿足第三范式了:
? ? ? ?學(xué)生:(學(xué)號,?姓名,?年齡,?性別,系別);?
? ? ? ?系別:(系別,?系辦地址、系辦電話)。
SQL語句總結(jié)
SQL語句中常用關(guān)鍵詞及其解釋如下:
1)SELECT
將資料從數(shù)據(jù)庫中的表格內(nèi)選出,兩個關(guān)鍵字:從 (FROM) 數(shù)據(jù)庫中的表格內(nèi)選出 (SELECT)。語法為
SELECT "欄位名" FROM "表格名"。
2)DISTINCT
在上述 SELECT 關(guān)鍵詞后加上一個 DISTINCT 就可以去除選擇出來的欄位中的重復(fù),從而完成求得這個表格/欄位內(nèi)有哪些不同的值的功能。語法為
SELECT DISTINCT "欄位名" FROM "表格名"。
3)WHERE
這個關(guān)鍵詞可以幫助我們選擇性地抓資料,而不是全取出來。語法為
SELECT "欄位名" FROM "表格名" WHERE "條件"?
4)AND
OR
上例中的 WHERE 指令可以被用來由表格中有條件地選取資料。這個條件可能是簡單的 (像上一頁的例子),也可能是復(fù)雜的。復(fù)雜條件是由二或多個簡單條件透過 AND 或是 OR 的連接而成。語法為:
SELECT "欄位名" ?FROM "表格名" ?WHERE "簡單條件" ?{[AND|OR] "簡單條件"}+
5)IN
在 SQL 中,在兩個情況下會用到 IN ?這個指令;這一頁將介紹其中之一:與 WHERE 有關(guān)的那一個情況。在這個用法下,我們事先已知道至少一個我們需要的值,而我們將這些知道的值都放入 IN ?這個子句。語法為:
SELECT "欄位名" ?FROM "表格名" ?WHERE "欄位名" IN ('值一', '值二', ...) ?
6)BETWEEN
IN 這個指令可以讓我們依照一或數(shù)個不連續(xù) (discrete)的值的限制之內(nèi)抓出資料庫中的值,而 BETWEEN 則是讓我們可以運用一個范圍 (range) ?內(nèi)抓出資料庫中的值,語法為:
SELECT "欄位名" ?FROM "表格名" WHERE "欄位名" BETWEEN '值一' AND '值二'?
7)LIKE
LIKE 是另一個在 WHERE ?子句中會用到的指令。基本上, LIKE ?能讓我們依據(jù)一個模式(pattern) 來找出我們要的資料。語法為:
SELECT "欄位名" ?FROM "表格名" ?WHERE "欄位名" LIKE {模式}?
8)ORDER
BY
我們經(jīng)常需要能夠?qū)⒆コ龅馁Y料做一個有系統(tǒng)的顯示。這可能是由小往大 (ascending) ?或是由大往小(descending)。在這種情況下,我們就可以運用 ORDER BY 這個指令來達到我們的目的。語法為:
SELECT "欄位名" ?FROM "表格名 [WHERE "條件"] ORDER BY "欄位名" [ASC, DESC]?
9)函數(shù)
函數(shù)允許我們能夠?qū)@些數(shù)字的型態(tài)存在的行或者列做運算,包括 AVG (平均)、COUNT (計數(shù))、MAX (最大值)、MIN (最小值)、SUM (總合)。語法為:
SELECT "函數(shù)名"("欄位名") FROM "表格名" ?
10)COUNT
這個關(guān)鍵詞能夠幫我我們統(tǒng)計有多少筆資料被選出來,語法為:
SELECT COUNT("欄位名") FROM "表格名"
11)GROUP
BY
GROUP BY 語句用于結(jié)合合計函數(shù),根據(jù)一個或多個列對結(jié)果集進行分組。語法為:
SELECT "欄位1", SUM("欄位2") ?FROM "表格名" ?GROUP BY "欄位1"?
12)HAVING
該關(guān)鍵詞可以幫助我們對函數(shù)產(chǎn)生的值來設(shè)定條件。語法為:
SELECT "欄位1", SUM("欄位2") ?FROM "表格名" ?GROUP BY "欄位1" ?HAVING (函數(shù)條件) ?
13)ALIAS
我們可以通過ALIAS為列名稱和表名稱指定別名,語法為:
SELECT "表格別名"."欄位1" "欄位別名" ?FROM "表格名" "表格別名" ?
下面為一個例子,通過它我們應(yīng)該能很好地掌握以上關(guān)鍵詞的使用方法。
Student(S#,Sname,Sage,Ssex) 學(xué)生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
問題:
1、查詢“001”課程比“002”課程成績高的所有學(xué)生的學(xué)號;
select a.S#
from (select s#,score from SC where C#=’001′) a,
(select s#,score from SC where C#=’002′) b
where a.score>b.score and a.s#=b.s#;
2、查詢平均成績大于60分的同學(xué)的學(xué)號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查詢所有同學(xué)的學(xué)號、姓名、選課數(shù)、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查詢姓“李”的老師的個數(shù);
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;
5、查詢沒學(xué)過“葉平”老師課的同學(xué)的學(xué)號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’);
6、查詢學(xué)過“001”并且也學(xué)過編號“002”課程的同學(xué)的學(xué)號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# and SC.C#=’001′and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);
7、查詢學(xué)過“葉平”老師所教的所有課的同學(xué)的學(xué)號、姓名;
select S#,Sname
from Student
where S# in
(select S#
from SC ,Course ,Teacher
where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’葉平’));
8、查詢所有課程成績小于60分的同學(xué)的學(xué)號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
9、查詢沒有學(xué)全所有課的同學(xué)的學(xué)號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S#
group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
10、查詢至少有一門課與學(xué)號為“1001”的同學(xué)所學(xué)相同的同學(xué)的學(xué)號和姓名;
select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');
11、刪除學(xué)習(xí)“葉平”老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';
12、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# 課程ID,L.score 最高分,R.score 最低分
FROM SC L ,SC R
WHERE L.C# = R.C#
and
L.score = (SELECT MAX(IL.score)
FROM SC IL,Student IM
WHERE IL.C# = L.C# and IM.S#=IL.S#
GROUP BY IL.C#)
and
R.Score = (SELECT MIN(IR.score)
FROM SC IR
WHERE IR.C# = R.C#
GROUP BY IR.C# );
13、查詢學(xué)生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S# ) T1
WHERE 平均成績 > T2.平均成績) 名次, S# 學(xué)生學(xué)號,平均成績
FROM (SELECT S#,AVG(score) 平均成績 FROM SC GROUP BY S# ) T2
ORDER BY 平均成績 desc;
14、查詢各科成績前三名的記錄:(不考慮成績并列情況)
SELECT t1.S# as 學(xué)生ID,t1.C# as 課程ID,Score as 分?jǐn)?shù)
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC)
ORDER BY t1.C#;
15、查詢每門功成績最好的前兩名
SELECT t1.S# as 學(xué)生ID,t1.C# as 課程ID,Score as 分?jǐn)?shù)
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )
ORDER BY t1.C#;
原文網(wǎng)址鏈接:數(shù)據(jù)庫及SQL----常用知識點總結(jié)