《數據庫系統概論》知識整理

第一節

      一、相關概念

       1. Data:數據,是數據庫中存儲的基本對象,是描述事物的符號記錄。
       2. Database:數據庫,是長期儲存在計算機內、有組織的、可共享的大量數據的集合。
       3. DBMS:數據庫管理系統,是位於用戶與操作系統之間的一層數據管理軟件,用於科學地組織、存儲和管理數據、高效地獲取和維護數據。
       4. DBS:數據庫系統,指在計算機系統中引入數據庫後的系統,一般由數據庫、數據庫管理系統、應用系統、數據庫管理員(DBA)構成。
       5. 數據模型:是用來抽象、表示和處理現實世界中的數據和信息的工具,是對現實世界的模擬,是數據庫系統的核心和基礎;其組成元素有數據結構、數據操作和完整性約束。
       6. 概念模型:也稱信息模型,是按用戶的觀點來對數據和信息建模,主要用於數據庫設計。
       7. 邏輯模型:是按計算機系統的觀點對數據建模,用於DBMS實現。
       8. 物理模型:是對數據最底層的抽象,描述數據在系統內部的表示方式和存取方法,在磁盤或磁帶上的存儲方式和存取方法,是面向計算機系統的。
       9. 實體和屬性:客觀存在並可相互區別的事物稱爲實體。實體所具有的某一特性稱爲屬性。
       10.E-R圖:即實體-關係圖,用於描述現實世界的事物及其相互關係,是數據庫概念模型設計的主要工具。
       11.關係模式:從用戶觀點看,關係模式是由一組關係組成,每個關係的數據結構是一張規範化的二維表。
       12.型/值:型是對某一類數據的結構和屬性的說明;值是型的一個具體賦值,是型的實例。
       13.數據庫模式:是對數據庫中全體數據的邏輯結構(數據項的名字、類型、取值範圍等)和特徵(數據之間的聯繫以及數據有關的安全性、完整性要求)的描述。
       14.數據庫的三級系統結構:外模式、模式和內模式。
       15.數據庫內模式:又稱爲存儲模式,是對數據庫物理結構和存儲方式的描述,是數據在數據庫內部的表示方式。一個數據庫只有一個內模式。
       16.數據庫外模式:又稱爲子模式或用戶模式,它是數據庫用戶能夠看見和使用的局部數據的邏輯結構和特徵的描述,是數據庫用戶的數據視圖。通常是模式的子集。一個數據庫可有多個外模式。
       17.數據庫的二級映像:外模式/模式映像、模式/內模式映像。

 

     

 二、重點知識點

       1. 數據庫系統由數據庫、數據庫管理系統、應用系統和數據庫管理員構成。

       2. 數據模型的組成要素是:數據結構、數據操作、完整性約束條件。

       3. 實體型之間的聯繫分爲一對一、一對多和多對多三種類型。

       4. 常見的數據模型包括:關係、層次、網狀、面向對象、對象關係映射等幾種。

       5. 關係模型的完整性約束包括:實體完整性、參照完整性和用戶定義完整性。

      6. 闡述數據庫三級模式、二級映象的含義及作用。
        數據庫三級模式反映的是數據的三個抽象層次: 
模式是對數據庫中全體數據的邏輯結構和特徵的描述。內模式又稱爲存儲模式,是對數據庫物理結構和存儲方式的描述。外模式又稱爲子模式或用戶模式,是對特定數據庫用戶相關的局部數據的邏輯結構和特徵的描述
 

        數據庫三級模式通過二級映象在 DBMS 內部實現這三個抽象層次的聯繫和轉換。外模式面向應用程序, 通過外模式/模式映象與邏輯模式建立聯繫, 實現數據的邏輯獨立性。 模式/內模式映象建立模式與內模式之間的一對一映射, 實現數據的物理獨立性。

第二節

