1. 程式人生 > >資料庫概論學習筆記 其三(關係資料庫標準語言SQL)

資料庫概論學習筆記 其三(關係資料庫標準語言SQL)

第三章 關係資料庫標準語言SQL

3.1 SQL概述

SQL(Structured Query Language)

結構化查詢語言,是關係資料庫的標準語言

SQL是一個通用的、功能極強的關係資料庫語言

SQL 的產生與發展

目前,沒有一個數據庫系統能夠支援SQL標準的所有概念和特性。

SQL的特點

1.綜合統一

2.高度非過程化

3.面向集合的操作方式

4.以同一種語法結構提供多種使用方式

5.語言簡潔,易學易用

SQL的基本概念

3.2 資料定義

SQL的資料定義功能:

模式定義 CREATE SCHEMA 

刪除 DROP SCHEMA

表定義 CREATE TABLE 刪除 DROP TABLE 修改 ALTER TABLE

檢視定義 CREATE VIEW 刪除 DROP VIEW

索引定義 CREATE INDEX 刪除 DROP INDEX 修改 ALTER INDEX

 

模式定義與刪除

模式定義

    CREATE SCHEMA <模式名> AUTHORIZATION <使用者名稱>[<表定義子句>|<檢視定義子句>|<授權定義子句>]

刪除模式

    DROP SCHEMA <模式名> <CASCADE|RESTRICT>

        CASCADE(級聯)

            刪除模式的同時把該模式中所有的資料庫物件全部刪除

        RESTRICT(限制)

            如果該模式中定義了下屬的資料庫物件(如表、檢視等),則拒絕該刪除語句的執行。 僅當該模式中沒有任何下屬的對        象時才能執行。

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

定義基本表

    CREATE TABLE <表名>      

    (<列名> <資料型別>[ <列級完整性約束條件> ]      

    [,<列名> <資料型別>[ <列級完整性約束條件>] ]    

    …      

    [,<表級完整性約束條件> ] );

    <列級完整性約束條件>:涉及相應屬性列的完整性約束條件。

    <表級完整性約束條件>:涉及一個或多個屬性列的完整性約束條件。

    如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級。

模式與表

    每一個基本表都屬於某一個模式 一個模式包含多個基本表

修改基本表

    ALTER TABLE <表名>

    [ ADD[COLUMN] <新列名> <資料型別> [ 完整性約束 ] ]

    [ ADD <表級完整性約束>]

    [ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]

    [ DROP CONSTRAINT<完整性約束名>[ RESTRICT | CASCADE ] ]

    [ALTER COLUMN <列名><資料型別> ] ;

    ADD:子句用於增加新列、新的列級完整性約束條件和新的表級完整性約束條件

    DROP COLUMN:子句用於刪除表中的列

        如果指定了CASCADE短語,則自動刪除引用了該列的其他物件

        如果指定了RESTRICT短語,則如果該列被其他物件引用,關係資料庫管理系統將拒絕刪除該列

    DROP CONSTRAINT:子句用於刪除指定的完整性約束條件

    ALTER COLUMN:子句用於修改原有的列定義,包括修改列名和資料型別

刪除基本表

    DROP TABLE <表名>[RESTRICT| CASCADE];

    RESTRICT:刪除表是有限制的。

        欲刪除的基本表不能被其他表的約束所引用 。

        如果存在依賴該表的物件,則此表不能被刪除 。

    CASCADE:刪除該表沒有限制。

        在刪除基本表的同時,相關的依賴物件一起刪除。

索引的建立與刪除

建立索引

修改索引

刪除索引

 

建立索引

    CREATE [UNIQUE] [CLUSTER] INDEX <索引名>

    ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);

    UNIQUE:此索引的每一個索引值只對應唯一的資料記錄

    CLUSTER:表示要建立的索引是聚簇索引

修改索引

    ALTER INDEX <舊索引名> RENAME TO <新索引名>

刪除索引

    DROP INDEX <索引名>;

3.4 資料查詢

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.選擇表中的若干列

    查詢全體學生的學號與姓名。         

        SELECT Sno,Sname         

        FROM Student;                              /*代表全部*/

    查全體學生的姓名及其出生年份。     /*查詢經過計算的值*/

        SELECT Sname,2018-Sage          /*假設當時為2018年*/

        FROM Student;

    使用列別名改變查詢結果的列標題

        SELECT Sname NAME,'Year of Birth:'  BIRTH, 2014-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT     

        FROM Student;

2.選擇表中的若干元組

    消除取值重複的行

        SELECT DISTINCT Sno    

        FROM SC;

    查詢滿足條件的元組

        查詢所有姓劉學生的姓名、學號和性別。

SELECT Sname, Sno, Ssex      

FROM Student      

WHERE  Sname LIKE '劉%';        /*%代表任意長度萬用字元,_代表單個字元長度,ESCAPE '\' 表示“ \” 為換碼字元*/

3.ORDER BY子句

升序:ASC;降序:DESC;預設值為升序

    查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列。

        SELECT Sno, Grade        

        FROM    SC        

        WHERE  Cno= ' 3 '        

        ORDER BY Grade DESC;

4.聚集函式

    統計元組個數      

        COUNT(*)

    統計一列中值的個數      

        COUNT([DISTINCT|ALL] <列名>)

    計算一列值的總和(此列必須為數值型)

        SUM([DISTINCT|ALL] <列名>)    

    計算一列值的平均值(此列必須為數值型)

        AVG([DISTINCT|ALL] <列名>)

    求一列中的最大值和最小值      

        MAX([DISTINCT|ALL] <列名>)     

        MIN([DISTINCT|ALL] <列名>)

