1. 程式人生 > >資料庫語句總結

資料庫語句總結

1、建立基本表<重在約束>

   CREATE TABLE [〈庫名〉]〈表名〉(

      〈列名〉〈資料型別〉[〈列級完整性約束條件〉] ,

      〈列名〉〈資料型別〉[〈列級完整性約束條件〉]]

         [,…n]          [,〈表級完整性約束條件〉]

         [,…n] )

針對屬性值設定的限制條件列級

1) NOT NULL或NULL約束。NOT NULL約束不允許欄位值為空,而NULL約束允許欄位值為空。

2) UNIQUE約束。惟一性約束,即不允許列中出現重複的屬性值。

3)PRIMARAY KEY [CLUSTERED|NON CLUSTERED]:定義該欄位為主碼

建立聚集(非)索引

   Notnull uniqueprimary key的區別:DBMS會給primary key建立索引

個屬性構成的主碼只能通過表級約束條件定義PRIMARY KEY (Sno,Cno)

個屬性構成的主碼可通過列級或表級約束條件定義Sno  CHAR(9) PRIMARY KEY

                                                                          或PRIMARY KEY (Sno)

4) DEFAULT約束。預設值約束。 DEFAULT〈約束名〉〈預設值〉FOR〈列名〉

5) CHECK約束。檢查約束。CONSTRAINT〈約束名〉CHECK (〈約束條件表示式〉)

                                     單一屬性設限

                CONSTRAINT C2 CHECK(性別 IN (‘男’,‘女’))

                            CONSTRAINT C3 CHECK(成績 BETWEEN 0AND 100)

                                     CHECK(Sage < 30)

                                     多屬性之間設限

                                     CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%')

ü 性別是女性的元組都能通過該項檢查,因為Ssex=‘女’成立;

ü 當性別是男性時,要通過檢查則名字一定不能以Ms.打頭

6)identity(初值,步長):定義欄位為數值型資料,並指出它的初始值和逐步增加的步長值

7)reference 參照表(對應欄位):定義該欄位為外碼,並指出被參照表及對應欄位

涉及到關係中一個或多個列或表間的限制條件記錄/欄位》《表級

格式:CONTRAINT〈約束名〉<約束式>

Sname  CHAR(20) CONSTRAINT C2 NOT NULL 1) UNIQUE約束。惟一性約束。 2) PRIMARYKEY[CLUSTERED|NON CLUSTERED]定義主碼,保證惟一性和非空性。建立聚集(非)索引。

   CONTRAINT〈約束名〉PRIMARYKEY [CLUSTERED] (〈列組〉)

3)check(條件表示式):定義記錄應滿足的條件 4) FOREIGN KEY約束。用於定義參照完整性。

  CONTRAINT〈約束名〉FOREIGN KEY(〈外碼〉)REFERENCES〈被參照表名〉(〈與外碼                     對應的主碼名〉)

2修改基本表約束屬性

         ALTERTABLE〈表名〉

[alter column(〈列名〉〈新型別〉[完整性約束] [,…n])]修改欄位定義或約束條件      [ADD(〈新列名〉〈資料型別〉[完整性約束] [,…n])]增加欄位或者欄位和表的約束      [DROP〈完整性約束名〉]刪除欄位或約束

{check|nocheck}constraint{all|約束名組}使約束有效或無效(check使之有效,nocheck使之無效,all指全部約束)

[MODIFY(〈列名〉〈資料型別〉[,…n])]

增加約束

ALTER TABLE Student  ADD CONSTRAINT C3 CHECK (Sage < 40)

增加屬性

ALTER TABLEStudent ADD S_entrance DATE

3刪除基本表    drop table 表名

4基本表的索引

   1)建立索引CREATE[UNIQUE] [CLUSTERED|NONCLUSTERED]

INDEX〈索引名〉 ON〈表名〉(〈列名〉[〈次序〉][,〈列名〉[〈次序〉]]…);

UNIQUE:建立唯一索引,不允許有兩行具有相同索引值

CLUSTERED|NONCLUSTERED:建立聚集或者非聚集索引,每張表只能有一個聚集索引,預設值為非聚集索引

   2)刪除索引DROP INDEX 〈索引名〉

1. 索引的作用 1) 使用索引可以明顯地加快資料查詢的速度。 2) 使用索引可保證資料的惟一性。 3) 使用索引可以加快連線速度。

2. 建立索引的原則 1) 索引的建立和維護由DBA和DBMS完成。 2) 大表應當建索引,小表則不必建索引。 3) 對於一個基本表,不要建立過多的索引。 4) 根據查詢要求建索引。

   3.例子

學生表按學號升序建立索引;