一、相關概念

       1. 主鍵 能夠唯一地標識一個元組的屬性或屬性組稱爲關係的鍵或候選鍵 若一個關係有多個候選則可選其一作爲主(Primary key)

       2. 外鍵:如果一個關係的一個或一組屬性引用(參照)了另一個關係的主鍵,則稱這個或這組屬性爲外碼或外鍵(Foreign key)

       3. 關係數據庫: 依照關係模型建立的數據庫稱爲關係數據庫。 它是在某個應用領域的所有關係的集合。

       4. 關係模式: 簡單地說,關係模式就是對關係的型的定義, 包括關係的屬性構成、各屬性的數據類型、 屬性間的依賴、 元組語義及完整性約束等。 關係是關係模式在某一時刻的狀態或內容, 關係模型是型, 關係是值, 關係模型是靜態的、 穩定的, 而關係是動態的、隨時間不斷變化的,因爲關係操作在不斷地更新着數據庫中的數據。

       5. . 實體完整性:用於標識實體的唯一性。它要求基本關係必須要有一個能夠標識元組唯一性的主鍵,主鍵不能爲空,也不可取重複值

       6. 參照完整性   用於維護實體之間的引用關係。 它要求一個關係的外鍵要麼爲空, 要麼取與被參照關係對應的主鍵值,即外鍵值必須是主鍵中已存在的值

       7. 用戶定義的完整性:就是針對某一具體應用的數據必須滿足的語義約束。包括非空、 唯一和布爾條件約束三種情況。

      二、重要知識點

      1. 關係數據庫語言分爲關係代數、關係演算和結構化查詢語言三大類。

      2. 關係的 5 種基本操作是選擇、投影、並、差、笛卡爾積。

      3.關係模式是對關係的描述,五元組形式化表示爲:RUDDOMF),其中

            R —— 關係名

            U —— 組成該關係的屬性名集合

            D —— 屬性組 U 中屬性所來自的域

            DOM —— 屬性向域的映象集合

            F —— 屬性間的數據依賴關係集合

       4.笛卡爾乘積,選擇和投影運算如下

https://img-blog.csdn.net/20130903203749812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFvcWlhbmcyMDEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

第三節

一、相關概念

       1. SQL:結構化查詢語言的簡稱, 是關係數據庫的標準語言。SQL 是一種通用的、 功能極強的關係數據庫語言, 是對關係數據存取的標準接口, 也是不同數據庫系統之間互操作的基礎。集數據查詢、數據操作、數據定義、和數據控制功能於一體。

       2. 數據定義:數據定義功能包括模式定義、表定義、視圖和索引的定義。

       3. 嵌套查詢:指將一個查詢塊嵌套在另一個查詢塊的 WHERE 子句或 HAVING 短語的條件中的查詢。

      二、重要知識點
 

       1. SQL 數據定義語句的操作對象有:模式、表、視圖和索引。
       2. SQL 數據定義語句的命令動詞是:CREATE、DROP 和 ALTER。
       3. RDBMS(關係型數據庫管理系統) 中索引一般採用 B+樹或 HASH 來實現。
       4. 索引可以分爲唯一索引、非唯一索引和聚簇索引三種類型。

 

https://img-blog.csdn.net/20130903204444156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFvcWlhbmcyMDEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
 

       6.SQL 創建表語句的一般格式爲

              CREATE TABLE <表名>

              ( <列名> <數據類型>[ <列級完整性約束> ]

              [<列名> <數據類型>[ <列級完整性約束>] ] 

              [<表級完整性約束> ] ) 