5.GROUP BY子句

    細化聚集函式的作用物件  

        如果未對查詢結果分組,聚集函式將作用於整個查詢結果  

        對查詢結果分組後,聚集函式將分別作用於每個組

        按指定的一列或多列值分組,值相等的為一組

    查詢選修了3門以上課程的學生學號。      

        SELECT Sno      

        FROM  SC      

        GROUP BY Sno      

        HAVING  COUNT(*) >3;        /*HAVING用來寫分組條件*/

連線查詢

1.等值與非等值連線查詢

    查詢每個學生及其選修課程的情況

        SELECT  Student.*, SC.*                 

        FROM     Student, SC                 

        WHERE  Student.Sno = SC.Sno;

    (1)巢狀迴圈法(NESTED-LOOP)

    (2)排序合併法(SORT-MERGE)

        首先按連線屬性對錶1和表2排序

        對錶1的第一個元組,從頭開始掃描表2,順序查詢滿足連線條件的元組,找到後就將表1中的第一個元組與該元組拼接起        來,形成結果表中一個元組。當遇到表2中第一條大於表1連線欄位值的元組時,對錶2的查詢不再繼續

    (3)索引連線(INDEX-JOIN)

        對錶2按連線欄位建立索引

        對錶1中的每個元組,依次根據其連線欄位值查詢表2的索引,從中找到滿足條件的元組,找到後就將表1中的第一個元組與    該元組拼接起來,形成結果表中一個元組

2.自身連線

自身連線:一個表與其自己進行連線

需要給表起別名以示區別

由於所有屬性名都是同名屬性,因此必須使用別名字首

    查詢每一門課的間接先修課(即先修課的先修課)    

        SELECT  FIRST.Cno, SECOND.Cpno      

        FROM  Course  FIRST, Course  SECOND      

        WHERE FIRST.Cpno = SECOND.Cno;

3.外連線

    普通連線操作只輸出滿足連線條件的元組

    外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出

4.多表連線

    多表連線:兩個以上的表進行連線

巢狀查詢

將一個查詢塊巢狀在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為巢狀查詢

不相關子查詢:子查詢的查詢條件不依賴於父查詢

相關子查詢:子查詢的查詢條件依賴於父查詢

1.帶有IN謂詞的子查詢

    查詢與“劉晨”在同一個系學習的學生。

        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);

3.帶有ANY(SOME)或ALL謂詞的子查詢

使用ANY或ALL謂詞時必須同時使用比較運算 語義為:      

> ANY    大於子查詢結果中的某個值      

> ALL    大於子查詢結果中的所有值

< ANY    小於子查詢結果中的某個值    

< ALL    小於子查詢結果中的所有值

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

>= ALL    大於等於子查詢結果中的所有值

!=(或<>)ANY    不等於子查詢結果中的某個值

!=(或<>)ALL    不等於子查詢結果中的任何一個值

4.帶有EXISTS謂詞的子查詢(表示除運算)

    查詢所有選修了1號課程的學生姓名。

        SELECT Sname      

        FROM Student      

        WHERE EXISTS                     

                                  (SELECT *                    

                                  FROM SC                    

                                  WHERE Sno=Student.Sno AND Cno= ' 1 ');

集合查詢

並操作UNION

交操作INTERSECT

差操作EXCEPT

    查詢選修了課程1或者選修了課程2的學生。

        SELECT Sno        

        FROM SC        

        WHERE Cno=' 1 '        

        UNION        

        SELECT Sno        

        FROM SC        

        WHERE Cno= ' 2 ';

3.5 資料更新

插入資料

1. 插入元組

INSERT     

INTO <表名> [(<屬性列1>[,<屬性列2 >…)]     

VALUES (<常量1> [,<常量2>]… );

提供的值必須與INTO子句匹配 值的個數 值的型別

2. 插入子查詢結果

INSERT      

INTO <表名>  [(<屬性列1> [,<屬性列2>…  )]

子查詢;

修改資料

UPDATE  <表名>    

SET  <列名>=<表示式>[,<列名>=<表示式>]…    

[WHERE <條件>];

關係資料庫管理系統在執行修改語句時會檢查修改操作是否破壞表上已定義的完整性規則

實體完整性

主碼不允許修改

使用者定義的完整性  

    NOT NULL約束  

    UNIQUE約束  

    值域約束

刪除資料

DELETE        

FROM     <表名>        

[WHERE <條件>];

3.6 空值的處理

1.空值的判斷

判斷一個屬性的值是否為空值,用IS NULL或IS NOT NULL來表示。

2.空值的約束條件

    有NOT NULL約束條件的不能取空值

    加了UNIQUE限制的屬性不能取空值

    碼屬性不能取空值

3.7 檢視

檢視的特點

1.虛表,是從一個或幾個基本表(或檢視)匯出的表

2.只存放檢視的定義,不存放檢視對應的資料

3.基表中的資料發生變化,從檢視中查詢出的資料也隨之改變

定義檢視

1.建立檢視

CREATE  VIEW              

      <檢視名>  [(<列名>  [,<列名>]…)]        

AS  <子查詢>        

[WITH  CHECK  OPTION];

WITH CHECK OPTION

    對檢視進行UPDATE,INSERT和DELETE操作時要保證更新、插入或刪除的行滿足檢視定義中的謂詞條件

2. 刪除檢視

DROP  VIEW  <檢視名>[CASCADE];

    如果該檢視上還匯出了其他檢視,使用CASCADE級聯刪除語句,把該檢視和由它匯出的所有檢視一起刪除 

查詢檢視

查詢檢視與查詢基本表相同