CREATE UNIQUE INDEX stusno ON 學生(學號);

課程表按課程號升序建惟一索引;

CREATE UNIQUE INDEX coursno ON 課程(課程號);

選課表按學號升序和課程號降序建惟一索引。

CREATE UNIQUE INDEX scno ON 選課(學號 ASC,課程號 DESC);

SSMS

1、建立基本表(課本137)                

2、建立表的約束條件和索引(課本138)

3、修改表結構(課本141)

資料(是對錶中資料(屬性和約束)的操作(增刪改查),而非表結構)

T-SQL語句

1、資料插入

1)使用常量插入單個元組

INSERT  INTO〈表名〉[(〈屬性列1〉[,〈屬性列2〉…)] VALUES (〈常量1〉[,〈常量2〉]…)

如果沒有列出任何列名,則必須將所有列名對應的值,包括空值“”,也要列出來;

如果列出了列名,則值要與列名出現的先後順序對應,沒有列出的屬性會設為空,此時要注意該屬效能否為空。

    2)在表中插入子查詢的結果集(一次插入多個元祖)

             INSERT         INTO〈表名〉[(〈屬性列1〉[,〈屬性列2〉]…)]        〈子查詢〉

       〈子查詢〉常常為select語句

2資料修改

UPDATE〈表名〉

SET〈列名〉=〈表示式〉[,〈列名〉=〈表示式〉][,…n]

[WHERE〈條件〉]

DELETE   FROM〈表名〉 [WHERE〈條件〉];

SELECT〈查詢列組〉

[Into 新表名]

FROM〈資料來源〉

[WHERE〈元組選擇條件〉]

[GROUP BY〈分列組〉[HAVING 〈組選擇條件〉]]

[ORDER BY〈排序列1〉〈排序要求1〉 [,…n]]

[compute〈統計列組〉[by〈表示式〉]]

Select和from為必選子句!

1)      SELECT子句:指明需查詢目標列(欄位、表示式、函式表示式、常量)。

SELECT[all|distinct][top數值[percent]]〈查詢列組〉

All:返回所有結果(預設)

Distinct:查詢後去重再返回

top數值:返回結果中的前數值行,

如果有[percent]則返回結果中的百分之數值行記錄

〈查詢列組〉可具體表示為:

〈查詢列組〉::=*|〈表或檢視〉.*|〈列名或表示式〉[AS]〈列別名〉|

〈列別名〉=〈表示式〉

*:指明返回在from子句中包括的表和檢視的全部列

〈表或檢視〉.*:指明返回指定表和檢視的全部列

〈列別名〉:用來代替出現在結果集中的列名或表示式,

其可在ORDER BY中出現,不能在where,groupby,having中出現

基本表中相同的列名錶示為:〈表名〉.〈列名〉

2)into子句:建立一個表,並將查詢結果新增到該表中。

  若建立的是臨時表,需在表明前加#;into不能喝compute子句同時使用。

3) FROM子句:指明資料來源。

表名間用“,”分割。

資料來源不在當前資料庫中,使用“〈資料庫名〉.〈表名〉”表示。

如果需要一表多用,需增設別名標識,在各自使用中用不同的表別名表示。

定義表別名:〈表名〉〈別名〉

From 學生 a  b    -----將學生表重新命名(另起別名為a和b)

4) WHERE子句:元組選擇條件。

5) GROUP BY子句:結果集分組。

  Group by [all]<分組表示式>

當目標列中有統計函式,則統計為分組統計,否則為對整個結果集統計。子句後帶上HAVING子句表達組選擇條件(帶函式的表示式)。

6)having:位於group by之後,用於指定組或彙總篩選條件。一般為函式的條件表示式。

7) ORDER BY子句:指明排序項和排序要求。

   Order by<排序項>[ASC|DESC][,…n]

當排序要求為ASC時升序排序(預設);排序要求為DESC時降序排列。

查詢結果集可以按多個排序列進行排序,每個排序列後都可以跟一個排序要求。

Order by 類別ASC

8)compure子句:產生彙總至,並在結果集中後將彙總值放入摘要列。

    Compute〈統計函式組〉[by〈分組項〉]

    Compute和by配合,可起到換行和分段小計的作用。

    Compute by必須和order by配合使用,分組項應完全等於排序項。

1、 簡單查詢:查詢過程中只涉及到一個表的查詢語句。

2、  連結查詢:連線查詢中的連線條件通過WHERE子句表達,連線條件和元組選擇條               件之間用AND(與)操作符銜接。

1)內連線:結果中只保留符合條件的元組,排除了兩表中沒有匹配的元組。