其中<數據類型>可以是數據庫系統支持的各種數據類型,包括長度和精度。 

    列級完整性約束爲針對單個列(本列)的完整性約束, 包括 PRIMARY KEY、 REFERENCES表名()UNIQUENOT NULL 等。 

    表級完整性約束可以是基於表中多列的約束,包括 PRIMARY KEY ( 列名列表FOREIGN KEY REFERENCES 表名(列名等。


 

       7. SQL 創建索引語句的一般格式爲

              CREATE [UNIQUE] [CLUSTER] INDEX <索引名>

              ON <表名> (<列名列表> ) 

其中UNIQUE:表示創建唯一索引,缺省爲非唯一索引;

      CLUSTER:表示創建聚簇索引,缺省爲非聚簇索引;

      <列名列表>:一個或逗號分隔的多個列名,每個列名後可跟 ASC 或 DESC,表示升/降序,缺省爲升序。多列時則按爲多級排序。

 

        8. SQL 查詢語句的一般格式爲

              SELECT [ALLDISTINCT] <算術表達式列表> FROM <表名或視圖名列表>

              [ WHERE <條件表達式 1> ]

              [ GROUP BY <屬性列表 1> [ HAVING <條件表達式 2 > ] ]

              [ ORDER BY <屬性列表 2> [ ASCDESC ] ] 

其中

      ALLDISTINCT: 缺省爲 ALL, 即列出所有查詢結果記錄, 包括重複記錄。 DISTINCT則對重複記錄只列出一條。

       算術表達式列表:一個或多個逗號分隔的算術表達式,表達式由常量(包括數字和字符串)、列名、函數和算術運算符構成。每個表達式後還可跟別名。也可用 *代表查詢表中的所有列。

      <表名或視圖名列表>: 一個或多個逗號分隔的表或視圖名。 表或視圖名後可跟別名。

      條件表達式 1:包含關係或邏輯運算符的表達式,代表查詢條件。

      條件表達式 2:包含關係或邏輯運算符的表達式,代表分組條件。

      <屬性列表 1>:一個或逗號分隔的多個列名。

      <屬性列表 2>: 一個或逗號分隔的多個列名, 每個列名後可跟 ASC 或 DESC, 表示升/降序,缺省爲升序。

 

      關於SQL語句的知識這裏先作如上簡略介紹,具體寫法下次將專門拿出一篇來敘述。

 

第四節

一、相關概念和知識

       1.觸發器是用戶定義在基本表上的一類由事件驅動的特殊過程。由服務器自動激活, 能執行更爲複雜的檢查和操作,具有更精細和更強大的數據控制能力。使用 CREATE TRIGGER 命令建立觸發器。

       2.計算機系統存在技術安全、管理安全和政策法律三類安全性問題。

       3. TCSEC/TDI 標準由安全策略、責任、保證和文檔四個方面內容構成。

       4. 常用存取控制方法包括自主存取控制(DAC)和強制存取控制(MAC)兩種。

       5. 自主存取控制(DAC) SQL 語句包括 GRANT 和 REVOKE 兩個。 用戶權限由數據對象和操作類型兩部分構成。

https://img-blog.csdn.net/20130903205901156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFvcWlhbmcyMDEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

       6. 常見SQL 自主權限控制命令和例子。
         1) 把對 Student Course 表的全部權限授予所有用戶。
              GRANT ALL PRIVILIGES ON TABLE StudentCourse TO PUBLIC
         2) 把對 Student 表的查詢權和姓名修改權授予用戶 U4
              GRANT SELECTUPDATE(Sname) ON TABLE Student TO U4
         3) 把對 SC 表的插入權限授予 U5 用戶,並允許他傳播該權限。
              GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION
         4) 把用戶 U5 SC 表的 INSERT 權限收回,同時收回被他傳播出去的授權。
              REVOKE INSERT ON TABLE SC FROM U5 CASCADE
         5) 創建一個角色 R1,並使其對 Student 表具有數據查詢和更新權限。
              CREATE ROLE R1
              GRANT SELECTUPDATE ON TABLE Student TO R1
         6) 對修改 Student 表結構的操作進行審計。
              AUDIT ALTER ON Student

數據庫知識總結(2)範式

 一、相關概念和知識點

       1.數據依賴:反映一個關係內部屬性與屬性之間的約束關係,是現實世界屬性間相互聯繫的抽象,屬於數據內在的性質和語義的體現。
       2. 
規範化理論:是用來設計良好的關係模式的基本理論。它通過分解關係模式來消除其中不合適的數據依賴,以解決插入異常、刪除異常、更新異常和數據冗餘問題。
       3. 
