數據庫系統概論——第三章 關係數據庫標準語言SQL(二)
一、 索引的建立與刪除
-
建立索引的目的:加快查詢速度
-
關係數據庫管理系統中常見索引:
(1)順序文件上的索引
(2)b+樹索引
(3)散列索引
(4)位圖索引 -
特點:
(1) b+樹索引具有動態平衡的優點
(2)hash索引具有查找速度快的優點 -
誰可以建立索引
(1)數據庫管理員DBA
(2)表的屬主(建表的人) -
誰來維護索引
關係數據庫管理系統自動完成 -
使用索引
DBMS自動選擇合適的索引作爲存取路徑,用戶不必也不能顯示的選擇索引。 -
建立索引
unique:此索引的一個索引值只對應唯一的數據記錄。
cluster:表示要建立的索引是聚簇索引
(1)創建三個表
(2)爲學生課程數據庫中的student,course,sc表建立索引。student表按學號升序建唯一索引,course表按課程號升序建唯一索引,sc表按學號升序和課程降序建唯一索引。
(3)修改索引名
alter table 表名 rename index 舊名字 to 新名字
(4)刪除索引名
二、數據字典
數據字典是關係DBMS內部的一組系統表,它記錄了數據庫中所有定義信息:
(1)關係模式定義
(2)視圖定義
(3)完整性約束定義
(4)各類用戶對數據庫的操作權限
(5)統計信息等
關係DBMS在執行sql的數據定義語句信息時,實際上就是在更新數據字典表中的相應信息。
三、數據查詢
(1)select子句:指定要顯示的屬性列
(2)from子句:指定查詢對象(基本表或視圖)
(3)where子句:指定查詢條件
(4)group by子句:對查詢結果按指定列的值分組,
該屬性列值相等的元祖爲一個組。通常會在每組中作用聚集函數。
(5)having短語:只有滿足指定條件的組才予以輸出
(6)order by子句:對查詢結果表按指定列值的升序或降序排序。
選擇表中的若干列
-
查詢指定列
-
查詢全部列
-
查詢經過計算的值
select子句的<目標列表達式>不僅可以爲表中的屬性列,也可以是表達式
-
使用列別名改變查詢結果的列標題
選擇表中的若干元組
- 消除取消重複的列
all 和 distinct ,默認爲all
- 查詢滿足條件的元組
(1)比較大小
eg:查找計算機科學學院全體學生名單
eg:查詢所有年齡在20歲以下的學生姓名及其年齡
eg:查詢考試成績有不及格的學生的學號
(2)確定範圍
between and
not between and
eg:查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡
eg:查詢年齡不在20-30歲之間的學生姓名、系別和年齡
(3)確定集合
in<值表>
not in <值表>
eg:查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名和性別。
(4)字符匹配
謂詞:【not 】like ‘<匹配串>’【escape‘<換碼字符>’】
匹配串:可以是一個 完整的字符串,也可以含有通配符%和_
%:代表任意長度(長度可以爲0)的字符串
_:代表任意單個字符
eg:查詢學號爲201215121的學生的詳細情況。
eg:查詢所有姓劉學生的姓名、學號和性別。
eg:查詢以"DB_"開頭,且倒數第3個字符爲 i的課程的詳細情況。
ESCAPE ‘\’ 表示“ \” 爲換碼字符
(5)涉及空值的查詢
is null
is not null
eg: 某些學生選修課程後沒有參加考試,所以有選課記錄,但沒 有考試成績。查詢缺少成績的學生的學號和相應的課程號。
(6)多重條件查詢
AND的優先級高於OR
可以用括號改變優先級
eg:查詢計算機系年齡在20歲以下的學生姓名。
- order by 子句
ORDER BY子句
可以按一個或多個屬性列排序
升序:ASC;降序:DESC;缺省值爲升序
默認爲升序
對於空值,排序時顯示的次序由具體系統實現來決定
eg:查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列。
eg:查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
- 聚集函數
統計元組的個數:count(*)
統計一列中值的個數:count(【distinct|all】<列名>)
計算一列值的總和(此列必須爲數值型):SUM([DISTINCT|ALL] <列名>)
計算一列值的平均值(此列必須爲數值型):
AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值:
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
eg:查詢學生201215012選修課程的總學分數。
- group by 子句
細化聚合函數作用的對象
如果爲對查詢結果分組,聚合函數將作用於真個查詢結果
對查詢結果分組後,聚合函數將分別作用在每個組
按指定的一列或多列值分組,值相等的爲一組
eg:求各個課程號及相應的選課人數。
eg:查詢選修了3門以上課程的學生學號。
eg:查詢平均成績大於等於90分的學生學號和平均成績
having 短語與where子句的區別
作用對象不同
where子句作用於基表或視圖,從中選擇滿足條件的元組
having短語作用於組,從中選擇滿足條件的組