1. 程式人生 > 其它 >UniApp 推送服務 UniPush踩坑記錄

UniApp 推送服務 UniPush踩坑記錄

宣告:全文來源《mysql SQL必知必會(第3版)》

第一章 瞭解SQL

1.1 資料庫基礎

  資料庫(database)儲存有組織的資料的容器

  表(table)某種特定型別資料的結構化清單。資料庫中的每個表都有一個用來標識自己的名字。此名字是唯一的。

  模式(schema)關於資料庫和表的佈局及特性的資訊。

  列(column)表中的一個欄位。所有表都是由一個或多個列組成的。

  資料型別(datatype)所容許的資料的型別。每個表列都有相應的資料型別,它限制該列中儲存的資料。

  行(row)表中的一個記錄。

  主鍵(primary key)一列,其值能夠唯一標識表中每一行。

    • 任意兩行都不具有相同的主鍵值;
    • 每個行都必須具有一個主鍵值(主鍵值不允許NULL值)
    • 主鍵列中的值不允許修改或更新
    • 主鍵值不嫩惡搞重用(如果某行從表中刪除,它的主鍵不能賦給以後的新行)。

  結構化查詢語言(SQL)Structured Query Language

第二章 建立和操縱表

  班級資訊ClassInfo

班級編號

班主任編號

學生編號

年級

ClassID

TeacherID

StudentID

Grade

  學生資訊StudentInfo

學生編號

性別

年齡

身份證

學生姓名

StudentID

Gender

Age

CardID

StudentName

  學生成績StudentAchieve

學生編號

語文

數學

英語

年份

班級編號

StudentID

Chinese

Math

English

TestYear

ClassID

2.1 建立表

  為利用CREATE TABLE建立表,必須給出下列資訊:

    • 新表的名字,在關鍵字CREATE TABLE之後給出;
    • 表列的名字和定義,用逗號分隔;
CREATE TABLE ClassInfo
(
    ClassID  CHAR(20) NOT NULL, --班級編號
    TeacherID CHAR(20) NOT
NULL, --班主任編號 StudentID CHAR(20) NOT NULL, --學生編號 Grade CHAR(15) NOT NULL --年級 )
CREATE TABLE StudentInfo
(
    StudentID CHAR(20) NOT NULL, --學生編號
    StudentName CHAR(50) NOT NULL, --學生姓名
    Gender CHAR(5) NOT NULL, --性別
    Age INT NOT NULL DEFAULT 0, --年齡
    CardID VARCHAR(50) NULL DEFAULT '' --身份證
)
CREATE TABLE StudentAchieve
(
    StudentID CHAR(20) NOT NULL, --學生編號
    ClassID  CHAR(20) NOT NULL, --班級編號
    Chinese DECIMAL(10,5) NOT NULL DEFAULT 0, --語文
    Math DECIMAL(10,5) NOT NULL DEFAULT 0, --數學
    English DECIMAL(10,5) NOT NULL DEFAULT 0 --英語
)

2.2 更新表

  為更新表定義,可使用ALTER TABLE語句。

  為了使用ALTER TABLE更改表結構,必須給出下面的資訊:

    • 在ALTER TABLE之後給出要更改的表名
    • 所做更改的列名
ALTER TABLE dbo.StudentAchieve ADD TestYear CHAR(20) NOT NULL --考試年份

新增考試年份的列

ALTER TABLE dbo.StudentAchieve DROP COLUMN TestYear

刪除考試年份的列

2.3 刪除表

DROP TABLE dbo.StudentAchieve

  刪除學生成績這張表。刪除表沒有確認,也不能撤銷,執行這條語句將永久刪除該表。

  注:可使用關係規則防止意外刪除

第三章 檢索資料

3.1 檢索單個列

SELECT StudentName FROM dbo.StudentInfo

  

3.2 檢索多個列

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo 

  

3.3 檢索所有列

SELECT * FROM dbo.StudentInfo

  

第四章 排序檢索資料

4.1 排序資料

SELECT StudentName FROM dbo.StudentInfo  ORDER BY StudentName

  Order by子句的位置:應保證它是slect語句中最後一條子句。

4.2 按多個列排序

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY StudentName,StudentID 

  

4.3 按列位置排序

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY 1,3 

  

