題目有點兒亂,先來總結吧:
- 關於索引的:
- 在修改索引時候遇到了錯誤:將alter index <舊索引名> rename to <新索引名>改爲:exec sp_rename ‘表名.舊索引名’ , ‘新索引名’ , ‘index’ 就好。
- 在刪除索引時候沒有指定 表名 而出錯。正確寫法:drop index 索引名 on 表名;
- 經常多次進行數據上的操作的表,個人建議不要建立太多的索引;
- 但是在經常進行搜索查詢的列上創建索引的話,可以加快搜索的速度;
- 索引會有特定的排列順序,所以可以在經常進行 一段範圍上的數據搜索 的列上建立索引;
- 因爲索引會進行排序,所以對於有大量重複數據的列上最好還是不用建立索引,因爲這樣並不會太大程度上提高搜索速度。
- 可以一些經常用於連接的列上創建索引,這樣可以加快連接的速度;
- 關於插入的一些注意事項:
- 如果插入的時候,只給出表明而不給出屬性名,那麼要加入的 values 中的值要和屬性列的數據存儲類型一一對應;如果給出了屬性名,那就要和用戶給定的屬性名一一對應。
- 對於給定表名,也給定部分屬性名,表中沒有被給出的屬性的值自動賦空值;
- 對於給定表名,不給定屬性名,values中必須給定和表中對應相等數目的值,因爲表中的未給出值的部分不會自動賦空值,否則會報錯。
- 關於查詢:
- 單表查詢列時候,可以按照任意順序查詢。
- select(查詢)子句的目標表達式可以不僅可以是表中的屬性列,也可以是一個算數表達式、字符串常量、函數等。
- 用戶可以根據意願改變輸出結果的列表的 列的標題 (見例3.20附近)
- 查詢時where子句的 判等 方式和各種語言判等方式不太相同 ,用一個等號 ‘=’ 即可;
- 最後,查詢時可以視情況建立索引,可能很大程度上加快進度。
[例3.13] 爲學生-課程數據庫中的Student. Course和SC三個表建立索引。其中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);
在SQL語言中,建立索引使用CREATE INDEX語句,其一般格式爲
:
CREATE [UNIQUE] [CLUSTER] INDEX<索引名>
ON<表名>(<列名>[<次序>][ <列名〉[<次序>]]…);
其中,<表名>是要建索引的基本表的名字。索引可以建立在該表的一列或多列上,各列名
之間用逗號分隔。每個<列名>後面還可以用<次序>指定索引值的排列次序,可選ASC (升
序)或DESC (降序),默認值爲ASC。
UNIQUE表明此索引的每一個索引值只對應唯一的數據記錄。
CLUSTER表示要建立的索引是聚簇索引。
[例3.14] 將SC表的Scno索引名改爲Scsno。
對於已經建立的索引,如果需要對其重新命名,可以使用ALTER INDEX語句。其一般格式爲
ALTER INDEX <舊索引名> RENAME TO <新索引名>;
發現修改時不可用:
正確運行結果如下:
提示內容:更改對象名的任意部分都可能會破壞腳本和存儲過程。
成功:
--失敗的修改:
--alter index Scno rename to Scsno;
--成功的修改:
EXEC sp_rename 'SC.Scno', 'Scsno', 'index'
[例3.15 ] 刪除Student表的Stusname索引。
刪除索引時,系統會同時從數據字典中刪去有關該索引的描述。索引一經建立就由系統使用和維護,不需用戶干預。建立索引是爲了減少査詢操作的時間,但如果數據增、刪、改頻繁,系統會花費許多時間來維護索引,從而降低了査詢效率。這時可以刪除一些不必要的索引。
在SQL中,刪除索引使用DROP INDEX語句,其一般格式爲
DROP INDEX <索引名>;
結果爲:
代碼如下:
--drop index Stusno; //失敗代碼
drop index Stusno on Student; //成功代碼
[例3.69] 將一個新學生元組(學號:201215128,姓名:陳冬,性別:男,所在系:IS,年齡:18歲)插入到Student表中。
在INTO子句中指出了表名Student,並指岀了新增加的元組在哪些屬性上要賦值,屬性的順序可以與CREATE TABLE中的順序不一樣。VALUES子句對新元組的各屬性賦值,字符串常數要用單引號(英文符號)括起來。
代碼如下:
insert
into Student(Sno , Sname , Ssex , Sdept , Sage)
values('201215128' , '陳冬' , '男' , 'IS' , 18);
[例3.70] 將學生張成民的信息插入到Student表中。
insert
into Student
values('201215126' , '張成民' , '男' , 18 , 'CS');
在INTO子句中只指出了表名,沒有指出屬性名。這表示新元組要在表的所有屬性列上都指定值,屬性列的次序與CREATE TABLE中的次序相同。VALUES子句對新元組的各屬性列賦值,一定要注意值與屬性列要一 一對應,如果像例3.69那樣,會因爲數據類型不匹配出錯。
[例3.71] 插入一條選課記錄(‘201215128’ , ‘1’)
首先我們來看錶的結構:
運行以下代碼:
發現關係數據庫管理系統將在新插入記錄的Grade列上自動地賦空值:
指定對應 表的屬性名 代碼如下:
insert
into SC(Sno , Cno)
values('201215128','1');
如果不指定對應屬性名,代碼如下:
insert
into SC
values('201215128','1' , NULL);
[例3.16]査詢全體學生的學號與姓名。
select Sno,Sname from Student;
該語句的執行過程可以是這樣的:從Student表中取出一個元組,取出該元組在屬性
Sno和Sname上的值,形成一個新的元組作爲輸出。對Student表中的所有元組做相同的處理,最後形成一個結果關係作爲輸出。
運行結果如下:
[例3.17] 査詢全體學生的姓名、學號、所在系。
查詢部分列(可以任意順序查詢):
select Sname,Sno,Sdept from Student;
查詢全部列:
select * from Student;
結果如下:
[例3.18] 査詢全體學生的詳細記錄.
[例3.19] 査詢全體學生的姓名及其出生年份。
査詢結果中第2列不是列名而是一個計算表達式,是用當時的年份(假設爲2014年)減去學生的年齡。這樣所得的即是學生的出生年份。輸出的結果爲:
代碼爲:
select Sname,2014-Sage from Student;
[例3.20] 査詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名。
結果爲:
代碼爲:
select Sname,'Year of Birth:',2014-Sage,lower(Sdept) from Student;
用戶可以通過指定別名來改變査詢結果的列標題,這對於含算術表達式、常量、函數
名的目標列表達式尤爲有用,例如對於例3.20可以定義如下列別名 :
代碼如下:
select Sname name,'Year of Birth:' birth , 2014-Sage birthday,lower(Sdept) from Student department;
[例3.21] 査詢選修了課程的學生學號。
代碼如下:
select Sno From SC;
--等價於下面這句:
--select all Sno From SC;
如果要去除表中的重複的行:
select distinct Sno From SC;
[例3.22] 査詢計算機科學系全體學生的名單。
select Sname from Student where Sdept='CS';
[例3.23] 査詢所有年齡在20歲以下的學生姓名及其年齡。
代碼如下:
select Sname,Sage from Student where Sage < 20;
[例3.24] 査詢考試成績不及格的學生的學號.
結果如下(無人):
代碼如下:
select distinct Sno from SC where Grade < 60;
[例3.25] 査詢年齡在20〜23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡。
結果如下:
代碼如下:
select Sname,Sdept,Sage from Student where Sage between 20 and 23;
[例3.26] 查詢年齡不在20〜23歲之間的學生姓名、系別和年齡。
結果如下:
代碼如下:
select Sname,Sdept,Sage from Student where Sage not between 20 and 23;
[例3.27] 査詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名和性別。
結果如下:
代碼如下:
select Sname,Ssex from Student where Sdept in('CS' , 'MA' , 'IS');
[例3.28] 査詢既不是計算機科學系、數學系,也不是信息系的學生的姓名和性別。
結果如下:
代碼如下:
select Sname,Ssex from Student where Sdept not in('CS' , 'MA' , 'IS');