数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图
數據庫從入門到精通合集(超詳細,學習數據庫必看)
前言:
使用SQL語言時,要注意SQL語言對大小寫并不敏感,一般使用大寫。所有符號一定是西文標點符號(雖然是常識,但我還是提一嘴)
1、模式的定義與刪除
1.1 定義模式
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句,語句如下:
CREATE SCHEMA <模式名> AUTHORIZATION <用戶名>[<表定義子句>|<視圖定義子句>|<授權定義子句>]注:如果沒有指定<模式名>,那么<模式名>隱含為<用戶名> 。
例子: 為用戶ZHANG創建了一個模式TEST,并且在其中定義一個表TAB1
其中這個TAB1的表有5列,第一列為短整型,第二列為整型,第三列為定長字符串,第四列為定點數,第五列跟第四列一樣。稍微了解一下,后面將會詳細的介紹,表的定義。
1.2 刪除模式
語句格式:
DROP SCHEMA <模式名> <CASCADE|RESTRICT>刪除模式的同時把該模式中所有的數據庫對象全部刪除 ,即 所有依賴此模式的對象都會被刪除。
如果該模式中定義了下屬的數據庫對象(如表、視圖等),則拒絕該刪除語句的執行。 僅當該模式中沒有任何下屬的對象時才能執行。
例子:
--刪除模式ZHANG, 則刪除失敗,因為模式中定義了TAB1 DROP SCHEMA ZHANG RESTRICT; --刪除模式ZHANG, 同時該模式中定義的表TAB1也被刪除 DROP SCHEMA ZHANG CASCADE;2、基本表的定義、刪除與修改
數據類型
| CHAR(n) | 長度為n的定長字符串,也可寫作CHARACTER(n) |
| VARCHAR(n) | 最大長度為n的變長字符串,也可寫作CHARACTERVARCHAR(n) |
| CLOB | 字符串大對象 |
| BLOB | 二進制大對象 |
| INT | 長整數,4字節(也可以寫作INTEGER) |
| SMALLINT | 短整數,2字節 |
| BIGINT | 大整數,8字節 |
| NUMERIC(p,d) | 定點數,由p位數字(不包括符號、小數點)組成,小數后面有d位數字 |
| DECIMAL(p,d) | 含義和NUMBER一樣,也可以寫作DEC(p,d) |
| REAL | 取決于機器單精度的浮點數 |
| DOUBLE PRECSION | 取決于機器精度的雙精度浮點數 |
| FLOAT(n) | 浮點數,精度至少為n位數字 |
| BOOLEAN | 布爾邏輯變量 |
| DATE | 日期,包含年、月、日,格式為YYYY-MM-DD |
| TIME | 時間,包含一日的時、分、秒,格式為HH:MM:SS |
其他的
| TIMES TAMP | 時間戳類型 |
| INTERVAL | 時間間隔類型 |
2.1 定義表
語句格式:
CREATE TABLE <表名> (<列名> <數據類型>[ <列級完整性約束條件> ] [,<列名> <數據類型>[ <列級完整性約束條件>] ] ...... [,<表級完整性約束條件> ] );注: 如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級。
例子:
--建立一個學生選課表SC CREATE TABLE SC( Sno CHAR(9), Cno CHAR(4) UNIQUE, --只涉及一個屬性,可以定義為列級完整性約束條件Grade SMALLINT,PRIMARY KEY (Sno,Cno), --主碼由/*約束條件涉及到該表的兩個屬性列,必須作為表級完整性進行定義*/FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 表級完整性約束條件,Sno是外碼,被參照表是Student */FOREIGN KEY (Cno)REFERENCES Course(Cno) /* 表級完整性約束條件, Cno是外碼,被參照表是Course*/);常見的五種完整性約束:
1.NOT NULL(非空)約束: 只用于定義列約束。
CREAT TABLE Employee (Emp_id int not null,Emp_name varchar(10) not null,EMP_address varchar(40) , )創建之后,如果往表Employee表中非空約束中插入空值將會出錯。
INSERT INTO Employee VALUES(1,NULL,'neimeng') /* 報錯 Cannot insert the value NULL into column 'emp_name', table 'Student.dbo.Employee'; column does not allow nulls. INSERT fails. */2.UNIQUE(惟一)約束:用于指明創建惟一約束的列上的取值必須惟一。
CREAT TABLE Employee (Emp_id int UNIQUE,Emp_name varchar(10) NOT NULL,EMP_address varchar(40) , )如果向Employee插入數據時,如果兩條記錄的Emp_id不惟一,則會出現錯誤。
INSERT INTO Employee VALUES(123,'xiaoming','neimeng') INSERT INTO Employee VALUES(123,'xiaoWang','hebei')/*Violation of UNIQUE KEY constraint 'UQ__Employee__0051DEAE8'.Cannot insert duplicate key in object 'dbo.Employee'.*/除了在定義列時添加UNIQUE約束外,也可以將unique約束作為表約束添加。即把它作為表定義的元素。
語法如下:
3.Primary KEY(主鍵)約束:
用于定義基本表的主鍵,起惟一標識作用,其值不能為null,也不能重復,以此來保證實體的完整性。
如果向Employee表插入的Emp_id 重復了或者插入時Emp_id 為NULL值,則會出錯。
可以在創建表時,創建主鍵約束,也可創建表完成以后,創建主鍵。
例如:
alter table EmployeeInfo add constraint e_prim primary key(emp_id)PRIMARY KEY與 UNQIUE 的區別:
1.在一個表中,只能定義一個PRIMARY KEY約束,但可定義多個UNQIUE 約束。
2.對于指定為primary key的一個列或多個列的組合,其中任何一個列都不能出現空值,而對于unique所約束的惟一鍵,則允許為null,只是null值最多有一個。
** 4.FOREGIN KEY(外鍵)約束:**
定義了一個表中數據與另一個表中的數據的聯系。
FOREGIN KEY約束指定某一個列或一組列作為外部鍵,其中包含外部鍵的表稱為子表,包含外部鍵所引用的主鍵的表稱為父表。系統保證,表在外部鍵上的取值要么是父表中某一主鍵,要么取空值,以此保證兩個表之間的連接,確保了實體的參照完整性。
通俗的說,外鍵是對另一個表中主鍵的引用。 如果公共關鍵字在一個關系中是主關鍵字,那么這個公共關鍵字被稱為另一個關系的外鍵(FK)。即,當一張二維表(如表A)的主關鍵字被包含在另一張二維表(如表B)中時,A表中的主關鍵字便成為B表的外關鍵字。
2.2 定義表的所屬模式
方法一:在表名中明顯地給出模式名
Create table"S-T".Student(......); /*模式名為 S-T*/ Create table "S-T".Cource(......); Create table "S-T".SC(......);方法二:在創建模式語句中同時創建表
CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE TAB1 (COL1 SMALLINT, COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2) );方法三:設置所屬的模式
- 創建基本表(其他數據庫對象也一樣)時,若沒有指定模式,系統根據搜索路徑來確定該對象所屬的模式
- 關系數據庫管理系統會使用模式列表中第一個存在的模式作為數據庫對象的模式名
- 若搜索路徑中的模式名都不存在,系統將給出錯誤
顯示當前的搜索路徑: SHOW search_path; 搜索路徑的當前默認值是:$user, PUBLIC
設置搜索路徑,然后定義基本表:
SET search_path TO "S-T",PUBLIC; //設置搜索路徑Create table Student(......); //定義基本表結果建立了S-T.Student基本表
2.3 修改表
語句格式:
ALTER TABLE <表名>[ADD <新列名><數據類型>[完整性約束]][DROP <完整性約束名>][ALTER COLUMN <列名> <數據類型>];| ADD | 子句用于增加新列、新的列級完整性約束條件和新的表級完整性約束條件 |
| DROP COLUMN | 子句用于刪除表中的列 如果指定了CASCADE短語,則自動刪除引用了該列的其他對象 如果指定了RESTRICT短語,則如果該列被其他對象引用,關系數據庫管理系統將拒絕刪除該列 |
| DROP CONSTRAINT | 子句用于刪除指定的完整性約束條件 |
| ALTER COLUMN | 子句用于修改原有的列定義,包括修改列名和數據類型 |
例子:
向 Course表增加“開始時間”列,將其數據類型為日期型
將Ccredit 分數的數據類型由短整數改為整數
ALTER TABLE Course ALTER COLUMN Ccredit INT ;增加課程名稱必須取唯一值得約束條件
ALTER TABLE Course ADD UNIQUE(Cname);2.4 刪除表
語句格式:
DROP TABLE <表名>[RESTRICT| CASCADE];
欲刪除的基本表不能被其他表的約束所引用;
如果存在依賴該表的對象,則此表不能被刪除
在刪除基本表的同時,相關的依賴對象(表定義、數據、索引、視圖、觸發器等)一起刪除
3.索引的建立與刪除
-
建立索引的目的:加快查詢速度
-
誰可以建立索引
DBA 或 表的屬主(即建立表的人)
DBMS一般會自動建立以下列上的索引
PRIMARY
KEY UNIQUE -
索引的維護:
DBMS自動完成 -
索引的使用
DBMS自動選擇是否使用索引以及使用哪些索引 -
RDBMS中索引一般采用B+樹、HASH索引來實現
B+樹索引具有動態平衡的優點
HASH索引具有查找速度快的特點 -
采用B+樹,還是HASH索引 則由具體的RDBMS來決定
-
索引是關系數據庫的內部實現技術,屬于內模式的范疇
-
CREATE INDEX語句定義索引時,可以定義索引是唯一索引、非唯一索引或聚簇索引
3.1 創建索引
語句格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);-
<表名>:要建索引的基本表的名字
-
索引:可以建立在該表的一列或多列上,各列名之間用逗號分隔
-
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
-
UNIQUE:此索引的每一個索引值只對應唯一的數據記錄
-
CLUSTER:表示要建立的索引是聚簇索引
例子:
為學生-課程數據庫中的Student,Course,SC三個表建立索引
Student表按學號升序建唯一索引
Course表按課程號升序建唯一索引
SC表按學號升序和課程號降序建唯一索引
聚簇索引:
將數據存儲與索引放到了一塊,找到索引也就找到了數據
非聚簇索引:
將數據存儲于索引分開結構,索引結構的葉子節點指向了數據的對應行,myisam通過key_buffer把索引先緩存到內存中,當需要訪問數據時(通過索引訪問數據),在內存中直接搜索索引,然后通過索引找到磁盤相應數據,這也就是為什么索引不在key buffer命中時,速度慢的原因。
注:如果索引建的不對速度會大受影響
3.2 修改索引
語句格式:
ALTER INDEX <舊索引名> RENAME TO <新索引名>例子:
將SC表的SCno索引名改為SCSno
3.3 刪除索引
刪除索引時,系統會從數據字典中刪去有關該索引的描述
語句格式:
例子:
刪除Student表的Stusname索引
4.視圖的創建與刪除
4.1 創建視圖
語句格式
CREATE VIEW <視圖名> [(<列名> [,<列名>]…)] AS <子查詢> [WITH CHECK OPTION];注:
省略:由子查詢中SELECT目標列中的諸字段組成
明確指定視圖的所有列名:
- 某個目標列是集函數或列表達式
- 目標列為 *
- 多表連接時選出了幾個同名列作為視圖的字段
- 需要在視圖中為某個列啟用新的更合適的名字
例1:建立信息系學生的視圖
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS';例2:建立信息系學生的視圖,并要求進行修改和插入操作時仍需保證該視圖只有信息系的學生
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS' WITH CHECK OPTION;透過視圖進行增刪改操作時,不得破壞視圖定義中的謂詞條件(即子查詢中的條件表達式)
對IS_Student視圖的更新操作:
- 修改操作:自動加上Sdept= 'IS’的條件
- 刪除操作:自動加上Sdept= 'IS’的條件
- 插入操作:自動檢查Sdept屬性值是否為’IS’
- 如果不是,則拒絕該插入操作
- 如果沒有提供Sdept屬性值,則自動定義Sdept為’IS’
4.1.1 基于多個基表的視圖
例3:建立信息系選修了1號課程的學生的視圖(包括學號、姓名、成績)
CREATE VIEW IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Sdept= 'IS' AND Student.Sno=SC.Sno AND SC.Cno= '1';4.1.2 基于視圖的視圖
例4:建立信息系選修了1號課程且成績在90分以上的學生的視圖
// IS_S2 基于視圖IS_s1:FROM IS_S1 CREATE VIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;4.1.3 帶表達式的視圖
例5:定義一個反映學生出生年份的視圖
// 表達式:2014-Sage CREATE VIEW BT_S(Sno,Sname,Sbirth) AS SELECT Sno,Sname,2014-Sage FROM Student;4.1.4分組視圖
例6:將學生的學號及平均成績定義為一個視圖
// 分組:GROUP BY CREAT VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;4.2 刪除視圖
語句的格式:
DROP VIEW <視圖名>[CASCADE];- 該語句從數據字典中刪除指定的視圖定義
- 如果該視圖上還導出了其他視圖,使用CASCADE級聯刪除語句,把該視圖和由它導出的所有視圖一起刪除
- 刪除基表時,由該基表導出的所有視圖定義都必須顯式地使用DROP VIEW語句刪除
例子:
CREATE VIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;--刪除視圖BT_S DROP VIEW BT_S;--刪除視圖IS_S1: DROP VIEW IS_S1;--拒絕執行--級聯刪除: DROP VIEW IS_S1 CASCADE;4.3 查詢視圖
用戶角度: 查詢視圖與查詢基本表相同
RDBMS實現視圖查詢的方法:
視圖消解法(View Resolution)
- 進行有效性檢查
- 轉換成等價的對基本表的查詢
- 執行修正后的查詢
例子:
在信息系學生的視圖中找出年齡小于20歲的學生
視圖消解轉換后的查詢語句為:
SELECT Sno,Sage FROM StudentWHERE Sdept= 'IS' AND Sage<20;有些情況下,視圖消解法不能生成正確查詢
在S_G視圖中查詢平均成績在90分以上的學生學號和平均成績
SELECT * FROM S_G WHERE Gavg>=90;S_G視圖的子查詢定義: CREATE VIEW S_G (Sno,Gavg)AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;錯誤:
SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade)>=90 GROUP BY Sno;正確:
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>=90;4.4 更新視圖
更新視圖和更新基本表相同
注:一些視圖是不可更新的——當對視圖的更新無法轉換成對基本表SC的更新時,如修改平均成績視圖中某個學生的平均成績不可實現
舉例:
向信息系學生視圖IS_S中插入一個新的學生記錄:200215129,趙新,20歲
INSERT INTO IS_Student VALUES(‘95029’,‘趙新’,20);轉換為對基本表的更新:
INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(‘200215129 ','趙新',20,'IS' );刪除信息系學生視圖IS_Student中學號為200215129的記錄
DELETE FROM IS_Student WHERE Sno= ' 200215129 ';轉換為對基本表的更新:
DELETE FROM Student WHERE Sno= ' 200215129 ' AND Sdept= 'IS';更新視圖的限制:
一些視圖是不可更新的,因為對這些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新
例:視圖S_G為不可更新視圖。
UPDATE S_G SET Gavg=90 WHERE Sno= ‘200215121’;這個對視圖的更新無法轉換成對基本表SC的更新
實際系統對視圖更新的限制
DB2對視圖更新的限制:
(1) 若視圖是由兩個以上基本表導出的,則此視圖不允許更新。
(2) 若視圖的字段來自字段表達式或常數,則不允許對此視圖執行INSERT和UPDATE操作,但允許執行DELETE操作。
(3) 若視圖的字段來自集函數,則此視圖不允許更新。
(4) 若視圖定義中含有GROUP BY子句,則此視圖不允許更新。
(5) 若視圖定義中含有DISTINCT短語,則此視圖不允許更新。
(6) 若視圖定義中有嵌套查詢,并且內層查詢的FROM子句中涉及的表也是導出該視圖的基本表,則此視圖不允許更新。
(7) 一個不允許更新的視圖上定義的視圖也不允許更新
這里還有數據庫相關的優質文章:快戳我,快戳我😳
總結
以上是生活随笔為你收集整理的数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本地怎么搭建mysql数据库
- 下一篇: 『数据库』 E-R图(实体联系图)你都不