4.4 指定排序方向

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY Gender DESC 

  

  DESC降序排列,DESCENDING

  ASC升序排列,預設

第五章 過濾資料

5.1 使用WHERE子句

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Age=5 

  

5.2 where子句操作符

操作符

說明

=

等於

<> 

不等於

!=

不等於

小於

<=

小於等於

!<

不小於

大於

>=

大於等於

!>

不大於

BETWEEN

再指定的兩個值之間

IS NULL

為NULL值

5.2.1 檢查單個值

SELECT StudentID,ClassID FROM dbo.StudentAchieve WHERE Chinese<95 

  

5.2.2 不匹配檢查

SELECT * FROM dbo.StudentInfo WHERE CardID <>'' 

  

5.2.3 範圍值檢查

SELECT StudentID,Math FROM dbo.StudentAchieve WHERE Math BETWEEN 90 AND 100

  

5.2.4 空值檢查

SELECT StudentName,StudentID FROM dbo.StudentInfo WHERE CardID IS NULL

  

第六章 高階資料過濾

6.1 組合WHERE子句

6.1.1 AND操作符

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Gender='' AND Age=6

  

6.1.2 OR操作符

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Gender='' OR Age=6

  

6.2 IN 操作符

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Age IN (5,6)

  

6.2 NOT操作符

SELECT StudentID,StudentName,Gender FROM dbo.StudentInfo WHERE NOT Gender=''

  

第七章 用萬用字元進行過濾

7.1 LIKE操作符

  萬用字元(wildcard)用來匹配值的一部分的特殊字元。

  搜尋模式(search pattern)由字面值、萬用字元或兩者組合構成的搜尋條件。

7.1.1 百分號(%)萬用字元

SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE CardID LIKE 'card%'

     

  檢索任意以card起頭的詞。

  %告訴DBMS接受card之後的任意字元,不管他有多少字元。

SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE CardID LIKE '%01%'

  

  %可以匹配0個字元。%代表搜尋模式中給定位置的0個、1個或多個字元。

7.1.2 下劃線(_)萬用字元

  下劃線的用途與%一樣,但下劃線只匹配一個字元而不是多個字元。

SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE StudentName LIKE '名_2'

   

7.1.3 方括號([])萬用字元

  方括號萬用字元用來指定一個字符集,它必須匹配指定位置得一個字元。

SELECT * FROM dbo.StudentInfo WHERE CardID LIKE 'card000[23]%'

   

  找出以card0002或card0003開頭得cardid

  此萬用字元可以用字首字元^(脫子號)來否定。

SELECT * FROM dbo.StudentInfo WHERE CardID LIKE 'card000[^23]%'

   

7.2 使用萬用字元得技巧

    • 不用過分使用萬用字元。如果其他操作符能達到相同得目的,應該使用其他操作符。
    • 在確實需要使用萬用字元時,除非絕對又必要,否則不要把它們用在搜尋模式得開始處,把萬用字元置於搜尋模式得開始處,搜尋起來時最慢的。
    • 仔細注意萬用字元的位置。如果放錯地方,可能不會返回想要的資料。

第八章 建立計算欄位

8.1 計算欄位

  欄位(field)基本上與列(column)的意思相同,經常互換使用,不過資料列一般稱為列,而術語欄位通常用在計算欄位的連線上。

8.2 拼接欄位

  拼接(concatenate)將值聯結到一起構成單個值。

SELECT StudentID+'name: '+StudentName  FROM dbo.StudentInfo

   

SELECT RTRIM(StudentID)+'name: '+RTRIM(StudentName)  FROM dbo.StudentInfo

   RTRIM()函式去掉右邊的所有空格。 

SELECT RTRIM(StudentID)+'name: '+RTRIM(StudentName) info FROM dbo.StudentInfo

  使用別名

8.3 執行算術計算

SELECT StudentID,Chinese+Math+English AS total FROM dbo.StudentAchieve

   

第九章 使用資料處理函式

9.1 函式

  可移植(portable)所編寫的程式碼可以在多個系統上執行。

9.2 使用函式

9.2.1 文字處理函式

SELECT StudentID,UPPER(CardID) cardinfo FROM dbo.StudentInfo

  UPPER()將文字轉換為大寫

  常用的文字處理函式

函式

說明

LEFT()

返回串左邊的字元

LENGTH()

返回串的長度

LOWER()

