很快,我們就進入到我們數據庫課程的核心章節,語句章節,首先我們先談談sql,其是結構化查詢語句,是關系數據庫的標准語言,同時,sql也是一個通用,功能極強的關系數據庫語言。其特點有五個,分別為
1)綜合統一
2)高度非過程化
3)面向集合的操作方式
4)以同一種語法結構提供多種使用方式
5)語言簡潔,易學易用
我們先說說綜合統一:
n 集數據定義語言(DDL),數據操縱語言(DML),數據控制語言(DCL)功能於一體。
n 可以獨立完成數據庫生命周期中的全部活動:
- 定義關系模式,插入數據,建立數據庫;
- 對數據庫中的數據進行查詢和更新;
- 數據庫重構和維護
- 數據庫安全性、完整性控制等
n 用戶數據庫投入運行后,可根據需要隨時逐步修改模式,不影響數據的運行。
n 數據操作符統一
然后說說高度非過程化:
v 非關系數據模型的數據操縱語言“面向過程”,必須制定存取路徑
v SQL只要提出“做什么”,無須了解存取路徑。
v 存取路徑的選擇以及SQL的操作過程由系統自動完成。
然后再說說面向集合的操作方式:
v 非關系數據模型采用面向記錄的操作方式,操作對象是一條記錄
v SQL采用集合操作方式
- 操作對象、查找結果可以是元組的集合
- 一次插入、刪除、更新操作的對象可以是元組的集合
然后再說說以同一種語法結構提供多種使用方式
v SQL是獨立的語言
能夠獨立地用於聯機交互的使用方式
v SQL又是嵌入式語言
SQL能夠嵌入到高級語言(例如C,C++,Java)程序中,供程序員設計程序時使用
最后說說語言簡潔,易學易用
Sql所涉及的基本概念,我們也要了解,分別為三級模式結構圖,基本表,存儲文件,視圖,首先先了解sql支持關系數據庫的三級模式結構圖:
然后看看基本表:
本身獨立存在的表
SQL中一個關系就對應一個基本表
一個(或多個)基本表對應一個存儲文件
一個表可以帶若干索引
再看看存儲文件:
邏輯結構組成了關系數據庫的內模式
物理結構是任意的,對用戶透明
最后看看視圖:
從一個或幾個基本表導出的表
數據庫中只存放視圖的定義而不存放視圖對應的數據
視圖是一個虛表
用戶可以在視圖上再定義視圖
了解到這些基礎知識之后,然后我們就進入主題了,就是我們的語句,首先先說說我們sql的數據定義,sql的數據定義功能分:模式(數據庫)定義,表定義,視圖和索引的定義,具體的語句如下:
嘿嘿嘿,說了數據定義功能的四個分類,現在我們就先說模式的定義與刪除(sql serverlar版本):
定義
不說其他,我們直接上代碼,簡單直白,通俗易懂:
[例1]定義一個學生-課程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG; 為用戶WANG定義了一個模式S-T
[例2]CREATE SCHEMA AUTHORIZATION WANG; <模式名>隱含為用戶名WANG
注意:如果沒有指定<模式名>,那么<模式名>隱含為<用戶名>
分析我們的模式:
v 定義模式實際上定義了一個命名空間(數據庫中再建立一個數據庫)
v 在這個空間中可以定義該模式包含的數據庫對象,例如基本表、視圖、索引等。
v 在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。其語句塊通式如下:
CREATE SCHEMA <模式名> AUTHORIZATION <用戶名>[<表定義子句>|<視圖定義子句>|<授權定義子句>]
例子:
CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE TAB1( COL1 SMALLINT, COL2 INT, COL3 CHAR(20), COL4 NUMERIC(10,3), COL5 DECIMAL(5,2) ); 為用戶ZHANG創建了一個模式TEST,並在其中定義了一個表TAB1。
刪除
刪除很簡單,只需要把握一條語句語法,以及語句的兩大關鍵詞(級聯和限制),不說其他,直接總結如下:
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
CASCADE(級聯)
刪除模式的同時把該模式中所有的數據庫對象全部刪除
RESTRICT(限制)
如果該模式中定義了下屬的數據庫對象(如表、視圖等),則拒絕該刪除語句的執行。
當該模式中沒有任何下屬的對象時 才能執行。
然后我們就說數據定義的第二大模塊,基本表的定義,刪除與修改
定義:
一、定義基本表
CREATE TABLE <表名>
(<列名> <數據類型>[ <列級完整性約束條件> ]
[,<列名> <數據類型>[ <列級完整性約束條件>] ] …
[,<表級完整性約束條件> ] );
如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級。
嘿嘿嘿,看到沒,這邊有個數據類型和約束條件,那么數據類型又有什么,約束條件又有什么呢?那么就得繼續往下看,首先看看數據類型吧
而約束條件有點多,而sql的約束有以下類型:
然后我說說表的一些補充,就是表和模式的關系:
v 每一個基本表都屬於某一個模式(一個數據庫一般有多個模式)
v 一個模式包含多個基本表
v 定義基本表所屬模式
n 方法一:在表名中明顯地給出模式名
Create table “S-T”.Student(......); /*模式名為 S-T*/
Create table “S-T”.Course(......);
Create table “S-T”.SC(......);
n 方法二:在創建模式語句中同時創建表
n 方法三:設置所屬的模式
v 創建基本表(其他數據庫對象也一樣)時,若沒有指定模式,系統根據搜索路徑來確定該對象所屬的模式
v RDBMS會使用模式列表中第一個存在的模式作為數據庫對象的模式名
v 若搜索路徑中的模式名都不存在,系統將給出錯誤
v 顯示當前的搜索路徑: SHOW search_path;
v 搜索路徑的當前默認值是:$user, PUBLIC
v DBA用戶可以設置搜索路徑,然后定義基本表
SET search_path TO “S-T”,PUBLIC;
Create table Student(......);
結果建立了S-T.Student基本表。
RDBMS發現搜索路徑中第一個模式名S-T存在,就把該
模式作為基本表Student所屬的模式。
修改
其語法如下所示:
ALTER TABLE <表名>
[ ADD <新列名> <數據類型> [ 完整性約束 ] ]
[ADD <標記完整性約束>]
[DROP <列名>]
[ DROP <完整性約束名> ]
[ ALTER COLUMN<列名> <數據類型> ];
其中ADD子句用於增加新列,新的列級完整性約束條件和新的表級完整性約束條件。
DROP COLUMN子句用於刪除表中的列,如果指定了CASCADE短語,則自動刪除引用了該列的其他對象,比如視圖;如果是RESTRICT短語,則如果該列被其他對象引用,RDBMS將拒絕刪除該列。
DROP CONSTRAINT子句用於刪除指定的完整性約束條件。
ALTER COLUMN子句用於修改原有的列定義,包括修改列名( alter table test change column address address1 varchar(30)--修改表列名)和數據類型
刪除
DROP TABLE <表名>[RESTRICT| CASCADE];
n RESTRICT:刪除表是有限制的。
- Ø 欲刪除的基本表不能被其他表的約束所引用
- Ø 如果存在依賴該表的對象,則此表不能被刪除
n CASCADE:刪除該表沒有限制。
- Ø 在刪除基本表的同時,相關的依賴對象一起刪除
然后我們要說說數據定義的第三個模塊,索引的建立與刪除,在說索引的建立與刪除之前,我們需要知道一些基礎知識,具體如下:
v 建立索引的目的:加快查詢速度
v 誰可以建立索引
- DBA 或 表的屬主(即建立表的人)
- DBMS一般會自動建立以下列上的索引
PRIMARY KEY
UNIQUE
v 誰 維護索引
DBMS自動完成
v 使用索引
DBMS自動選擇是否使用索引以及使用哪些索引
v RDBMS中索引一般采用B+樹、HASH索引來實現
n B+樹索引具有動態平衡的優點
n HASH索引具有查找速度快的特點
v 采用B+樹,還是HASH索引則由具體的RDBMS來決定
v 索引是關系數據庫的內部實現技術,屬於內模式的范疇
v CREATE INDEX語句定義索引時,可以定義索引是唯一索引、非唯一索引或聚簇索引
嘿嘿嘿,好了,了解完一些基礎之后,我們就進入到建立和刪除的知識點了
建立
v 語句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
[例13] CREATE CLUSTER INDEX Stusname ON Student(Sname);
- 在Student表的Sname(姓名)列上建立一個聚簇索引
Sc表按學號升序和課程號降序建唯一索引:
Create unique index scno on sc(sno asc,cno desc);
建表注意事項:
v 在最經常查詢的列上建立聚簇索引以提高查詢效率
v 一個基本表上最多只能建立一個聚簇索引
v 經常更新的列不宜建立聚簇索引
修改索引
對於已經建立的索引,如果需要對其重新命名,可是使用ALTER INDEX語句。其一般格式是:
ALTER INDEX <舊索引名> RENAME TO <新索引名>;
刪除索引
DROP INDEX <索引名>;
刪除索引時,系統會從數據字典中刪去有關該索引的
描述。
[例15] 刪除Student表的Stusname索引
DROP INDEX Stusname;