本文主要介紹 INDEX、INSERT、SELECT的使用及注意事項,歡迎閱讀~
📋目錄
- 索引的建立與删除
-
- 1. 建立索引
- 2. 修改索引
- 3. 删除索引
- 插入資料
-
- 1. 插入元組
- 資料查詢
- 資料查詢之 單表查詢
-
- 1. 選擇表中的若幹列
- 2. 選擇表中的若幹元組
索引的建立與删除
建立索引(INDEX)的目的:加快查詢速度
1. 建立索引
語句格式如下:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>: 要建索引的基本表的名字
索引: 可以建立在該表的一列或多列上,各列名之間用逗号分隔
<次序>: 指定索引值的排列次序,升序:ASC,降序:DESC。預設值:ASC(即什麼都不寫時預設為升序排列)
UNIQUE: 此索引的每一個索引值隻對應唯一的資料記錄
CLUSTER: 表示要建立的索引是聚簇索引
🌟舉例:
為學生-課程資料庫中的 Student,Course,SC三個表建立索引(這三個基本表是在我的上一篇部落格中介紹并建立的,不清楚的小夥伴戳這裡傳送過去:SQL Server 資料庫基本操作入門篇【2】)。Student表按學号升序建唯一索引,Course表按課程号升序建唯一索引,SC表按學号升序和課程号降序建唯一索引:
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
此處以檢視Course表為例,能看到剛剛的按課程号升序的唯一索引建立成功了

