一.數據查詢
語句格式
SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>] …
FROM <表名或視圖名>[,<表名或視圖名> ]…|(SELECT 語句)
[AS]<別名>
[ WHERE <條件表達式> ]
[ GROUP BY <列名1> [ HAVING <條件表達式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
其中:
SELECT子句:指定要顯示的屬性列
FROM子句:指定查詢對象(基本表或視圖)
WHERE子句:指定查詢條件
GROUP BY子句:對查詢結果按指定列的值分組,該屬性列值相等的元組爲一個組。通常會在每組中作用聚集函數。
HAVING短語:只有滿足指定條件的組才予以輸出
ORDER BY子句:對查詢結果表按指定列值的升序或降序排序
(1)單表查詢
1.選擇表中的若干列
查詢指定列
/*查詢全體學生的學號與姓名*/
SELECT Sno,Sname
FROM Student;
查詢全部列(選出所有屬性列):
在SELECT關鍵字後面列出所有列名
將<目標列表達式>指定爲 *。
/*查詢全體學生的詳細記錄*/
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
查詢經過計算的值 :
SELECT子句的<目標列表達式>不僅可以爲表中的屬性列,也可以是表達式
/*查全體學生的姓名及其出生年份*/
SELECT Sname,2020-Sage /*假設當時爲2020年*/
FROM Student;
使用列別名改變查詢結果的列標題
SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
2.選擇表中的若干元組
消除取值重複的行(如果沒有指定DISTINCT關鍵詞,則缺省爲ALL )
/*查詢選修了課程的學生學號*/
SELECT Sno FROM SC;
等價於:
SELECT ALL Sno FROM SC;
指定DISTINCT關鍵詞後,查詢結果會自動消除取值重複的行
SELECT DISTINCT Sno
FROM SC;
查詢滿足條件的元組
常用的查詢條件
① 比較大小
/*查詢所有年齡在20歲以下的學生姓名及其年齡*/
SELECT Sname,Sage
FROM Student
WHERE Sage < 20;
② 確定範圍
/*查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡*/
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
③ 確定集合
/*查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名和性別*/
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS','MA’,'IS' );
④ 字符匹配
謂詞: [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 ';
查詢所有姓劉學生的姓名、學號和性別。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '劉%';
查詢姓"歐陽"且全名爲三個漢字的學生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '歐陽__';
使用換碼字符將通配符轉義爲普通字符
例:查詢DB_Design課程的課程號和學分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
⑤ 涉及空值的查詢
/*查所有有成績的學生學號和課程號*/
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
⑥多重條件查詢
邏輯運算符:AND和 OR來連接多個查詢條件
AND的優先級高於OR,但可以用括號改變優先級
/*查詢計算機系年齡在20歲以下的學生姓名*/
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20;
3.ORDER BY子句
可以按一個或多個屬性列排序
升序:ASC;降序:DESC; 缺省值(即默認)爲升序
/*查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列*/
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
4.聚集函數
統計元組個數:COUNT(*)
統計一列中值的個數:COUNT([DISTINCT|ALL] <列名>)
計算一列值的總和(此列必須爲數值型):SUM([DISTINCT|ALL] <列名>)
計算一列值的平均值(此列必須爲數值型):AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值:MAX([DISTINCT|ALL] <列名>) MIN([DISTINCT|ALL] <列名>)
例:
/*計算1號課程的學生平均成績*/
SELECT AVG(Grade)
FROM SC
WHERE Cno= ' 1 ';
5.GROUP BY子句
GROUP BY子句分組:
細化聚集函數的作用對象
如果未對查詢結果分組,聚集函數將作用於整個查詢結果
對查詢結果分組後,聚集函數將分別作用於每個組
按指定的一列或多列值分組,值相等的爲一組
/*查詢選修了3門以上課程的學生學號*/
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3; //組內求和大於3
注:WHERE子句中是不能用聚集函數作爲條件表達式
HAVING短語與WHERE子句的區別:
作用對象不同
WHERE子句作用於整個基表或視圖,從中選擇滿足條件的元組
HAVING短語作用於組,從中選擇滿足條件的組。
二.視圖
視圖,它是虛表,是從一個或幾個基本表(或視圖)導出的表,只存放視圖的定義,不存放視圖對應的數據,基表中的數據發生變化,從視圖中查詢出的數據也隨之改變。
(1)定義視圖
1.建立視圖
語句格式
CREATE VIEW <視圖名> [(<列名> [,<列名>]…)]
AS <子查詢>
[WITH CHECK OPTION];
WITH CHECK OPTION子句:對視圖進行UPDATE,INSERT和DELETE操作時要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)
注:關係數據庫管理系統執行CREATE VIEW語句時只是把視圖定義存入數據字典,並不執行其中的SELECT語句。
/* 定義視圖*/
create view test
as
select sno ,name,course
from sd
/*建立信息系學生的視圖,並要求進行修改和插入操作時仍需保證該視圖只有信息系的學生*/
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
定義IS_Student視圖時加上了WITH CHECK OPTION子句,對該視圖進行插入、修改和刪除操作時,RDBMS會自動加上Sdept='IS’的條件。
若一個視圖是從單個基本表導出的,並且只是去掉了基本表的某些行和某些列,但保留了主碼,我們稱這類視圖爲行列子集視圖。
我們也可以建立基於視圖的視圖
create view mytest
as
select sno, name
from test; //test本身爲視圖
帶表達式的視圖
/*定義一個反映學生出生年份的視圖*/
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2014-Sage
FROM Student;
分組視圖
/*將學生的學號及平均成績定義爲一個視圖*/
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
2.刪除視圖
語句的格式:DROP VIEW <視圖名>[CASCADE];
該語句從數據字典中刪除指定的視圖定義
/* 刪除視圖 */
drop view mytest; //刪除視圖名爲mytest的視圖
(2)查詢視圖
從用戶的角度:查詢視圖與查詢基本表相同。
例:查詢視圖test和表課程中符合條件的元組。
/* 查詢視圖*/
select sno,course,課程號
from test,課程
where sno='020101' and course=課程名;
關係數據庫管理系統實現視圖查詢的方法
視圖消解法(View Resolution):
1.進行有效性檢查
2.轉換成等價的對基本表的查詢
3.執行修正後的查詢
例:在信息系學生的視圖中找出年齡小於20歲的學生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
// 視圖消解轉換後的查詢語句爲:
SELECT Sno,Sage
FROM Student
WHERE Sdept= 'IS' AND Sage<20;
視圖消解法的侷限
對於非行列子集視圖,視圖消解法不能生成正確的查詢。
(3)更新視圖
其他更新視圖的語句跟更新表相同,不一一解釋了
例:將信息系學生視圖IS_Student中學號”201215122”的學生姓名改爲”劉辰”。
UPDATE IS_Student
SET Sname= '劉辰'
WHERE Sno= ' 201215122 ';
DB2對視圖更新的限制:
若視圖是由兩個以上基本表導出的,則此視圖不允許更新。
若視圖的字段來自字段表達式或常數,則不允許對此視圖執行INSERT和UPDATE操作,但允許執行DELETE操作。
若視圖的字段來自聚集函數,則此視圖不允許更新。
若視圖定義中含有GROUP BY子句,則此視圖不允許更新。
若視圖定義中含有DISTINCT短語,則此視圖不允許更新。
一個不允許更新的視圖上定義的視圖也不允許更新。
若視圖定義中有嵌套查詢,並且內層查詢的FROM子句中涉及的表也是導出該視圖的基本表,則此視圖不允許更新。
(4)視圖的作用
1.視圖能夠簡化用戶的操作
2.視圖使用戶能以多種角度看待同一數據
3.視圖對重構數據庫提供了一定程度的邏輯獨立性
4.視圖能夠對機密數據提供安全保護
5.適當的利用視圖可以更清晰的表達查詢