(1) 等值連線和非等值連線

 [〈表名1〉.]〈列名1〉〈比較運算子〉[〈表名2〉.]〈列名2〉

(2) 自身連線

例如,課程表中的先行課是在上學期應開設的,先行課的先行課,即間接先行課應提前一學年開設。如果求查詢某門課的間接先行課或全部課程的間接先行課,就需要對課程表進行自身連線。

需用到為表重新命名,再進行查詢

Eg.查詢每一門課的間接先行課

Select a.課程號,a.課程名,b.先行課(將a表看成課程表,b表看成先行課表)

From 先行課 a  b

Where a.先行課=b.課程號

           (3)一般內連線

Select 職工.*,部門,電話

                From 職工 linner join部門on職工.所在部門=部門.部門號

2) 外部連線:把捨棄的元組也儲存在結果關係中,而在其他屬性上填空值(Null)

可用於檢驗資料的正確與否

(1)全外連線:如果把兩表中非匹配項都儲存在結果關係中,而在非匹配項所對應的其他屬性上填空值(Null)

Select 職工.*,部門,電話

  From 職工 fulljoin部門on職工.所在部門=部門.部門號

(2)左外連線:只把左邊關係R中要捨棄的元組保留   *=

Select 職工.*,部門,電話

  From 職工 left join部門on職工.所在部門=部門.部門號

(3)右外連線:如果只把右邊關係S中要捨棄的元組保留   =*

Select 職工.*,部門,電話

  From 職工 right  join部門on職工.所在部門=部門.部門號

Eg.

1)使用IN操作符的巢狀查詢

在SQL語言中,一個select…from…where語句成為一個查詢塊兒。將一個查詢塊巢狀在另一個查詢塊的where子句或having短語的條件中的查詢即為巢狀查詢。

                   Eg.SELECT 學號,姓名   FROM 學生    WHERE 學號 IN ( SELECT 學號 FROM  選課        WHERE 課程號 IN ( SELECT 課程號FROM  課程            WHERE 課程名=‘高等數學' ))

                   In=的區別:in用於劃定某個屬性的取值範圍,而=用於限定某個屬性的唯一取值

        所以,在查詢結果唯一是可以用=,不唯一使用in

2)使用比較符的巢狀查詢

比較後面的值需要查詢得到

Eg.SELECT 學號,成績     FROM 選課     WHERE 課程號=‘C1’ AND 成績 > (

          SELEC 成績 FROM 選課        WHERE 課程號=‘C1’AND 學號=

             (SELECT 學號 FROM 學生

              WHERE 姓名='張三'))

3)使用ANY或ALL操作符的巢狀查詢

 〈欄位〉〈比較符〉[ANY|ALL]〈子查詢〉

Eg. SELECT *    FROM 學生    WHERE 年齡 <ANY (SELECT 年齡 FROM 學生      WHERE 所在系=‘計算機系’) AND 所在系<>‘計算機系’

4)使用(NOT)EXISTS操作符的巢狀查詢

 Exists代表存在。Exist操作符後子查詢結果若非空,則從表中選出非空值對應的查詢結果。Not exist後子查詢結果若為空,則從表中選出空值對應的查詢結果

Eg. 求選修了C2課程的學生姓名

SELECT 姓名 FROM 學生   WHERE EXISTS (SELECT *  FROM 選課       WHERE 學生.學號=學號 AND 課程號='C2')

相當於(連線查詢)

SELECT 姓名 FROM 學生,選課    WHERE學生.學號=選課.學號 AND 課程號='C2'

Eg. 求沒選修C2課程的學生姓名

SELECT 姓名 FROM 學生      WHERE NOT EXISTS (SELECT * FROM 選課         WHERE 學生.學號=學號 AND 課程號='C2')

4、 組合查詢Union (all)

Union代表並。Union all在並操作是保留重複的元組。

Eg.SELECT學號 FROM 選課 WHERE 課程號=‘C1’    UNION    SELECT 學號 FROM 選課 WHERE 課程號=‘C2’

未對查詢結果(一般為select)按指定的一列或多列值分組,聚集函式將作用於整個查詢結果;對查詢結果分組後,聚集函式將分別作用於每個組

常用函式如下

Eg.求課程和選修該課程的人數。     SELECT 課程號,COUNT(學號)     FROM 選課     GROUP BY 課程號

求選修課超過3門課的學生學號。     SELECT 學號     FROM 選課     GROUP BY學號 HAVING COUNT(*)>3

  HAVING後跟分組後篩選條件

Havingwhere的區別

Having必和group by連用,不會單獨出現,其作用於組,從中選擇滿足條件的組。

