數據庫 關係數據庫標準語言

數據庫 關係數據庫標準語言

一、SQL概貌及特點

1.1 SQL簡介

  • 定義:結構化查詢語言SQL(Structured Query Language)是一種介於 關係代數與 關係演算之間的語言,其功能包括查詢、操縱、定義和控制四個方面,是一個通用的、功能極強的關係數據庫語言。目前已成爲關係數據庫的標準語言。

1.2 SQL特點

  1. 綜合統一
  2. 高度非過程化
  3. 面向集合的操作方式
  4. 以同一種語法結構提供兩種使用方式
  5. 語言簡潔,易學易用

1.3 SQL的基本概念

二、數據定義

2.1 基本表的定義、刪除與修改

  1. 定義基本表

    CREATE TABLE <表名>(
    	<列名><數據類型>[列級完整性約束條件] 
    	[,<列名><數據類型>[列級完整性約束條件]]
    	... 
    	[,<表級完整性約束條件>] 
    );
    
  2. 修改基本表

    ALTER TABLE <表名>
    [ADD <新列名><數據類型>[完整性約束]]
    [DROP<完整性約束名>]
    [MODIFY<列名> <數據類型><數據類型>]; 
    
  3. 刪除基本表

    DROP TABLE<表名> 
    

2.2 索引的建立與刪除

  1. 建立索引

    CREATE [UNIQUE][CLUSTER] INDEX <索引名> 
    ON <表名> (
    	<列名>[<次序>]
        [,<列名>[<次序>]]
        ...
    ); 
    
  2. 修改索引

    ALTER INDEX <舊索引名> RENAME TO <新索引名>
    
  3. 刪除索引

    DROP INDEX<索引名>;
    

三 數據查詢

3.1 單表查詢

  1. 選擇表中的若干列
    (1)查詢指定列
    【例】:查詢全體學生的學號和姓名

    SELECT SNO,SNAME FROM STUDENT;
    

    (2)查詢全部列
    【例】:查詢全體學生的詳細信息

    SELECT * FROM STUDENT;  
    

    (3)查詢經過計算的值,即目標列也可以是表達式

    【例】:查詢全體學生的姓名以及出生年月

    SELECT SANME,2014-SAGE FROM STUDENT;
    

    注意:2014-SAGE BIRTHDAY 指定別名;

  2. 選擇表中的若干元組
    (1)消除取值重複的行,使用DISTINCTDISTINCT實現,沒有指定,則默認爲ALLALL
    【例】:查詢選修了課程的學生學號

    SELECT DISTINCT SNO FROM SC
    

    (2)查詢滿足條件的元組,使用WHEREWHERE子句實現;

    條件 謂詞
    比較 =,>,>=,<=,!=,<>,!>,!<,NOT...=,>,>=,<=,!=,<>,!>,!<,NOT...
    確定範圍 BETWEEN AND, NOT BETWEEN AND
    確定集合 IN, NOT IN
    字符匹配 LIKE, NOT LIKE
    空值 IS NULL, IS NOT NULL
    多重條件 AND, OR

    ①比較大小
    【例】:查詢計算機全體學生的名單;

    SELECT SANME FROM STUDENT WHERE SDEPT='CS';
    

    【例】:查詢考試不及格的學生學號;

    SELECT DISTINCT SNO FROM SC WHEREGRADE<60
    

    ②確定範圍
    【例】:查詢年齡在20~23歲(包括20和23歲)的學生姓名,系名和年齡;

    SELECT SNAME,SDEPT,SAGE FROM STUDENT WHERE SAGE BETWEEN 20 AND 23;
    

    ③確定集合
    【例】:查詢計算機系、數學系、信息系學生的姓名;

    SELECT SNAME FROM STUDENT WHERE SDEPT IN('CS','MA','IS');
    

    ④字符匹配:謂詞LIKELIKE可以用來進行字符匹配

    [NOT] LIKE '<匹配串>' [ESCAPE '<換碼字符>']
    
    通配符 功能
    _ 匹配任意一個字符
    % 匹配0個或多個字符
    [ ] 匹配[ ]中的任意一個字符
    [ ^ ] 不匹配[ ]中的任意一個字符

    【例】:查詢所有姓劉的學生的姓名、學號和性別;

    SELECT SNAME,SNO,SEX FROM STUDENT WHERE SNAME LIKE '劉%';
    

    ⑤涉及空串的查詢
    【例】:查詢缺少成績的學生的學號和相應的課程號

    SELECT SNO,CNO FROM SC WHERE GRADE IS NULL;
    

    ⑥多重條件查詢:AND的優先級高於OR,但用戶可以用括號改變優先級;
    【例】:查詢計算機系年齡在20歲以下的學生姓名;

    SELEC SNAME FROM STUDENT WHERE SDEPT = 'CS' AND SNAME<20;
    
  3. ORDER BY字:用戶可以對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,默認爲升序;
    【例】:查詢全體學生,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列;

    SELECT * FROM STUDENT ORDER BY SDEPT,SAGE DESC;
    
  4. 聚集函數

    功能
    count() 統計元組個數
    sum() 計算數據和
    max() 計算最大值
    min() 計算最小值
    avg() 計算平均值

    【例】:查詢選修了課程的學生人數;

    SELECT COUNT(DISTINCT SNO) FROM SC;
    
  5. GROUP BY字句:將查詢結果按某一列或多列的值分組,值相等爲一組;
    【例】:求各個課程號及相應的選課人數;

    SELECT CNO,COUNT(SNO) FROM SC GROUP BY CNO;
    

    【例】:查詢選修了三門以上選修課的學生學號;

    SELECT SNO FROM SC GROUP BY SNO HAVING COUNT(*)>=3;
    

    【例】:查詢平均成績大於等於90分的學生學號和平均成績;

    SELECT SNO,AVG(GRADE) FROM SC GROUP BY SNO HAVING AVG(GRADE)>=90;
    

