SQL(structrued query language)是1974年由Boyce和Chamberlin提出的,主要包括:數據查詢(query)、數據操縱(manipulation)、數據定義(definition)和數據控制(control)功能,是一種通用的、功能強大的關係數據庫的標準語言。
SQL的特點
綜合統一:SQL是集數據定義、數據操縱和數據控制功能於一體,語言風格統一,可獨立完成數據庫生命週期的所有活動。
高度非過程化:SQL語言是高度非過程化的,當進行數據操作時,存儲路徑對用戶來說是透明的,提高了數據的獨立性。
面向集合的操作方式:操作對象、查找結果可以是記錄的集合。
兩種使用方式:既可以在終端鍵盤上輸入SQL命令,對數據庫進行操作,也可以將SQL語言嵌入到高級語言程序中。
語言簡潔,易學易用:SQL語言功能極強,完成核心功能只用了9個動詞,包括以下4類。
數據查詢:SELECT
數據定義:CREATE DROP ALTER
數據操縱:INSERT UPDATE DELETE
數據控制:GRANT REVOKE
SQL數據定義
1.創建表(CREATE TABLE)
語句格式:
CREATE TABLE <表名>(<列名><數據類型>[列級完整性約束條件] [,<列名><數據類型>[列級完整性約束條件]]... [,<表級完整性約束條件>]);
列級完整性約束條件有:NULL(空)、UNIQUE(取值唯一)等。
2.修改表(ALTER TABLE)
語句格式:
ALTER TABLE <表名>[ADD<新列名><數據結構>[完整性約束條件]] [DROP<完整性約束名>] [MODIFY<列名><數據類型>];
3.刪除表(DROP TABLE)
語句格式:
DROP TABLE <表名>;
4.建立索引
語句格式:
CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...);
參數說明:
次序。可選ASC(升序)或者DSC(降序),默認值爲ASC。
UNIQUE。表明此索引的每一個索引值只對應唯一的數據記錄。
CLUSTER。表明要建立的索引是聚集索引,意爲索引項的順序是與表中記錄的物理順序一致的索引組織。
5.刪除索引
語句格式:
DROP INDEX <索引名>;
6.定義視圖
視圖是從一個或者多個表或視圖中導出的表,其結構和數據是建立在對錶的查詢基礎上的。視圖不是真實存在的基礎表而是一個虛擬表,視圖所對應的數據並不真實存在以視圖結構存儲的數據庫中,而是存儲在視圖所引用的表中。
語句格式:
CREATE VIEW 視圖名 [(列名)[,<列名>]] AS <子查詢> [WITH CHECK OPTION];
注意:
a.子查詢可以是任意複雜的SELECT語句,但通常不允許含有ORDER BY 子句和 DISTINCT 短語。
b.WITH CHECK OPTION 表示對 UPDATE, INSERT, DELETE 操作時保證更新、插入或刪除的行滿足視圖定義中的謂語條件(即子查詢中的條件表達式)。
c.組成視圖的屬性列名或者全部省略或者全部指定。如果省略屬性列名,則隱含該視圖由 SELECT 子查詢目標列的諸屬性組成。
7.刪除視圖
語句格式:
DROP VIEW <視圖名>;
SQL數據查詢
SQL的數據操縱功能包括SELECT(查詢)、INSERT(插入)、DELETE(刪除)和UPDATE(修改)4條語句。SQL語言對數據庫的操作十分靈活方便,原因在於SELECT語句中的成分豐富多樣的元組,有許多可選形式,尤其是目標列和條件表達式。
1.SELECT基本結構
語句格式
SELECT [ALL | DISTINCT] <目標列表達式> [,<目標列表達式>]... FROM <表名或視圖名>[,<表名或視圖名>] [WHERE <條件表達式>] [GROUP BY <列名1>[HAVING<條件表達式>]] [ORDER BY <列名2>[ASC | DESC]...];
SQL查詢中的字句順序:SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDER BY。但是 SELECT、FROM 是必須的,而且,HAVING 子句只能與 GROUP BY 搭配起來使用。
SELECT 子句對應的是關係代數中的投影運算,用來列出查詢結果中的屬性。其輸出可以是:列名、表達式、集函數(AVG、COUNT、MAX、MIN、SUM),DISTINCT 選項可以保證查詢的結果集中不存在重複元組。
FROM 子句對應的是關係代數中的笛卡爾積,它列出的是表達式求值過程中需掃描的關係,即在FROM 子句中出現多個基本表或視圖時,系統首先執行笛卡爾積操作。
WHERE 子句對應的是關係代數中的選擇謂詞。WHERE 子句的條件表達式中可以使用的運算符如表1所示。
表1 WHERE 子句的條件表達式中可以使用的運算符
運算符 | 含義 | 運算符 | 含義 | ||
集合成員運算符 | IN | 在集合中 | 算術運算符 | > | 大於 |
NOT IN | 不在集合中 | >= | 大於等於 | ||
< | 小於 | ||||
字符串匹配運算符 | LIKE | 與_和%進行單個多個字符匹配 | <= | 小於等於 | |
= | 等於 | ||||
!= | 不等於 | ||||
空值比較運算符 | IS NULL | 爲空 | 邏輯運算符 | AND | 與 |
IS NOT NULL | 不能爲空 | OR | 或 | ||
NOT | 非 |
2.簡單查詢
簡單查詢只需要使用3個保留字 SELECT、FROM 和 WHERE。
3.連接查詢
若查詢涉及兩個以上的表,則成爲連接查詢。
4.子查詢
子查詢也稱嵌套查詢。嵌套查詢是指一個SELECT-FROM-WHERE 查詢塊可以嵌入另一個查詢塊之中。在SQL中允許多重嵌套。
5.聚集函數
聚集函數是一個值得集合爲輸入,返回單個值的函數。SQL提供了5個預定義集函數:平均值 AVG、最小值 MIN、最大值 MAX、求和 SUM 以及計數 COUNT。如表2所示。
表2 集函數的功能
集函數名 | 功能 |
COUNT ([DISTINCT|ALL]*) | 統計元組個數 |
COUNT ([DISTINCT|ALL]<列名>) | 統計一列中值得個數 |
SUM ([DISTINCT|ALL]<列名>) | 計算一列(該列應爲數值型)中值得總和 |
AVG ([DISTINCT|ALL]<列名>) | 計算一列(該列應爲數值型)中值的平均值 |
MAX ([DISTINCT|ALL]<列名>) | 求一列值的最大值 |
MIN ([DISTINCT|ALL]<列名>) | 求一列值的最小值 |
使用 ANY 和 ALL 謂詞必須同時使用比較運算符,其含義及等價的轉換關係見表3.用集函數實現子查詢通常要比直接用ALL 或 ANY 查詢效率要高。
表3 ANY、ALL 謂詞含義及等價的轉換關係
謂詞 | 語義 | 等價轉換關係 |
>ANY | 大於子查詢結果中的某個值 | >MIN |
>ALL | 大於子查詢結果中的所有值 | >MAX |
<ANY | 小於子查詢結果中的某個值 | <MAX |
<ALL | 小於子查詢結果中的所有值 | <MIN |
>=ANY | 大於等於子查詢結果中的某個值 | >=MIN |
>=ALL | 大於等於子查詢結果中的所有值 | >=MAX |
<=ANY | 小於等於子查詢結果中的某個值 | <=MAX |
<=ALL | 小於等於子查詢結果中的所有值 | <=MIN |
<>ANY | 不等於子查詢結果中的某個值 | - |
<>ALL | 不等於子查詢結果中的任何一個值 | NOT IN |
=ANY | 等於子查詢結果中的某個值 | IN |
=ALL | 等於子查詢結果中的所有值 | - |
6.分組查詢
1)GROUP BY 子句
在 WHERE 子句後面加上 GROUP BY 子句可以對元組進行分組,保留字 GROUP BY 後面跟着一個分組屬性的列表。最簡單的情況是,FROM 子句後面只有一個關係,根據分組屬性對它的元組進行分組。SELECT 子句中使用的聚集操作符僅用在每個分組上。
2)HAVING 子句
假如元組在分組前按照某種方式加上限制,使得不需要的分組爲空,可以在GROUP BY子句後面跟一個HAVING 子句即可。
注意,當元組含有空值時,需要注意:
第一,空值在任何聚集操作中被忽視。它對求和、求平均值和計數都沒有影響。它也不能是某列的最大值或最小值。
第二,NULL值又可以在分組屬性中看做是一個一般的值。
7.更名運算
SQL 提供可爲關係和屬性重新命名的機制,這是通過使用具有如下形式的 AS 子句來實現的
Old-name AS new-name
AS 子句即可出現在SELECT 子句,也可出現在 FROM 子句中。
8.字符串操作
對於字符串進行的最通常的操作是使用操作符 LIKE 的模式匹配。使用兩個特殊的字符來描述模式:“%”匹配任意字符串;“_”匹配任意一個字符。模式是大小寫敏感的。
“__”匹配只含兩個字符的字符串;“_%”匹配至少包含兩個字符的字符串。
爲了使模式中包含特殊模式字符(即%和_),在SQL中允許使用 ESCAPE 關鍵詞來定義轉義符。轉義字符緊靠着特殊字符,並放在它的前面,表示該特殊字符被當成普通字符。例如使用反斜槓“\”作爲轉義符。
LIKE 'ab\%cd%' ESCAPE '\' //匹配所有以ab%cd開頭的字符串 LIKE 'ab\\cd%' ESCAPE '\' //匹配所有以ab\cd開頭的字符串
9.視圖的查詢
系統執行視圖查詢語句時,通常先將其轉換成等價的對基本表的查詢,然後執行查詢語句。即當查詢視圖時,系統先從數據字典中取出該視圖的定義,然後將定義中的查詢語句和對該視圖的查詢語句結合起來,形成一個修正的查詢語句。
SQL數據更新
1.插入語句
要在關係數據庫中插入數據,可以指定被插入的元組,或者用查詢語句選出一批待插入的元組。語句格式:
INSERT INTO <基本表名> [(字段名[,字段名]...)] VALUES (常量[,常量]...); INSERT INTO <基本表名> (字段名[,字段名]...) SELECT 查詢語句;
2.刪除語句
語句格式:
DELETE FROM <基本表名> [WHERE 條件表達式];
3.修改語句
語句格式:
UPDATE <基本表名> SET <列名>=<值表達式>[,<列名>=<值表達式>...] [WHERE <條件表達式>];
SQL的訪問控制
訪問控制是指對數據訪問數據的控制,有授權語句和收回權限語句。
1.授權的語句格式
GRANT <權限> [,<權限>]... [ON <對象類型><對象名>] TO <用戶> [,<用戶>]... [WITH GRANT OPTION];
注意:不同類型的操作對象有不同的操作權限,常見的操作權限見表4。
表4 常見的操作權限
對象 | 對象類型 | 操作權限 |
屬性列 | TABLE | SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES(四種權限的總和) |
視圖 | TABLE | SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES(四種權限的總和) |
基本表 | TABLE | SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, ALL PRIVILEGES(六種權限的總和) |
數據庫 | DATABASE | CREATEAB 建立表的權限,可由 DBA 授予普通用戶 |
說明:
接受權限的用戶可以是單個或者多個具體的用戶,也可以是 PUBLIC, 即全體用戶。
若指定了 WITH GRANT OPTION 子句,則獲得了某種權限的用戶還可以將此權限賦給其他用戶。
2.收回權限語句格式
REVOKE <權限> [,<權限>]... [ON <對象類型> <對象名>] FROM <用戶> [,<用戶>]...;