資料庫完整性+T-SQL

Leon Devine發表於2019-04-15

資料庫完整性

定義

資料庫的完整性(integrity)是指資料的正確性(correctness)和相容性(compat-abiity)。 資料庫的完整性是防止不合語義或不正確的資料進入資料庫 完整性體現了是否真實地反映現實世界

意義

用合適的完整性約束來規範資料,方便查詢和操作,也方便後期的維護和優化。

資料模型(關係)

結構 操作 完整性

DBMS的完整性機制

提供了定義完整性約束條件的機制
提供了完整性檢查的方法
違約處理

實體完整性(區分記錄)

關係模型的實體完整性

Primary key

定義實體完整性

單一屬性可以在列級和表級定義主碼
多屬性只能在表級定義主碼

DBMS實體完整性檢查和違約處理

檢查

檢查記錄中主碼值是否唯一的一種方法是進行全表掃描
該方法缺點:耗時

違約處理

拒絕操作

參照完整性(Foreign key)

定義參照完整性

create table sc(
    //列級定義參照完整性
    sno char(9) foreign key (sno) references student(sno),
    cno char(4),
    grade smallint,
    //表級定義實體完整性
    primary key(sno,cno),
    //表級定義參照完整性
    foreign key (cno) references student(cno)
)

複製程式碼

參照完整性檢查和違約處理

如上程式碼:student表為被參照表,sc為參照表

被參照表(例如Student) 參照表(例如SC) 違約處理
可能破壞參照完整性 <—— 插入元組 拒絕
可能破壞參照完整性 <—— 修改外碼值 拒絕
刪除元組 ——> 可能破壞參照完整性 拒絕/級聯刪除/設定為空值
修改主碼值 ——> 可能破壞參照完整性 拒絕/級聯刪除/設定為空值

違約處理

拒絕執行(預設處理)
級聯操作
設定為空值

create table sc(
    //顯式說明參照完整性的違約處理示例
    //列級定義參照完整性
    sno char(9),
    cno char(4),
    grade smallint,
    //表級定義實體完整性
    primary key(sno,cno),
    //表級定義參照完整性
    foreign key (sno) references student(sno)
    on delete cascade //級聯刪除sc表中相應的元組
    on update cascade,//級聯更新sc表中相應的元組
    foreign key (cno) references course(cno)
    on delete no action//當刪除course表中的元組造成了與sc表不一致時拒絕刪除
    on update cascade//當更新course表中的cno時,級聯更新sc表中相應的元組

    //如果在表級定義實體完整性,隱含了sno,cno不允許取空值,則在列級不允許取空值的定義就不必寫了
)

複製程式碼

使用者定義的完整性

定義

使用者定義的完整性就是針對某一具體應用的資料必須滿足的語義要求
RDBMS提供,而不必由應用程式承擔

屬性約束條件的定義

定義

列值為空not null
列值唯一unique
檢查列值是否滿足一個條件表示式check

create table sc(
    sno char(9) not null,//不允許取空值
    cno char(4) unique not null,//要求cno列值唯一,且不能取空值
    ssex char(2) check(ssex in('男','女')),//用check短語制定列值應滿足的條件,in後面跟集合
    grade smallint check(grade>=0 and grade<=100>)//或者使用between 0 and 100
 
)
複製程式碼

ps:查詢某個欄位是否為空 ~ where sno is (not) null

屬性上約束條件的檢查和違約處理

拒絕執行

元組上的約束條件

在create table可以用check短語定義元組上的約束條件,即元組級的限制

定義
create table sc(
    sno char(9) ,
    ssex char(2),
    sname char(10),
    check(ssex='女' or sname not like 'Ms.%')//當性別為男時檢查名字不能以Ms.開頭
 
)
複製程式碼
元組上約束條件的檢查和違約處理

完整性約束命名子句

constraint約束

建立

    constraint <完整性約束條件名><完整性約束條件>
複製程式碼
    create table student(
        sno numeric(6)
        constraint c1 check(sno between 9000 and 9999),
        sname char(20)
            constraint c2 not null,
        sage numeric(3)
            constraint c3 check(sage<30),
        ssex char(2)
            constraint c4 check (ssex in('男','女')),
            constraint studentKey primary key(sno)

    )

    //在student表上建立了5個約束條件,包括主碼約束(命名為studentKey以及C1,C2,C3,C4這四個列級約束)