將串轉換為小寫

LTRIM()

去掉串左邊的空格

RIGHT()

返回串右邊的字元

RTRIM()

去掉串右邊的空格

SOUNDEX()

返回串的SOUNDEX值

UPPER()

將串轉換為大寫

  SOUNDEX()函式是一個將任何文字串轉換為描述其語音表達的字母數字模式的演算法。SOUNDEX考慮了類似的發音字元和音節,使得能對串進行發音比較而不是字母比較。

9.2.2 日期和時間處理函式

  日期和時間採用相應的資料型別儲存在表中,每種DBMS都有自己的變體。日期和時間值以特殊的格式儲存,以便能快速和有效地排序或過濾,並且節約物理儲存空間。

9.2.3 數值處理函式

函式

說明

ABS()

絕對值

COS()

餘弦

EXP()

指數

PI()

圓周率

SIN()

正弦

SQRT()

平方根

TAN()

正切

第十章 彙總資料

10.1 聚集函式

  聚集函式(aggregate function)執行在行組上,計算和返回單個值的函式。

函式

說明

AVG()

平均值

COUNT()

行數

MAX()

最大值

MIN()

最小值

SUM()

10.1.1 AVG()函式

SELECT AVG(Chinese) AS avg_chinese FROM dbo.StudentAchieve

   

SELECT  AVG(Chinese) AS avg_chinese_11 FROM dbo.StudentAchieve WHERE ClassID='c00011'

   

  AVG()只能用來確定特定數值列的平均值,而且列名必須作為函式引數給出。只能用於單個列。

  AVG()函式忽略值為NULL的行。

10.1.2 COUNT()函式

  COUNT()函式又兩種使用方式

    • 使用COUNT(*)對錶中行的資料進行計數,不管表列中包含的是空值還是非空值。
    • 使用COUNT(column)對特定列中具有值得行進行計數,忽略NULL值
SELECT COUNT(*) AS num FROM dbo.StudentInfo

   

SELECT COUNT(StudentID) AS num FROM dbo.StudentInfo

   

10.1.3 MAX()函式

SELECT MAX(Math) AS max_math FROM dbo.StudentAchieve

10.1.4 MIN()函式

SELECT MIN(Math) AS min_math FROM dbo.StudentAchieve

   

10.1.5 SUM()函式

SELECT sum(Math) AS sum_math FROM dbo.StudentAchieve

   

SELECT sum(Math+Chinese) AS total FROM dbo.StudentAchieve

   

10.2 聚集不同值

  以上5個聚集函式都可以如下使用:

    • 對所有得行執行計算,指定ALL引數或不給引數。
    • 值包含不同的值,指定DISTINCT引數
SELECT AVG(distinct Math) AS math_avg FROM dbo.StudentAchieve

   

10.3 組合聚集函式

SELECT COUNT(*) as num_count,MIN(Math) AS min_math,MAX(Math) AS max_math FROM dbo.StudentAchieve

   

第十一章 分組資料

11.1 資料分組

SELECT COUNT(*) AS math_95 FROM dbo.StudentAchieve WHERE Math>95

   

11.2 建立分組

SELECT StudentID,COUNT(*) AS column1 FROM dbo.StudentAchieve GROUP BY StudentID

   

在具體使用GROUP BY子句前,需要知道一些重要的規定:

    • GROUP BY子句可以包含任意數目的列。這使得能對分組進行巢狀,為資料分組提供更細緻的控制。
    • 如果在GROUP BY子句中快安了分組,資料將在最後規定的分組上進行彙總。換句話說,在建立分組時指定的所有列都一起計算(所以不能從個別的列取回資料)。
    • GROUP BY子句中列出的每個列都必須是檢索列或有效的表示式(但不能是聚集函式)。如果在SELECT中使用表示式,則必須在GROUP BY子句中指定相同的表示式。不能使用別名。
    • 大多數SQL實現不允許GROUP BY列帶有長度可變的資料型別(如文字或備註型欄位)。
    • 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
    • 如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多行NULL值,它們將分為一組
    • GROUP BY子句必須出現在WHERE子句之後,ORDER BY子向之前。

11.3 過濾分組

SELECT StudentID,COUNT(*) AS column1 FROM dbo.StudentAchieve GROUP BY StudentID HAVING COUNT(*)=2

   

