企業(yè)營銷網(wǎng)站建設規(guī)劃百度網(wǎng)站優(yōu)化公司
文章目錄
- 三、SQL語言
- 1 概述
- 2 數(shù)據(jù)定義(DDL)
- 2.1 定義數(shù)據(jù)庫
- 2.2 定義基本表
- 2.3 修改基本表
- 2.4 刪除基本表
- 3 數(shù)據(jù)操作(DML)
- 3.1 數(shù)據(jù)查詢
- 3.1.1 單表查詢
- 3.1.2 連接查詢
- 3.1.3 嵌套查詢
- 3.1.4 集合查詢
- 3.2 數(shù)據(jù)更新
- 3.2.1 插入數(shù)據(jù)
- 3.2.2 修改數(shù)據(jù)
- 3.2.3 刪除數(shù)據(jù)
- 4 數(shù)據(jù)控制(DCL)
- 5 視圖
- 5.1 定義視圖
- 5.2 刪除視圖
- 5.3 查詢視圖
- 5.4 更新視圖
- 6 索引
- 6.1 建立索引
- 6.2 刪除索引
- 6.3 一般準則
- 7 嵌入式SQL
三、SQL語言
1 概述
-
什么是SQL語言?
Structured Query Language 結(jié)構(gòu)化查詢語言。所有關(guān)系數(shù)據(jù)庫產(chǎn)品的標準。
-
SQL語言分類:
- DDL:數(shù)據(jù)定義語言
- DML:數(shù)據(jù)操作語言(有些教材分為數(shù)據(jù)查詢和數(shù)據(jù)操縱)
- DCL:數(shù)據(jù)控制語言
- INDEX(索引)、VIEW(視圖)、嵌入式SQL
-
SQL語言的特點:
- 綜合統(tǒng)一
- 高度非過程化:用戶只需提出"做什么",而不是"怎么做"
- 面向集合的操作方式
- SQL語言可以嵌入到高級語言程序中
-
SQL支持數(shù)據(jù)庫三級模式結(jié)構(gòu):
- 基本表(模式):一個表對應一個存儲文件
- 視圖(外模式):是一個虛表,由基本表導出
- 存儲文件(內(nèi)模式)
2 數(shù)據(jù)定義(DDL)
定義表、定義視圖、定義索引。包括創(chuàng)建、刪除、修改操作。
2.1 定義數(shù)據(jù)庫
-
注意:所有的表都必須依賴數(shù)據(jù)庫而存在,所以在定義表之前要先創(chuàng)建一個數(shù)據(jù)庫。
CREATE DATABASE containerName; -- 創(chuàng)建一個容器 USE containerName; -- 使用指定的數(shù)據(jù)庫
-
數(shù)據(jù)庫中的文件分為數(shù)據(jù)文件(又分為主數(shù)據(jù)文件mdf,次數(shù)據(jù)文件ndf)與事務文件(ldf)
-
數(shù)據(jù)庫維護:
-- 修改數(shù)據(jù)庫名 ALTER DATABASE test modify name= test_1 -- 刪除數(shù)據(jù)庫 DROP DATABASE dbtest -- 修改數(shù)據(jù)庫 sjkDB 中數(shù)據(jù)文件的初始大小,將其初始大小改為 9MB,最大為120MB ALTER DATABASE sjkDB MODIFY FILE ( NAME=sjkDB_data, SIZE=9, MAXSIZE=120) -- 為數(shù)據(jù)庫添加日志文件 ALTER DATABASE sjkDB ADD LOG FILE ( NAME=sjkDBlog1, FILENAME='E:\teaching\sjkDBlog1.ldf', SIZE=3, MAXSIZE=20, FILEGROWTH=1 )
2.2 定義基本表
一個表必須包括:表名、屬性名、屬性數(shù)據(jù)類型、完整性約束
-
創(chuàng)建基本表的語法
[]里的內(nèi)容表示可以省略,但是最基本的必須有主鍵
PRIMARY KEY
CREATE TABLE 表名 (列名1 數(shù)據(jù)類型 [約束], -- []里的內(nèi)容表示可以不寫列名2 數(shù)據(jù)類型 [約束],...列名N 數(shù)據(jù)類型 [約束],...其他表級完整性約束 );
-
常用的數(shù)據(jù)類型
數(shù)據(jù)類型 描述 CHAR(n) 定長為n的字符串,不足長度會用空格填充 VARCHAR(n) 最大長度為n的變長字符串,不足的不會自動補空格 INT, SMALLINT, BIGINT 長整數(shù) (4字節(jié))、短整數(shù) (2字節(jié))、大整數(shù) (8字節(jié)) BIT 只能是0或1 DECIMAL(p,d) 精確的小數(shù)類型,p表示總數(shù)字位數(shù),d表示小數(shù)位數(shù) FLOAT(n) 可選精度浮點數(shù),n表示總位數(shù),通常指的是存儲精度 DATE 日期,格式為YYYY-MM-DD(年-月-日) TIME 時間,格式為HH:MM:SS(時:分:秒) DATETIME 日期和時間的組合,通常格式為YYYY-MM-DD HH:MM:SS -
常用的完整性約束
- 主鍵約束:PRIMATY KEY
- 參照完整性約束(外鍵-另一個表的主鍵):FOREIGN KEY … REFERENCES …
- 唯一性約束:UNIQUE
- 非空值約束:NOT NULL
- 自定義約束:CHECK
主鍵和唯一性的異同:相同點是每列中不能有重復的值;不同點是主鍵不能為空,而唯一性約束可以為空,且一個表中只能有一個主鍵約束,但可以有很多個唯一性約束。
-
表級完整性約束寫法:如果完整性涉及道多個屬性列必須定義在表級上
寫在所定義表的所有列之后
-
多列組成的主鍵
PRIMARY KEY(列名1,列名2,...)
-
定義外鍵:當前表的某列是其他表的主鍵
FOREIGN KEY(當前表的列名) REFERENCES 參照的表名(參照表的主鍵)
-
設置外鍵并添加約束
foreign key (course_id) references course(course_id)on delete set null -- 當另一個表中刪除時設為空
-
ON DELETE CASECATE 級聯(lián)刪除(刪的更深)
-
ON UPDATE CASECATE 級聯(lián)修改
-
2.3 修改基本表
-
基本語法
-
添加
ADD
-- 添加整列 ALTER TABLE 表名 ADD COLUMN 列名 數(shù)據(jù)類型 [約束]; -- 添加約束 ALTER TABLE 表名 ADD 約束類型(列名);
-
刪除
DROP
-- 刪除某列 ALTER TABLE 表名 DROP COLUMN 列名; -- 刪除主鍵約束 ALTER TABLE 表名 DROP PRIMARY KEY; -- 刪除某列約束 ALTER TABLE 表名 DROP CONSTRAINT 約束名; -- 刪除某列約束(SQL Server) ALTER TABLE 表名 DROP CONSTRAINT 約束名(列名);
-
更新
MODIFY
-- 修改某列數(shù)據(jù)類型 ALTER TABLE 表名 MODIFY COLUMN 列名 數(shù)據(jù)類型; -- 修改列名 ALTER TABLE 表名 RENAME COLUMN 舊列名 TO 新列名; -- 修改表名 ALTER TABLE 舊表名 RENAME TO 新表名; -- 設置默認值 ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 默認值; -- 取消默認值 ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;
-
2.4 刪除基本表
-
刪除基本表后,磁盤中對該表的描述,索引,數(shù)據(jù)都會被刪去,視圖還保留,但無法引用。
-
語法
DROP TABLE 表名
-
ON DELETE CASECATE 級聯(lián)刪除(刪的更深)
-
ON UPDATE CASECATE 級聯(lián)修改
3 數(shù)據(jù)操作(DML)
3.1 數(shù)據(jù)查詢
-
基本語法
SELECT 列1,列2,... -- 指定顯示的列 FROM 表1,表2,... -- 指定查詢對象 WHERE 條件 -- 查定查詢條件 GROUP BY 分組列名 HAVING 條件 -- 對查詢結(jié)果按指定列進行分組 ORDER BY 排序列名 -- 對查詢結(jié)果指定升序/降序
Tips:先執(zhí)行FROM 再執(zhí)行后面的子句 最后才執(zhí)行SELECT
3.1.1 單表查詢
單表查詢僅涉及一張表,是最簡單的查詢操作
基本操作
-
查詢某些列
SELECT 列1,列2,... FROM 表名
-
查詢所有列
SELECT * FROM 表名 -- 按照原始順序查詢。也可以把所有列名列出來,可以指定順序查詢
-
查詢表達式值
-- 例:查詢學生的出生年份 SELECT year(getdate())-sage FROM student -- year(getdate())是系統(tǒng)內(nèi)置函數(shù)
-
給查詢到的列起別名
給列起別名并不會影響數(shù)據(jù)庫中原來的名字
SELECT 列名 as 列別名 FROM 表名 -- as可以省略,別名有空格,必須寫單引號
-
嵌入字符串:SELECT后面還可以跟字符串,這樣查詢出來的結(jié)果每一行都多出來一列指定的字符串
SELECT 列名 'hello' FROM 表名 -- 結(jié)果:第二列所有值都為hello
聚集函數(shù)
聚集函數(shù)用于選取出數(shù)據(jù)后對數(shù)據(jù)進行統(tǒng)計操作
-
主要的集函數(shù)有:
COUNT統(tǒng)計個數(shù);SUM計算總和;AVG求平均值;MAX求最大值;MIN求最小值。統(tǒng)計時忽略NULL。
-
基本語法:
-- 統(tǒng)計某列的所含值得個數(shù) SELECT COUNT(列名) FROM 表名
條件查詢-WHERE
-
去掉重復的元組(行)
關(guān)鍵字DISTINCT:去重 ALL:顯示所有(默認)
SELECT DISTINCT 列1,列2,... FROM 表名
-
選擇運算:通過
WHERE Condition
子句實現(xiàn)-
比較大小:
= > < >= <= != or <> !> !<
SELECT 列名 FROM 表名 where 列名='name' -- name是指定字符串
-
確定范圍:
BETWEEN 下限 AND 上限
NOT BETWEEN 下限 AND 上限
-- 例子1:查詢年齡在10-20之間的學生姓名,年齡 SELECT sname,sage FROM student WHERE sage BETWEEN 10 AND 20 -- 例子2:查詢年齡不在在10-20之間的學生姓名,年齡 SELECT sname,sage FROM student WHERE sage NOT BETWEEN 10 AND 20
-
確定謂詞:
IN <值表>
NOT IN <值表>
表示所查詢的表在元組中某列的值在<值表>當中
-- 查詢計算機系、數(shù)學系的學生姓名 SELECT snam FROM student WHERE Sdept IN ('CS','MA')
-
字符串匹配:
LIKE '匹配串'
NOT LIKE '匹配串'
模糊匹配,配合通配符使用才有意義
%
-任意長度的字符串_
-任意單個長度字符-- 查詢姓劉學生的姓名,年齡 SELECT sname,sage FROM student WHERE Sname LIKE '劉%'
ESCAPE短語:用戶查詢字符串中有_或%,要使用換碼字符對通配符進行轉(zhuǎn)義
-- 查詢以DB_開頭的課程號和學分 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE 'DB\_%' ESCAPE '\' -- 這里_不再是通配符,而是普通的字符串
-
涉及空值的查詢:
IS NULL
IS NOT NULL
注意:不能用=NULL來代替
-- 查詢學生成績?yōu)榭盏膶W號和課程號 SELECT Sno,Cno FROM SC WHERE Grade IS NULL
-
-
多重條件查詢:使用關(guān)鍵字
AND
或OR
將條件子句連接起來。AND
優(yōu)先級高于OR
。-- 例子1:查詢年齡在10-20之間的學生姓名,年齡 SELECT sname,sage FROM student WHERE sage>=10 AND sage<=20 -- 例子2:查詢年齡不在在10-20之間的學生姓名,年齡 SELECT sname,sage FROM student WHERE sage<10 OR sage>20
分組查詢-GROUP BY
-
注意:SELECT后面可以是分組依據(jù)的列,也可以是聚集函數(shù),但不能是其他的列名!
為什么呢?比如我按課程號分組,選這個課程的人數(shù)超過2人,那么我查詢學生學號時,這兩個人的學號應該顯示哪個呢,這樣就會沖突。
-
基本語法
SELECT [分組列名],[聚集函數(shù)] FROM 表名 GROUP BY 分組列名
-
GROUP BY和WHERE配合使用
-- 求各個課程號及相應課程成績>90分的學生人數(shù) SELECT Cno,COUNT(Sno) FROM SC WHERE Grade>90 GROUP BY Cno
-
HAVING對分組以后的結(jié)果篩選
-
語法
SELECT [分組列名],[聚集函數(shù)] FROM 表名 GROUP BY 分組列名 HAVING 條件 -- HAVING后面的意思是,只有滿足某些條件的組才會被留下來
-
例子1:查詢選修了3門以上課程的學生學號
SELECT Cno FROM SC GROUP BY Cno HAVINF COUNT(*)>3
-
例子2:查詢3門課程90分以上的學生學號和其90分以上的課程數(shù)
SELECT Cno,COUNT(*) FROM SC WHERE Grade>90 -- 先把表中90分的留下來 GROUP BY Cno HAVINF COUNT(*)>3 -- 按學號分組,分完組后組中個數(shù)大于3的組才留下來
-
-
WHERE和HAVING的區(qū)別
- WHERE是對整個表進行篩選,后不可跟聚合函數(shù)
- HAVING是對分組之后的結(jié)果進行篩選,后可跟聚合函數(shù)
排序子句-ORDER BY
將查詢得到的結(jié)果排序后再顯示。默認是升序ASC
,降序DESC
-
基本語法
SELECT 列名... FROM 表名 WHERE 條件 ORDER BY 主排序列 排序方式,次排序列 排序方式 -- 如果是升序 ASC可以不寫
-
注意:只能對最終的查詢結(jié)果排序,不能對中間結(jié)果排序。
3.1.2 連接查詢
同時涉及多個表的查詢。用來連接兩個表的條件稱為連接謂詞。多個表中有相同的列要加前綴以示區(qū)別,如果是等值連接的列則不用。
交叉連接
-
定義:廣義笛卡爾積。把表1的每一行和表2的每一行都連接一遍;很少使用,無任何連接條件,所以無意義。
-
語法:兩種方式
-
直接用逗號把兩表隔開
SELECT Student.* SC.* FROM Student,SC
-
使用
CROSS JOIN
關(guān)鍵字把兩表連接起來SELECT Student.* SC.* FROM Student CROSS JOIN SC
-
等值連接
-
定義:交叉連接結(jié)果的篩選。大部分情況是同名列相等,一般是主鍵與外鍵相等。
-
語法:使用=號連接相等的結(jié)果。并且注意多個表的相同列名要加上前綴。
-- 查詢每個學生及其選修課程的情況 SELECT Student.* SC.* FROM Student,SC WHERE Student.Sno=SC.Sno
-
注:兩個表WHERE后就跟一個條件即可進行等值連接,3個表則要跟2個條件,以此類推。
-
復合連接就是WHERE后面有好多個AND加上條件罷了
自身連接
-
定義:一個表與自身連接
-
語法:需要給表起別名以示區(qū)別;必須加前綴。
-
例子:查詢每一門課程的先修課程名
SELECT a1.Cname,a2.Cname -- 從新的表中選特定的列 FROM Course a1,Course a2 -- 先把兩個表拼成一排 WHERE a1.Cpno=a2.Cno -- 篩選出符合條件的連接起來放在一個新的表里 Cpno是先修課程學號
內(nèi)連接
其實是等值連接,只不過兩個表之間用JION
隔開而不是,
外連接
把被舍棄的值,也保留在結(jié)果中,但是要加NULL
-
左外連接
-- 語法 SELECT 列名... FROM 表1 LEFT OUTER JOIN 表2 ON 查詢條件
-
右外連接
-- 語法 SELECT 列名... FROM 表1 RIGHT OUTER JON 表2 ON 查詢條件 -- 如果右表沒有匹配的則列返回空值
-
全外連接
-- 語法 SELECT 列名... FROM 表1 FULL OUTER JION 表2 ON 查詢條件
3.1.3 嵌套查詢
-
查詢塊:一個SELECT語句稱為一個查詢塊
-
嵌套查詢:將一個查詢塊嵌套在另一個查詢塊的WHERE或HAVING子句中
-
兩種方式:
-
不相關(guān)子查詢:子查詢的查詢條件不依賴于父查詢。
由里往外,先執(zhí)行完子查詢再執(zhí)行父查詢。子查詢的結(jié)果用于建立父查詢的查找條件。
-
相關(guān)子查詢:子查詢的查詢條件依賴于父查詢
執(zhí)行一行外層查詢就會執(zhí)行完整一次子查詢,然后把內(nèi)層查詢的結(jié)果代替子查詢作用于外層查詢的條件。
-
-
嵌套查詢的謂詞:
-
IN:子查詢的結(jié)果是一個集合
-- 例子:查詢了選修課程號為2的學生姓名 SELECT Sname FROM Student WHERE Sno IN -- ②再通過學號查學生姓名 (SELECT Sno FROM SC WHERE Cno=2) -- ①子查詢的結(jié)果,先把課程號為2的學生學生求出來
-
比較運算符:子查詢的結(jié)果是單個值。子查詢一定跟在比較運算符之后。
-
ANY或ALL:子查詢的結(jié)果是多個,配合比較運算符使用。
ANY:小于子查詢?nèi)我庖粋€ >ALL:大于子查詢的所有
-- 語法 SELECT 列名... FROM 表名 WHERE 列名>ALL (子查詢)
-
EXISTS:子查詢的結(jié)果是空或者非空
EXISTS的值:如果子查詢?yōu)榉强談t為True,空則為False。True表示當前行被選中,False則不被選中。
NOT EXISTS則相反。
例子:查詢選了1號課程的學生姓名 SELECT Sname FROM Student S WHERE EXISTS -- 有返回值則為True被選中 (SELECT * FROM SC C WHERE S.Sno=C.Sno AND Cno=1) -- 如果學選了一號課程則有返回值
-
-
子查詢的限制
- 不能使用ORDER BY子句
3.1.4 集合查詢
-
并集 UNION
會自動去掉重復的元組。
<查詢塊> UNION <查詢塊>
-
交集 INTERSECT
大部分系統(tǒng)不提供,所以用戶要自己用別的方式來實現(xiàn)。用AND來實現(xiàn)。
-
差集 EXCEPT
大部分系統(tǒng)也不提供。
3.2 數(shù)據(jù)更新
3.2.1 插入數(shù)據(jù)
插入單個元組
-
語法
INSERT INTO 表名(列名1,列名2,...) VALUES(常量1,常量2,...)
-
兩種情況
- 沒有列名,則所有的數(shù)據(jù)項常量都必須有
- 有列名,后面的數(shù)據(jù)項常量要與列名的順序匹配上
- 考到了,背錯了,氣死!!
插入多個元組
-
語法
INSERT INTO 表名 VALUES(常量,常量,...),(常量,常量,...)
插入子查詢結(jié)果
-
前提:子查詢的結(jié)果要與表的列關(guān)系對應上,否則要寫清楚列名
-
語法
INSERT INTO 表名 SELECT查詢塊
注意:執(zhí)行插入語句時不能破壞原表的完整性規(guī)則。
- 實體完整性
- 參照完整性
- 用戶自定義完整性
- 非空、非重復、值域范圍
3.2.2 修改數(shù)據(jù)
-
功能:修改表中滿足WHERE子句條件的元組
-
語法
UPDATE 表名 SET 列名=表達式 WHERE 條件
-
修改單個元組、修改多個元組
-
帶子查詢的修改
-- 例子:將計算機系全體學生成績置0 UPDATE SC SET Grade=0 WHERE 'CS' = (SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno) -- 相關(guān)子查詢
3.2.3 刪除數(shù)據(jù)
-
功能:刪除指定表中符合WHERE子句的元組
-
語法
DELETE FROM 表名 WHERE 條件
-
注意:要滿足完整性規(guī)則。如果沒有WHERE將刪除整個表
-
也有三種方式,刪除單個/多個元組。
-
帶子查詢的刪除
-- 例子:刪除計算機系學生的選課記錄 DELETE FROM SC WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept=SC) -- 不相關(guān)子查詢
-
TRUNCATE也可以刪除表
- DELETE是一行一行刪,當有很多行數(shù)據(jù)時效率低。執(zhí)行的是DML命令。
- TRUNCATE是先DROP刪除整個表,再CREATE創(chuàng)建一個表,效率高。實際上是執(zhí)行了兩條DDL命令。
4 數(shù)據(jù)控制(DCL)
數(shù)據(jù)控制也稱為數(shù)據(jù)保護。包括四個方面:
- 安全性控制
- DBA授權(quán),包括授權(quán)GRANT,回收權(quán)力REVOKE
- 完整性控制
- 數(shù)據(jù)庫中數(shù)據(jù)的有效性、正確性、相容性
- 并發(fā)性控制
- 多個用戶并發(fā)的對數(shù)據(jù)庫進行操作時,對他們加以控制、協(xié)調(diào),保證并發(fā)操作的正確執(zhí)行和數(shù)據(jù)庫的一致性。
- 恢復
- 數(shù)據(jù)庫發(fā)生故障時,對數(shù)據(jù)庫進行恢復
5 視圖
視圖是虛擬表,可以從多個表中取出數(shù)據(jù)構(gòu)成虛擬表,目的是方便用戶操作、多角度理解數(shù)據(jù),保證邏輯獨立性、保證表的某些數(shù)據(jù)機密性;對應數(shù)據(jù)庫三級模式結(jié)構(gòu)的外模式。
5.1 定義視圖
-
建立視圖
就是把子查詢的結(jié)構(gòu)當作視圖的結(jié)構(gòu)
CREATE VIEW 視圖名(列名1,列名2...) AS SELECT子查詢 WITH CHECK OPTION
-
列名:如果不起則默認為子查詢的列名;基于多個表的視圖最好寫列名;查詢得到的數(shù)據(jù)中有表達式的列要起列名
-
SELECT語句:創(chuàng)建視圖時并不執(zhí)行,查詢視圖的時候才執(zhí)行,并且子查詢中必須有表的主鍵
-
WITH CHECK OPTION:可選項;要求透過視圖進習更新的時候要滿足子查詢的條件,防止這種通過視圖更新不屬于視圖范圍的數(shù)據(jù)
-
基于視圖的視圖:AS后面查詢的對象是視圖
5.2 刪除視圖
-
語法
由該視圖導出的其他視圖要被顯示刪除,已經(jīng)無法使用。注意:刪除表時由該表導出的視圖也要顯示刪除。
DROP VIEW 視圖名
5.3 查詢視圖
-
查詢視圖的語法:與查詢基本表完全一樣。
-
關(guān)鍵:視圖不存任何數(shù)據(jù),所以查詢視圖相當于查詢了基本表,只不過它更方便用戶操作。
-
視圖實體化法:把中間的結(jié)果轉(zhuǎn)化為表
-
視圖消解法(常用):把視圖定義的子查詢和用戶的查詢結(jié)合,轉(zhuǎn)化為等價的對表的查詢
-
例子
-
V_SG視圖的定義
CREATE VIEW V_SG(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
-
在V_SG視圖中查詢平均成績在90分以上的學生學號和平均成績
-
對視圖的查詢
SELECT Sno,Gavg FROM V_SG WHERE Gavg>90
-
轉(zhuǎn)化為真實的表查詢
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HABING AVG(Grade)>90;
-
視圖消解法局限:有些情況不能正確使用,比如上述例子,AVG聚集函數(shù)不能再WHERE子句中使用
-
5.4 更新視圖
包括刪除,修改,插入。
- 同樣是轉(zhuǎn)化為更新表。視圖消解法(常用),試圖實體化表。
- 視圖可更新的條件
- 行列子集視圖:只取自一個表,且包含主鍵
- 視圖不能包含聚合函數(shù)、GROUP BY 子句、DISTINCT 關(guān)鍵字(列不包含計算出來的結(jié)果)
- 其他大多數(shù)視圖都不可更新
6 索引
對應三級模式的內(nèi)模式。涉及到磁盤上數(shù)據(jù)的存儲。簡單理解為書的目錄。
6.1 建立索引
-
目的:加快查詢速度的有效手段。結(jié)合維護的代價和查詢的性能提升確定是否要創(chuàng)建索引。
-
如何建立?
當我創(chuàng)建表確定主鍵、唯一鍵時,數(shù)據(jù)庫會幫我們自動建立索引。維護索引也由數(shù)據(jù)庫自動完成。
-
人為建立(唯一)索引:
當不存在主鍵、唯一鍵時,建立索引才有意義
CREATE UNIQUE INDEX 索引名 ON 表名(列名) -- 表示按表的某列升序建立索引 CREATE UNIQUE INDEX 索引名 ON 表名(列名 DESC) -- 表示按表的某列降序建立索引 CREATE UNIQUE NONCLUSTERED INDEX 索引名 ON 表名(列名) -- 非聚集索引
-
人為建立(普通)索引:
CREATE INDEX 索引名 ON 表名(列名)
-
創(chuàng)建復合索引:
CREATE UNIQUE INDEX 索引名 ON 表名(列名1 DESC,列名2 ASC)
-
什么是聚集索引?
磁盤上按該索引的順序進行物理存儲的。一個表只有一個聚集索引,且不需要人為創(chuàng)建。
-
什么是非聚集索引?
不要求數(shù)據(jù)表的數(shù)據(jù)按照索引關(guān)鍵字順序排序。也就是說表的物理順序與索引關(guān)鍵字順序不同。
-
什么是唯一索引?
人為創(chuàng)建的索引。但是注意,為列創(chuàng)建索引時列索引關(guān)鍵字必須符合唯一性。
6.2 刪除索引
-
語法
DROP INDEX 索引名 ON 表
6.3 一般準則
- 在經(jīng)常過濾,查詢的列上建立索引
- 在不同值較少的列上不必要建立索引,如性別字段
- 對于經(jīng)常存取的列避免建立索引
7 嵌入式SQL
-
SQL的兩種使用方式:
-
在終端直接交互
-
嵌入在高級語言
-
-
嵌入式SQL的實現(xiàn)方式:
源程序(高級語言+SQL) -> DBMS預處理 -> SQL轉(zhuǎn)化為函數(shù)調(diào)用的形式 -> 高級語言編譯程序(調(diào)用SQL數(shù)據(jù)庫) -> 執(zhí)行程序