複製程式碼

修改

可以先刪除原來的約束條件,再增加新的約束條件

//去掉上表對性別的限制
    alter table student 
        drop constraint C4;
複製程式碼
//修改表student中的約束條件,要求學號改為在9000~9999之間的年齡由小於30改為小於40
//先刪除原來的約束條件,再新增新的約束條件
alter table student
    drop constraint c1;
alter table student
    add constraint c1 check (sno between 9000 and 9999);
alter table student
    drop constraint c3;
alter table student
    add constraint c3 check(sage<40>
    )
複製程式碼

域中的完整性限制(略)

斷言

概念

在SQL中可以使用資料定義語言中的create assertion語句,通過宣告性斷言來指定更具一般性的約束

建立斷言的語句格式

create assertion <斷言名> <check子句> 每個斷言都被賦予一個名字,<check 子句>中的約束條件與where子句的條件表打式類似。

//限制資料庫課程最多60名學生選修
create assertion asse_sc_db_num
    check(60>=(select count(*)//此斷言的謂詞涉及聚集操作count的sql語句
    from course,sc
    where sc.cno = course.cno adn course.cname='資料庫'
    );

//每當學生選修課程時,將在sc表中插入一條元組(sno,cno,null),asse_sc_db_num斷言被觸發檢查,如果選修資料庫課程的人數已經超過60人,check返回值就為“假”,對sc表的插入操作被拒絕。
複製程式碼

刪除斷言的語句格式

drop assertion <斷言名>

觸發器

Transact(事務)——SQL語言簡介

快速入門:www.jianshu.com/p/a7bb06705… 系統學習:www.w3cschool.cn/t_sql/t_sql…

概念

T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增強版,它是用來讓應用程式與 SQL Server 溝通的主要語言。T-SQL 提供標準 SQL 的 DDL 和 DML 功能,加上延伸的函式、系統預存程式以及程式設計結構(例如 IF 和 WHILE)讓程式設計更有彈性。

常用語句

兩種註釋方式
  1. "--"
    ep:use st //選擇資料庫
    go//批處理結束
  2. "---"
    用法同其他語言
批處理GO

批處理時傳給伺服器的一組完整的資料和指令 一個批處理中的所有語句作為一個整體被成組的分析、編譯、和執行

print命令

格式:print ‘需要輸出的字串’
功能:傳送使用者指定的資訊

Use mydata;
    GO
    If Exists(select cname from course where cname='作業系統')
    print '你選擇的課程是作業系統'
    GO
複製程式碼
變數

全域性變數
由系統定義和維護,使用者不能建立和修改。作用範圍時所有應用過程式。
全域性變數的表示:@@名稱
ep: @@ SERVERNAME SELECT @@SERVERNAME AS 本地伺服器
(1)區域性變數
  區域性變數由使用者定義,一般出現在批處理、儲存過程和觸發器中,其作用範圍僅在程式內部。
  區域性變數必須先宣告,後使用。T-SQL還為區域性變數提供了賦值語句。
  ①declare變數宣告語句,其語法格式為:

declare @變數1 [as] datatype,@變數2 [as] datatype...
複製程式碼

區域性變數名稱必須以@開始開頭
as可以省略
賦初值NULL

區域性變數的賦值有三種方式:
  ①在變數定義的時候對其賦值:

declare @變數1 [as] datatype = value,@變數2 [as] datatype = value...
複製程式碼

②select賦值語句,其語法格式為:

select @變數1 = 表示式1,@變數2 = 表示式2...
複製程式碼

用select命令可以一次給多個變數賦值
表示式可以為普通的value,也可以為查詢結果
當表示式為表的列名時,形式與普通查詢中使用列別名的用法類似。可以使用子查詢從表中一次返回多個值。
如果查詢的結果為多行,則只會把最後一行的相應列值賦給變數,這與PL/SQL的處理方式不同,在PL/SQL中,不允許把多行查詢結果賦值給變數

③set賦值語句,其語法格式為:

set @變數 = 表示式
複製程式碼

基本用法和select一樣,區別在於一條set賦值語句只能給一個變數賦值,而一條select語句可以給多個變數賦值


【示例】
declare @sumsal as numeric(10,2),@dno as tinyint
select @dno = deptno,@sumsal = sum(sal) 
from emp 
where deptno = 10
group by deptno
print cast(@dno as varchar)+':'+cast(@sumsal as varchar)
複製程式碼
運算子

算術運算子:+、-、*、/、%(求餘)
字串運算子:+(連線)
比較運算子:=、>、>=、<、<=、<>(不等於)、!>(不大於)、!<(不小於)
邏輯運算子:NOT、AND、OR、ALL(所有)、ANY(或SOME,任意一個)、BETWEEN...AND、EXISTS(存在)、IN(在範圍內)、LIKE(匹配)
按位運算子:&(位與)、|(位或)、^(按位異或)
一元運算子:+(正)、-(負)、~(按位取反)
賦值運算子:=(等於)

函式

函式是用來完成某種特定功能,並返回處理結果的一組T-SQL語句,處理結果成為“返回值”,處理過程成為“函式體”。
  函式又分為系統內建函式和使用者自動以函式。SQL Server提供了大量系統內建函式,主要可以分為以下幾類:數學函式、字串函式、日期函式、convert函式、聚合函式。
  (1)數學函式
  T-SQL中提供的常用的數學函式如下:

abs():返回絕對值
round(數值表示式,長度,[,型別]):舍入到指定長度或精度。型別為0,表示舍入,型別為非0,表示截斷
power(m,n):返回m的n次冪
trunc():將數字截斷到指定的位數
%:求餘數,SQL Server沒有mod(m,n),而用m%n代替
複製程式碼

(2)字串函式

ltrim(str,substr)/rtrim(str,substr):str表示要操作的字串,substr表示要裁剪的子串,若裁剪空格,則可以省略
substring(str,position,length):求子字串
replace(str,search_str,rep_str):替換一個字串中的子串。search_str表示要搜尋的子字串,rep_str表示要替換的目標字串
left(str,n):返回字串從左邊開始的指定個數的字元
len():求字串長度
複製程式碼

(3)日期和時間函式

T-SQL中提供下列日期函式:

getdate():返回當前的日期和時間
year(日期):返回指定日期的“年”部分的整數
month(日期):返回指定日期的“月”部分的整數
day(日期):返回指定日期的“日”部分的整數
datepart(日期元素,日期):返回日期元素指定的日期部分的整數
datename(日期元素,日期):以字串的形式返回日期元素指定時間的日期名稱
datediff(日期元素,日期1,日期2):返回兩個日期間的差值並將其轉換為指定日期元素的形式
dateadd(日期元素,數值,日期) :按照“日期元素”給定的日期單位,返回“日期”加上“數值”的新日期

涉及日期時間常量時,SQL Server建議使用與dateformat及語言環境設定無關的字串格式,通常這樣的字串常量符合下面兩種形式:

日期之間不使用分隔符,格式為yyyymmdd[ hh:mi:[:ss][,mmm]],如'20070703','20070703 17:53:00.997'。
ISO 8601標準形式,格式為yyyy-mm-ddThh:mi:ss[.mmm],日期各個部分之間使用“-”分隔符,日期和時間部分用T分隔,並且時間部分不能省略,如'2007-07-03T17:53:10'。

(4)資料型別轉換函式
  轉換的方式有隱式轉換和顯式轉換兩種。
  隱式轉換是SQL Server自動地將資料從一種資料型別轉換為另一種資料型別,使用者不可見。
  顯式轉換使用convert函式,該函式可以將一種資料型別的表示式強制轉換為另一種資料型別的表示式。兩種資料型別必須能夠進行轉換,例如,char值可以轉換為binary,但不能轉換為image。該函式的主要作用是把數值型或日期型資料轉換為字串,而只包含數字的字串轉換為數值型資料一般隱式轉換。
  格式:convert(資料型別(長度),表示式[,n])
  函式的第4個引數n是可選的,用於日期時間型資料型別和字元資料型別轉換。

程式控制語句

if else
begin end
begin <多條SQL語句> end
while
示例:

Use mydata 
Go
while(select avg(grade) from sc)<90
begin
    update sc set grade=grade+5
    if(select max(grade) from sc)>80
        break
    else
        continue
end
print '成績已調整'
複製程式碼

觸發器概念

觸發器(trigger)是使用者定義在關係表上的一類由事件驅動的特殊過程

定義觸發器

敬請期待
複製程式碼

相關文章