11.4 分組和排序

  ORDER BY與GROUP BY

ORDER BY

GROUP BY

排序產生的輸出

任意列都可以使用(甚至非選擇的列也可以使用) 

不一定需要

分組行。但輸出可能不是分組的順序

只可能使用選擇列或表示式列,而且必須使用每個選擇列表達式

如果與聚集函式一起使用列(或表示式),則必須使用

11.5 SELECT子句順序

子句

說明

是否必須使用

SELECT

要返回的列或表示式

FROM

從中檢索資料的表

僅在從表選擇資料時使用

WHERE

行級過濾

GROUP BY

分組說明

僅在按組計算聚集時使用

HAVING

組級說明

ORDER BY

輸出排序順序

第十二章 使用子查詢

12.1 子查詢

  查詢(query)任何SQL語句都是查詢。

  SQL還允許建立子查詢(subquery),即:巢狀在其他查詢中的查詢。

12.2 利用子查詢進行過濾

SELECT StudentName FROM dbo.StudentInfo WHERE StudentID IN ( SELECT StudentID FROM dbo.StudentAchieve WHERE Math > 95 );

   

12.3 作為計算欄位使用子查詢

SELECT StudentID,(  SELECT COUNT(*)FROM dbo.StudentAchieve WHERE StudentID = StudentID) AS column1 FROM dbo.StudentInfo;

   

第十三章 聯結表

13.1 聯結

  可伸縮性(scale)能夠適應不斷增加的工作量而不失敗。設計良好的資料庫或應用程式稱之為可伸縮性好、

13.2 建立聯結

SELECT StudentName,Math, Chinese FROM dbo.StudentInfo,dbo.StudentAchieve WHERE StudentAchieve.StudentID = StudentInfo.StudentID;

   

13.2.1 WHERE子句的重要性

  笛卡兒積(cartesian product)由沒有聯結條件的表關係返回的結果為笛卡兒積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。

SELECT StudentName,Math,Chinese FROM dbo.StudentInfo,dbo.StudentAchieve

   

13.2.2 內部聯結

SELECT StudentName, Math,Chinese FROM dbo.StudentInfo INNER join dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID

   

13.2.3 聯結多個表

SELECT StudentName,Math,Chinese, Grade FROM dbo.StudentInfo,dbo.StudentAchieve, dbo.ClassInfo
WHERE StudentInfo.StudentID = StudentAchieve.StudentID  AND ClassInfo.StudentID = StudentAchieve.StudentID  AND Math > 90;

   

第十四章 建立高階聯結

14.1 使用表別名

SELECT StudentName,Math, Chinese,Grade FROM dbo.StudentInfo AS a, dbo.StudentAchieve AS b, dbo.ClassInfo AS c
WHERE a.StudentID = b.StudentID  AND c.StudentID = a.StudentID  AND Math > 90;

   

14.2 使用不同型別的聯結

14.2.1 自聯結

SELECT StudentID,StudentName,Gender FROM dbo.StudentInfo WHERE Gender =( SELECT Gender FROM dbo.StudentInfo WHERE StudentID = 's00001')

   

SELECT a.StudentID,a.StudentName,a.Gender FROM dbo.StudentInfo AS a,dbo.StudentInfo AS b WHERE a.Gender = b.Gender  AND b.StudentID = 's00001';

   

14.2.2 自然聯結

SELECT StudentName,Math, Chinese,Grade FROM dbo.StudentInfo AS a, dbo.StudentAchieve AS b, dbo.ClassInfo AS c WHERE a.StudentID = b.StudentID  AND c.StudentID = a.StudentID AND Math > 90;

   

14.2.3 外部聯結

SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo  LEFT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;

   

SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo RIGHT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;

      

14.3 使用帶聚集函式的聯結

SELECT Grade,COUNT(Age) AS age_count,Age FROM dbo.StudentInfo INNER JOIN dbo.ClassInfo ON ClassInfo.StudentID = StudentInfo.StudentID GROUP BY ClassInfo.Grade,Age

   

