『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
這里還有數(shù)據(jù)庫相關(guān)的優(yōu)質(zhì)文章:快戳我,快戳我😳
前言:
使用SQL語言時(shí),要注意SQL語言對大小寫并不敏感,一般使用大寫。所有符號(hào)一定是西文標(biāo)點(diǎn)符號(hào)(雖然是常識(shí),但我還是提一嘴)
文章有點(diǎn)長,大家要耐心看完呀!👍👍👍👍👍👍
1、模式的定義與刪除
1.1 定義模式
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句,語句如下:
CREATE SCHEMA <模式名> AUTHORIZATION <用戶名>[<表定義子句>|<視圖定義子句>|<授權(quán)定義子句>]注:如果沒有指定<模式名>,那么<模式名>隱含為<用戶名> 。
例子: 為用戶ZHANG創(chuàng)建了一個(gè)模式TEST,并且在其中定義一個(gè)表TAB1
其中這個(gè)TAB1的表有5列,第一列為短整型,第二列為整型,第三列為定長字符串,第四列為定點(diǎn)數(shù),第五列跟第四列一樣。稍微了解一下,后面將會(huì)詳細(xì)的介紹,表的定義。
1.2 刪除模式
語句格式:
DROP SCHEMA <模式名> <CASCADE|RESTRICT>刪除模式的同時(shí)把該模式中所有的數(shù)據(jù)庫對象全部刪除 ,即 所有依賴此模式的對象都會(huì)被刪除。
如果該模式中定義了下屬的數(shù)據(jù)庫對象(如表、視圖等),則拒絕該刪除語句的執(zhí)行。 僅當(dāng)該模式中沒有任何下屬的對象時(shí)才能執(zhí)行。
例子:
--刪除模式ZHANG, 則刪除失敗,因?yàn)槟J街卸x了TAB1 DROP SCHEMA ZHANG RESTRICT; --刪除模式ZHANG, 同時(shí)該模式中定義的表TAB1也被刪除 DROP SCHEMA ZHANG CASCADE;2、基本表的定義、刪除與修改
數(shù)據(jù)類型
| CHAR(n) | 長度為n的定長字符串,也可寫作CHARACTER(n) |
| VARCHAR(n) | 最大長度為n的變長字符串,也可寫作CHARACTERVARCHAR(n) |
| CLOB | 字符串大對象 |
| BLOB | 二進(jìn)制大對象 |
| INT | 長整數(shù),4字節(jié)(也可以寫作INTEGER) |
| SMALLINT | 短整數(shù),2字節(jié) |
| BIGINT | 大整數(shù),8字節(jié) |
| NUMERIC(p,d) | 定點(diǎn)數(shù),由p位數(shù)字(不包括符號(hào)、小數(shù)點(diǎn))組成,小數(shù)后面有d位數(shù)字 |
| DECIMAL(p,d) | 含義和NUMBER一樣,也可以寫作DEC(p,d) |
| REAL | 取決于機(jī)器單精度的浮點(diǎn)數(shù) |
| DOUBLE PRECSION | 取決于機(jī)器精度的雙精度浮點(diǎn)數(shù) |
| FLOAT(n) | 浮點(diǎn)數(shù),精度至少為n位數(shù)字 |
| BOOLEAN | 布爾邏輯變量 |
| DATE | 日期,包含年、月、日,格式為YYYY-MM-DD |
| TIME | 時(shí)間,包含一日的時(shí)、分、秒,格式為HH:MM:SS |
其他的
| TIMES TAMP | 時(shí)間戳類型 |
| INTERVAL | 時(shí)間間隔類型 |
2.1 定義表
語句格式:
CREATE TABLE <表名> (<列名> <數(shù)據(jù)類型>[ <列級(jí)完整性約束條件> ] [,<列名> <數(shù)據(jù)類型>[ <列級(jí)完整性約束條件>] ] ...... [,<表級(jí)完整性約束條件> ] );注: 如果完整性約束條件涉及到該表的多個(gè)屬性列,則必須定義在表級(jí)上,否則既可以定義在列級(jí)也可以定義在表級(jí)。
例子:
--建立一個(gè)學(xué)生選課表SC CREATE TABLE SC( Sno CHAR(9), Cno CHAR(4) UNIQUE, --只涉及一個(gè)屬性,可以定義為列級(jí)完整性約束條件Grade SMALLINT,PRIMARY KEY (Sno,Cno), --主碼由/*約束條件涉及到該表的兩個(gè)屬性列,必須作為表級(jí)完整性進(jìn)行定義*/FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 表級(jí)完整性約束條件,Sno是外碼,被參照表是Student */FOREIGN KEY (Cno)REFERENCES Course(Cno) /* 表級(jí)完整性約束條件, Cno是外碼,被參照表是Course*/);常見的五種完整性約束:
1.NOT NULL(非空)約束: 只用于定義列約束。
CREAT TABLE Employee (Emp_id int not null,Emp_name varchar(10) not null,EMP_address varchar(40) , )創(chuàng)建之后,如果往表Employee表中非空約束中插入空值將會(huì)出錯(cuò)。
INSERT INTO Employee VALUES(1,NULL,'neimeng') /* 報(bào)錯(cuò) Cannot insert the value NULL into column 'emp_name', table 'Student.dbo.Employee'; column does not allow nulls. INSERT fails. */2.UNIQUE(惟一)約束:用于指明創(chuàng)建惟一約束的列上的取值必須惟一。
CREAT TABLE Employee (Emp_id int UNIQUE,Emp_name varchar(10) NOT NULL,EMP_address varchar(40) , )如果向Employee插入數(shù)據(jù)時(shí),如果兩條記錄的Emp_id不惟一,則會(huì)出現(xiàn)錯(cuò)誤。
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'.*/除了在定義列時(shí)添加UNIQUE約束外,也可以將unique約束作為表約束添加。即把它作為表定義的元素。
語法如下:
3.Primary KEY(主鍵)約束:
用于定義基本表的主鍵,起惟一標(biāo)識(shí)作用,其值不能為null,也不能重復(fù),以此來保證實(shí)體的完整性。
如果向Employee表插入的Emp_id 重復(fù)了或者插入時(shí)Emp_id 為NULL值,則會(huì)出錯(cuò)。
可以在創(chuàng)建表時(shí),創(chuàng)建主鍵約束,也可創(chuàng)建表完成以后,創(chuàng)建主鍵。
例如:
alter table EmployeeInfo add constraint e_prim primary key(emp_id)PRIMARY KEY與 UNQIUE 的區(qū)別:
1.在一個(gè)表中,只能定義一個(gè)PRIMARY KEY約束,但可定義多個(gè)UNQIUE 約束。
2.對于指定為primary key的一個(gè)列或多個(gè)列的組合,其中任何一個(gè)列都不能出現(xiàn)空值,而對于unique所約束的惟一鍵,則允許為null,只是null值最多有一個(gè)。
** 4.FOREGIN KEY(外鍵)約束:**
定義了一個(gè)表中數(shù)據(jù)與另一個(gè)表中的數(shù)據(jù)的聯(lián)系。
FOREGIN KEY約束指定某一個(gè)列或一組列作為外部鍵,其中包含外部鍵的表稱為子表,包含外部鍵所引用的主鍵的表稱為父表。系統(tǒng)保證,表在外部鍵上的取值要么是父表中某一主鍵,要么取空值,以此保證兩個(gè)表之間的連接,確保了實(shí)體的參照完整性。
通俗的說,外鍵是對另一個(gè)表中主鍵的引用。 如果公共關(guān)鍵字在一個(gè)關(guān)系中是主關(guān)鍵字,那么這個(gè)公共關(guān)鍵字被稱為另一個(gè)關(guān)系的外鍵(FK)。即,當(dāng)一張二維表(如表A)的主關(guān)鍵字被包含在另一張二維表(如表B)中時(shí),A表中的主關(guān)鍵字便成為B表的外關(guān)鍵字。
2.2 定義表的所屬模式
方法一:在表名中明顯地給出模式名
Create table"S-T".Student(......); /*模式名為 S-T*/ Create table "S-T".Cource(......); Create table "S-T".SC(......);方法二:在創(chuàng)建模式語句中同時(shí)創(chuàng)建表
CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE TAB1 (COL1 SMALLINT, COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2) );方法三:設(shè)置所屬的模式
- 創(chuàng)建基本表(其他數(shù)據(jù)庫對象也一樣)時(shí),若沒有指定模式,系統(tǒng)根據(jù)搜索路徑來確定該對象所屬的模式
- 關(guān)系數(shù)據(jù)庫管理系統(tǒng)會(huì)使用模式列表中第一個(gè)存在的模式作為數(shù)據(jù)庫對象的模式名
- 若搜索路徑中的模式名都不存在,系統(tǒng)將給出錯(cuò)誤
顯示當(dāng)前的搜索路徑: SHOW search_path; 搜索路徑的當(dāng)前默認(rèn)值是:$user, PUBLIC
設(shè)置搜索路徑,然后定義基本表:
SET search_path TO "S-T",PUBLIC; //設(shè)置搜索路徑Create table Student(......); //定義基本表結(jié)果建立了S-T.Student基本表
2.3 修改表
語句格式:
ALTER TABLE <表名>[ADD <新列名><數(shù)據(jù)類型>[完整性約束]][DROP <完整性約束名>][ALTER COLUMN <列名> <數(shù)據(jù)類型>];| ADD | 子句用于增加新列、新的列級(jí)完整性約束條件和新的表級(jí)完整性約束條件 |
| DROP COLUMN | 子句用于刪除表中的列 如果指定了CASCADE短語,則自動(dòng)刪除引用了該列的其他對象 如果指定了RESTRICT短語,則如果該列被其他對象引用,關(guān)系數(shù)據(jù)庫管理系統(tǒng)將拒絕刪除該列 |
| DROP CONSTRAINT | 子句用于刪除指定的完整性約束條件 |
| ALTER COLUMN | 子句用于修改原有的列定義,包括修改列名和數(shù)據(jù)類型 |
例子:
向 Course表增加“開始時(shí)間”列,將其數(shù)據(jù)類型為日期型
將Ccredit 分?jǐn)?shù)的數(shù)據(jù)類型由短整數(shù)改為整數(shù)
ALTER TABLE Course ALTER COLUMN Ccredit INT ;增加課程名稱必須取唯一值得約束條件
ALTER TABLE Course ADD UNIQUE(Cname);2.4 刪除表
語句格式:
DROP TABLE <表名>[RESTRICT| CASCADE];
欲刪除的基本表不能被其他表的約束所引用;
如果存在依賴該表的對象,則此表不能被刪除
在刪除基本表的同時(shí),相關(guān)的依賴對象(表定義、數(shù)據(jù)、索引、視圖、觸發(fā)器等)一起刪除
3.索引的建立與刪除
-
建立索引的目的:加快查詢速度
-
誰可以建立索引
DBA 或 表的屬主(即建立表的人)
DBMS一般會(huì)自動(dòng)建立以下列上的索引
PRIMARY
KEY UNIQUE -
索引的維護(hù):
DBMS自動(dòng)完成 -
索引的使用
DBMS自動(dòng)選擇是否使用索引以及使用哪些索引 -
RDBMS中索引一般采用B+樹、HASH索引來實(shí)現(xiàn)
B+樹索引具有動(dòng)態(tài)平衡的優(yōu)點(diǎn)
HASH索引具有查找速度快的特點(diǎn) -
采用B+樹,還是HASH索引 則由具體的RDBMS來決定
-
索引是關(guān)系數(shù)據(jù)庫的內(nèi)部實(shí)現(xiàn)技術(shù),屬于內(nèi)模式的范疇
-
CREATE INDEX語句定義索引時(shí),可以定義索引是唯一索引、非唯一索引或聚簇索引
3.1 創(chuàng)建索引
語句格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);-
<表名>:要建索引的基本表的名字
-
索引:可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔
-
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
-
UNIQUE:此索引的每一個(gè)索引值只對應(yīng)唯一的數(shù)據(jù)記錄
-
CLUSTER:表示要建立的索引是聚簇索引
例子:
為學(xué)生-課程數(shù)據(jù)庫中的Student,Course,SC三個(gè)表建立索引
Student表按學(xué)號(hào)升序建唯一索引
Course表按課程號(hào)升序建唯一索引
SC表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引
聚簇索引:
將數(shù)據(jù)存儲(chǔ)與索引放到了一塊,找到索引也就找到了數(shù)據(jù)
非聚簇索引:
將數(shù)據(jù)存儲(chǔ)于索引分開結(jié)構(gòu),索引結(jié)構(gòu)的葉子節(jié)點(diǎn)指向了數(shù)據(jù)的對應(yīng)行,myisam通過key_buffer把索引先緩存到內(nèi)存中,當(dāng)需要訪問數(shù)據(jù)時(shí)(通過索引訪問數(shù)據(jù)),在內(nèi)存中直接搜索索引,然后通過索引找到磁盤相應(yīng)數(shù)據(jù),這也就是為什么索引不在key buffer命中時(shí),速度慢的原因。
注:如果索引建的不對速度會(huì)大受影響
3.2 修改索引
語句格式:
ALTER INDEX <舊索引名> RENAME TO <新索引名>例子:
將SC表的SCno索引名改為SCSno
3.3 刪除索引
刪除索引時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述
語句格式:
例子:
刪除Student表的Stusname索引
4.視圖的創(chuàng)建與刪除
4.1 創(chuàng)建視圖
語句格式
CREATE VIEW <視圖名> [(<列名> [,<列名>]…)] AS <子查詢> [WITH CHECK OPTION];注:
省略:由子查詢中SELECT目標(biāo)列中的諸字段組成
明確指定視圖的所有列名:
- 某個(gè)目標(biāo)列是集函數(shù)或列表達(dá)式
- 目標(biāo)列為 *
- 多表連接時(shí)選出了幾個(gè)同名列作為視圖的字段
- 需要在視圖中為某個(gè)列啟用新的更合適的名字
例1:建立信息系學(xué)生的視圖
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS';例2:建立信息系學(xué)生的視圖,并要求進(jìn)行修改和插入操作時(shí)仍需保證該視圖只有信息系的學(xué)生
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS' WITH CHECK OPTION;透過視圖進(jìn)行增刪改操作時(shí),不得破壞視圖定義中的謂詞條件(即子查詢中的條件表達(dá)式)
對IS_Student視圖的更新操作:
- 修改操作:自動(dòng)加上Sdept= 'IS’的條件
- 刪除操作:自動(dòng)加上Sdept= 'IS’的條件
- 插入操作:自動(dòng)檢查Sdept屬性值是否為’IS’
- 如果不是,則拒絕該插入操作
- 如果沒有提供Sdept屬性值,則自動(dòng)定義Sdept為’IS’
4.1.1 基于多個(gè)基表的視圖
例3:建立信息系選修了1號(hào)課程的學(xué)生的視圖(包括學(xué)號(hào)、姓名、成績)
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號(hào)課程且成績在90分以上的學(xué)生的視圖
// 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 帶表達(dá)式的視圖
例5:定義一個(gè)反映學(xué)生出生年份的視圖
// 表達(dá)式:2014-Sage CREATE VIEW BT_S(Sno,Sname,Sbirth) AS SELECT Sno,Sname,2014-Sage FROM Student;4.1.4分組視圖
例6:將學(xué)生的學(xué)號(hào)及平均成績定義為一個(gè)視圖
// 分組:GROUP BY CREAT VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;4.2 刪除視圖
語句的格式:
DROP VIEW <視圖名>[CASCADE];- 該語句從數(shù)據(jù)字典中刪除指定的視圖定義
- 如果該視圖上還導(dǎo)出了其他視圖,使用CASCADE級(jí)聯(lián)刪除語句,把該視圖和由它導(dǎo)出的所有視圖一起刪除
- 刪除基表時(shí),由該基表導(dǎo)出的所有視圖定義都必須顯式地使用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;--拒絕執(zhí)行--級(jí)聯(lián)刪除: DROP VIEW IS_S1 CASCADE;4.3 查詢視圖
用戶角度: 查詢視圖與查詢基本表相同
RDBMS實(shí)現(xiàn)視圖查詢的方法:
視圖消解法(View Resolution)
- 進(jìn)行有效性檢查
- 轉(zhuǎn)換成等價(jià)的對基本表的查詢
- 執(zhí)行修正后的查詢
例子:
在信息系學(xué)生的視圖中找出年齡小于20歲的學(xué)生
視圖消解轉(zhuǎn)換后的查詢語句為:
SELECT Sno,Sage FROM StudentWHERE Sdept= 'IS' AND Sage<20;有些情況下,視圖消解法不能生成正確查詢
在S_G視圖中查詢平均成績在90分以上的學(xué)生學(xué)號(hào)和平均成績
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;錯(cuò)誤:
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 更新視圖
更新視圖和更新基本表相同
注:一些視圖是不可更新的——當(dāng)對視圖的更新無法轉(zhuǎn)換成對基本表SC的更新時(shí),如修改平均成績視圖中某個(gè)學(xué)生的平均成績不可實(shí)現(xiàn)
舉例:
向信息系學(xué)生視圖IS_S中插入一個(gè)新的學(xué)生記錄:200215129,趙新,20歲
INSERT INTO IS_Student VALUES(‘95029’,‘趙新’,20);轉(zhuǎn)換為對基本表的更新:
INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(‘200215129 ','趙新',20,'IS' );刪除信息系學(xué)生視圖IS_Student中學(xué)號(hào)為200215129的記錄
DELETE FROM IS_Student WHERE Sno= ' 200215129 ';轉(zhuǎn)換為對基本表的更新:
DELETE FROM Student WHERE Sno= ' 200215129 ' AND Sdept= 'IS';更新視圖的限制:
一些視圖是不可更新的,因?yàn)閷@些視圖的更新不能唯一地有意義地轉(zhuǎn)換成對相應(yīng)基本表的更新
例:視圖S_G為不可更新視圖。
UPDATE S_G SET Gavg=90 WHERE Sno= ‘200215121’;這個(gè)對視圖的更新無法轉(zhuǎn)換成對基本表SC的更新
實(shí)際系統(tǒng)對視圖更新的限制
DB2對視圖更新的限制:
(1) 若視圖是由兩個(gè)以上基本表導(dǎo)出的,則此視圖不允許更新。
(2) 若視圖的字段來自字段表達(dá)式或常數(shù),則不允許對此視圖執(zhí)行INSERT和UPDATE操作,但允許執(zhí)行DELETE操作。
(3) 若視圖的字段來自集函數(shù),則此視圖不允許更新。
(4) 若視圖定義中含有GROUP BY子句,則此視圖不允許更新。
(5) 若視圖定義中含有DISTINCT短語,則此視圖不允許更新。
(6) 若視圖定義中有嵌套查詢,并且內(nèi)層查詢的FROM子句中涉及的表也是導(dǎo)出該視圖的基本表,則此視圖不允許更新。
(7) 一個(gè)不允許更新的視圖上定義的視圖也不允許更新
別吝嗇一個(gè)👍。
別吝嗇一個(gè)👍。
別吝嗇一個(gè)👍。
寫在最后:
我叫風(fēng)骨散人,名字的意思是我多想可以不低頭的自由生活,可現(xiàn)實(shí)卻不是這樣。家境貧寒,總得向這個(gè)世界低頭,所以我一直在奮斗,想改變我的命運(yùn)給親人好的生活,希望同樣被生活綁架的你可以通過自己的努力改變現(xiàn)狀,深知成年人的世界里沒有容易二字。目前是一名在校大學(xué)生,預(yù)計(jì)考研,熱愛編程,熱愛技術(shù),喜歡分享,知識(shí)無界,希望我的分享可以幫到你!
如果有什么想看的,可以私信我,如果在能力范圍內(nèi),我會(huì)發(fā)布相應(yīng)的博文!
謝謝大家的閱讀!😘
總結(jié)
以上是生活随笔為你收集整理的『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 车主全责!特斯拉自动驾驶辅助未识别隔离墩
- 下一篇: 一加李杰官宣Ace系列淘汰8GB运存 称