數據庫作業5:索引(index)、插入(insert)、查詢(select) 例題 及 注意事項

這裏寫了課本上的數據庫關於索引、插入、查詢的例子,和自己的一些體會:o(* ̄▽ ̄*)ブ

題目有點兒亂,先來總結吧:
  • 關於索引的:
  1. 在修改索引時候遇到了錯誤:將alter index <舊索引名> rename to <新索引名>改爲:exec sp_rename ‘表名.舊索引名’ , ‘新索引名’ , ‘index’ 就好。
  2. 在刪除索引時候沒有指定 表名 而出錯。正確寫法:drop index 索引名 on 表名;
  3. 經常多次進行數據上的操作的表,個人建議不要建立太多的索引;
  4. 但是在經常進行搜索查詢的列上創建索引的話,可以加快搜索的速度;
  5. 索引會有特定的排列順序,所以可以在經常進行 一段範圍上的數據搜索 的列上建立索引;
  6. 因爲索引會進行排序,所以對於有大量重複數據的列上最好還是不用建立索引,因爲這樣並不會太大程度上提高搜索速度。
  7. 可以一些經常用於連接的列上創建索引,這樣可以加快連接的速度;
  • 關於插入的一些注意事項:
  1. 如果插入的時候,只給出表明而不給出屬性名,那麼要加入的 values 中的值要和屬性列的數據存儲類型一一對應;如果給出了屬性名,那就要和用戶給定的屬性名一一對應。
  2. 對於給定表名,也給定部分屬性名,表中沒有被給出的屬性的值自動賦空值;
  3. 對於給定表名,不給定屬性名,values中必須給定和表中對應相等數目的值,因爲表中的未給出值的部分不會自動賦空值,否則會報錯。
  • 關於查詢:
  1. 單表查詢列時候,可以按照任意順序查詢。
  2. select(查詢)子句的目標表達式可以不僅可以是表中的屬性列,也可以是一個算數表達式、字符串常量、函數等。
  3. 用戶可以根據意願改變輸出結果的列表的 列的標題 (見例3.20附近)
  4. 查詢時where子句的 判等 方式和各種語言判等方式不太相同 ,用一個等號 ‘=’ 即可;
  5. 最後,查詢時可以視情況建立索引,可能很大程度上加快進度。

[例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');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章