函數依賴:簡單地說,對於關係模式的兩個屬性子集X和Y,若X的任一取值能唯一確定Y的值,則稱Y函數依賴於X,記作X→Y。
       4. 
非平凡函數依賴:對於關係模式的兩個屬性子集X和Y,如果X→Y,但Y!X,則稱X→Y爲非平凡函數依賴;如果X→Y,但YX,則稱X→Y爲非平凡函數依賴。
       5. 
完全函數依賴:對於關係模式的兩個屬性子集X和Y,如果X→Y,並且對於X的任何一個真子集X',都沒有X'→Y,則稱Y對X完全函數依賴。
       6. 
範式:指符合某一種級別的關係模式的集合。在設計關係數據庫時,根據滿足依賴關係要求的不同定義爲不同的範式。
       7. 
規範化:指將一個低一級範式的關係模式,通過模式分解轉換爲若干個高一級範式的關係模式的集合的過程。
       8. 
1NF:若關係模式的所有屬性都是不可分的基本數據項,則該關係模式屬於1NF。
       9. 
2NF:1NF關係模式如果同時滿足每一個非主屬性完全函數依賴於碼,則該關係模式屬於2NF。
       10. 
3NF:若關係模式的每一個非主屬性既不部分依賴於碼也不傳遞依賴於碼,則該關係模式屬於3NF。
       11. 
BCNF:若一個關係模式的每一個決定因素都包含碼,則該關係模式屬於BCNF。
       12. 
數據庫設計:是指對於一個給定的應用環境,構造優化的數據庫邏輯模式和物理結構,並據此建立數據庫及其應用系統,使之能夠有效地存儲和管理數據,滿足各種用戶的應用需求,包括信息管理要求和數據操作要求。
       13. 數據庫設計的6個基本步驟:
需求分析,概念結構設計,邏輯結構設計,物理結構設計,數據庫實施,數據庫運行和維護
       14. 
概念結構設計:指將需求分析得到的用戶需求抽象爲信息結構即概念模型的過程。也就是通過對用戶需求進行綜合、歸納與抽象,形成一個獨立於具體DBMS的概念模型。
       15. 
邏輯結構設計:將概念結構模型(基本E-R圖)轉換爲某個DBMS產品所支持的數據模型相符合的邏輯結構,並對其進行優化。
       16. 
物理結構設計:指爲一個給定的邏輯數據模型選取一個最適合應用環境的物理結構的過程。包括設計數據庫的存儲結構與存取方法。
       17. 
抽象:指對實際的人、物、事和概念進行人爲處理,抽取所關心的共同特性,忽略非本質的細節,並把這些特性用各種概念精確地加以描述,這些概念組成了某種模型。

       18. 數據庫設計必須遵循結構設計和行爲設計相結合的原則。

       19. 數據字典主要包括數據項、數據結構、數據流、數據存儲和處理過程五個部分。
       20. 三種常用抽象方法是
分類、聚集和概括
       21. 局部 E-R 圖之間的衝突主要表現在
屬性衝突、命名衝突和結構衝突三個方面。

       22. 數據庫常用的存取方法包括索引方法、聚簇方法和 HASH方法三種。
       23. 確定數據存放位置和存儲結構需要考慮的因素主要有:
 存取時間、 存儲空間利用率和維護代價等。

二、細說數據庫三範式

2.1 第一範式(1NF)無重複的列

       第一範式(1NF)中數據庫表的每一列都是不可分割的基本數據項
       同一列中不能有多個值
       即實體中的某個屬性不能有多個值或者不能有重複的屬性。
       簡而言之,第一範式就是無重複的列。

 

       在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不滿足第一範式(1NF)的數據庫就不是關係數據庫。

