天天看點

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

本文主要介紹 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表為例,能看到剛剛的按課程号升序的唯一索引建立成功了

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

— — — — — — — — — — — — — — — — — — — — — — — — — —

2. 修改索引

語句格式如下:

🌟舉例:

将SC表的SCno索引名改為SCSno:

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

這句标準SQL語句在SQL Server執行是錯誤的,不能這麼寫,應寫成如下格式:

EXEC sp_rename @objname = '表名.舊索引名', @newname = '新索引名', @objtype = 'index'
           

建議簡寫成這個亞子:

注意這裡EXEC調用存儲過程時會出現提示:

注意: 更改對象名的任一部分都可能會破壞腳本和存儲過程。

不過别着急,這隻是一個溫馨提示,指令已經成功執行了,更改索引名成功!

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

當然也可采取先删除索引再建立的方法,不過無論采用哪種方法都需注意

表名.舊索引名

— — — — — — — — — — — — — — — — — — — — — — — — — —

3. 删除索引

語句格式如下:

删除索引時,系統會從資料字典中删去有關該索引的描述

🌟舉例:

删除Student表的Stusno索引:

然而在SQL Server中執行該語句後會報錯:

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

應更改為

<表名>.<索引名>

,格式如下:

删除成功!

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

插入資料

兩種插入資料方式

  • 插入元組
  • 插入子查詢結果(可以一次插入多個元組 )

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; 
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

② 查詢全體學生的姓名、學号、所在系:

SELECT Sname,Sno,Sdept
FROM Student;
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

· 查詢全部列:

選出所有屬性列(兩種辦法):

  • 在SELECT關鍵字後面列出所有列名
  • 将 <目标清單達式> 指定為 *

🌟舉例:

查詢全體學生的詳細記錄:

SELECT  Sno,Sname,Ssex,Sage,Sdept 
FROM Student; 
           

OR

SELECT  *
FROM Student; 
           

如下圖:

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

· 查詢經過計算的值 :

SELECT子句的<目标清單達式>不僅可以為表中的屬性列,也可以是表達式

🌟舉例:

查詢全體學生的姓名及其出生年份:

SELECT Sname,2020-Sage
FROM Student;
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名:

SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept)
FROM Student;
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

使用列别名改變查詢結果的列标題(中間用空格隔開):

SELECT Sname NAME,'Year of Birth:'  BIRTH,2014-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
FROM Student;
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

— — — — — — — — — — — — — — — — — — — — — — — — — —

2. 選擇表中的若幹元組

· 消除取值重複的行 :

① 如果沒有指定DISTINCT關鍵詞,即預設,預設為ALL

🌟舉例:

查詢選修了課程的學生學号:

等價于:

執行上面的SELECT語句後,結果為:

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

② 指定DISTINCT關鍵詞,則去掉表中的重複行

SELECT DISTINCT Sno
FROM SC; 
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

· 查詢滿足條件的元組 :

常用的查詢條件有:

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

🌟比較大小:

① 查詢計算機科學系全體學生的名單:

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
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

② 查詢既不是計算機科學系、數學系,也不是資訊系的學生的姓名和性别:

SELECT Sname, Ssex
FROM   Student
WHERE  Sdept NOT IN ('IS','MA','CS' );

SELECT *
FROM   Student
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

🌟字元比對: (模糊查詢)

謂詞:

[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
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

例:查詢姓"歐陽 "長度為三個字元的學生的姓名和長度為四個字元的學生的姓名:

SELECT Sname
FROM   Student
WHERE  Sname LIKE '歐陽_';
SELECT Sname
FROM   Student
WHERE  Sname LIKE '歐陽__'; /* 這裡是兩個'_',這樣子看它們連在一起了*/
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

咦?為啥 “歐陽” 和 “歐陽帥” 在它 “不該出現的地方” 也列印粗來了呢?

👀是以說在SQL Server中,當通配符

_

放在最後的時候,它列印出來是一個範圍的,并不是有幾個

_

就列印幾個字元,例如這裡歐陽後面跟着兩個

_

的時候,列印出來的是歐陽、歐陽*、歐陽**(2~4個字元)

此處注意:

資料庫字元集為 ASCII 時,一個漢字需要兩個_

資料庫字元集為 GBK 時,一個漢字需要一個_

再來一例:查詢名字中第2個字為"陽 "字的學生的姓名和學号

SELECT Sname, Sno
FROM   Student
WHERE  Sname LIKE '_陽%';
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

例:查詢所有不姓夏的學生姓名、學号和性别:(我列印粗來了全部的學生以作對比)

SELECT Sname, Sno, Ssex
FROM   Student
WHERE  Sname NOT LIKE '夏%';

SELECT Sname, Sno, Ssex
FROM   Student
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

③ 使用換碼字元将通配符轉義為普通字元

诶,那有的小夥伴就會問:🙋既然

_

/

這兩個字元是通配符,那如果表名中含有這兩個字元怎麼辦嘞?

嘿嘿,當然是考慮到了這種情況啦,解決辦法就是使用換碼字元,通過

ESCAPE '\ '

的方式來将

\

設定為換碼字元

例:查詢DB_Design課程的課程号和學分:(我這裡列印出來了所有的課程作為對照)

SELECT Cno, Ccredit
FROM   Course
WHERE  Cname LIKE 'DB\_Design' ESCAPE '\' ;

SELECT *
FROM   Course
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

👀可見,将

\

設定為換碼字元後成功地把

_

轉義為一個普通的字元,而且轉碼字元是不包括在表名内的,但是如果不加

ESCAPE '\'

的話,結果就是下面這樣啦:

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

\

作為一個普通的字元包含在表名中,而此時的

_

作為一個通配符,代表了任意的單個字元

再來一個例子:查詢以"DB_"開頭,且倒數第3個字元為 i的課程的詳細情況:

SELECT *
FROM   Course
WHERE  Cname LIKE  'DB\_%i__' ESCAPE '\' ; /*注意此處是兩個_*/
           
SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢

怎麼樣,有了之前查詢

'歐陽__'

的經驗,這次通配符

_

放在比對串末尾查詢出的結果應該是你的意料之中了吧~

嘻嘻🌞,這次的總結分享就告一段落啦,因為查詢這一塊的内容有些多,單表查詢剩餘部分将在下一期總結~ 感謝閱讀~😊

咱們下期 見~

SQL Server 資料庫基本操作入門篇【3】索引的建立與删除插入資料資料查詢資料查詢之 單表查詢
  • 下一篇:SQL Server 資料庫基本操作入門篇【4】
  • 安利一下:【吐血整理】資料庫重點知識總結【2】