日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

计算机三级——数据库技术

發布時間:2023/12/9 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机三级——数据库技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算機三級——數據庫技術

一、考試內容及要求

  • 掌握數據庫技術 的基本概念、原理、方法和技術。
  • 能夠使用SQL語言實現數據庫的基本操作(增刪改查)
  • 基本數據庫系統安裝配置以及數據庫管理及維護的基本技能。
  • 掌握數據庫管理和維護的方法。
  • 掌握數據庫性能優化的方法。
  • 了解數據庫系統的生命周期及設計和開發過程。
  • 了解常用的數據庫管理和開發工具,具備用指定的工具管理開發簡單數據庫應用系統的能力。
  • 了解數據庫的最新發展。
  • 二、考試題型

  • 選擇題——30小題(40分);
  • 應用題(填空題)——10小題(30分);
  • 設計與應用題——三大題(30分)。
  • 畫E-R圖(考試帶有工具 ),范式,SQL語句
  • 三、考試環境

    1.軟件:SQL service 2008

    2.只需在正確答案的前面選中即可(都為單選題) ,在應用題中一空可能會有多個答案選項,在填寫答案時要全部寫上且要用頓號(、)隔開

    3.考試時間為120分鐘(上機考試 ),考試結束前5分鐘系統會報警提醒考生存盤,考試時間為0自動交卷。

    第一章 數據庫應用系統開發方法

    ①掌握數據庫的基本概念。

    ②了解軟件工程和數據庫技術

    ③理解DBAS生命周期模型

    第一節 基本概念

    1.數據

    1)數據:是數據庫中存儲的基本對象。

    ? 定義:描述事物的符號序列。

    ? 數據的種類:數字、文字、圖形、圖像聲音以及其他特殊符號。

    2)計算機中的數據分為兩個部分:①臨時性數據(程序運行時產生的數據,保存在內存中,內存在斷電時所有的數據都回消失);②持久化數據(存儲在磁盤中的數據)

    3)數據有型和值的劃分

    ? 表示數據的類型(例如整型,字符型等等);表示給出了符合給定型的值。

    2.數據庫(DataBase)——DB
    1)數據的集合,**具有統一的結構形式并存放在統一存儲介質中**,是多種應用數據的集成,可被多個應用程序所共享。

    ? 2)按照數據提供的數據模式存儲

    ? 3)數據庫的體現——二維表

    3、數據庫應用系統——DBAS

    ? 組成:數據庫系統,應用程序,應用界面

    第二節 軟件工程與數據庫技術

    一)定義

    ? 軟件工程是由工程、科學和數學的原則與方法來開發和維護計算機軟件的相關技術和管理方法。

    ? 組成:軟件工程由方法、工具、過程組成——這就是軟件工程的三要素。

    二)軟件生命周期

    ? 定義:一般來說,軟件產品從定義開始,經過開發、使用和維護,直到退役的全過程稱為軟件生命周期。

    三)數據庫工程

    ? 1、數據庫應用系統的開發本身就是軟件工程但是又有自己的特點,所以特稱為數據庫工程。數據庫工程分為兩個部分:①數據庫設計;②是數據庫相應的應用的設計與實現

    ? 2、數據庫應用系統的設計開發必須要有軟件過程模型作為指導

    ? 3、典型的軟件開發模型:瀑布模型、快速原型模型、螺旋模型、增量模型等等

    第三節 DBAS的生命周期模型

    ? 1、參照軟件開發模型的瀑布模型,DBAS的生命周期模型有項目規劃、需求分析、系統設計、系統實現與部署、運行管理與維護。

    ? 2、根據DBAS的軟件組成和各自的功能,數據組織與存儲設計(后臺)、數據訪問與處理設計、應用設計三條設計主線,分別用于設計數據庫、數據庫事務和應用程序

    ? 3、根據數據庫三級模式(外模式,概念模式(模式),內模式),DBAS設計階段分為概念設計,邏輯設計和物理設計三個步驟。

    ? DBAS生命周期模型圖

    ? 4、規劃與分析的主要工作內容:系統規劃與定義、可行性 分析、項目規劃

    5、需求分析(干什么)的主要工作:數據需求分析。功能需求分析、性能需求分析、其他需求分析。

    6、系統設計(怎么干)

    第一章例題

    (1)下列屬于數據庫設計內容的是 ( B )

    A.需求分析和維護

    B.概念結構設計和邏輯結構設計

    C.功能設計和測試用例設計

    D.結構設計和行為設計

    (2)下列不屬于DBAS可行性分析的是 ( C )

    A技術可行性

    B操作可行性

    C.結構可行性

    D.經濟可行性

    (3)下列不屬于運行維護工作的是 ( C )

    A.系統監控

    B系統性能優化

    C.應用系統重寫

    D.系統升級

    (4) 第四題答案為 A

    (5) 第五題答案為 B

    (6)第六題答案為 A

    (7)第七題答案為 D

    第二章 需求分析

  • 了解需求分析的概念和獲取需求的方法
  • 了解需求建模的方法
  • 結構化分析案例——教材購銷系統
  • 第一節 需求分析的概念

    一、概念和需求獲取

    1、需求:是指用戶對軟件的功能和性能的要求,就是用戶想要軟件干什么,完成什么樣的功能,達到什么性能。

    2、需求分析是計算機系統的軟件功能分配和軟件設計之間起重要橋梁作用的軟件工程活動描述待開發的系統要完成的功能

    ? 需求分析時指明軟件和系統其他元素的接口并建立軟件必須要滿足的的約束。

    3.注意:①軟件功能越復雜,需求分析的工作就越復雜;②用戶需求的不明確性導致需求的可變性,從而導致需求分析工作的復雜;③軟件產品的不可見性——即開發人員對具體的需求不了解(例如在開發人員開發系統時不了解取款機取款三次密碼錯誤就會吞卡等等)。

    4、需求獲取的方法

    ①面談

    ②實地觀察——在別人已有的產品或者產品對換環境有依賴時;

    ③問卷調查——訪談對象多時且需要許多的細節問題需要了解時,時間盡可能的短,最好是單選題且有自己的答案;

    ④查閱資料——向對象公司借閱他們的資料了解

    二、需求分析

    1、需求分析的過程(該步驟建立在已經獲取了需求的基礎上)

    ①標識問題—>②建立需求模型—>③描述需求—>④確認需求

    2、需求分析的方法

    1)結構化分析及建模方法(SAD)——如DFD模型(數據流圖)、IDEF模型;

    ? ①注意:結構化分析及設計方法是瀑布模型的首次實踐。

    ? ②結構化分析的任務:建立分析模型—>編寫需求規格說明書(SRS)—>結構化分析的指導思想(抽象與分解)

    ? 注意SA表示結構化分析

    2)面向對象分析和建模方法(OOA)——UML用例建模(第五章講)

    3、DFD需求建模方法——核心是數據流

    1)DFD的常用圖形符號

    2)數據流(數據流動的方向)——數據在系統內傳播的路徑,因此由一組成分固定的數據組成;就是流動中的數據,由名詞或者名詞短語來命名。

    3)數據源和數據加工(處理)

    4)注意:DFD圖(數據流程圖)主要是對功能進行建模,就是業務流程

    5)DFD圖(數據流程圖)的具體建模的過程和步驟:明確目標和確定系統邊界(將用戶對目標系統的功能需求完整、準確、一致的描述出來 )—>建立頂層DFD圖 (頂層DFD只有一張),頂層DFD是對系統的一個大概的概括,沒有具體的細節,說明系統的邊界(系統的輸入和輸出)——>構建第一層DFD分解圖(中間層DFD )——>開發DFD層次結構圖(底層DFD原則:保持均勻的深度模型,按困難程度進行選擇),由不可再分的過程組成。

    6)確認DFD的五條規則:

    4、常用的IDEF0~IDEF4:

    ①IDEF0:描述系統功能及其相互關系

    ②IDEF1:系統信息及其數據的關系

    ③IDEF2:系統模擬,動態建模

    ④IDEF3:過程描述及獲取方法

    ⑤IDEF4:面向對象設計

    5、UML用例模型

    ★例題

    1)教材購銷系統:

    解答:頂層DFD

    中間層和底層DFD

    2)

    3)

    4)

    5)

    第三章 數據庫結構設計

    第一節 數據庫概念設計

    數據庫概念設計是數據庫設計的核心環節。通過對用戶的需求進行綜合、歸納與抽象,形成一個獨立于DBMS的概念模型。

    一、數據庫概念設計的目標

    二、概念設計的依據與過程

    一)依據

    ? 數據庫概念設計以需求分析的結果為依據,即需求說明書、DFD圖以及在需求階段收集到的應用領域中的各類報表。

    二)結果

    ? 概念設計的結果是概念模型(E-R圖)以及概念設計說明書

    三)過程

    ? ①明確建模目標(模型覆蓋范圍);②定義實體集(自底向上識別和定義實體);③定義聯系(實體間的關聯關系);④建立信息模型(構建ER模型);⑤確定實體的屬性(屬性描述實體的特征和性質);⑥對信息模型進行集成與優化(檢查和消除命名不一致、結構不一致)

    ? 概念模型是對現實世界的抽象和模擬

    四)概念模型設計

    ? 概念設計目前采用的最廣泛的是E-R建模方法。將現實世界抽象為具有屬性的實體及聯系。

    五)與E-R建模有關的的概念

    ? 1)實體:客觀存在并可相互區分的事物叫實體;實體集:同型實體的集合稱之為實體集;屬性:實體具有的某一特性,一個實體具有若干個屬性來刻畫,每個屬性的取值范圍稱為域(用來描述實體的性質和特征);碼或鍵:實體集中唯一標識每個實體的屬性或屬性組合;主鍵或主碼:用來區別同一個實體集不同實體的鍵(主碼的值不能相同)。

    ? 2)聯系:描述實體間的相互關系;聯系集:同類聯系的集合稱之聯系集 ;三類聯系:一對一(1:1)、一對多(1:n)、多對多(m:n)

    IDEF1X是數據建模的方法

    第二節 數據庫邏輯設計

    一)邏輯設計的任務

    ? 將概念模型(ER圖)轉換為DBMS支持的數據模型(關系模型),并對其進行優化。

    二)數據模型

    ? 有三種:層次模型、網狀模型、關系模型(當前最流行的數據模型)

    三)關系模型

    ? 關系模型用二維表來表示;關系的描述稱為關系模式;關系模式由五部分組成,即五元組:R(U,D,DOM,F)

    ? E-R圖到關系模式的轉換:

    四)關系數據庫數據的核心是關系模式的設計

    五)數據依賴

    六)數據依賴的類型

    ? ①函數依賴(Functional Dependency,FD)

    這種依賴關系類似于數學中的函數y=f(x),自變量x確定之后,相應的函數值y也就唯一地確定了。

    如關系:公民(身份證號,姓名,地址,工作單位)

    身份證號一確定,則其地址就唯一確定,因此地址函數依賴身份證號。而姓名一確定,不一定能確定地址。

    ? ②多值依賴(Multivalued Dependency,MD)

    教師號可能多值依賴課程號,因為給定一個(課程號,參考書號)的組合,可能有對應多個教師號。這是因為多個老師可以使用相 同或不同的參考書上同一門課。

    簡單點講,函數就是唯一確定的關系;多值依賴卻不能唯一確定。

    七)函數依賴的幾種特例

    1、平凡函數依賴與非平凡函數依賴

    如果X→Y,且Y ? X,則X→Y 稱為非平凡函數依賴。

    若Y ? X ,則稱X→Y為平凡函數依賴。

    由于Y ? X 時,一定有X→Y,平凡函數依賴必然成立,沒有意義,所以一般所說的函數依賴總是指非平凡函數依賴。

    舉例

    例:Sno代表學生的學號,Cno代表課程號,Grade代表成績。

    在關系 SC(Sno, Cno, Grade)中,

    非平凡函數依賴:(Sno, Cno)→Grade 即Grade不包含于(Sno, Cno)

    平凡函數依賴:(Sno, Cno)→Sno 即Sno包含于(Sno, Cno)

    ? (Sno, Cno)→Cno

    2、完全函數依賴與部分函數依賴

    如果X→Y ,且對于任何X’ ? X,都有X’

    Y,則稱y完全依賴于x,記作X->Y(箭頭上有個大寫f)。

    如果X→Y,但Y不完全依賴于X,則稱Y部分函數依賴于X,記作X->Y(箭頭上有個大寫P)。

    例:選課(學號,課程號,課程名,成績)

    (學號,課程號) X->Y(箭頭上有個大寫f) 成績 即(學號,課程號)兩者都為主鍵且共同決定成績,缺一不可

    (學號,課程號)X->Y(箭頭上有個大寫P) 課程名 因為課程號→課程名 即(學號,課程號)兩者都為主鍵且課程號可以單獨決定課程名。

    推論:如果X→Y ,且X是單個屬性,則X->Y(箭頭上有個大寫f)

    3、傳遞函數依賴

    如果X→Y , Y→Z,且Y 不包含于X, Y 不依賴 X,則稱Z傳遞函數依賴于X。記作X 傳遞→Z 。

    例:學生(學號,姓名,系名,系主任)

    顯然系主任傳遞函數依賴于學號,因為學號→系名,系名→系主任

    思考題:已知關系模式R(學生學號,課程名,學生專業號,專業名,成績),說出下面是什么關系?

    (學生學號,課程名,學生專業號) 成績 (部分函數依賴)

    學生學號 專業名 (傳遞函數依賴)

    (學生學號,專業名) 成績 (不是依賴關系)

    (學生學號,課程名) 成績 (完全函數依賴)

    (課程名,專業名,成績) (課程名,成績) (平凡函數依賴)

    八)數據規范化

    關系數據庫的設計主要是關系模式設計。關系模式設計的好壞直接影響到數據庫設計的成敗。將關系模式規范化,是設計較好的關系模式的惟一途徑。

    關系模式的規范化主要是由關系范式來完成的。

    關系模式的規范化:把一個低一級的關系模式分解為高一級關系模式的過程。

    關系數據庫的規范化理論是數據庫邏輯設計的工具。

    目的:盡量消除插入、刪除異常,修改復雜,數據冗余的問題。

    九)范式

    范式:關系模式滿足的約束條件稱為范式。根據滿足規范化的程度不同,范式由低到高分為1NF,2NF,3NF,BCNF,4NF,5NF。

    ①1NF:如果關系模式R,其所有屬性都是不可再分的基本數據項,則稱R屬于第一范式,R∈1NF。1NF要求數據庫表中的字段都是單一屬性的,不可再分。即元素具有原子性。

    ②2NF:如關系模式R∈1NF,且每個非主屬性完全函數依賴于主碼,則稱R屬于第二范式,R∈2NF。2NF要求實體的屬性完全依賴于 主關鍵字。首先關系要滿足第一范式。

    例:判斷R (學號,姓名,年齡,課程名稱,成績,學分)是否屬于第二范式。

    ? 主碼:(學號,課程名稱)

    非主屬性:姓名,年齡,成績,學分

    ? 存在如下決定關系:
     (學號, 課程名稱)→(姓名,年齡,成績,學分)
      但(課程名稱)→(學分)

    (學號)→(姓名, 年齡)所以R不屬于2NF

    ? ③第三范式:如果關系模式為2NF,并且R中的每個非主屬性不傳遞依賴于R的主鍵,則稱關系R是是屬于第三范式,即R∈2NF。

    ? 范式之間的關系:

    ?

    十)數據庫邏輯模型的產生(ER圖轉換為關系模式)

    ? ①一個實體轉換成一個關系模式;②一個1:1聯系可以轉換為一個獨立的關系模式,也可以于任意一端對應的關系模式合并;

    ? ③一個1:n聯系可以轉化為一個獨立的關系模式,也可以于n端對應的關系模式合并;④一個n:m轉換為一個關系模式;⑤三個或三個以上實體的多元聯系轉換為一個關系模式;⑥同一實體集實體間的聯系可以按照1:1、1:n、n:m三種情況進行處理。

    舉例:

    ? ①1:1聯系的E-R圖轉換為關系模式較為簡單,不在列舉,總共有情況;

    ? ②1:n聯系的E-R圖轉換為關系模式,有兩種方案;

    ? 方案一:倉庫(倉庫號、地點、面積)、產品(產品號、產品名、價格)、倉儲(倉庫號、產品號、數量)

    ? 方案二:倉庫(倉庫號、地點、面積)、產品(產品號、產品名、價格、倉庫號、數量)

    ③m:n聯系的E-R圖轉換為關系模式,有一種方案;

    方案一:學生(學號、姓名、年齡、性別)、課程(課程號、課程名、學時數)、選修(學號、課程號、成績)

    ④三個及三個以上實體:

    ⑤同實體集1:n聯系轉換為關系模式

    第三節 數據庫物理設計

    1、物理設計概述

    ? 數據庫物理設計是設計數據庫的存儲結構和物理實現方法。

    ? 目的:將數據的邏輯描述轉換為技術規范,設計數據存儲方案以便提供足夠的好的性能以便確保數據庫數據的完整性、安全性、可靠性

    2、數據庫的物理結構

    ? 一)①物理設備上的存儲結構與存取方法稱為數據庫的物理結構;②數據庫中的數據一文件形式存儲在外存儲介質上。

    ? 二)數據庫的物理結構設計需要解決的問題:文件組織、文件結構、文件存取、索引技術

    3、索引——數據庫持久化設計(數據的存取)

    ? 1)①索引是數據庫中獨立的存儲結構其作用是提供一種無須掃描每個頁面(存儲表格數據的物理塊)而快速訪問數據頁的方案。
    ? ②索引技術(Indexing)是一種快速數據訪問技術

    ? ③索引技術的關鍵:建立記錄域取值到記錄的物理地址間的映射關系,即索引。

    ? ④索引能夠提高性能(減少時間),但是需要付出額外的空間、在維護時也需要付出多余的時間

    ? 2)索引技術的分類

    ? 有序索引:又分為聚集索引和非聚集索引、稠密索引和稀疏索引;散列索引(哈希表存儲);主索引;唯一索引、單層索引和多層索引

    ? 3)數據庫的物理設計

    ? 目標:略;

    ? 環節:(1)數據庫邏輯模式描述(關系模式-基本表);(2)文件組織與存取設計(基本原則:①將易變部分與穩定部分、存儲頻率較高的部分與存儲頻率較低的部分分開存放,以提高系統性能;②分析理解數據庫事務訪問特性);(3)數據分布設計(分布式數據庫系統的數據劃分垂直劃分和水平劃分(各自的含義));(4)確定系統配置;(5)物理模式評估(對數據庫的**時間和空間(存取時間、存儲空間)**的效率進行評估)

    3)什么是存取路徑

    選擇存取路徑主要是指確定如何建立索引。對同一個關系我們要建立多條索引路徑。

    4)DBMS常用的存取方法:索引方法(B+樹索引方法)、聚簇方法、HASH方法

    第三章 例題講解

    1)

    2)

    3)

    4)

    5)

    6)重點:第三章出現的設計與應用題

    第四章 數據庫系統功能設計于是實施

    總述:DBAS功能設計包括應用軟件設計中的數據庫事務設計和應用程序設計。

    功能設計過程分為:總體設計概念設計詳細設計;具體到數據庫事務設計分為:事物概要設計、事物詳細設計

    第一節 軟件體系結構與設計過程

    一、軟件體系結構與設計過程

    一)軟件體系結構:又稱為軟件架構是軟件系統中最本質的東西,良好的軟件體系結構必須是普適、高效和穩定的;軟件體系結構={構件(軟件系統的各個模塊),連接件(接口和過程調用)、約束(完整性約束和規則)}

    軟件體系結構類型:分層體系結構、MVC(模型-視圖-控制器)體系結構、客戶端/服務器(B/S、C/S)體系結構

    二)軟件設計過程

    1)軟件開發有設計、實現、測試三個環節組成;包含概要設計(任務:軟件總體結構圖設計)和詳細設計(任務:數據設計、過程設計及人機界面設計)

    2)設計原則:模塊化、信息隱藏、抽象和逐步求精

    3)軟件設計可選用的方法:結構化設計方法、面向對象方法、面向數據設計方法

    第二節 DBAS整體設計

    DBAS整體設計的任務:確定系統整體框架;涉及的內容包括:DBAS體系結構設計、軟件體系結構設計、軟件硬選型與配置設計、業務規則初步設計

    一、DBAS體系結構設計

    1)常見的DBAS體系結構:客戶服務器體系結構(C/S)、瀏覽器服務器體系結構(B/S)

    2)三層客戶服務器體系結構(C/S):表示層、功能層(業務:應用服務器)、數據層(DB:數據庫服務器)

    二、軟件體系結構設計

    1)DBAS軟件包括:操作系統、數據庫管理系統、開發環境中間件、應用軟件(數據庫事務和應用程序)

    2)可用模塊結構圖(模塊+調用+控制+轉接)表示總體結構和分層模塊結構(體系結構的情況

    三、軟件硬選型與配置設計

    總體設計階段需要對軟硬件設備做出合理選擇,并進行初步配置設計。

    四、業務規則初步設計

    關鍵:業務流程圖——總體設計階段

    第三節 DBAS功能概要設計

    1) DBAS功能概要設計在總體設計的基礎上進一步細化模塊/子模塊,組成應用軟件的系統—子系統—模塊—子模塊結構,并從結構、行為、數據三方面進行設計。

    2)從功能角度,DBAS系統通常劃分為四個層次:表示層、業務邏輯層、數據訪問層、數據持久層

    一、表示層概要設計

    1)人機界面設計,影響系統易用性(目前第四代為WIMP與web技術多任務處理技術相結合)

    2)設計原則:對用戶友好;用戶自主控制;反饋及時上下文感知;容錯與錯誤恢復;界面標準常規;輸入靈活;界面簡潔、交互及時。

    二、業務邏輯層概要設計

    1)設計原則:高內聚低耦合

    2)設計內容:結構、行為、數據、接口等等

    三、數據訪問層概要設計

    1)事物概要設計核心:在于辨識和設計事物自身的處理邏輯、注意流程

    2)一個完整的事物概要設計包括:事務名稱、訪問的關系表和數據項、事務邏輯、事務用戶

    四、事務

    1)事務的概念(Transaction):事務是訪問并可能更新數據庫中各種數據項的一個程序執行單元

    2)事務的特性:原子性、一致性、隔離性、持續性;稱為ACID特性

    ? 原子性:一個不可分割的工作單位;一致性:從一個一致性狀態變到另一個一致性狀態;隔離性:執行不能被其他事務干擾;持久性:永久性,他對數據庫的改變是永久的。

    五、數據持久層概要設計

    第三章內容

    第四節 DBAS功能詳細設計

    一、表示層詳細設計

    人機界面采用原型迭代法。

    二、業務邏輯層詳細設計

    1)設計各模塊內部處理流程和算法、具體數據結構和詳細接口。

    第五節 應用系統安全架構設計

    一、數據安全設計

    安全性保護、完整性保護、并發性保護、數據備份與恢復、數據加密傳輸

    1)數據庫的安全性保護

    ? (1)主要保護方法:用身份鑒別、權限控制

    2)數據庫的完整性保護

    ? 定義:數據庫的完整性保護是指數據庫中的正確性、一致性

    及相容性

    ? 方法:設置完整性檢查(即對數據設置一些約束條件(實體完整性、參考完整性、用戶自定義完整性))

    ? 完整性條件作用對象:列、元組、關系

    ? DBAS中的完整性約束功能包括:完整性約束條件設置和檢查。

    3)數據庫的并發控制

    ? 并發控制:事務在空間上重疊執行。

    ? 并發控制機制是衡量一個DBAS性能的一個重要標志;實現并發控制常用的方法是封鎖技術(就是Java里面的)。

    ? 基本鎖類型:排他鎖(X鎖)—寫鎖、共享鎖(S鎖)—讀鎖

    ? 死鎖:是兩個或者兩個以上的事務之間的循環等待。

    ? 避免死鎖的原則: ①按照同一順序訪問資源。(如第一個事務提交或回滾后第二個事務進行) ②避免事務交互性 ③采用小事務模 式,縮短長度和占用時間。 ④盡量使用記錄級別的所(行鎖),少用表級別鎖。 ⑤使用綁定連接,同一用戶打開的兩個或多個連接 可以互相合作。

    4)數據的備份與恢復

    ? 數據庫恢復的基本原理:

    ? 數據庫備份與恢復的策略:雙機熱備、數據轉儲(數據備份)、數據加密存儲(針對高敏感數據)

    7)數據加密傳輸常見的傳輸手段:數字安全證書、對稱密鑰加密、數字簽名、數字信封

    二、環境安全設計

    漏洞與補丁、計算機病毒防護、網絡環境安全(防火墻)、物理環境安全

    三、制度安全設計

    管理層安全措施

    第六節 DBAS實施

    一、DBAS實施工作

    1)創建數據庫、2)數據裝載、3)編寫調試應用程序、4)數據庫系統運行(功能測試、性能測試)

    第四章 例題

    1、

    2)

    3)

    4)

    5)

    6)

    7)

    8)

    第五章 UML與數據庫應用系統

    內容摘要:

    ? ①了解DBAS建模方法;②掌握DBAS業務流程與需求表達方法;③掌握DBAS系統內部結構的表達方法;④掌握DBAS微觀設計的表達方法;⑤了解DBAS宏觀設計的表達方法;⑥了解DBAS系統實現與部署的表達方法。

    第一節 DBAS建模

    一、統一建模語言(UML)

    1)UML是面向對象的可視化的通用語言,他是一種建模語言不是建模方法。

    2)建模方法包括建模語言與建模過程;①建模語言:提供這種方法用于表示建模結果的符號(圖形符號:可視化);②建模過程:嗎iOS建模時需要遵循的步驟。

    二、UML的組成

    1)由**語義(自然語言)與表示法(可視化標準符號)**組成。

    ? 四層建模概念框架:元元模型、元模型、模型層(類模型或類型模型)、用戶模型(實例模型:具體的對象)

    2)UML的五種視圖:結構、實現、行為、環境、用例視圖

    3)UML 2.0分為靜態結構圖和行為圖

    第二節 DBAS業務流程圖與需求表達

    一、業務流程與活動圖

    ? 活動圖最適合描述系統或子系統的工作流程

    二、系統需求與用例圖

    三、關系說明

    1)角色之間的關系——通用化關系(繼承:extends)帶三角符號的箭頭

    2)用例與角色之間的關系——連接關系(關聯關系)

    3)用例之間的關系——擴展(extends)關系、包含(use、include)(使用)關系、組合(關聯)關系、泛化關系

    第三節 DBAS系統內部結構的表達

    一、類圖

    1)類與類的關系:關聯關系、繼承、依賴、精化(實現)

    2)組成:類名、屬性、方法(操作、行為)

    二、順序圖-行為建模

    1)順序圖主要用于描述系統內對象之間的消息發送和接收序列;

    2)順序圖中出現的元素一定是在類圖中出現的;用來強調時間。

    三、通信圖(協作圖)

    第四節 DBAS系統微觀設計的表達

    一、對象圖

    對象圖是類圖的實例,描述特定時間中所有對象在系統中的結構,是一個快照

    矩形框上面的左邊為對象名——后面為所屬的類

    二、狀態圖

    1)狀態圖用來描述有關事件或對像的狀態轉移;只能有一個開始狀態可以有多個結束狀態。

    2)狀態圖的轉移由事件驅動

    三、時間圖

    當狀態的轉換由時間因素決定時,使用時間圖來描述狀態的變化。

    第五章 DBAS系統宏觀設計的表達

    一、包圖

    二、交互概述圖

    交互概述圖相當于活動圖和順序圖的結合

    三、復合結構圖

    復合結構圖適用于系統間的溝通接口,進行系統架構設計和系統維護時。

    第六節 DBAS系統實現與部署的表達

    一、組件圖

    組件時邏輯中定義的概念和概念在物理架構中的實現。

    二、部署圖(配置圖)

    1)描述系統中軟硬件的物理配置情況與系統結構。

    2)部署圖說明實體組件如何執行程序,將如何部署到實際的計算機中——在集成測試之前

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EZPS9LIT-1616819653259)(]

    第五章例題

    1)

    2)

    3)

    4)

    5)

    6)

    7)

    第六章 數據庫以及數據庫對象

    第一節 創建及維護數據庫

    一、SQL server數據庫分類

    1)系統數據庫(系統自動創建):master、msdb、tempdb、model、resource

    2)用戶數據庫

    二、SQL server數據庫的組成

    1)SQL server將數據庫映射為一組操作系統文件。

    2)數據文件:①.mdf:主要數據文件,不能小于3M。只有一個;②.ndf:次要數據文件,0個或多個;

    日志文件:.ldf:事務日志文件,至少有一個日志文件。

    三、數據庫存儲空間的發分配

    1)數據存儲的最小單位是數據頁(也就是頁),一頁是一塊8KB的連續磁盤空間。

    2**)頁的大小決定了數據庫表中一行**(一個記錄、元組)數據的最大值—不能超過8KB

    3)行不能跨頁存儲,一頁可以存放多行數據但是不能超過8KB

    四、數據庫文件組

    1)類型:主文件組(系統定義,主要數據文件和如何沒有明確分配的其他文件)、用戶定義文件組(使用FILEGROUP關鍵字定義)

    五、創建數據庫

    1)通過圖形可視化工具直接創建

    2)通過T-SQL語言創建

    舉例:

    七、修改數據庫

    八、分離和附加數據庫

    一)分離數據庫

    ? 1)作用:就是將數據庫從一臺數據庫服務器轉移到另一臺數據庫服務器,不需要重建(類似于剪切)

    ? 2)使用的語句:sp_detach_db實現系統存儲過程

    二)附加數據庫

    ? 將分離的數據庫重新安裝到數據庫管理系統中,必須指定主要數據文件的物理存儲位置和文件名。

    ? 2)語句:CREATE DATABASE …(數據庫名) ON(存儲位置) FOR ATTACH

    第二節 架構

    一、架構(模式)

    1)架構是數據庫下的一個邏輯命名空間,是數據庫對象的容器,一個數據庫包含一個或多個架構,同一個數據庫內架構命名唯一

    2)定義架構語句:CREATE SCHEMA [<架構名>] AUTHORIZATION [<用戶名>]

    3)刪除架構:DROP SCHEMA [<架構名>]

    第三節 分區表

    一、基本概念

    ? 1)分區表是將表中的數據按水平分割成不同的子集,并將數據子集存儲在數據庫一個或多個文件組中。

    ? 2)物理上將大表分成好幾個小表,邏輯上還是一個大表;合理使用分區能提高數據庫性能。

    二、創建分區表

    實例:

    第五節 索引視圖

    1)創建索引

    2)刪除索引

    一、基本概念

    ? 1)標準視圖(也稱虛擬表):返回結果集與標準表一致,標準視圖的結果集不永久存放

    ? 2)索引視圖(也稱物化視圖):建立唯一聚集索引的視圖;視圖結果存放在數據庫中。

    ?

    二、索引視圖使用與限制

    1)適用場合:①很少更新的基礎數據;②基礎數據使用批處理定期更新且作為只讀數據

    2)

    三、定義索引視圖

    創建索引視圖必須滿足的條件:①視圖只能引用基本表,不能是其他的視圖;②引用的基本表和視圖在同一歌數據庫中;③必須用SCHEMABINDING選項創建視圖;④視圖中的表達式引用的所有函數必須確定。

    第六章例題

    1)

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-h5AUySgD-1616819653276)(C:\Users\潘仕毅\AppData\Roaming\Typora\typora-user-images\image-20210224184633675.png)]

    2)

    3)

    4)創建唯一約束后面必須要字段

    5)

    6)

    注意:在數據庫設計題有怎么創建數據庫

    第七章 高級數據庫查詢

    第一節 數據查詢功能擴展

    一、查詢語句–SELETE(具體看榮瑩數據庫-第五章)

    1)SELETE語句的格式和含義

    SELECT [DISTINCT] [TOP n] select_list ——查詢指定的列、DISTINCT消除重復元組

    [INTO new_table]——將查詢結果創建到新表

    [FROM table_source]——查詢的目標表

    [WHERE search_conditition]——查詢的條件

    [GROUP BY group_by_expression]——指定分組查詢的條件

    [HAVING search_condition]——指定組或聚合函數查詢的條件

    [ORDER BY order_expression [ASC|DESC]]——指定表的數據的升降序

    [COMPUTE expression] ——在結果集得到末尾生成匯總數據

    2)WHERE 條件表達式中可使用下列運算符

    ?算術比較運算符:<、<=、>、>=、=、<>或!=。

    ?邏輯運算符:AND、OR、NOT(AND和 OR來聯結多個查詢條件可多次出現、 AND的優先級高于OR、 可以用括號改變優先級)。

    ?集合運算符:IN(DNAME IN ( ‘計算機’,‘電子’)表示取DNAME為’計算機’,’電子‘的結果集)、NOT IN(與前面相反)。

    ?謂詞:EXISTS(存在量詞)、ALL、SOME、UNIQUE(并)、BETWEEN … AND(在某個范圍)、NOT BETWEEN … AND(不在這個范圍) 。

    ?聚合函數:AVG、MIN、MAX、SUM、COUNT。

    ? F中運算對象還可以是另一個SELECT語句,即SELECT語句可以嵌套。

    二、使用TOP限制結果集

    1)TOP n [percent] [WITH TIES]

    ? Top n 前n行

    ? Top n [percent]前n%行

    ? [WITH TIES]:包括最后一行取值并列的結果。

    2)TOP的使用:SELECT TOP 3 WITH TIES 。。。。

    三、使用CASE函數

    1)語法:

    CASE

    WHEN 布爾表達式1 then 結果表達式1

    WHEN 布爾表達式2 then 結果表達式2

    ……

    WHEN 布爾表達式n then 結果表達式n

    [ELSE 結果表達式n+1]

    2)使用舉例

    SELECT a.GoodsID,商品銷售類別=CASE

    WHEN COUNT(b.GoodsID)>10 THEN ‘熱門商品’

    WHEN COUNT(b.GoodsID)BETWEEN 5 AND 10 THEN ‘一般商品’

    WHEN COUNT(b.GoodsID)BETWEEN 1 AND 4 THEN ‘難銷商品’

    ELSE ‘滯銷商品’

    END

    FROM Table_Goods a LEFT JOIN Table_SaleBillDetail b

    ON a.GoodsID=b.GoodsID GROUP BY a.GoodsID

    四、將查詢結果保存到新表中

    SELECT 查詢列表序列 INTO <新表名>

    FROM 數據源……(其他行過濾、分組語句)

    注意:表名前加**#為局部臨時表,##為全局臨時表**,只有表名為永久表。

    例子:SELECT * INTO #HD_Customer FROM Table_Customer WHERE ……

    注意:局部臨時表和全局臨時表只在當前查詢中一次有效

    第二節 查詢結果的交、并、差運算

    在FROM子句中給出多個表名,即可完成笛卡爾積運算

    ②建立幾個表連接的方法:在FROM子句中列出需連接的表名,在WHERE子句給出連接條件或連接謂詞

    一、并運算

    1)并運算(UNION):將多個查詢結果合并為一個結果集。。

    語法:

    SELECT 語句1UNION [ALL]SELECT 語句2UNION [ALL]

    2)使用UNION注意

    ?要進行合并的查詢,SELECT中列數必須相同,語義相同。

    ?每個相對應列的數據類型隱式兼容,如char(20)與varchar(40)。

    ?合并后結果采用第一個SELECT語句的列標題。

    ?若需排序,則GROUP BY語句寫在最后一個SELECT之后,且排序的一句是第一個SELECT中的列名。

    3)舉例:求選修了課程C2或C4的學生的學號和姓名

    二、交運算

    1)交運算:返回同時在兩個集合中出現的記錄。

    語法:

    SELECT 語句1INTERSECT SELECT 語句2INTERSECT ……SELECT 語句n

    2)舉例:求選修了課程C2和C4的學生的學號和姓名

    三、差運算

    1)差運算:返回第一個集合中有而第二個集合中沒有的的記錄。

    語法:

    SELECT 語句1EXCEPT SELECT 語句2EXCEPT……SELECT 語句n

    2)舉例:求選修了課程C2但沒有選修課程C4的學生的學號和姓名

    第三節 子查詢

    一、單值子查詢

    1)WHERE子句中的條件表達式可以是標量數據 ,也可以是一個SELECT-FROM-WHERE查詢塊構成的子查詢

    SELECT <屬性名1> /*外層查詢 /父查詢*/FROM <表名1>WHERE ? (SELECT <屬性名2> /*內層查詢/子查詢*/ ? FROM <表名2> ? WHERE<條件2 >)

    2)①子查詢的限制:不能使用ORDER BY子句;②層層嵌套方式反映了 SQL語言的結構化,③有些嵌套查詢可以用連接運算替代

    3)舉例:求選修了數據結構的學生的學號

    SELECT語句

    SELECT SNO FROM SCWHERE CNO = ? (SELECT CNO //子查詢語句返回的結果集要與父查詢語句的條件的名稱(語義)相同,但是為不同的表 ? FROM C ? WHERE CNAME= ' 數據結構‘)

    也可以用自身連接完成前例查詢要求

    SELECT SNO FROM SC, C WHERE SC.CNO = C.CNO AND C.CNAME= '數據結構';

    二、包含多值的子查詢

    1)子查詢的結果不是單一值,而是多個值,即一個集合(記為R)。與子查詢結果比較,可使用以下運算符:

    EXISTS R是一個條件,當且僅當R非空時,該條件為真。

    EXISTS相當于離散數學中的存在量詞。

    s IN R為真,當且僅當s等于R中的一個值。類似地,s NOT IN R為真,當且僅當s不等于R中的值。

    IN的含義相當于集合論中的“屬于”(∈)。類似地,s NOT IN R,表示s不屬于R。

    ③ s>ALL R為真,當且僅當s大于關系R中的每一個值。同樣可以使用其他五個比較運算符(>=、=、<、<=、<>)。

    例如,s<>ALL R,表示s NOT IN R。

    ④ s>ANY R為真,當且僅當s至少大于關系R中的一個值。同樣可以使用其他五個比較運算符(>=、=、<、<=、<>)。

    例如,s = ANY R表示s IN R。

    2)例一:查詢選修了課程號為‘C4’的學生的SNO和SNAME

    SELECT SNO,SNAME FROM SWHERE SNO IN ? (SELECT SNO ? FROM SC ? WHERE CNO=‘C4’ );

    舉例二:查詢選修了“數據結構”的學生的SNO和SNAME

    執行過程:

    三、使用EXISTS的子查詢

    一、EXISTS

    1)EXISTS—>①相當于離散數學中的存在量詞;

    ②帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值“true”或邏輯假值“false”。

    ③若內層查詢結果非空,則外層的WHERE子句返回真值;若內層查詢結果為空,則外層的WHERE子句返回假值

    ④由EXISTS引出的子查詢,其屬性名表達式通常都用* ,因為帶EXISTS的子查詢只返回真值或假值,給出屬性名無實際意義。

    2)舉例:查詢所有選修了C2號課程的學生姓名

    SELECT SNAMEFROM SWHERE EXISTS //與上述子查詢不同的是在**EXISTS**前沒有任何的屬性(列名、語義),子查詢語句返回為真才會有結果集 ? ( SELECT * ? FROM SC ? WHERE S.SNO=SC.SNO AND CNO='C2')//只有S.SNO=SC.SNO相等并且CNO為'C2'時才為真。

    執行過程:先將S表中的SNO拿出來與 SC中的SNO一一對比;②當S.SNO=SC.SNO相等時,再判斷CNO是否為’C2’,若為’C2’則返回真(因為子查詢執行的結果集不為空);③所以在父查詢執行完畢后會有相應的結果集出現。

    3)執行結果為:

    二) NOT EXISTS

    1)若內層查詢結果非空,則外層的WHERE子句返回假值;若內層查詢結果為空,則外層的WHERE子句返回真值

    2)例:用NOT EXISTS求沒有選修C3課程的學生的姓名。

    SELECT SNAMEFROM S ? WHERE NOT EXISTS ? ( SELECT * ? FROM SC ? WHERE S. SNO=SNO AND CNO='C3')

    3)執行過程與 EXISTS 的執行過程差不多,只不過是為空時為真;返回的結果為沒有選修C3課程的學生的姓名

    三) NOT EXISTS與 NOT EXISTS 結合舉例:

  • 查詢沒有選修全部課程的學生姓名。
  • 思路分析:(將課程表視為一個分組,用來判斷是否全部選修)

    ①本查詢涉及S、C和SC三個關系

    ②在S關系中依次取每個元組的學號SNO

    ③從C關系中依次取出每個元組的課程號CNO

    ④在SC關系中查詢學號SNO是否選修課程號CNO,若未選修,則將該元組的SNAME放入查詢結果集

    SELECT SNAMEFROM SWHERE EXISTS(SELECT *FROM CWHERE NOT EXISTS(SELECT *FROM SCWHERE SC.SNO= S.SNOAND SC.CNO= C.CNO)); // 查詢選修了全部課程的學生姓名。 SELECT SNAMEFROM SWHERE NOT EXISTS(SELECT *FROM CWHERE NOT EXISTS(SELECT *FROM SCWHERE SC.SNO= S.SNOAND SC.CNO= C.CNO));: 查詢選修了學生S4選修的全部課程的學生學//想象三張表 SELECT DISTINCT SNO //最終返回的結果集,若存在則返回;不存在則說明數據都沒有 FROM SC AS SC1 WHERE NOT EXISTS (SELECT *FROM SC AS SC2WHERE SC2.SNO=‘S4’(確定學生S4選修的全部課程) AND NOT EXISTS(SELECT * //返回確定的結果集,只是會返回true或falseFROM SC AS SC3WHERE SC3.SNO = SC1.SNO(選中學生的SNO學號)AND SC3.CNO= SC2.CNO (判斷每個學生選修的課程與學生S4選修的全部課程是否相等))); 查詢所有學生都選修的課程的課程名。SELECT CNAMEFROM CWHERE NOT EXISTS(SELECT *FROM SWHERE NOT EXISTS(SELECT *FROM SCWHERE SC.SNO= S.SNOAND SC.CNO= C.CNO));

    總結:①EXISTS 和 NOT EXISTS 想象為一個圈,EXISTS 是在圈里面,NOT EXISTS在圈外面(圈指的是子查詢結果);②在進行設計時要思考題目中出現的關鍵字以關鍵字來確定選擇 EXISTS 或者 NOT EXISTS ;③思考題目中出現的關鍵字涉及到那些表,以確定在進行設計時需要哪些表。

    四、使用ANY(SOME)或ALL的子查詢

    1)子查詢返回標量值時可以用比較運算符

    返回多值要使用比較運算符,則需要配合ANY或ALL

    ANY:任意一個值

    ALL:所有值

    2)含義:

    > ANY 大于子查詢結果中的某個值 (存在大于)

    > ALL 大于子查詢結果中的所有值(比最大值還大)

    < ANY 小于子查詢結果中的某個值 (存在小于)

    < ALL 小于子查詢結果中的所有值 (比最小值還小)

    >= ANY 大于等于子查詢結果中的某個值 (存在大于或等于)

    >= ALL 大于等于子查詢結果中的所有值 (應該為一個與子查詢相同大小的集合)

    <= ANY 小于等于子查詢結果中的某個值 (存在小于或等于)

    <= ALL 小于等于子查詢結果中的所有值 (應該為一個與子查詢相同大小的集合)

    = ANY 等于子查詢結果中的某個值 (存在等于關系)

    =ALL 等于子查詢結果中的所有值(通常沒有實際意義)

    !=(或<>)ANY 不等于子查詢結果中的某個值

    !=(或<>)ALL 不等于子查詢結果中的任何一個值

    3)舉例: 查詢其他系中比計算機系任意學生年齡小的SNAME和AGE

    SELECT SNAME,AGEFROM SWHERE AGE < ANY (SELECT AGE FROM SWHERE DNAME= ‘ 計算機 ')//子查詢,確定為計算機系的學生的年齡;整個語句的意思是確定比計算機系任意學生年齡小的學生AND 所在系 <> ‘計算機 ' ; //選擇返回結果為其他系的學生

    第四節 其他形式的子查詢

    一、替代表達式的子查詢

    在SELECT的選擇列表中嵌入了一個只返回一個標量值的子查詢

    實例: SELECT Cname,Address, (SELECT COUNT(*) FROM Table_Customer b ON a.CardID=b. CardID WHERE CustomerID=‘C001’)AS TotalTimes FROM Table_Custmer Where CustomerID=‘C001’;

    二、派生表

    1)也稱為內聯視圖,是將子查詢作為一個表處理,產生的新表為“派生表”。

    2)實例:查詢至少買了C001和C002兩種商品的顧客號和顧客名。

    SELECT CustomerID,CName FROM (SELECT * FROM Table_SaleBill a JOIN Table_SaleBillDetail b ON a.SaleBillID=b. SaleBillID WHERE GoodsID=‘G001’) AS T1JOIN (SELECT * FROM Table_SaleBill a JOIN Table_SaleBillDetail b ON a.SaleBillID=b. SaleBillID WHERE GoodsID=‘G002’) AS T2ON T1.CardID=T2.CardID JOIN Table_Customer c ON c.CardID=T1. CardID

    復習:聚集函數

    原文鏈接:https://blog.csdn.net/u010327460/article/details/80527568

    聚集函數是以值得一個集合(集或多重集)為輸入、返回單個值得函數。

    固有的聚集函數

    SQL提供了五個固有的聚集函數

    平均值 :avg
    最小值: min
    最大值:max
    總和: sum
    計數: count

    一、基本聚集

    查詢1. 平均數 找出Computer Science 系教師的平均工資。select avg(salary) from instructor where dept_name = 'Comp. Sci.'; 查詢2. as 重命名平均數 將查詢1中的查詢屬性賦予一個有意義的名字select avg(salary) as avg_salary from instructor where dept_name = 'Comp. Sci.';

    注意: 在計算平均數時,保留重復元組很重要。

    查詢3. distinct 使用的情況。 找出在2010年春季學期講授一門課程的教師總數:select count(distinct ID) from teaches where semester = 'Spring' and year = 2010;

    有些情況下,計算聚集函數需要先刪除重復元組。可以使用distinct

    查詢4. count(*) 找出course關系中的元組數:select count(*) from course;

    SQL中不允許使用count(*)的時候使用distinct。使用max和min時,可以使用distinct

    二、分組聚集

    使用 group by 將聚集函數作用于一組元組集上。
    理解:group by 子句中給出的一個或多個屬性是用來構造數組的。在 group by 子句中的所有屬性上取值相同的元組被分在一個組中。

    查詢5. 找出每個系的平均工資select dept_name, avg(salary) as avg_salary from instructor group by dept_name; 查詢6.整個關系作為一個分組 找出所有教師的平均工資select avg(salary) from instructor; 查詢7: 每個系在2010年春季學期講授一門課程的教師人數 from instructor natural join teaches where semester = 'Spring' and year = 2010 group by dept_name;

    重要結論:出現在select語句中但沒有被聚集的屬性,只能是那些出現在group by 子句中那些的屬性。換句話說,任何沒有出現在group by 中的屬性,如果出現在select子句中,它只能出現在聚集函數內部,否則這樣的查詢就是錯誤的。

    查詢8. 一個錯誤的查詢 /* 錯誤的查詢*/ select dept_name, ID, avg(salary) from instructor group by dept_name;

    分析:ID出現在select子句中,且不是聚集函數的參數,卻沒出現在group by,查詢錯誤。換個思路,一個分組有多個教師,每個教師有不同的ID,每個分組只輸出一個元組,那么就無法確定輸出哪一個ID。

    三、having子句

    having子句是對分組的限定(就是where,條件)

    查詢9. having子句 找出系平均工資超過42000美元的那些系中的教師的平均工資。select dept_name, avg(salary) as avg_salary -----步驟④ from instructor -----步驟① group by dept_name -----步驟② having avg(salary) > 42000; -----步驟③

    having子句使用 having avg_salary 會有什么不同?

    任何出現在having子句中,但沒有被聚集的屬性必須出現在 group by 子句中,否則查詢就被當成錯誤的。

    包含聚集、group by或having子句的查詢

    包含聚集、group by或having子句的查詢的含義可通過下述操作序列來定義:

  • 最先根據 from 子句計算出一個關系;
  • 如果出現 where 子句, where 子句 中的謂詞將應用到 from子句 的結果關系上;
  • 如果出現了group by 子句, ①滿足 where 謂詞的元組通過group by 子句形成分組。 ②如果沒有 group by 子句,滿足where謂詞的整個元組集被當做一個分組。
  • 如果出現了 having子句,它將應用到每個分組上;不滿足having子句謂詞的分組將被拋棄。
  • select 子句 利用剩下的分組產生出查詢結果中的元組,即在每個分組上應用聚集函數來得到單個結果元組。
  • 查詢10.同時使用having和where子句 “對于在2009年將受的每個課程段,如果該課程段至少2名學生選課,找出選修該課程段的所有學生的總學分(tot_cred)的平均值”。student(ID, name, dept_name, tot_cred) takes(ID, course_id, sec_id, semester, year, grade)select course_id, sec_id, semester,year,avg(tot_cred) //⑤對大表進行分割,返回的結果集 from takes natural join student //①自然連接 where year = 2009 //②該條件先確定了時間段為2009年 group by course_id,semester,year,sec_id //③找出了2009年段的數據后根據 course_id,semester,year,sec_id 分組 having count(ID) >= 2; //④對分組的數據進行選擇

    對空值和布爾值的聚集

    四、聚集函數處理空值規則如下:

  • 除了count(*) 外的所有聚集函數都忽略輸入集合中的空值;空值被忽略有可能造成參加函數運算的輸入值集合為空
  • 規定空集的count運算值為0 ;其他所有聚集運算在輸入為空集的情況下返回一個空值。
    SQL:1999 中 引入了布爾數據類型,可以取true, false, unknown 三個值。有兩個聚集函數some 和 every。

    開窗函數

    原文鏈接:https://www.cnblogs.com/lihaoyang/p/6756956.html

    一、開窗函數

    ? 與聚合函數一樣,開窗函數也是對行集組進行聚合計算,但是它不像普通聚合函數那樣每組只返回一個值,開窗函數可以為每組返回多個值,因為開窗函數所執行聚合計算的行集組是窗口。在 ISO SQL 規定了這樣的函數為開窗函數,在 Oracle 中則被稱為分析函數。

    ? 數據表(Oracle):T_Person 表保存了人員信息,FName 字段為人員姓名,FCity 字段為人員所在的城市名,FAge 字段為人員年齡,FSalary 字段為人員工資

    CREATE TABLE T_Person (FName VARCHAR2(20),FCity VARCHAR2(20),FAge INT,FSalary INT)

    向 T_Person 表中插入一些演示數據:

    [](javascript:void(0)😉

    INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Tom','BeiJing',20,3000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Tim','ChengDu',21,4000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Jim','BeiJing',22,3500); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Lily','London',21,2000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('John','NewYork',22,1000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('YaoMing','BeiJing',20,3000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Swing','London',22,2000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Guo','NewYork',20,2800); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('YuQian','BeiJing',24,8000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Ketty','London',25,8500); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Kitty','ChengDu',25,3000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Merry','BeiJing',23,3500); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Smith','ChengDu',30,3000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Bill','BeiJing',25,2000); INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Jerry','NewYork',24,3300);

    [](javascript:void(0)😉

    select * from t_person:

    要計算所有人員的總數,我們可以執行下面的 SQL 語句:SELECT COUNT(*) FROM T_Person

    除了這種較簡單的使用方式,有時需要從不在聚合函數中的行中訪問這些聚合計算的值。比如我們想查詢每個工資小于 5000 元的員工信息(城市以及年齡),并且在每行中都顯示所有工資小于 5000 元的員工個數:

    [](javascript:void(0)😉

    select fname,fcity,fsalary,(select count(*) from t_person where fsalary < 5000) 工資少于5000員工總數from t_personwhere fsalary < 5000

    [](javascript:void(0)😉

    雖然使用子查詢能夠解決這個問題,但是子查詢的使用非常麻煩,使用開窗函數則可以大大簡化實現,下面的 SQL 語句展示了如果使用開窗函數來實現同樣的效果:

    select fname, fcity, fsalary, count(*) over() 工資小于5000員工數from t_personwhere fsalary < 5000

    可以看到與聚合函數不同的是,開窗函數在聚合函數后增加了一個 OVER 關鍵字。

    開窗函數格式: 函數名(列) OVER(選項)

    ? 1)OVER 關鍵字表示把函數當成開窗函數而不是聚合函數。SQL 標準允許將所有聚合函數用做開窗函數,使用 OVER 關鍵字來區分這兩種用法。
    ? 2)在上邊的例子中,開窗函數 COUNT(*) OVER()對于查詢結果的每一行都返回所有符合條件的行的條數。OVER 關鍵字后的括號中還經常添加選項用以改變進行聚合運算的窗口范圍。如果 OVER 關鍵字后的括號中的選項為空,則開窗函數會對結果集中的所有行進行聚合運算。

    二、PARTITION BY 子句:

    開窗函數的 OVER 關鍵字后括號中的可以使用 PARTITION BY 子句來定義行的分區來供進行聚合計算。與 GROUP BY 子句不同,PARTITION BY 子句創建的分區獨立于結果集的,創建的分區只是供進行聚合計算的,而且不同的開窗函數所創建的分區也不互相影響。下面的 SQL 語句用于顯示每一個人員的信息以及所屬城市的人員數:

    select fname,fcity,fage,fsalary,count(*) over(partition by fcity) 所在城市人數 from t_person

    COUNT(*) OVER(PARTITION BY FCITY) 表示對結果集按照FCITY進行分區,并且計算當前行所屬的組的聚合計算結果。比如對于FName等于 Tom的行,它所屬的城市是BeiJing,同屬于BeiJing的人員一共有6個,所以對于這一列的顯示結果為6。

    這就不需要先對fcity分組求和,然后再和t_person表連接查詢了,省事兒。

    在同一個SELECT語句中可以同時使用多個開窗函數,而且這些開窗函數并不會相互干
    擾。比如下面的SQL語句用于顯示每一個人員的信息、所屬城市的人員數以及同齡人的人數:

    [](javascript:void(0)😉

    --顯示每一個人員的信息、所屬城市的人員數以及同齡人的人數: select fname,fcity,fage,fsalary,count(*) over(partition by fcity) 所屬城市的人個數,count(*) over(partition by fage) 同齡人個數from t_person

    [](javascript:void(0)😉

    三、ORDER BY子句:

    開窗函數中可以在 OVER 關鍵字后的選項中使用ORDER BY子句指定排序規則,而且有的開窗函數還要求必須指定排序規則。使用ORDER BY子句可以對結果集按照指定的排序規則進行排序,并且在一個指定的范圍內進行聚合運算。ORDER BY子句的語法為:

    ORDER BY 字段名 RANGE|ROWS BETWEEN 邊界規則1 AND 邊界規則2

    RANGE表示按照值的范圍進行范圍的定義,而ROWS表示按照行的范圍進行范圍的定義;邊界規則的可取值見下表:

    “RANGE|ROWS BETWEEN 邊界規則1 AND 邊界規則2”部分用來定位聚合計算范圍,這個子句又被稱為定位框架。

    例子程序一:查詢從第一行到當前行的工資總和:

    [](javascript:void(0)😉

    select fname,fcity,fage,fsalary,sum(fsalary) over(order by fsalary rows between unbounded preceding and current row) 到當前行工資求和from t_person

    [](javascript:void(0)😉

    上述語句的理解:

    這里的開窗函數 “SUM(FSalary) OVER(ORDER BY FSalary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)” 表示按照FSalary進行排序,然后計算從第一行(UNBOUNDED PRECEDING)到當前行(CURRENT ROW)的和,這樣的計算結果就是按照工資進行排序的工資值的累積和。

    第五節 其他查詢功能

    一、排名函數

    一)RANK()

    ? 我們理解的排名為1,2,3,········但是 RANK() 函數的排名形式可能為:1,2,4·········即可能存在并列的情況,但是 RANK() 函數不會是連續; 排名函數具有不確定性 , 排名從1開始,不一定是連續整數。

    二)DENSE_BANK()

    ? 排名是連續的整數

    三)NTILE()

    ? 將有序分區中的行劃分到指定的數目的組中,編號從1開始,函數返回此行所屬的組的編號。

    四)ROWNUMBER()

    ? 返回結果集中每個分區的序列號,每個分區的第一行從1開始。

    二、公用表表達式

    ? 1)公用表表達式定義:將查詢結果集指定一個臨時名字,這些命名的結果集就是公用表表達式。

    ? 2)格式:

    WITH <common_table_expression>[,…n] <common_table_expression>::= Expression_name[(column_name [,…n])] AS (SELECT語句)

    3)舉例:定義一個統計每個會員購買商品總次數的CTE,并利用CTE查詢會員卡號和購買商品的次數

    定義:WITH BuyCount(公用表表達式的名字+上后面的在那個列名)(CardID,Counts(加粗內容))AS (SELECT CardID,Count(*) FROM Table_SaleBill GROUP BY CardID )----->該步驟相當于在SQL server中新建了一張表,名字為 BuyCount 使用: AS(SELECT CardID,Counts FROM BuyCount ORDER BY Counts ---> 該步驟表示BuyCount進行查詢即實現上面語句的后半段

    第七章 例題講解(重點)

    **1.**設某數據庫中有旅客表A(旅客編號,城市)和旅客表B(旅客編號,城市),現將所有旅客的數據存儲這兩張表中。請補全如下查詢語句,使得該查詢語句能查詢所有旅客所在的全部的不重復的城市。

    SELECT 城市 FROM 旅客表A

    (  )

    SELECT 城市 FROM 旅客表B

    答案: UNION

    2.設有購買表(顧客號,商品號,購買時間)。現要查詢顧客A與顧客B購買的相同商品。有下列查詢語句:

    Ⅰ.SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘A’

    AND 商品號 IN (SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘B’)

    Ⅱ.SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘A’

    ? EXCEPT SELECT 商品號 FROM 購買表 WHERE 顧客號 = 'B‘

    Ⅲ.SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘A’

    ? INTERSECT SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘B’

    Ⅳ.SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘A’

    ? UNION SELECT 商品號 FROM 購買表 WHERE 顧客號 = ‘B’

    上述語句中,能夠實現該查詢要求的是(  )。

    A.僅Ⅰ和Ⅱ

    B.僅Ⅰ和Ⅲ

    C.僅Ⅰ和Ⅳ

    D.僅Ⅲ

    答案:B

    **3.**設有選課表(學號,課程號,成績),現要統計每門課程的選課人數,并將結果保存到新表:選課情況表。下列語句中正確的是( )。

    A.SELECT 課程號, COUNT(*) 選課人數 FROM 選課表 INTO 選課情況表GROUP BY 課程號

    B.SELECT 課程號, COUNT(*) 選課人數 INTO 選課情況表(關鍵 ) FROM 選課表 GROUP BY 課程號

    C.SELECT 課程號, COUNT(*) FROM 選課表 INTO 選課情況表(課程號,選課人數)GROUP BY 課程號

    D.SELECT 課程號, COUNT(*) INTO 選課情況表(課程號, 選課人數)

    FROM 選課表 GROUP BY 課程號

    答案:B

    4.設某數據庫中有學生表(學號,姓名,所在系)和選課表(學號,課程號,成績)。現要查詢沒選課的學生姓名和所在系。下列語句中能夠實現該查詢要求的是(  )。

    A.SELECT 姓名,所在系FROM學生表a LEFT JOIN選課表b

    ON a.學號=b.學號WHERE a.學號IS NULL

    **B.**SELECT 姓名,所在系 FROM 學生表a LEFT JOIN 選課表b

    ON a.學號=b.學號 WHERE b.學號IS NULL

    C.SELECT 姓名,所在系FROM學生表a RIGHT JOIN選課表b

    ON a.學號=b.學號WHERE a.學號IS NULL

    D.SELECT 姓名,所在系FROM學生表a RIGHT JOIN選課表b

    ON a.學號=b.學號WHERE b.學號IS NULL

    答案:B

    5.設在SQL Server2008中,用戶U1在DB1數據庫中創建了#Temp表。下列關于#Temp表的說法中,正確的是(  )。

    A.在所有用戶U1發起的連接中,都可以查詢#Temp表數據

    **B.**只有在創建#Temp表的連接中才可以查詢#Temp表數據

    C.在創建#Temp表的連接未斷開時,DB1數據庫的所有用戶都可以查詢#Temp表數據

    D. 在創建#Temp表的連接斷開時,DB1數據庫的所有用戶仍可以查詢#Temp表數據

    答案:B

    6.設在采用SQL Server 2008數據庫的圖書館應用系統中有三個基本表,表結構如下所示,請用SQL語句完成下列兩個查詢:

    ①BORROWER:

    借書證號姓名系名班級
    12011106蔣輝文計算機系12-1
    12011107王麗計算機系12-1
    12012113范園園信息系12-2
    ……………………

    ②LOANS:

    借書證號圖書館登記號借書日期
    12011106T0010012012.01.02
    12012113T0010262013.02.06
    ………………

    ③BOOKS:

    索書號書名作者圖書登記號出版社價格
    TP311.1數據庫系統李明T001001科學19.00
    TP311.2二級C語言王珊T001026人民32.00
    ………………………………

    (1)檢索至少借了5本書的同學的借書證號、姓名、系名和借書數。

    【參考答案】 (1)SELECT LOANS.借書證號,姓名,系名,COUNT(*) AS 借書數量 FROM BORROWER,LOANS WHERE BORROWER.借書證號=LOANS.借書證號 GROUP BY LOANS.借書證號 HAVING COUNT(*)>=5;

    (2)檢索借書和王麗同學所借圖書中的任意一本相同的學生姓名、系名、書名和借書日期。

    2)SELECT 姓名,系名,書名,借書日期 FROM BORROWER,LOANS , BOOKS WHEREBORROWER.借書證號=LOANS.借書證號 AND LOANS.圖書登記號=BOOKS.圖書登記號 AND 索書號 IN (SELECT 索書號 FROM BORROWER,LOANS,BOOKS WHERE BORROW.借書證號=LOANS.借書證號 AND LOANS.圖書館登記號=BOOKS.圖書登記號 AND 姓名="王麗")

    第八章 數據庫后臺編程技術

    該部分涉及到應用設計題——大題。

    第一節 存儲過程

    存儲過程詳解原文鏈接:https://www.cnblogs.com/mark-chan/p/5384139.html

    一、基本概念

    1)存儲過程:存儲在數據庫中供所有用戶程序調用的子程序(T-SQL語句);是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執行它。

    2)以子程序存儲在數據庫中的代碼(T-SQL語句)的執行:有權限的用戶方可執行。

    3)存儲過程的分類:①系統存儲過程、②用戶自定義存儲過程(用戶自己創建,完成特定的功能)、③擴展存儲過程

    二、創建、執行和刪除存儲過程

    1)創建語法:CREATE PROCEDURE 過程名 ([[IN|OUT|INOUT] 參數名 數據類型 [ , [IN|OUT|INOUT] 參數名 數據類型…]]) [特性 …] 過程體

    CREATE PROCEDURE myproc(OUT s int , y char(20))BEGINSELECT COUNT(*) INTO s FROM students;END

    2)參數:存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有**多個參數用","**分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型:IN,OUT,INOUT

    IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值

    OUT:該值可在存儲過程內部被改變,并可返回

    INOUT調用時指定,并且可被改變和返回

    3)過程體:過程體的開始與結束使用 BEGIN 與 END 進行標識。

    4)執行語法:EXEC (或EXECUTE)過程名(參數)+;。使用 DECLARE 進行變量的定義,@xxx為用戶變量(在數據庫中不可多用);SELECT 為返回值,相當于 print 函數。

    第二節 用戶自定義函數

    一、用戶自定義函數

    二、調用標量函數

    1)語法結構:

    CREATE FUNCTION function_name(@parameter_name parameter_data_type) --(@參數名 參數的數據類型)

    RETURNS date_type – 返回返回值的數據類型

    [WITH ENCRYPTION] --如果指定了 encryption 則函數被加密

    [AS]

    BEGIN

    function_body --函數體

    RETURN 表達式;

    END

    2)舉例:

    創建標量函數,計算指定課程號的課程的平均成績,然后調用該函數查詢某門課的平均成績。create function getavgdegreeofonecourse(@課程號 char(5)) returns float begindeclare @result floatselect @result=avg(degree) from score where score.cno=@課程號return @result end

    3)調用:

    --執行函數 SELECT dbo.MySTR('aa') AS result在sql 語句也可以這樣用: DECLARE @str3 VARCHAR(30)SET @str3=(select name from userinfo where huji=dbo.MySTR('邯鄲') and id=23 ) select @str3

    鏈接:https://blog.csdn.net/qq_16055765/article/details/88836520

    原文鏈接:https://blog.csdn.net/adreammaker/article/details/68071214

    三、創建和調用內嵌表值函數

    一)單表格查詢

    1)語法結構:
    CREATE FUNCTION function_name(@parameter_name parameter_data_type) --(@參數名 參數的數據類型)

    RETURNS table --返回一張表

    [AS]

    RETURN( --返回下面空白部分所寫語句中查詢的表

    )

    特點:內斂表值函數支持在WHERE子句中使用參數

    2)舉例:

    1)創建內聯表值函數,查詢指定學號的學生的選課情況(包括學號、姓名、課程號和成績),然后調用該函數查詢某位學生的選課情況, 再調用該函數將該生某門課的成績改為100,重新查詢該生成績檢查一下改過來了嗎。drop function getxuankeqingkuang create function getxuankeqingkuang(@學號 char(5)) returns table return(select student.sno,student.sname,course.cno,score.degree from student,course,score where student.sno=score.sno and score.cno=course.cnoand student.sno=@學號--查詢該生選課情況 select * from dbo.getxuankeqingkuang('101') --修改該生某門課程的成績 update dbo.getxuankeqingkuang('101') set degree=100 where cno='3-105' --重新查詢該生成績 select * from dbo.getxuankeqingkuang('101') go 舉例2: CREATE FUNCTION tabcmess(@title VARCHAR(10)) RETURNS TABLE AS return(select title,des from product where title like '%'+@title+'%')調用:SELECT * FROM tabcmess(‘aaa’)

    鏈接:https://blog.csdn.net/qq_16055765/article/details/88836520

    原文鏈接:https://blog.csdn.net/adreammaker/article/details/68071214

    二)多表格查詢:

    1)語法:create function 函數名(參數)

    ? returns 表格變量名 table (表格變量定義)

    as

    begin SQL語句 ( 要有函數返回值 ) end (單表格沒有 begin SQL語句 end 直接 return )

    2)舉例:

    CREATE function tabcmessalot (@title varchar(10)) Returns @ctable table(title varchar(10) null,des varchar(100) null) As Begin Insert @ctable Select title,des from product WHERE title LIKE '%'+@title+'%' return End–執行SELECT * FROM tabcmessalot(‘aaa’)

    四、刪除用戶自定義函數

    1)語法結構:DROP function 函數名(參數 參數類型)

    第四節 觸發器

    一、基本概念

    ? 1)觸發器:特殊的存儲過程,在對表中的數據進行 UPDATE、INSTER、DELETE 操作時自動觸發執行,常用于保證業務規則和數據完整性,增強數據完整性約束能力。

    ? 2)SQL server支持的三種類型觸發器:DML(數據操縱語言:Insert、Update、Delete)、DDL(數據定義語言:Create、Alter、Drop)、登錄觸發器。

    ? 3)規則:

    ? ① 觸發器名必須符合標識符規則,并且在數據庫中必須唯一。

    ? ② 觸發器所基于的對象。ON關鍵字后面指定在其上執行觸發器的表,也可以稱為觸發器表。除了表以外,視圖上也可以定義觸發器。使用 WITH ENCRYPTION 選項可以對 CREATE TRIGGER 語句的文本進行加密。 ③觸發器中使用的特殊表。執行觸發器時,系統創建了兩個特殊的臨時表inserted表和deleted表。當向表中插入數據時,INSERT觸發器觸發執行,新的記錄插入到觸發器表和inserted表中。deleted表用于保存已從表中刪除的記錄,當觸發一個DELETE觸發器時,被刪除的記錄存放到deleted表中。 ④ INSTEAD OF 表示前觸發器,在數據庫中最多只能有一個。

    二、語法

    CREATE TRIGGER table1_insert(觸發器名) ON table1(觸發器基于的對象 就是第二點) AFTER INSERT(表示觸發器的類型:后觸發器(AFTER/FOR)、前觸發器(INSTEAD OF);INSTER表示在進行插入操作時觸發)ASBEGIN觸發器函數體,在觸發器觸發后將會有什么影響或要進行什么操作。END

    三、刪除觸發器

    語法格式:DROP TRIGGER 觸發器名 (必須在當前數據庫進行這些操作,即在哪個數據庫創建在哪刪除)

    四、舉例

    原文鏈接:https://blog.csdn.net/weixin_43107805/article/details/103091354

    (1)創建一個表table1,其中只有一列a。在表上創建一個觸發器,每次插入操作時,將變量@str的值設為“TRIGGER IS WORKING”并顯示。

    USE PXSCJ GO CREATE TABLE table1(a int) GO CREATE TRIGGER table1_insert ON table1 AFTER INSERTASBEGINDECLARE @str char(50)SET @str='TRIGGER IS WORKING'PRINT @strEND

    向table1中插入一行數據: INSERT INTO table1 VALUES(10) 執行結果如下所示:

    2)創建觸發器,當向CJB表中插入一個學生的成績時,將XSB表中該學生的總學分加上添加的課程的學分。

    CREATE TRIGGER cjb_insert ON CJB AFTER INSERTASBEGINDECLARE @num char(6), @kc_num char(3)DECLARE @xf intSELECT @num=XH, @kc_num=KCH FROM insertedSELECT @xf=XF FROM KCB WHERE KCH=@kc_numUPDATE XSB SET ZXF=ZXF+@xf WHERE XH=@numPRINT '修改成功'END

    (3)創建觸發器,當修改XSB表中的學號時,同時也要將CJB表中的學號修改成相應的學號(假設XSB表和CJB表之間沒有定義外鍵約束)

    CREATE TRIGGER xsb_update ON XSBAFTER UPDATEASBEGINDECLARE @old_num char(6), @new_num char(6)SELECT @old_num=XH FROM deletedSELECT @new_num=XH FROM insertedUPDATE CJB SET XH=@new_num WHERE XH=@old_numEND

    接著修改XSB表中的一行數據,并查看觸發器執行結果:

    UPDATE XSB SET XH='081120' WHERE XH='081101' GO SELECT * FROM CJB WHERE XH='081120'

    (4)創建DELETE觸發器。在刪除XSB表中的一條學生記錄時將CJB表中該學生的相應記錄也刪除。

    CREATE TRIGGER xsb_deleteON XSB AFTER DELETEASBEGINDELETE FROM CJB WHERE XH IN(SELECT XH FROM deleted)END

    第四節 游標

    一、概念

    相當于指針(數組的索引)——> 聯想到數據庫的鏈表和Java的數組的索引

    定義:實現對 SELECT 結果集的逐行處理。

    二、游標的語法結構

    ①聲明游標: DECLARE 游標名 CURSOR FOR 結果集

    ②打開游標:OPEN 游標名 INTO 結果集 (游標的位置默認在結果集的第一行)

    ③提取數據:FETCH 游標名

    ④關閉游標:CLOSE 游標名 可以再次打開

    ⑤釋放游標:DEALLOCATE 游標名

    三、舉例

    1. 對Table_Customer表,定義一個查詢“長沙岳麓區”姓“王”的顧客姓名和郵箱的游標,并輸出游標結果。

    DECLARE @cn VARCHAR(10 @cn VARCHAR(50)

    ①聲明:DECLARE Cname_cursor CURSOR FOR

    SELECT Cname,Email FROM Table_Customer

    WHERE Cname LIKE ‘王%’AND Address LIKE ‘長沙岳麓區’

    ②打開:OPEN Cname_cursor

    ③提取:FETCH NEXT FROM Cname_cursor INTO @cn , @Email

    WHILE @@ FETCH_STATUS=0

    BEGIN

    PRINT’顧客姓名’+@cn +‘,郵箱:’+ @Email

    FETCH NEXT FROM Cname_cursor INTO @cn , @Email

    END

    ④關閉:CLOSE Cname_cursor

    ⑤釋放:DEALLOCATE Cname_cursor

    第八章 例題

    1、在SQL Server 2008中,對于更新操作的觸發器,系統將產生2張邏輯工作表,其中存放更新前數據的邏輯工作表是(  )。

    答案:DELETE

    2、刪除用戶自定義的函數使用(  )語句來實現。

    答案:DROP FUNCTION

    3、設在數據庫應用系統設計與實現過程中有下列活動:

    Ⅰ. 創建觸發器

    Ⅱ. 定義事務隔離性級別

    Ⅲ. 數字簽名

    Ⅳ. 定義主碼

    上述活動中,用于數據庫的完整性保護的是(  )

    A.僅Ⅰ和Ⅳ B.僅Ⅰ和Ⅱ

    C.僅Ⅲ和Ⅳ D.僅Ⅱ和Ⅲ

    答案:B

    4、利用游標機制可以實現對查詢結果集的逐行操作。下列關于SQL Server 2008中游標的說法中,錯誤的是(  )

    A. 每個游標都有一個當前行指針,當游標打開后,當前行指針自動指向結果集的第一行數據

    B.如果在聲明游標時未指定INSENSITIVE選項,則已提交的對基表的更新都會反映在后面的提取操作中

    C.當@@FETCH_STATUS=0時,表明游標當前行指針已經移出了結果集范圍

    D.關閉游標之后,可以通過OPEN語句再次打開該游標

    答案:C

    5、在SQL Server 2008中,用于判斷游標數據提取狀態的全局變量是(  )。

    答案:@@FETCH_STATUS

    6、設在SQL Server 2008某數據庫中有按如下格式定義的存儲過程首部

    CREATE PROC P1(存儲過程名)

    @x int, @y int, @z int output AS …

    請補全下列調用該存儲過程的語句。

    DECLARE @S int

    EXEC P1 20, 30, @S (  )

    答案:output

    7、在SQL Server 2008中,設有教師表(教師號, 姓名, 所在部門號, 職稱) 和 部門表(部門號, 部門名, 高級職稱人數)。請編寫滿足下列要求的后觸發型觸發器 (設觸發器名字為tri_zc)。

    每當在教師表中插入一名具有 高級職稱(“教授"或"副教授”) 的教師時,或者將非高級職稱教師的職稱更改為高級職稱時,均修改部門表中相應部門的高級職稱人數。(假設一次操作只插入或更改一名教師的職稱) )——>修改時觸發(INSERT)

    【參考答案】CREATE TRIGGER tri_zc ON 教師表 AFTER INSERT,UPDATE AS BEGIN DECLATE@zc varchar(10),@dept varchar(30) SELECT @dept=所在部門號,@2c=職稱 FROM inserted IF @zc =′教授′ or ′副教授′ Update 部門表 SET 高級職稱人數 = 高級職稱人數 + 1 Where 部門號 = @dept End

    8、設在SQL Server 2008某數據庫中有商品表和銷售表,兩個表的定義如下:

    ① CREATE TABLE 商品表(

    商品號 char(10)PRIMARY KEY,

    商品名 varchar(40),

    類別 varchar(20),

    進貨單價 int )

    ② CREATE TABLE 銷售表(

    商品號 char(10),

    銷售時間 datetime,

    銷售數量 int,

    銷售單價 int,

    PRIMARY KEY(商品號,銷售時間))

    下面是一個用戶定義的多語句表值函數,它接受類別作為輸入參數,返回該類別下的每種商品在2012年的銷售總利潤,并將結果按照銷售總利潤的降序輸出。請補全該函數定義代碼。

    CREATE FUNCTION f_Profit (@lb char(10)) 【1】@ProfitTable【2】(

    商品號 char(10),

    總利潤 int )

    AS

    BEGIN

    INSERT INTO @ProfitTable

    【3】

    【4】

    END

    【參考答案】

    第一空:RETURNS

    第二空:table

    第三空:a SELECT a.商品號,SUM(銷售數量(銷售單價-進貨單價)) AS總利潤 FROM 銷售表 a JOIN商品表b ON a. 商品號=b. 商品號 WHERE a.商品號 IN(SELECT 商品號 FROM 商品表 WHERE 類別=@lb) GROUP BY a. 商品號ORDER BY 總利潤 DESC*

    第四空:RETURN@Rrofit Table

    第九章 安全管理

    第一節 安全控制概述

    一、數據庫安全性與數據的完整性。

    安全性:保護數據以防止不合法用戶故意造成破壞。

    (確保用戶被允許做其想做的事情。)

    完整性:保護數據以防止合法用戶無意中造成的破壞。

    (確保用戶做的事情是正確的。)

    二、安全控制模型

    包括四階段:

    ①身份驗證(用戶)

    ②操作權限控制(數據庫應用程序與數據庫管理系統)

    ③文件操作控制(操作系統)

    ④加密存儲與冗余(數據庫)

    三、授權和認證

    1)認證是一種鑒定用戶身份的機制(相當于開門并走進去)。授權(相當于對里面的東西進行操作(賦予權限))是將合法訪問數據庫或數據庫對象的權限授予用戶的過程。包括認證用戶對對象的訪問請求。

    2)DBMS(數據庫管理系統)通常采用自主存取控制和強制存儲控制兩種方案來解決安全控制問題

    第二節 存取控制

    一、自主存取控制

    1)自主存取控制又稱自主安全模式, 通過SQL的**GRANT(授予權限),REVOKE(收回權限),DENY(拒絕權限)**語句來實現。

    2)權限種類:維護權限 與 操作權限(語句權限與對象權限)

    3)用戶分類:系統管理員(sa)、數據庫對象擁有者、普通用戶。

    二、強制存取控制

    1)目的:為避免自主存取模式下數據的“無意泄露”,采取強制存取控制。

    2)DBMS將全部實體分為主體和客體兩大類。

    ? ?主體:系統活動實體,實際用戶和進程。

    ? ?客體:被動實體,受主體操縱,包括文件、基本表、視圖。

    3)敏感度標記:DBMS指派,主體為許可證級別客體為密級。分絕密、秘密、可信和公開等若干級別。

    4)強制存取控制遵循如下規則:

    ? ?①僅當主體許可證級別大于或等于客體密級,主體可以讀取相應客體

    ? ?②僅當主體許可證級別等于客體密級,該主體才能寫相應客體。

    第三節 審計跟蹤

    1)審計跟蹤實質上是一種特殊的文件或數據庫系統自動記錄用戶對常規數據的所有操作。

    2)審計跟蹤對數據安全有輔助作用。

    第四節 統計數據庫的安全性

    統計數據庫允許用戶查詢聚合類型的信息,如總和、平均等,但不允許查詢個人信息

    一、身份驗證模式

    1)Windows身份驗證模式

    SQL Server通過Windows操作系統獲得用戶信息,驗證登錄名和密碼,一般推薦。

    2)混合身份驗證模式

    ? Windows授權用戶和SQL授權用戶可以登錄。

    二、登錄帳戶

    1)建立登錄賬戶

    ? CREATE LOGIN login_name(賬戶名)

    2)修改登錄帳戶屬性

    ? ALTER LOGIN login_name

    3)刪除登錄帳戶

    ? DROP LOGIN login_name

    舉例“:

    CREATE LOGIN SQL_User1 WITH PASSWORD=‘a1b2c3XY’-------設置用戶名和密碼

    ALTER LOGIN SQL_User1 WITH PASSWORD=‘a4b5c6XY’

    ALTER LOGIN SQL_User3 WITH NAME=NewUser

    三、數據庫用戶

    ? 1)用戶有了登錄帳戶,只能連接到SQL服務器,并不具有訪問數據庫的權限。

    ? 2)映射:讓登錄賬戶成為數據庫用戶的操作成為映射。一個登錄賬戶可以映射為多個數據庫用戶。默認情況下,新建數據庫只有一個用戶:dbo,數據庫用戶的擁有者。

    ? 3)①建立數據庫用戶

    ? CREATE USER user_name [|FOR|FROM] -------表示可選,選擇其中一個

    ? LOGIN login_name(自定義的用戶名)------整個過程為映射

    ? ②Guest用戶,特殊數據庫用戶,匿名訪問,沒有映射到登錄賬戶的時候使用

    ? GRANT CONNECT TO guest

    ? REVOKE CONNECT TO guest

    ? ③刪除數據庫用戶

    ? DROP USER user_name

    四、權限管理

    ? 1)登錄賬戶成為合法用戶后沒有任何操作權限,就需要為用戶授予數據庫數據及其對象的操作權限。

    (1)對象級別的權限(6種)

    ? SELECT、INSERT、UPDATE、DELETE、REFERENCES、EXECUTE

    ? 1)授權語句:

    ? 語法結構:GRANT 對象權限 ON 對象(表、視圖、觸發器等等) TO (主體:數據庫用戶名或角色)[WITH GRANT OPTION]

    ? 實例:

    ? GRANT SELECT ON Addres TO abc

    ? GRANT EXECUTE ON OBJECT::HR.EI TO abc

    ? GRANT REFERENCES(EmployeeID)ON vEmp TO abc WITH GRANT OPTION

    2)拒絕權限

    ? ①語法結構:DENY 對象權限 ON 對象 TO (主體:數據庫用戶名或角色) [CASCADE] [AS主體]

    ? ②實例:

    ? DENY SELECT ON Addres TO abc

    ? DENY EXECUTE ON OBJECT::HR.EI TO abc

    ? DENY REFERENCES(EmployeeID)ON vEmp TO abc CASCADE

    3)收權語句

    ? ①語法結構:REVOKE 對象權限 ON 對象 TO (主體:數據庫用戶名或角色) [CASCADE] [AS角色]

    ? ②實例:

    ? REVOKE SELECT ON Addres TO abc

    ? REVOKE EXECUTE ON OBJECT::HR.EI TO abc

    ? REVOKE REFERENCES(EmployeeID)ON vEmp TO abc CASCADE

    (2)語句級別的權限

    ? 1)語法結構:CREATE DATABASE| PROCEDURE| TABLE| VIEW| FUNCTION | BACKUP DATABASE| LOG

    ? 2)實例:

    ? GRANT CREATE DATABASE TO user0

    ? GRANT CREATE DATABASE , CREATE VIEW TO user1,user2

    ? DENY CREATE VIEW TO user1

    ? REVOKE CREATE DATABASE FROM user0

    五、角色

    1)定義:一組具有相同權限的用戶就是角色。

    2)SQL Server 2008中,角色分為預定義的系統角色和用戶角色兩種。

    ? ?系統角色又分為固定服務器角色(服務器級角色)和固定數據庫角色(數據庫級角色)。

    ? ?用戶角色均是數據庫級角色。

    1、固定服務器角色

    1)角色及權限

    ?Bulkadmin:執行BULK INSERT語句權限。

    ?Dbcreator:創建、修改、刪除、還原數據庫權限。

    ?Diskadmin:具有管理磁盤文件的權限

    ?Processadmin管理運行進程權限。

    ?Securtyadmin:專門管理登錄賬戶、讀取錯誤日志執行CREATE DATABASE 權限的賬戶,便捷。

    ?Serveradmin:服務器級別的配置選項和關閉服務器權限。

    ?Setupadmin:添加、刪除鏈接服務器。

    ?Sysadmin:系統管理員 ,Windows超級用戶自動映射為系統管理員。

    ?Public:系統預定義服務器角色,每個登錄名都是這個角色的成員。沒有授予或拒絕特定權限,則將具有這個角色權限。

    2)例:

    (1)為固定服務器角色添加成員

    ? Sp_addsrvrolemember

    ? EXEC Sp_addsrvrolemember ‘user1’(要賦予的用戶),‘sysadmin’(賦予用戶的角色)

    (2)刪除固定服務器角成員

    ? Sp_dropsrvrolemember

    ? EXEC Sp_dropsrvrolemember ‘user1’(要賦予的用戶),‘sysadmin’(賦予用戶的角色)

    2、固定數據庫角色

    1)角色及權限

    定義在數據庫級別上,存在于每個數據庫中。用戶加入固定數據庫角色就具有數據庫角色權限。

    ?Db_accessadmin:添加或刪除數據庫權限

    ?Db_backupoperator:備份數據庫、日志權限

    ?Db_datareader:查詢數據庫數據權限

    ?Db_datawriter:具有插入、刪除、更改權限

    ?Db_ddladmin:執行數據定義的權限

    ?Db_denydatareader:不允許具有查詢數據庫中所有用戶數據的權限。

    ?Db_denydatawriter:不允許具有插入、刪除、更改數據庫中所有用戶數據權限。

    ?Db_owner具有全部操作權限,包括配置、維護、刪除數據庫。

    ?Db_securityadmin:具有管理數據庫角色、角色成員以及數據庫中語句和對象的權限。

    2)例:

    (1)為固定數據庫角色添加成員

    ? Sp_addrolemember

    ? EXEC Sp_addrolemember ‘Db_datareader’,‘SQL_User2’

    (2)刪除固定服務器角成員

    ? Sp_droprolemember

    ? EXEC Sp_droprolemember ‘Db_datareader’,‘SQL_User2’

    3、用戶定義的角色

    ?用戶定義的角色屬于數據庫一級。

    ?用戶定義的角色成員可以是用戶定義角色或數據庫用戶

    注意: 角色中的成員擁有的 權限=成員自身權限+所在角色權限(例如:既是qq成員又是管理員) 。但若某個權限在角色中被拒絕,則成員不再擁有。

    4、創建用戶定義的角色

    CREATE ROLE

    實例: CREATE ROLE MathDept [AUTHORIZATION(授權) Software]

    注意:為用戶定義角色授權(GRANT)、添加、刪除(DENY)用戶定義的角色中的成員與固定數據庫角色一致。

    5、刪除用戶定義角色

    DROP ROLE

    實例:DROP ROLE MathDept

    第六節 Oracle的安全管理

    Oracle的安全機制分為數據庫級的安全控制、表級、列級、行級的安全控制

    Oracle系統通常設置兩級安全管理員:全局級(相當于中央)、場地級(相當于地方 )

    一、用戶與資源管理

    按權限大小劃分為DBA用戶(sys與system用戶,擁有全部系統特權)和普通用戶(DBA用戶或有相應特權的用戶創建,并賦予權限)

    二、建立用戶

    CREATE USER use1 IDENTIFIED BY 123456

    DEFAULT TABLESPACE student(存儲在student表空間)

    QUOTA 5M ON student(限制使用空間為5M)

    三、管理用戶和資源

    ?DBA特權用戶可以改變一個用戶資源使用限額、密碼、登錄次數等

    ALTER USER use1

    QUOTA 60M ON student(限制使用空間為60M)

    ALTER USER use1 IDENTIFIED BY 12345678

    四、刪除用戶

    DROP USER

    DROP USER user1 CASCADE(刪除用戶及其所擁有的全部對象)

    五、權限管理

    (1)系統特權

    ? 三種默認特權:

    ? ?Connect: 不能建立任何對象,可以查詢數據字典及訪問數據庫對象。

    ? ?Recource :可建立數據庫對象(表、視圖、索引……)

    ? ?DBA :擁有預定義的全部權限 。

    (2)對象特權

    ? 用于維護表級、行級、列級數據的安全性。

    ? 實例:

    ? GRANT all ON dep TO user1 (授權語句)

    ? GRANT select(tno,tname,sal) ON teacher TO user2

    第九章 例題

    1.在SQL Server 2008某數據庫中,用戶U1是Role1角色中的成員。設在該數據庫中執行了下述授權語句:

    GRANT INSERT ON T TO U1

    GRANT UPDATE, DELETE ON T TO Role1

    GRANT SELECT ON T TO PUBLIC

    DENY UPDATE ON T TO PUBLIC (刪除權限)

    則用戶U1對T表具有的操作權限是(  )。

    A. INSERT

    B. INSERT、UPDATE和DELETE

    C.INSERT、SELECT和DELETE

    D.INSERT和DELETE

    答案:C

    2.在SQL Server 2008中,設log1是SQL Server身份驗證模式的數據庫服務器登錄帳戶。現要授予log1具有創建數據庫的權限,請補全下列語句:

    EXEC sp_addsrvrolemember ′log1′, ′ (  ) ′

    答案: dbcreator (服務器角色)

    3.在SQL Server 2008的某數據庫中,設用戶U1同時是角色R1和角色R2中的成員。現已授予角色R1對T具有SELECT、INSERT和UPDATE權限,授予角色R2對表T具有INSERT 和 DENY UPDATE權限,沒有對U1進行其他授權,則U1對表T有權執行的操作是( )。

    A.SELECT和UPDATE

    B.INSERT、UPDATE和SELECT

    C.SELECT和INSERT

    D.SELECT

    答案:C

    4.在SQL Server 2008中,設用戶 U1 是某數據庫 db_datawriter 角色中的成員,則U1在該數據庫中有權執行的操作是(  )。

    A. SELECT(db_datareader 的權限)

    B.SELECT和INSERT

    C. INSERT、UPDATE和DELETE(db_datawriter:沒有查詢功能)

    D.SELECT、INSERT、UPDATE和DELETE

    答案:C

    5.在SQL Server 2008中,只具有修改數據庫中全部用戶表數據權限的系統角色是 (  ) 。

    答案: db_datawriter

    6.設在SQL Server 2008某數據庫中,要設置不允許用戶U1獲得對表T數據的刪除權限,請補全實現該授權操作的SQL語句:

    (  )ON T TO U1;

    數據庫權限

    ?Db_backupoperator:備份數據庫、日志權限

    ?Db_datareader:查詢數據庫數據權限

    ?Db_datawriter:具有插入、刪除、更改權限

    ?Db_ddladmin:執行數據定義的權限

    ?Db_denydatareader:不允許具有查詢數據庫中所有用戶數據的權限。

    ?Db_denydatawriter:不允許具有插入、刪除、更改數據庫中所有用戶數據權限。

    ?Db_owner具有全部操作權限,包括配置、維護、刪除數據庫。

    ?Db_securityadmin:具有管理數據庫角色、角色成員以及數據庫中語句和對象的權限。

    2)例:

    (1)為固定數據庫角色添加成員

    ? Sp_addrolemember

    ? EXEC Sp_addrolemember ‘Db_datareader’,‘SQL_User2’

    (2)刪除固定服務器角成員

    ? Sp_droprolemember

    ? EXEC Sp_droprolemember ‘Db_datareader’,‘SQL_User2’

    3、用戶定義的角色

    ?用戶定義的角色屬于數據庫一級。

    ?用戶定義的角色成員可以是用戶定義角色或數據庫用戶

    注意: 角色中的成員擁有的 權限=成員自身權限+所在角色權限(例如:既是qq成員又是管理員) 。但若某個權限在角色中被拒絕,則成員不再擁有。

    4、創建用戶定義的角色

    CREATE ROLE

    實例: CREATE ROLE MathDept [AUTHORIZATION(授權) Software]

    注意:為用戶定義角色授權(GRANT)、添加、刪除(DENY)用戶定義的角色中的成員與固定數據庫角色一致。

    5、刪除用戶定義角色

    DROP ROLE

    實例:DROP ROLE MathDept

    第六節 Oracle的安全管理

    Oracle的安全機制分為數據庫級的安全控制、表級、列級、行級的安全控制

    Oracle系統通常設置兩級安全管理員:全局級(相當于中央)、場地級(相當于地方 )

    一、用戶與資源管理

    按權限大小劃分為DBA用戶(sys與system用戶,擁有全部系統特權)和普通用戶(DBA用戶或有相應特權的用戶創建,并賦予權限)

    二、建立用戶

    CREATE USER use1 IDENTIFIED BY 123456

    DEFAULT TABLESPACE student(存儲在student表空間)

    QUOTA 5M ON student(限制使用空間為5M)

    三、管理用戶和資源

    ?DBA特權用戶可以改變一個用戶資源使用限額、密碼、登錄次數等

    ALTER USER use1

    QUOTA 60M ON student(限制使用空間為60M)

    ALTER USER use1 IDENTIFIED BY 12345678

    四、刪除用戶

    DROP USER

    DROP USER user1 CASCADE(刪除用戶及其所擁有的全部對象)

    五、權限管理

    (1)系統特權

    ? 三種默認特權:

    ? ?Connect: 不能建立任何對象,可以查詢數據字典及訪問數據庫對象。

    ? ?Recource :可建立數據庫對象(表、視圖、索引……)

    ? ?DBA :擁有預定義的全部權限 。

    (2)對象特權

    ? 用于維護表級、行級、列級數據的安全性。

    ? 實例:

    ? GRANT all ON dep TO user1 (授權語句)

    ? GRANT select(tno,tname,sal) ON teacher TO user2

    第九章 例題

    1.在SQL Server 2008某數據庫中,用戶U1是Role1角色中的成員。設在該數據庫中執行了下述授權語句:

    GRANT INSERT ON T TO U1

    GRANT UPDATE, DELETE ON T TO Role1

    GRANT SELECT ON T TO PUBLIC

    DENY UPDATE ON T TO PUBLIC (刪除權限)

    則用戶U1對T表具有的操作權限是(  )。

    A. INSERT

    B. INSERT、UPDATE和DELETE

    C.INSERT、SELECT和DELETE

    D.INSERT和DELETE

    答案:C

    2.在SQL Server 2008中,設log1是SQL Server身份驗證模式的數據庫服務器登錄帳戶。現要授予log1具有創建數據庫的權限,請補全下列語句:

    EXEC sp_addsrvrolemember ′log1′, ′ (  ) ′

    答案: dbcreator (服務器角色)

    3.在SQL Server 2008的某數據庫中,設用戶U1同時是角色R1和角色R2中的成員。現已授予角色R1對T具有SELECT、INSERT和UPDATE權限,授予角色R2對表T具有INSERT 和 DENY UPDATE權限,沒有對U1進行其他授權,則U1對表T有權執行的操作是( )。

    A.SELECT和UPDATE

    B.INSERT、UPDATE和SELECT

    C.SELECT和INSERT

    D.SELECT

    答案:C

    4.在SQL Server 2008中,設用戶 U1 是某數據庫 db_datawriter 角色中的成員,則U1在該數據庫中有權執行的操作是(  )。

    A. SELECT(db_datareader 的權限)

    B.SELECT和INSERT

    C. INSERT、UPDATE和DELETE(db_datawriter:沒有查詢功能)

    D.SELECT、INSERT、UPDATE和DELETE

    答案:C

    5.在SQL Server 2008中,只具有修改數據庫中全部用戶表數據權限的系統角色是 (  ) 。

    答案: db_datawriter

    6.設在SQL Server 2008某數據庫中,要設置不允許用戶U1獲得對表T數據的刪除權限,請補全實現該授權操作的SQL語句:

    (  )ON T TO U1;

    答案: DENY DELETE

    總結

    以上是生活随笔為你收集整理的计算机三级——数据库技术的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。