第3章關係數據庫標準語言SQL
3.1SQL概述
SQL的定義:
- 結構化查詢語言
- 集數據定義語言(DDL),數據操縱語言(DML),數據控制語言(DCL)功能於一體。
- SQL只要提出“做什麼”,無須瞭解存取路徑。操作對象是一條記錄
SQL的特點:
- 綜合統一
- 高度非過程化
- 面向集合的操作方式
- 以同一種語法結構提供多種使用方式
- 語言簡潔,易學易用
SQL功能 | 動詞 |
---|---|
數據查詢 | select |
數據定義 | create、drop、alter |
數據操縱 | insert、update、delete |
數據控制 | grant、revoke |
3.1.3SQL的基本概念
基本表
- 基本表示本身獨立存在的表,
- 在關係數據庫管理系統中一個關係就對應一個基本表
- 一個或多個基本表對應一個存儲文件
- 一個表可以帶若干索引,索引也存放在存儲文件中
存儲文件
- 存儲文件的邏輯結構組成了關係數據庫的內模式
- 存儲文件的物理結構對最終用戶是隱蔽的
視圖
- 從一個或幾個基本表導出的表
- 數據庫中只存放視圖的定義而不存放視圖對應的數據
- 視圖是一個虛表
- 用戶可以在視圖上再定義視圖
3.3數據定義
一個關係數據庫管理系統的實例可以建立多個數據庫,一個數據庫中可以建立多個模式,一個模式下通常包括多個表、視圖和索引等數據庫對象
3.3.1模式的定義與刪除
定義
CREATE SCHEMA <模式名>AUTHORIZATION<用戶名> [<表定義子句>|<視圖定義子句>|<授權定義子句>];
刪除模式
DROP SCHEME <模式名><cascade|RESTRICT>
3.3.2基本表的定義、刪除與修改
定義
create table 表名(
列名 數據類型 not null, //非空性約束
列名 數據類型 unique, //唯一性約束
列名 數據類型 check(檢查條件),//檢查性約束
............
constraint 主鍵名 primary key(主屬性列表),
constraint 外鍵名 foreign key (外鍵屬性列表) references 被參考表名(參考列),
constraint 檢查名 check(校驗條件)
)
[例3.10] 增加課程名稱必須取唯一值的約束條件。
ALTER TABLE Course ADD UNIQUE(Cname);
UNIQUE:不能重複可以爲空
主碼:不能重複不可以爲空
3.3.3索引的建立與刪除
建立索引的目的:加快查詢速度
- 順序文件上的索引
- B+樹索引
- 散列索引
- 位圖索引
3.4數據查詢
SELECT [ALL|DISTINCT] <目標列表達式> [,<目標列表達式>]···
FROM <表名或視圖名> [,<表名或視圖名>···]|(<SELECT 語句>) [AS] <別名>
[WHERE <條件表達式>]
[GROUP BY <列名1> [HAVING <條件表達式>]]
[ORDER BY <列名2> [ASC|DESC]];
3.4.1單表查詢
指定DISTINCT關鍵詞,去掉表中重複的行
- 常用查詢條件:
比較:= , > , < , >= , <= , != , <>(也是不等於), !> , !< , not+上述運算符
確定範圍:between and , not between and
- 如
where age between 18 and 20;
等價於where age <=18 and age<=20;
- 如
確定集合:in , not in
字符匹配:like , not like
like
可以當做=
用以比較字符串,也可以使用通配符來模糊匹配字符串。%
表示匹配0個或多個字符,_
匹配一個。\%
用來轉義百分號,以此類推。如果用戶要查詢的字符串本身就含有通配符%或_,這時就要使用ESCAPE‘<換碼字符>’短語就可以對通配符轉義了
空值:is null,is not null
- 空值不能用
=null
判斷。因爲null
不等於任何值。
- 空值不能用
邏輯運算:and , or , not
ORDER BY子句
- 可以按一個或多個屬性列排序
- 升序:ASC;降序:DESC;默認爲升序 對於空值,默認爲最大,
- 例如按升序排,含空值的元組最後顯示,按降序排,空值的元組則最先顯示。
聚集函數
如果指定DISTINCT短語,則表示在計算時要取消指定列中的重複值。
注意:where子句中是不能用聚集函數作爲條件表達式的,聚集函數只能用於select子句和group by中的having子句。
GROUP BY子句
- 該子句將查詢結果按某一列或多列的值分組,值相等的爲一組。
- 對查詢結果分組的目的是爲了細化聚集函數的作用對象,如果未對查詢結果分組,聚集函數將作用於整個查詢結果,分組後聚集函數將作用於每一組,即每一組都有一個函數值。
- where子句和having短語的區別在於作用對象不同,where子句作用於基本表或視圖,從中選擇滿足條件的元組。Having短語作用於組,從中選擇滿足條件的組。
注意:where子句中是不能用聚集函數作爲條件表達式的,
3.4.2連接查詢
連接查詢:同時涉及兩個以上的表的查詢
等值與非等值連接查詢
等值連接:
若在等值連接中把目標列中重複的屬性列去掉則爲自然連接
自身連接:一個表與其自己進行連接,需要給表起別名以示區別
外連接
左外連接
3.4.3嵌套查詢
帶有IN謂詞的子查詢
帶有比較運算符的子查詢
帶有ANY(SOME)或ALL謂詞的子查詢
帶有EXISTS謂詞的子查詢
- EXISTS和NOT EXISTS謂詞子查詢
....
where exists (select .........)
當後面的子查詢結果集不爲空時,exists返回true
,否則返回false
。
not exists和exists剛好相反。
3.4.4集合查詢
3.5 數據更新
3.5.1 插入數據
兩種形式:一種是插入一個元組,另一種是插入子查詢結果。後者可以一次插入多個元組
1、插入元組
INTO子句
- 指定要插入數據的表名和屬性列
- 屬性列的順序可與表定義中的順序不一致
- 沒有指定屬性列:表示要插入的是一條完整的個元組,且屬性列屬性與表定義中的順序一致
- 指定部分屬性列:插入的元組在其餘屬性列上取空值
插入子查詢結果
可以一次插入多個元組
關係數據庫管理系統在執行插入語句時會檢查所插元組是否破壞表上已定義的完整性規則
- 實體完整性
- 參照完整性
- 用戶定義的完整性
- NOT NULL約束
- UNIQUE約束
- 值域約束
3.5.2修改數據
修改操作又稱爲更新操作,
update 表名 set 列名=表達式,列名=表達式,..... where 條件
功能:
- 修改指定表中滿足where子句條件的元組
- set子句給出<表達式>的值用於取代相應的屬性列
- 如果省略where子句,表示要修改表中的所有元組
三種修改方式:
修改某一個元組的值
修改多個元組的值
帶子查詢的修改語句
關係數據庫管理系統在執行修改語句時會檢查所插元組是否破壞表上已定義的完整性規則
- 實體完整性
- 參照完整性
- 用戶定義的完整性
- NOT NULL約束
- UNIQUE約束
- 值域約束
3.5.3刪除數據
delete from 表名 where 條件。
-
刪除某一個元組的值
3.7視圖
視圖是從一個或幾個基本表導出的表,是一個虛表,只存放視圖的定義,而不存放視圖對應的數據
3.7.1定義視圖
建立視圖
- with check option表示對視圖進行update、insert和delete操作時要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)
- 關係數據庫管理系統執行create view語句時,只是把視圖定義存入數據字典,並不執行其中的select語句
- 在對視圖查詢時,按視圖的定義從基本表中將數據查出
定義IS_Student視圖時加上了with check option,對該視圖進行插入、修改和刪除操作時,關係數據庫管理系統會自動加上Sdept="IS"的條件。
2.刪除視圖
因爲IS_S1視圖上還道出了IS_S2視圖,所以被拒絕執行。如果確定要刪除,需要級聯刪除
3.7.2 查詢視圖
用戶角度:查詢視圖與查詢基本表相同
關係數據庫管理系統實現視圖查詢的方法
視圖消解法
- 進行有效性檢查
- 轉換成等價的對基本表的查詢
- 執行修正後的查詢
有些情況下,視圖消解法不能生成正確的查詢。
3.7.3 更新視圖
由於視圖是不實際存儲數據的虛表,因此對視圖的更新最終要轉換爲對基本表的更新。
一般的,行列子集視圖是可更新的,並不是所有的視圖都是可更新的。
視圖的作用(優點)
習題
1 .試述 SQL 語言的特點。
- (l)綜合統一。 sQL 語言集數據定義語言 DDL 、數據操縱語言 DML 、數據控制語言 DCL 的功能於一體。
- (2)高度非過程化。用 sQL 語言進行數據操作,只要提出“做什麼”,而無需指明“怎麼做”,因此無需瞭解存取路徑,存取路徑的選擇以及 sQL 語句的操作過程由系統自動完成。
- (3)面向集合的操作方式。 sQL 語言採用集合操作方式,不僅操作對象、查找結果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。
- (4)以同一種語法結構提供兩種使用方式。 sQL 語言既是自含式語言,又是嵌入式語言。作爲自含式語言,它能夠獨立地用於聯機交互的使用方式;作爲嵌入式語言,它能夠嵌入到高級語言程序中,供程序員設計程序時使用。
- (5)語言簡捷,易學易用。
2 .試述 SQL 的定義功能。S
SQL 的數據定義功能包括定義表、定義視圖和定義索引。 SQL 語言使用 cREATE TABLE 語句建立基本表, ALTER TABLE 語句修改基本表定義, DROP TABLE 語句刪除基本表;使用 CREATE INDEX 語句建立索引, DROP INDEX 語句刪除索引;使用 CREATE VIEW 語句建立視圖, DROP VIEW 語句刪除視圖。
3.什麼是基本表?什麼是視圖?
兩者的區別和聯繫是什麼?基本表是本身獨立存在的表,在 SQL 中一個關係就對應一個表。視圖是從一個或幾個基本表導出的表。視圖本身不獨立存儲在數據庫中,是一個虛表。即數據庫中只存放視圖的定義而不存放視圖對應的數據,這些數據仍存放在導出視圖的基本表中。視圖在概念上與基本表等同,用戶可以如同基本表那樣使用視圖,可以在視圖上再定義視圖。
4 .試述視圖的優點。
- ( l )視圖能夠簡化用戶的操作;
- ( 2 )視圖使用戶能以多種角度看待同一數據;
- ( 3 )視圖對重構數據庫提供了一定程度的邏輯獨立性;
- ( 4 )視圖能夠對機密數據提供安全保護。
5.所有的視圖是否都可以更新?爲什麼?
不是。視圖是不實際存儲數據的虛表,因此對視圖的更新,最終要轉換爲對基本表的更新。因爲有些視圖的更新不能惟一有意義地轉換成對相應基本表的更新,所以,並不是所有的視圖都是可更新的
6 .哪類視圖是可以更新的?哪類視圖是不可更新的?各舉一例說明。
答:基本表的行列子集視圖一般是可更新的。若視圖的屬性來自集函數、表達式,則該視圖肯定是不可以更新的。