where作用於基表或檢視,從中選擇滿足條件的元組,不限於組。

Group bygroup by all的區別

Group by只對查詢結果分組,而group by all不僅會對查詢結果分組,還會對不滿足查詢結果的元組分組,即對整個查詢範圍(from後的範圍)分組。但由於查詢結果中會有統計函式,而該統計函式只對查詢結果進行了處理,查詢範圍之內查詢結果之外的元組並沒有進行處理,所以這一部分返回null

Eg. Select 類別,AVG(定價)平均值 from圖書

Where 出版社=‘機械工業出版社’

Group by 類別

Order by 類別ASC

AVG(定價)平均值:使用平均值做AVG(定價)別名,輸出時別名將會作為結果列名

Compute可以建立一個彙總摘要,compute by可建立分組彙總摘要。

Eg.select書號,書名,定價 from圖書

   Where類別=‘計算機類’

   Order by 書號ASC

   Compute count(*),sum(定價)[by 出版社]

結果集中,後面以摘要形式列出一條count和sum記錄

compute後函式不受group by影響,但受到where影響(即groupby同級,並行

後面加by,則會by後的條件分類,再執行compute後的函式

別名

屬性或表名或資料庫名或函式結果別名

即: 屬性或表名或資料庫名或函式結果+空格+別名

別名將代替被別名者(被DBMS識別或者作為結果輸出)

關係定義的完整性約束條件及違約處理

1實體完整性:

定義

若屬性A是基本關係R的主屬性,則屬性A的值不能為空值。

1) 實體完整效能夠保證實體的唯一性。

2) 實體完整效能夠保證實體的可區分性。

使用

create table中用primary key定義

  1)單屬性構成的碼

   定義為列級約束條件 Sno  CHAR(9) PRIMARY KEY

   定義為表級約束條件 PRIMARY KEY (Sno)

  2)單屬性構成的碼

   定義為表級約束條件PRIMARY KEY (Sno,Cno) <無法定義為列級約束條件>

檢查和違約性處理

1. 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改

2. 檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改

2、參照完整性:

定義

若屬性(或屬性組)F是基本關係R的外碼,它與基本關係S的主碼Ks相對應(基本關係R和S不一定是不同的關係),則對於R中每個元組在F上的值:        取空值(F的每個屬性值均為空值)        或者等於S中某個元組的主碼值

使用:

create table中用foreign key+reference定義

FOREIGN KEY定義哪些列為外碼;REFERENCES指明這些外碼參照哪些表的主碼

FOREIGN KEY (Sno)REFERENCES Student(Sno)

檢查和違約性處理

1. 拒絕(NO ACTION)執行

預設策略

2. 級聯(CASCADE)操作

3. 設定為空值(SET-NULL)

對於參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值

3、使用者定義的完整性:

定義

針對某一具體關係資料庫的約束條件,反映某一具體應用所涉及的資料必須滿足的語義要求。由RDBMS提供,而不必由應用程式承擔。

使用:

Ø  屬性上的約束條件:

CREATE TABLE時定義

列值非空(NOT NULL)Sno  CHAR(9) NOT NULL

列值唯一(UNIQUE)Dname  CHAR(9) UNIQUE

檢查列值是否滿足一個布林表示式(CHECK)Ssex CHAR(2) CHECK (Ssex IN (‘男’,‘女’)

Ø  元組上的約束條件:

在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制

同屬性值限制相比,元組級的限制可以設定不同屬性之間的取值的相互約束條件

CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%')

定義了元組中Sname和 Ssex兩個屬性值之間的約束條件

性別是女性的元組都能通過該項檢查,因為Ssex=‘女’成立;

當性別是男性時,要通過檢查則名字一定不能以Ms.打頭

檢查及違約處理

插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足

如果不滿足則操作被拒絕執行

4、完整性約束命名子句

CONSTRAINT <完整性約束條件名>

PRIMARY KEY短語CONSTRAINT StudentKey PRIMARY KEY(Sno)

|FOREIGN KEY短語

|CHECK短語]CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999)

Inexist的區別:執行順序不同

In:查詢先產生結果集,然後主查詢再去結果集裡去找符合要求的欄位列表,符合要的輸出,反之,則不輸出。

Exist:先執行一次主查詢,再去子查詢裡查詢與其的結果,如果是true則輸出,反之,則不輸出。

只要not in的子查詢中包含空值,那麼最終的結果就為空;

not in 查詢,外表存在空值,存在空值的那條記錄最終將被過濾,其他資料不受影響,內表存在空值將導致最終的查詢結果為空

not exists查詢,外表存在空值,存在空值的那條記錄將被輸出,內表存在空值,對查詢結果沒有影響