3.4.2 連接查詢

  1. 等值與非等值連接查詢:用來連接兩個表的條件稱爲連接條件或連接謂詞;
    【例】:查詢選修2號課程且成績在90分以上的所有學生的學號和姓名;

    SELECT STUDENT.SNO,SNAME FROM STUDENT,SC WHERE STUDENT.SNO=SC.SNO AND SC.CNO='2' AND SC.GRADE>90;
    
  2. 自身連接:連接操作不僅可以在兩個表之間進行,也可以是一個表與其自己進行連接,這種連接稱爲表的自身連接;
    【例】:查詢一門課的間接先選課;
    爲此,要爲Coures表取兩個別名,一個是FIRST,另一個是SECOND

    SELECT FIRST.CNO,SECOND.CPNO FROM COURES FIRST,COURSE SECOND WHERE FIRST.CPNO=SECOND.CNO;
    
  3. 外連接:在通常的連接操作中,只有滿足連接條件的元組才能作爲結果輸出。但是,有時也需輸出那些不滿足連接條件的元組,這個時候就需要使用外連接(Outer join);
    (1)左外連接(LEFT [OUTER] JOIN)只將左邊關係R要捨棄的元組保留;
    (2)右外連接( RIGHT [OUTER] JOIN )只將右邊關係S要捨棄的元組保留;
    語法形式一:

    SELECT fieldlist
    FROM table1 left [right] [outer] join table2
    ON table1.column=table2.column
    

    語法形式二:
    左外連接

    SELECT  fieldlist
    FROM table1 ,table2
    Where  table1.column=table2.column(+)
    

    右外連接

    SELECT fieldlist
    FROM table1 ,table2
    Where  table1.column(+)=table2.column
    
  4. 多表連接:連接操作除了兩個表,還可以兩個以上的表進行連接;

3.4.3 嵌套查詢

  1. 帶有IN謂詞的字句查詢: 帶有IN謂詞的子查詢是指父查詢與子查詢之間用IN進行連接,判斷某個屬性列值是否在子查詢的結果中;
    【例】:查詢與“劉晨”在同一個系學習的學生
    (1)確定“劉晨”所在系名;

    SELECT SDEPT
    FROM STUDENT
    WHERE SNAME='劉晨';
    

    (2)查找所有CS系學習的學生;

    SELECT SNO,SNAME,SDEPT
    FROM STUDENT
    WHERE SDEPT ='CS';
    

    (3)構造嵌套結構;

    SELECT SNO,SNAME,SDEPT
    FROM STUDENT
    WHERE SDEPT IN(
    		SELECT SDEPT
    		FROM STUDENT
    		WHERE SNAME='劉晨');
    

    本例中子查詢的查詢條件不依賴父查詢,稱爲不相關子查詢

  2. 帶有比較運算符的子查詢:帶有比較運算符的子查詢是指父查詢與子查詢之間用比較運算符進行連接。當用戶能確切知道內層查詢返回的是單值時,可以用>、 <、 =、 >=、<=、!=或<>等比較運算符;
    【例】:找出每個學生超過他自己選修課程平均成績的課程號;

    SELECT SNO,CNO
    FROM SC X
    WHERE GRADE>=(
    		SELECT AVG(GRADE)
    		FROM SC Y
    		WHERE Y.SNO=X.SNO);
    

    X Y表是CS表的別名,本例是一個相關子查詢。求解相關子查詢,子查詢不能一次求解出了。內層查詢與外層查詢有關,因此必須反覆求值;

  3. 帶有ANY(SOME)或ALL謂詞的子查詢:子查詢返回單值時可以用比較運算符。而使用ANY或ALL謂詞時則必須同時使用比較運算符;

    語義
    > ANY 大於子查詢結果中的某個值
    < ANY 小於子查詢結果中的某個值
    >= ANY 大於等於子查詢結果中的某個值
    <= ANY 小於等於子查詢結果中的某個值
    <= ANY 小於等於子查詢結果中的某個值
    = ANY 等於子查詢結果中的某個值

    【例】:查詢非計算機系中比計算機系任意一個學生年齡小的學生姓名和年齡;

    SELECT SNAEM,SAGE
    FROM STUDENT
    WHERE SAGE<ANY(
    		SELEC AGE
    		FROM STUDENT
    		WHERE SDEPT='CS')
    AND SDEPT <> 'CS';
    
  4. 帶有EXISTS謂詞的子查詢:EXISTS代表存在量詞彐。帶有EXISTS謂詞的子查詢不返回任何實際數據,它只產生邏輯真值“true”或邏輯假值“false”;
    【例】:查詢所有選修1號課程的學生姓名;

    SELECT SNAME 
    FROM STUDENT
    WHERE EXISTS(
    		SELECT * FROM SC
    		WHERE SNO=STUDENT.SNO AND CNO='1');
    