14.4 使用聯結和聯結條件

    • 注意所使用的聯結型別。一般我們使用內部聯結,但使用外部聯結也是有效的。
    • 關於確切的聯結語法,應該檢視具體的文件,看相應的DBMS支援何種語法(大多數DBMS使用這兩章中描述的某種語法形式)。
    • 保證使用正確的聯結條件(不管是採用哪種語法),否則將返回不正確的資料。
    • 應該總是提供聯結條件,否則會得出笛卡兒積。
    • 在一個聯結中可以包含多個表,甚至對於每個聯結可以採用不同的聯結型別。雖然這樣做是合法的,一般也很有用,但應該在起測試它們前,分別測試每個聯結。這將使故障排除更為簡單。

第十五章 組合查詢

15.1 組合查詢

  SQL允許執行多個查詢,並將結果作為單個查詢結果集返回。這些組合查詢通常稱為並(union)或複合查詢(compound query)。

15.2 建立組合查詢

15.2.1 使用UNION

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5
UNION
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender=''

   

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5 OR Gender=''

   

15.2.2 UNION規則

    • UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵宇UNION分隔(因此,如果組合4條SELECT語句,將要使用3個UNION關鍵宇)。
    • UNION中的每個查詢必須包含相同的列、表示式或聚集西數(不過各個列不需要以相同的次序列出)。
    • 列資料型別必須相容:型別不必完全相同,但必須是DBMS可以隱含地轉換的型別(例如,不同的數值型別或不同的日期型別)。

15.2.3 包含或取消重複的行

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5
UNION ALL
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender=''

   

15.2.4 對組合查詢結果排序

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5
UNION
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender=''
ORDER BY Gender

   

第十六章 插入資料

16.1 資料插入

16.1.1 插入完整的行

INSERT INTO dbo.StudentInfo
VALUES( 's00010','新的名字', '',7,'cardcard' )

   

更標準的寫法:

INSERT INTO dbo.StudentInfo(StudentID,StudentName,Gender,Age,CardID)
VALUES('s00010','新的名字','',7,'cardcard')

16.1.2 插入部分行

INSERT INTO dbo.StudentInfo( StudentID,StudentName,Gender, Age)
VALUES( 's00014','新的名字2', '',7)

16.1.3 插入檢索出的資料

INSERT INTO dbo.StudentInfo(StudentID,StudentName,Gender,Age)
VALUES('s00014','新的名字2', '',7)

16.2 從一個表複製到另一個表

SELECT * INTO #tmp1 FROM dbo.StudentInfo

第十七章 更新和刪除資料

17.1 更新資料

UPDATE dbo.StudentInfo SET CardID='cardnew' WHERE StudentID='s00002' AND Age=7

17.2 刪除資料

DELETE FROM dbo.StudentInfo WHERE StudentID='s00002' AND Age=7

第十八章 使用檢視

18.1 檢視

  檢視不包含任何列或資料,它包含的是一個查詢。

18.1.1 為什麼使用檢視

    • 重用SQL語句
    • 簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必知道它的基本查詢細節。
    • 使用表的組成部分而不是整個表。
    • 保護資料。可以給使用者授予表的特定部分的訪問許可權而不是鱉個表的訪問許可權。
    • 更改資料格式和表示。檢視可返回與底層表的表示和格式不同的資料。

18.1.2 檢視的規則和限制

    • 與表一樣,檢視必須唯一命名(不能給檢視取與別的檢視或表相同的名字)。
    • 對於可以建立的檢視數目沒有限制。
    • 為了建立檢視,必須具有足形的訪問許可權。這些限制通常由資料庫管理人員授子。
    • 檢視可以巢狀,即:可以利用從其他檢視中檢素資料的查詢來構造一個檢視。所允許的恢套層數在不同的DBMS中有所不同(巢狀檢視可能會嚴重降低查詢的效能,因此在產品環境中使用之前,應該對其進行詳細的測試)。
    • 許多DBMS禁止在檢視查詢中使用ORDER BY子句。
    • 有的DBMS要求命名返回的所有列,如果列是計算欄位,則需要使用別名
    • 檢視不能索引,也不能有關聯的觸發器或預設值。
    • 有的DBMS把檢視作為只讀的查詢,這表示可以從檢視檢索資料,但不能將資料寫回底層表。詳情請參閱具體的DBMS文件。
    • 有的DBMS允許建立這樣的檢視,它不允許進行導致行不再屬於檢視的插入或更新。例如,有這樣一個檢視,它只檢索帶有電子郵件地址的客戶。如果更新東個客戶,刪除他的電子郵件地址,這將使該客戶不再屬於檢視。這是預設行為,而且是允許的,但在具體的DBMS上可能能夠防止這種情況發生