2.2 第二範式(2NF)屬性完全依賴於主鍵[消除部分子函數依賴]

      滿足第二範式(2NF)必須先滿足第一範式(1NF)。

      第二範式(2NF)要求數據庫表中的每個實例或行必須可以被惟一地區分。

      爲實現區分通常需要爲表加上一個列,以存儲各個實例的惟一標識。 
      第二範式(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分通常需要爲表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二範式就是屬性完全依賴於主鍵。

2.3 第三範式(3NF)屬性不依賴於其它非主屬性[消除傳遞依賴]

      滿足第三範式(3NF)必須先滿足第二範式(2NF)。

      簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。

      例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那麼在的員工信息表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據第三範式(3NF)也應該構建它,否則就會有大量的數據冗餘。簡而言之,第三範式就是屬性不依賴於其它非主屬性。

2.4 具體實例剖析

      下面列舉一個學校的學生系統的實例,以示幾個範式的應用。

       在設計數據庫表結構之前,我們先確定一下要設計的內容包括那些。學號、學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦地址、系辦電話等信息。爲了簡單我們暫時只考慮這些字段信息。我們對於這些信息,說關心的問題有如下幾個方面。

       1)學生有那些基本信息 
       2)學生選了那些課,成績是什麼 
       3)每個課的學分是多少 
       4)學生屬於那個系,系的基本信息是什麼。

       首先第一範式(1NF):數據庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構成,包括整型、實數、字符型、邏輯型、日期型等。在當前的任何關係數據庫管理系統(DBMS)中,不允許你把數據庫表的一列再分成二列或多列,因此做出的都是符合第一範式的數據庫。 

       我們再考慮第二範式,把所有這些信息放到一個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦地址、系辦電話)下面存在如下的依賴關係。 
       1)(學號)→ (姓名, 年齡,性別,系別,系辦地址、系辦電話) 
       2) (課程名稱) → (學分) 
       3)(學號,課程)→ (學科成績)

根據依賴關係我們可以把選課關係表SelectCourse改爲如下三個表: 

       學生:Student(學號,姓名, 年齡,性別,系別,系辦地址、系辦電話); 
       課程:Course(課程名稱, 學分); 
       選課關係:SelectCourse(學號, 課程名稱, 成績)。

       事實上,對照第二範式的要求,這就是滿足第二範式的數據庫表,若不滿足第二範式,會產生如下問題 
數據冗餘: 同一門課程由n個學生選修,"學分"就重複n-1次;同一個學生選修了m門課程,姓名和年齡就重複了m-1次。

更新異常: 1)若調整了某門課程的學分,數據表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。 
                 2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入數據庫。

刪除異常 : 假設一批學生已經完成課程的選修,這些選修記錄就應該從數據庫表中刪除。但是,與此同時,課程名稱和學分信息也被刪除了。很顯然,這也會導致插入異常。
 

       我們再考慮如何將其改成滿足第三範式的數據庫表,接着看上面的學生表Student(學號,姓名, 年齡,性別,系別,系辦地址、系辦電話),關鍵字爲單一關鍵字"學號",因爲存在如下決定關係:

      (學號)→ (姓名, 年齡,性別,系別,系辦地址、系辦電話) 
但是還存在下面的決定關係 
       (學號) → (所在學院)→(學院地點, 學院電話) 
        即存在非關鍵字段"學院地點"、"學院電話"對關鍵字段"學號"的傳遞函數依賴。 
       它也會存在數據冗餘、更新異常、插入異常和刪除異常的情況(這裏就不具體分析了,參照第二範式中的分析)。根據第三範式把學生關係表分爲如下兩個表就可以滿足第三範式了:

       學生:(學號, 姓名, 年齡, 性別,系別); 
       系別:(系別, 系辦地址、系辦電話)。


 


SQL語句總結

SQL語句中常用關鍵詞及其解釋如下:

1)SELECT

將資料從數據庫中的表格內選出,兩個關鍵字:從 (FROM) 數據庫中的表格內選出 (SELECT)。語法爲
SELECT "欄位名" FROM "表格名"。

 

2)DISTINCT

在上述 SELECT 關鍵詞後加上一個 DISTINCT 就可以去除選擇出來的欄位中的重複,從而完成求得這個表格/欄位內有哪些不同的值的功能。語法爲
SELECT DISTINCT "欄位名" FROM "表格名"。

 

3)WHERE

