SQL中數據查詢及視圖

一.數據查詢
語句格式
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 LIKE201215121';

等價於:
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.適當的利用視圖可以更清晰的表達查詢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章