18.2 建立檢視

18.2.1 利用檢視簡化複雜的聯結

CREATE VIEW student_view
AS
SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo LEFT JOIN dbo.StudentAchieve  ON StudentAchieve.StudentID = StudentInfo.StudentID;

18.2.2 用檢視重新格式化檢索出的資料

CREATE VIEW student_view
AS
SELECT RTRIM(StudentID)+'('+RTRIM(StudentName)+')' AS stuinfo FROM dbo.StudentInfo
SELECT * FROM student_view

   

第十九章 使用儲存過程

19.1 儲存過程

  儲存過程簡單來說,就是為了以後的使用而儲存的一條或多條SQL語句的集合。可將其視為批檔案。

19.2 為什麼要使用儲存過程

  簡單、安全、高效能。

19.3 執行儲存過程

  EXECUTE

  EXECUTE後面跟著儲存過程和需要傳遞給它的任何引數。

19.4 建立儲存過程

CREATE PROCEDURE test
AS
DECLARE @n INTEGER
SELECT @n=COUNT(*) FROM dbo.StudentInfo WHERE CardID IS NOT NULL
RETURN @n

第二十章 管理事務處理

20.1 事務處理

  事務處理(transaction processing)可以用來維護資料庫的完整性,它保證成批的SQL操作要麼完全執行,要麼完全不執行。

    • 事務 (transaction)指一組SQL語句。
    • 回退(ro11back)"指撤銷指定SOL語句的過程。
    • 提交(commit)指將未儲存的SOL語句結果寫入資料庫表。
    • 保留點(savepoint)指事務處理中設定的臨時佔位符(placcholder),你可以對它釋出回退(與回退整個事務處理不同)。

20.2 控制事務處理

BEGIN TRANSACTION operation
--****
COMMIT TRANSACTION operation

20.2.1 使用ROLLBACK

ROLLBACK operation

20.2.2 使用保留點

SAVE TRANSACTION operation

第二十一章 使用遊標

21.1 遊標

  結果集(result set)SQL查詢所檢索出的結果。

  遊標(cursor)是一個儲存在DBMS伺服器上的資料庫查詢,它不是一條SELECT語句,二十被該語句檢索出來的結果集。

21.2 使用遊標

21.2.1 建立遊標

DECLARE testcursor CURSOR
FOR
SELECT StudentID FROM dbo.StudentInfo

21.2.2 使用遊標

DECLARE @n [char] (20)
DECLARE testcursor CURSOR
FOR
SELECT StudentID FROM dbo.StudentInfo
OPEN testcursor
FETCH NEXT FROM testcursor INTO @n
BEGIN
        --***
        FETCH NEXT FROM testcursor INTO @n
END

21.2.3 關閉遊標

CLOSE testcursor

第二十二章 瞭解高階SQL特性

22.1 約束

  約束(constraint)管理如何插入或梳理資料庫資料的規則

22.1.1 主鍵

  表中任意列只要滿足以下條件,都可以用於主鍵:

    • 任意兩行的主鍵值都不相同。
    • 每行都具有一個主鍵值(即列中不允許NULL值)。
    • 包含主鍵值的列不修改或更新。
    • 主鍵值不能重用。如果從表中刪除菜一行,其主鍵值不分配給新行。

22.1.2 外來鍵

  外來鍵是表中的一個列,其值必須再另一個表的主鍵中列出。

  外來鍵可以幫助防止意外的刪除。

22.1.3 唯一約束

  唯一約束用來保證一個列(或一組列)中的資料唯一。

22.1.4 檢查約束

  檢查約束用來保證一個列(或一組列)中的資料滿足一組指定的條件。

  CHECK

22.2 索引

  CREATE INDEX

22.3 觸發器

  CREATE TRIGGER

22.4 資料庫安全

    • 對資料庫管理功能(建立表、更改或刪除己存在的表等)的訪問;
    • 對特定資料庫或表的訪問;
    • 訪問的型別(只讀、對特定列的訪問等)
    • 僅通過檢視或儲存過程對錶進行訪問;
    • 建立多層次的安全措施,從而允許多種基於登入的訪問和控制;
    • 限制管理使用者賬號的能力。