數據庫基本知識

 1、相關概念    

  1. Data:數據,是數據庫中存儲的基本對象,是描述事物的符號記錄。html

       2. Database:數據庫,是長期儲存在計算機內、有組織的、可共享的大量數據的集合面試

       3. DBMS:數據庫管理系統,是位於用戶與操做系統之間的一層數據管理軟件,用於科學地組織、存儲和管理數據、高效地獲取和維護數據。數據庫

       4. DBS:數據庫系統,指在計算機系統中引入數據庫後的系統,通常由數據庫、數據庫管理系統、應用系統、數據庫管理員(DBA)構成。安全

       5. 數據模型:是用來抽象、表示和處理現實世界中的數據和信息的工具,是對現實世界的模擬,是數據庫系統的核心和基礎;其組成元素有數據結構、數據操做和完整性約束服務器

       6. 概念模型:也稱信息模型,是按用戶的觀點來對數據和信息建模,主要用於數據庫設計。數據結構

       7. 邏輯模型:是按計算機系統的觀點對數據建模,用於DBMS實現。數據庫設計

       8. 物理模型:是對數據最底層的抽象,描述數據在系統內部的表示方式和存取方法,在磁盤或磁帶上的存儲方式和存取方法,是面向計算機系統的。函數

       9. 實體和屬性:客觀存在並可相互區別的事物稱爲實體。實體所具備的某一特性稱爲屬性。工具

       10.E-R圖:即實體-關係圖,用於描述現實世界的事物及其相互關係,是數據庫概念模型設計的主要工具。post

       11.關係模式:從用戶觀點看,關係模式是由一組關係組成,每一個關係的數據結構是一張規範化的二維表。

       12.型/值:型是對某一類數據的結構和屬性的說明;值是型的一個具體賦值,是型的實例。

       13.數據庫模式:是對數據庫中全體數據的邏輯結構(數據項的名字、類型、取值範圍等)和特徵(數據之間的聯繫以及數據有關的安全性、完整性要求)的描述。

       14.數據庫的三級系統結構:外模式、模式和內模式

       15.數據庫內模式:又稱爲存儲模式,是對數據庫物理結構和存儲方式的描述,是數據在數據庫內部的表示方式。一個數據庫只有一個內模式

       16.數據庫外模式:又稱爲子模式或用戶模式,它是數據庫用戶可以看見和使用的局部數據的邏輯結構和特徵的描述,是數據庫用戶的數據視圖。一般是模式的子集。一個數據庫可有多個外模式

       17.數據庫的二級映像:外模式/模式映像、模式/內模式映像。

 2、重點知識點

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

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

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

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

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

      6. 闡述數據庫三級模式、二級映象的含義及做用。

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

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

第二節

1、相關概念

       1. 主鍵: 可以惟一地標識一個元組的屬性或屬性組稱爲關係的鍵或候選鍵。 若一個關係有多個候選鍵則可選其一做爲主鍵(Primary key)。

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

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

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

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

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

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

2、重要知識點

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

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

      3.關係模式是對關係的描述,五元組形式化表示爲:R(U,D,DOM,F),其中

            R —— 關係名

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

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

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

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

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

第三節

1、相關概念

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

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

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

2、重要知識點

       1. SQL 數據定義語句的操做對象有:模式、表、視圖和索引。

       2. SQL 數據定義語句的命令動詞是:CREATE、DROP 和 ALTER。

       3. RDBMS 中索引通常採用 B+樹或 HASH 來實現

       4. 索引能夠分爲惟一索引、非惟一索引和聚簇索引三種類型。

  6.SQL 建立表語句的通常格式爲

              CREATE TABLE <表名>

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

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

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

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

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

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

       7. SQL 建立索引語句的通常格式爲

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

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

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

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

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

   8. SQL 查詢語句的通常格式爲

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

              [ WHERE <條件表達式 1> ]

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

              [ ORDER BY <屬性列表 2> [ ASC|DESC ] ] ;

其中

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

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

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

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

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

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

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

第四節

1、相關概念和知識

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

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

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

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

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

       6. 常見SQL 自主權限控制命令和例子。

         1) 把對 Student 和 Course 表的所有權限授予全部用戶。

              GRANT ALL PRIVILIGES ON TABLE Student,Course TO PUBLIC ;

         2) 把對 Student 表的查詢權和姓名修改權授予用戶 U4。

              GRANT SELECT,UPDATE(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 SELECT,UPDATE ON TABLE Student TO R1;

         6) 對修改 Student 表結構的操做進行審計。

              AUDIT ALTER ON Student ;

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

 1、相關概念和知識點

       1.數據依賴:反映一個關係內部屬性與屬性之間的約束關係,是現實世界屬性間相互聯繫的抽象,屬於數據內在的性質和語義的體現。

       2. 規範化理論:是用來設計良好的關係模式的基本理論。它經過分解關係模式來消除其中不合適的數據依賴,以解決插入異常、刪除異常、更新異常和數據冗餘問題。

       3. 函數依賴:簡單地說,對於關係模式的兩個屬性子集X和Y,若X的任一取值能惟一肯定Y的值,則稱Y函數依賴於X,記做X→Y。

       4. 非平凡函數依賴:對於關係模式的兩個屬性子集X和Y,若是X→Y,但Y!⊆X,則稱X→Y爲非平凡函數依賴;若是X→Y,但Y⊆X,則稱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、細說數據庫三範式

  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(學號, 課程名稱, 成績)。

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

  (2)更新異常:1)若調整了某門課程的學分,數據表中全部行的"學分"值都要更新,不然會出現同一門課程學分不一樣的狀況。 
                 2)假設要開設一門新的課程,暫時尚未人選修。這樣,因爲尚未"學號"關鍵字,課程名稱和學分也沒法記錄入數據庫。

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

  咱們再考慮如何將其改爲知足第三範式的數據庫表,接着看上面的學生表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 "表格名" "表格別名"  

問題:

一、查詢「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#;

二、查詢平均成績大於60分的同窗的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;

三、查詢全部同窗的學號、姓名、選課數、總成績;
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

四、查詢姓「李」的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;

五、查詢沒學過「葉平」老師課的同窗的學號、姓名;
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=’葉平’);

六、查詢學過「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′);

 

七、查詢學過「葉平」老師所教的全部課的同窗的學號、姓名;
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=’葉平’));

八、查詢全部課程成績小於60分的同窗的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

九、查詢沒有學全全部課的同窗的學號、姓名;
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);

十、查詢至少有一門課與學號爲「1001」的同窗所學相同的同窗的學號和姓名;
select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');

十一、刪除學習「葉平」老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';

十二、查詢各科成績最高和最低的分:以以下形式顯示:課程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# );

1三、查詢學平生均成績及其名次
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;

1四、查詢各科成績前三名的記錄:(不考慮成績並列狀況)
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#;

1五、查詢每門功成績最好的前兩名
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#;

相關文章
相關標籤/搜索