— — — — — — — — — — — — — — — — — — — — — — — — — —
2. 修改索引
語句格式如下:
🌟舉例:
将SC表的SCno索引名改為SCSno:
這句标準SQL語句在SQL Server執行是錯誤的,不能這麼寫,應寫成如下格式:
EXEC sp_rename @objname = '表名.舊索引名', @newname = '新索引名', @objtype = 'index'
建議簡寫成這個亞子:
注意這裡EXEC調用存儲過程時會出現提示:
注意: 更改對象名的任一部分都可能會破壞腳本和存儲過程。
不過别着急,這隻是一個溫馨提示,指令已經成功執行了,更改索引名成功!
當然也可采取先删除索引再建立的方法,不過無論采用哪種方法都需注意
表名.舊索引名
!
— — — — — — — — — — — — — — — — — — — — — — — — — —
3. 删除索引
語句格式如下:
删除索引時,系統會從資料字典中删去有關該索引的描述
🌟舉例:
删除Student表的Stusno索引:
然而在SQL Server中執行該語句後會報錯:
應更改為
<表名>.<索引名>
,格式如下:
删除成功!
插入資料
兩種插入資料方式
- 插入元組
- 插入子查詢結果(可以一次插入多個元組 )
1. 插入元組
語句格式如下:
INSERT
INTO <表名> [(<屬性列1>[,<屬性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
功能: 将新元組插入指定表中
🌟舉例:
将一個新學生元組(學号:201215128;姓名:陳冬;性别:男;所在系:IS;年齡:18歲)插入到Student表中:
INSERT
INTO Student (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215128','陳冬','男','IS',18);
資料查詢
語句格式如下:
SELECT [ALL|DISTINCT] <目标清單達式>[,<目标清單達式>] …
FROM <表名或視圖名>[,<表名或視圖名> ]…|(SELECT 語句)[AS]<别名>
[ WHERE <條件表達式> ]
[ GROUP BY <列名1> [ HAVING <條件表達式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
-
整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的
基本表、視圖或派生表中找出滿足條件的元組,再按SELECT子句中的目标清單達式選出元組中的屬性值形成結果表
SELECT子句:指定要顯示的屬性列
FROM子句:指定查詢對象(基本表或視圖)
WHERE子句:指定查詢條件
GROUP BY子句:對查詢結果按指定列的值分組,該屬性列值相等的元組為一個組。通常會在每組中作用聚集函數。
HAVING短語:隻有滿足指定條件的組才予以輸出
ORDER BY子句:對查詢結果表按指定列值的升序或降序排序
(這裡就先介紹單表查詢)
資料查詢之 單表查詢
顧名思義,單表查詢即查詢僅涉及一個表
1. 選擇表中的若幹列
· 查詢指定列(關系代數中的投影):
🌟舉例:
① 查詢全體學生的學号與姓名:
SELECT Sno,Sname
FROM Student;
② 查詢全體學生的姓名、學号、所在系:
SELECT Sname,Sno,Sdept
FROM Student;
· 查詢全部列:
選出所有屬性列(兩種辦法):
- 在SELECT關鍵字後面列出所有列名
- 将 <目标清單達式> 指定為 *
🌟舉例:
查詢全體學生的詳細記錄:
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
OR
SELECT *
FROM Student;
如下圖:
· 查詢經過計算的值 :
SELECT子句的<目标清單達式>不僅可以為表中的屬性列,也可以是表達式
🌟舉例:
查詢全體學生的姓名及其出生年份:
SELECT Sname,2020-Sage
FROM Student;
查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名:
SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept)
FROM Student;
使用列别名改變查詢結果的列标題(中間用空格隔開):
SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
— — — — — — — — — — — — — — — — — — — — — — — — — —
2. 選擇表中的若幹元組
· 消除取值重複的行 :
① 如果沒有指定DISTINCT關鍵詞,即預設,預設為ALL
🌟舉例:
查詢選修了課程的學生學号:
等價于:
執行上面的SELECT語句後,結果為:
② 指定DISTINCT關鍵詞,則去掉表中的重複行
SELECT DISTINCT Sno
FROM SC;
· 查詢滿足條件的元組 :
常用的查詢條件有:
🌟比較大小:
① 查詢計算機科學系全體學生的名單:
SELECT Sname
FROM Student
WHERE Sdept = 'CS';
② 查詢所有年齡在20歲以下的學生姓名及其年齡:
SELECT Sname, Sage
FROM Student
WHERE Sage < 20;
③ 查詢考試成績有不及格的學生的學号:
SELECT DISTINCT Sn
FROM SC
WHERE Grade < 60;
🌟确定範圍:
謂詞:
BETWEEN … AND …
NOT BETWEEN … AND …
① 查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系别和年齡:
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
② 查詢年齡不在20~23歲之間的學生姓名、系别和年齡:
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(值得注意的是:這裡是包括邊界的,即
WHERE Sage BETWEEN 20 AND 23;
包含20歲和30歲)
🌟确定集合:
謂詞:
IN <值表>
NOT IN <值表>
① 查詢計算機科學系(CS)、數學系(MA)和資訊系(IS)學生的姓名和性别:(我列印粗來了所有的學生資訊作為參考)
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS' );
SELECT *
FROM Student
② 查詢既不是計算機科學系、數學系,也不是資訊系的學生的姓名和性别:
SELECT Sname, Ssex
FROM Student
WHERE Sdept NOT IN ('IS','MA','CS' );
SELECT *
FROM Student
🌟字元比對: (模糊查詢)
謂詞:
[NOT] LIKE '<比對串>'
[ESCAPE '<換碼字元>']
<比對串>可以是一個完整的字元串,也可以含有通配符 % 和 _
%(百分号) 代表任意長度(長度可以為0)的字元串
(例如:a%b 表示 以a開頭,以b結尾的任意長度的字元串)
_ (下劃線) 代表任意的單個字元
(例如:a_b 表示 以a開頭,以b結尾的長度為3的任意字元串)
① 比對串為固定字元串
例:查詢學号為201215121的學生的詳細情況:
SELECT *
FROM Student
WHERE Sno LIKE '201215121';
等價于:
SELECT *
FROM Student
WHERE Sno = '201215121';
(ps:因為這裡Student表中學号是唯一的,沒有其他的情況,是以
LIKE
就相當于
'='
了,但是在SC表中學号并不是唯一的是以兩者就不相等,是以是否唯一(兩者是否等價)是相對的,得看作用的是哪個表)
② 比對串為含通配符的字元串
例:查詢所有姓夏學生的姓名、學号和性别:
(我把所有學生也列印出來了友善對比)
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '夏%';
SELECT Sname, Sno, Ssex
FROM Student
例:查詢姓"歐陽 "長度為三個字元的學生的姓名和長度為四個字元的學生的姓名:
SELECT Sname
FROM Student
WHERE Sname LIKE '歐陽_';
SELECT Sname
FROM Student
WHERE Sname LIKE '歐陽__'; /* 這裡是兩個'_',這樣子看它們連在一起了*/
咦?為啥 “歐陽” 和 “歐陽帥” 在它 “不該出現的地方” 也列印粗來了呢?
👀是以說在SQL Server中,當通配符
_
放在最後的時候,它列印出來是一個範圍的,并不是有幾個
_
就列印幾個字元,例如這裡歐陽後面跟着兩個
_
的時候,列印出來的是歐陽、歐陽*、歐陽**(2~4個字元)
此處注意:
資料庫字元集為 ASCII 時,一個漢字需要兩個_
資料庫字元集為 GBK 時,一個漢字需要一個_
再來一例:查詢名字中第2個字為"陽 "字的學生的姓名和學号
SELECT Sname, Sno
FROM Student
WHERE Sname LIKE '_陽%';
例:查詢所有不姓夏的學生姓名、學号和性别:(我列印粗來了全部的學生以作對比)
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE '夏%';
SELECT Sname, Sno, Ssex
FROM Student
③ 使用換碼字元将通配符轉義為普通字元
诶,那有的小夥伴就會問:🙋既然
_
和
/
這兩個字元是通配符,那如果表名中含有這兩個字元怎麼辦嘞?
嘿嘿,當然是考慮到了這種情況啦,解決辦法就是使用換碼字元,通過
ESCAPE '\ '
的方式來将
\
設定為換碼字元
例:查詢DB_Design課程的課程号和學分:(我這裡列印出來了所有的課程作為對照)
SELECT Cno, Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\' ;
SELECT *
FROM Course
👀可見,将
\
設定為換碼字元後成功地把
_
轉義為一個普通的字元,而且轉碼字元是不包括在表名内的,但是如果不加
ESCAPE '\'
的話,結果就是下面這樣啦:
\
作為一個普通的字元包含在表名中,而此時的
_
作為一個通配符,代表了任意的單個字元
再來一個例子:查詢以"DB_"開頭,且倒數第3個字元為 i的課程的詳細情況:
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE '\' ; /*注意此處是兩個_*/
怎麼樣,有了之前查詢
'歐陽__'
的經驗,這次通配符
_
放在比對串末尾查詢出的結果應該是你的意料之中了吧~
嘻嘻🌞,這次的總結分享就告一段落啦,因為查詢這一塊的内容有些多,單表查詢剩餘部分将在下一期總結~ 感謝閱讀~😊
咱們下期 見~
- 下一篇:SQL Server 資料庫基本操作入門篇【4】
- 安利一下:【吐血整理】資料庫重點知識總結【2】