主要內容
SQL概述
1. SQL的發展
結構化查詢語言(Structured Query Language,SQL)集數據查詢、數據操縱、數據定義和數據控制功能於一體,它的標準自公佈以來隨數據庫技術的發展而不斷豐富完善。
自SQL成爲國際標準語言後,各個數據庫廠家紛紛推出各自的SQL軟件或與SQL的接口軟件。這就使大多數數據庫均用SQL作爲共同的數據存取語言和標準接口,使不同數據庫系統之間的操作有了共同的基礎。
SQL之所以能夠爲用戶和業界所接受併成爲國際標準,是因爲它是一個綜合的、功能極強同時又簡潔易學的語言。
但儘管SQL的標準在不斷髮展,目前還沒有一個數據庫系統能夠支持SQL標準的所有概念和特性。大部分數據庫系統能支持SQL/92標準中的大部分功能以及SQL99、SQL2003中的部分新概念。同時,許多軟件廠商對SQL基本命令集還進行了不同程度的擴充和修改,又可以支持標準以外的一些功能特性。
接下來我們將會了解SQL的基本概念和功能。
2. SQL的優點
(1)綜合統一:非關係數據語言分多鐘語言以完成不同的操作,而且需要修改模式時,必須停止數據庫的運行,修改後要重裝數據庫,十分麻煩。相比之下,SQL集數據查詢、數據操縱、數據定義和數據控制功能於一體,語言風格統一,可以獨立完成數據庫生命週期的全部活動,這就爲數據庫應用系統的開發提供了良好的環境。特別是用戶在數據庫系統投入運行後,還可以根據需要隨時地、逐步地修改模式,而不影響數據庫的運行,使得數據庫系統具有良好的可擴展性。
(2)高度非過程化:非關係數據模型需要指明存取路徑,而用SQL進行數據操作時,只要提出“做什麼”,而無須指明“怎麼做”,數據的存取由系統自動完成。這不但大大減少了用戶負擔,而且有利於提高數據獨立性。
(3)面向集合:非關係數據模型的操作對象是一條記錄,而SQL的操作對象是元組的集合,哪個比較高效一目瞭然。
(4)SQL既可以作爲獨立語言,又可以作爲嵌入式語言:作爲獨立語言,用戶可以在終端鍵盤上直接鍵入SQL命令來對數據庫進行操作;作爲嵌入式語言,它可以嵌入到高級語言(例如C、C++、Java等)程序中,供程序猿使用。關鍵是,兩種使用方式下SQL的語法結構基本一致,因此提供了極大的靈活性和方便性。
(5)簡潔易學!:學習語言最怕就是要背的東西多,而SQL語言十分簡潔,完成核心功能只用了9個動詞,而且接近英語口語,相當易學。數據查詢(SELECT)、數據定義(CREAT,DROP,ALTER)、數據操縱(INSERT,UPDATE,DELETE)和數據控制(GRANT,REVOKE)。
3. SQL的基本概念
SQL支持關係數據庫系統的三級模式結構,其中外模式包括若干視圖(view)和部分基本表(base table),模式包括若干基本表,內模式包括若干存儲文件(stored file)。
用戶可以用SQL對基本表和視圖進行查詢或其他操作,基本表和視圖都是關係(二維表)。
基本表是獨立存在的,在關係數據庫管理系統中,一個關係對應一個基本表,一個或多個基本表對應一個存儲文件。一個表可以帶若干索引,索引也存放在存儲文件中。
存儲文件的邏輯結構組成了關係數據庫的內模式。
視圖是從一個或幾個基本表或視圖中導出的表,它本身並不獨立存在,數據庫中只存放視圖的定義,而不存放它對應的數據,數據仍存放在原來的基本表中,因此視圖只是一個虛表。
SQL的常用數據類型
數據類型 | 含義 |
CHAR(n) | 長度爲n的定長字符串 |
VARCHAR(n) | 最大長度爲n的變長字符串 |
INT | 長整型(4字節) |
SMALLINT | 短整型(2字節) |
BIGINT | 大整型(8字節) |
FLOAT(n) | 可選精度的浮點數,精度至少爲n位數字 |
BOOLEAN | 邏輯布爾量 |
DATE | 日期(YYYY-MM-DD) |
TIME | 時間(HH:MM:SS) |
數據定義
操作對象 | 操作方式 | ||
創建 | 刪除 | 修改 | |
模式 | CREAT SCHEMA | DROP SCHEMA | |
表 | CREAT TABLE | DROP TABLE | ALTER TABLE |
視圖 | CREAT VIEW | DROP VIEW | |
索引 | CREAT INDEX | DROP INDEX | ALTER INDEX |
需要注意的是,SQL標準不提供修改模式和視圖定義的語句,如果用戶要修改模式或視圖,只能先將它們刪除然後重建。SQL標準也沒有提供索引相關的語句,但爲了提高查詢效率,商用關係數據庫管理系統都提供了索引機制。
在早期的數據庫系統中,所有數據庫對象都屬於一個數據庫,也就是說只有一個命名空間。而現代的關係數據管理系統提供了一個層次化的數據庫對象命名機制。
一個關係數據庫管理系統的實例中可以建立多個數據庫,一個數據庫中可以建立多個模式,一個模式下通常包括多個表、視圖和索引等數據庫對象:數據庫【模式(表、視圖和索引)】
1. 模式的定義與刪除
(1)定義模式:CREAT SCHEMA <模式名> AUTHORIZATION <用戶名> [<表定義子句>|<視圖定義子句>|<授權定義子句>];
定義模式實際上定義了一個命名空間,在這個空間中可以進一步定義該模式包含的數據庫對象,例如基本表、視圖、索引等。
如果模式定義語句中沒有指定<模式名>,<模式名>隱含爲<用戶名>。
例如:
爲用戶WANG定義一個模式TEST,並且在其中定義一個表TAB:
CREAT SCHEMA TEST AUTHORIZATION WANG
CREAT TABLE TAB(COL1 SMALLINT, COL2 INT);
(2)刪除模式:DROP SCHEMA <模式名> <CASCADE|RESTRICT>;
CASCADE(級聯),表示在刪除模式的同時,把模式中的所有數據庫對象刪除;RESTRICT(限制),表示如果模式中定義了數據庫對象,則拒絕該刪除語句的執行。
2. 基本表的定義、刪除和修改
(1)定義基本表:CREAT TABLE <表名> (<列名><數據類型> [列級完整性約束條件]...[表級完整性約束條件]);
建表的同時通常可以定義與該表有關的完整性約束條件,表的定義以及約束條件會被存放在數據字典中。
*數據字典是關係數據庫管理系統的一組系統表,記錄了數據庫中所有的定義信息。關係數據庫管理系統在執行SQL的數據定義語句時,實際上就是在更新數據字典中相應的信息。
例如:
建立一個“學生”表Student,定義各列數據類型以及完整性約束條件:
CREAT TABLE Student
(Sno CHAR(9) PRIMARY KEY, /*列級完整性約束條件,Sno是主碼*/
Sname CHAR(20) UNIQUE, /*列級完整性約束條件,Sname取唯一值*/
Ssex CHAR(2) NOT NULL, /*列級完整性約束條件,Ssex不能取空值*/
Sage SMALLINT,
Sdept VARCHAR(20),
FOREIGN KEY (Cpno) REFERENCES Course (Cno)
/*表級完整性約束條件,Cpno是外碼,被參照表是Course,被參照列是Cno*/
/*上面看不太懂的同學請翻到《數據庫知識整理 - 關係數據庫》看下“關係的完整性”的部分*/
);
區分列級完整性約束條件和表級完整性約束條件的方法比較簡單——看約束條件短語的位置:在子句結尾是作爲列級完整性約束條件,而在子句開頭是作爲表級完整性約束條件。
比如主碼由兩個屬性構成:
PRIMARY KEY(Sno,Cno),
(2)定義基本表所屬的模式有兩種較簡單的方法。一種方法是定義模式的同時定義基本表,就像上面定義模式的例子;另一種方法是在表名中直接給出:
CREAT TABLE "S-T".Student(...);
(3)修改基本表:ALTER TABLE <表名> [操作子句] ;
修改基本表主要有4個操作子句:
<1> ADD子句用於增加新列或新的完整性約束條件。如:
向Student表中增加“entrance(入學時間)”列:ALTER TABLE Student ADD entrance DATE;
增加課程名稱必須取唯一值的約束條件:ALTER TABLE Student ADD UNIQUE(Cname);
<2> DROP COLUMN子句用於刪除表中的列。如果指定了CASCADE短語,則自動刪除引用了該列的所有對象,比如視圖;如果指定了RESTRICT短語,則如果該列被其他對象引用,拒絕刪除操作。
<3> ALTER COLUMN子句用於修改列原有的定義,包括列名和數據類型。如:
將年齡的數據類型從字符型轉爲整型:ALTER TABLE Student ALTER COLUMN Sage INT; /*相當於直接覆蓋*/
<4>DROP CONSTRAINT子句用於刪除完整性約束條件。
(4)刪除基本表:DROP TABLE <表名> [RESTRICT|CASCADE];
RESTRICT是有條件的刪除,存在任何依賴該表的對象,該表都不能被刪除;CASCADE是無條件的刪除,刪除表的同時,所有依賴該表的對象也自動刪除。
默認情況下是RESTRICT。
3. 索引的建立和刪除
當表的數據量比較大時,建立索引是加快查詢速度的有效手段。索引雖然能夠加速數據庫查詢,但需要佔用一定的存儲空間。當基本表更新時,索引需要進行維護,這樣又增加了數據庫的負擔,所以要有選擇地創建索引。
索引建立在基本表的一列或多列上。
(1)建立索引:CREAT [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>]);
UNIQUE表明此索引的每一個索引值只對應唯一的數據記錄;CLUSTER表示要建立聚簇索引,這裏暫時不作過多介紹。
<次序>有兩種:ASC(升序)和DESC(降序),默認值爲ASC。
舉栗子:
爲學生-課程數據庫中的Student、Course和SC三個表建立索引。Student和Course表按學號(課程號)升序建唯一索引,SC表按學號升序,課程號降序建立唯一索引。
CREAT UNIQUE INDEX Stusno ON Student(Sno);
CREAT UNIQUE INDEX Cousno ON Course(Cno);
CREAT UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
(2)修改索引:ALTER INDEX <舊索引名> RENAME TO <新索引名>;
(3)刪除索引:DROP INDEX <索引名>;
路過的圈毛君:“這裏介紹的只是SQL的基本概念和基礎功能。對於SQL語言,不同的數據庫產品在處理策略上可能會與SQL的國際標準有所差別,所以使用具體的數據庫系統時以用戶手冊的說明爲準。”