這個關鍵詞可以幫助我們選擇性地抓資料,而不是全取出來。語法爲
SELECT "欄位名" FROM "表格名" WHERE "條件" 

 

4)AND OR

上例中的 WHERE 指令可以被用來由表格中有條件地選取資料。這個條件可能是簡單的 (像上一頁的例子),也可能是複雜的。複雜條件是由二或多個簡單條件透過 AND 或是 OR 的連接而成。語法爲:
SELECT "欄位名"  FROM "表格名"  WHERE "簡單條件"  {[AND|OR] "簡單條件"}+

 

5)IN

在 SQL 中,在兩個情況下會用到 IN  這個指令;這一頁將介紹其中之一:與 WHERE 有關的那一個情況。在這個用法下,我們事先已知道至少一個我們需要的值,而我們將這些知道的值都放入 IN  這個子句。語法爲:
SELECT "欄位名"  FROM "表格名"  WHERE "欄位名" IN ('值一', '值二', ...)  

 

6)BETWEEN

IN 這個指令可以讓我們依照一或數個不連續 (discrete)的值的限制之內抓出資料庫中的值,而 BETWEEN 則是讓我們可以運用一個範圍 (range)  內抓出資料庫中的值,語法爲:
SELECT "欄位名"  FROM "表格名" WHERE "欄位名" BETWEEN '值一' AND '值二' 

 

7)LIKE

LIKE 是另一個在 WHERE  子句中會用到的指令。基本上, LIKE  能讓我們依據一個模式(pattern) 來找出我們要的資料。語法爲:
SELECT "欄位名"  FROM "表格名"  WHERE "欄位名" LIKE {模式} 

 

8)ORDER BY

我們經常需要能夠將抓出的資料做一個有系統的顯示。這可能是由小往大 (ascending)  或是由大往小(descending)。在這種情況下,我們就可以運用 ORDER BY 這個指令來達到我們的目的。語法爲:
SELECT "欄位名"  FROM "表格名 [WHERE "條件"] ORDER BY "欄位名" [ASC, DESC] 

 

9)函數

函數允許我們能夠對這些數字的型態存在的行或者列做運算,包括 AVG (平均)、COUNT (計數)、MAX (最大值)、MIN (最小值)、SUM (總合)。語法爲:
SELECT "函數名"("欄位名") FROM "表格名"  

 

10)COUNT

這個關鍵詞能夠幫我我們統計有多少筆資料被選出來,語法爲:
SELECT COUNT("欄位名") FROM "表格名"

 

11)GROUP BY

GROUP BY 語句用於結合合計函數,根據一個或多個列對結果集進行分組。語法爲:
SELECT "欄位1", SUM("欄位2")  FROM "表格名"  GROUP BY "欄位1" 

 

12)HAVING

該關鍵詞可以幫助我們對函數產生的值來設定條件。語法爲:
SELECT "欄位1", SUM("欄位2")  FROM "表格名"  GROUP BY "欄位1"  HAVING (函數條件)  

 

13)ALIAS

我們可以通過ALIAS爲列名稱和表名稱指定別名,語法爲:
SELECT "表格別名"."欄位1" "欄位別名"  FROM "表格名" "表格別名"  

下面爲一個例子,通過它我們應該能很好地掌握以上關鍵詞的使用方法。


Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表


問題:
1、查詢“001”課程比“002”課程成績高的所有學生的學號;
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分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;

3、查詢所有同學的學號、姓名、選課數、總成績;
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、查詢姓“李”的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;

5、查詢沒學過“葉平”老師課的同學的學號、姓名;
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、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
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、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
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分的同學的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

9、查詢沒有學全所有課的同學的學號、姓名;
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、查詢至少有一門課與學號爲“1001”的同學所學相同的同學的學號和姓名;
select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');

11、刪除學習“葉平”老師課的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、查詢學生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S# ) T1
WHERE 平均成績 > T2.平均成績) 名次, S# 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績 FROM SC GROUP BY S# ) T2
ORDER BY 平均成績 desc;

14、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
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 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )

 

ORDER BY t1.C#;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章