3.4.4 集合查詢

  • 集合操作主要包括並操作UNION、交操作INTERSECT和差操作MINUS。使用UNION將多個查詢結果合併起來形成一個完整的查詢結果時,系統會自動去掉重複的元組。

四、數據更新

4.1 插入數據

  1. 插入元組

    INSERT INTO <表名> [(<屬性列1>[,<屬性列2>...)] VALUES (<常量1> [,<常量2>]...); 
    
  2. 插入子查詢結果

    INSERT INTO <表名> [(<屬性列1> [,<屬性列2>...)] 
    子查詢;
    

    【例】:對於每一個系,求學生的平均年齡,並把結果存入數據庫

    INSERT INTO DEPT_AGE(SDEPT,AVG_AGE)
    SELECT STUDENT
    FROM STUDENT
    GROUP BY SDEPT;
    

4.2 修改數據

  • 修改操作又稱爲更新操作,其語句的一般格式爲:

    UPDATE <表名>
    SET <列名>=<表達式>[,<列名>=<表達式>]...
    [WHERE <條件>];
    
  1. 修改某一個元組的值
    【例】:將學生201215121的年齡改爲22歲

    UPDATE STUDENT
    SET AGE=22
    WHERE SNO='201215121';
    
  2. 修改多個元組的值
    【例】:將所有學生的年齡增加1歲;

    UPDATE STUDENT 
    SET SAGE=SAGE+1;
    
  3. 帶子查詢的修改語句
    【例】:將計算機系全體學生的成績置零;

    UPDATE SC
    SET GRADE=0
    WHERE SNO IN(
    		SELECT SNO
    		FROM STUDENT
    		WHERE SDEPT='CS');
    

4.3 刪除數據

  • 刪除語句的一般格式爲:

    DELETE  
    FROM <表名>
    [WHERE <條件>]; 
    

    DELETE語句的功能是從指定表中刪除滿足WHERE子句條件的所有元組。

  1. 刪除某一個元組的值
    【例】:刪除學號爲201215128的學生記錄

    DELETE
    FROM STUDENT
    WHERE SNO='201215128';
    
  2. 刪除多個元組的值
    【例】:刪除所有學生的選課記錄;

    DELETE
    FROM SC
    
  3. 帶子查詢的刪除語句
    【例】:刪除計算機系所有學生的選課記錄;

    DELETE
    FROM SC
    WHERE SNO IN(
    		SELECT SNO
    		FROM STUDENT
    		WHERE SDEPT='CS';
    

五、視圖

  • 視圖的特點主要作用在於“查詢”
    1. 視圖能夠簡化用戶的操作;
    2. 視圖使用戶能以多種角度看待同一數據;
    3. 視圖對重構數據庫提供了一定程度的邏輯獨立性;
    4. 視圖能夠對機密數據提供安全保護;

5.1 建立視圖

  1. 語法

    CREATE VIEW <視圖名>[(<列名>[,<列名>]...)]
    AS <子查詢> 
    [WITH CHECK OPTION]; 
    
  2. 說明:
    (1)視圖的屬性名(列名)缺省爲子查詢結果中的屬性名,也可以顯式指明;
    (2)with check option指明當對視圖進行insert,update時,要檢查是否滿足視圖定義中的條件;
    (3)視圖一旦建立,可以同基本表一樣使用.對視圖的操作最終被轉換爲對基本表的操作。

  3. 例子

       CREATE VIEW IS _Student  
       AS 
       SELECT Sno,Sname,Sage,sdept
       FROM student  
       WHERE Sdept ='IS' 
       WITH CHECK OPTION;
    

5.2 刪除視圖

  1. 語法:

    DROP   VIEW <視圖名>;
    
  2. 一個視圖被刪除後,由此視圖導出的其他視圖也將失效,用戶應該使用DROP VIEW語句將他們一一刪除。

5.3 查詢視圖

  • 將對視圖的查詢轉換爲對基本表的查詢的過程稱爲視圖的消解(View Resolution)。

5.4 更新視圖

  • 轉換爲等價的對基本表的更新;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章