1. 程式人生 > >3、【資料庫技術】SQL語言

3、【資料庫技術】SQL語言

三、SQL語言

    SQL語言:結構化查詢語言的簡稱,是關係資料庫的標準語言。SQL是一種通用的、功能極強的關係資料庫語言,是對關係資料存取的標準介面,也是不同資料系統之間互相操作的基礎。集資料查詢、資料操作、資料定義和資料控制功能於一體。
    資料查詢:即根據相關條件從資料庫中查詢資料;關鍵字:select
    資料定義:資料定義功能包括模式定義、表定義、檢視定義和索引定義。關鍵字:Create、Drop、Alter
    資料操作:即資料庫的增刪改查等操作。關鍵字:Insert、Updata、Delete
    資料控制:用來授權或回收資料庫的某種特權,並控制資料庫操縱事務發生的時間及效果。關鍵字:GRANT、REVORK

SQL支援三級模式結構:檢視 -> 外模式 基本表 -> 模式 儲存檔案 -> 內模式

下面以表為例,為大家展示一下,表的資料定義、資料操作、資料查詢和資料控制。

(1)資料定義

資料庫系統支援的資料型別有:

資料型別 含義
char(n) 長度為n的定長字串
varchar(n) 最大長度為n的變長字串
INT 長整數(也可以寫作INTEGER)
SMALLINT 短整數
NUMERIC(p,d) 定點數,由p位數字(不包括符號、小數點)組成,小數後面有d位數字
REAL 取決於機器精度的浮點數
Double Precision 取決與機器精度的雙精度浮點數
FLOAT(n) 浮點數,精度至少為n位數字
DATE 日期,包含年、月、日,格式為YYYY-MM-DD
TIME 時間,包含一日的時、分、秒,格式為HH:MM:SS

    SQL資料定義語句操作的物件有:模式、表、檢視和索引

操作物件 建立 刪除 修改
模式 CREATE SCHEMA DROP SCHEMA
CREATE TABLE DROP TABLE ALTER TABLE
檢視 CREATE VIEW DROP VIEW
索引 CREATE INDEX DROP INDEX
  • 表定義
    SQL建立表語句的一般格式為:
CREATE TABLE <表名><列名> <資料型別> [<列級完整性約束>]
[<列名> <資料型別> [<列級完整性約束>]] ...
[,<表級完整性約束>];

    其中<資料型別>可以是資料庫系統支援的各種資料型別,包括長度和精度。[]內的內容是可選的

    列級完整性約束為針對單個列(本列)的完整性約束,包括PRIMARY KEY、REFERENCES表名(列名)、UNIQUE、NOT NULL等。

    表級完整性約束可以是基於表中多列的約束,包括PRIMARY KEY(列名)、FOREIGN KEY REFERENCES 表名(列名)等。
【示例】

create table instructor2( 
    id char(5) not null, 
    name varchar(20) not null, 
    dept_name varchar(20) not null, 
    salary numeric(8,2), 
    primary key(id) 
);

(2)資料操作

  • 插入元組,語法如下:
    insert into 關係名 values(每個屬性對應的值);//關係名,即表名

【示例】

    insert into instructor2 values(00001,'ai','math',2500.37); 
    insert into instructor2 values(00002,'la','math',3700.89);
    insert into instructor2 values(00003,'bi','math',5400.45); 
    insert into instructor2 values(00004,'ma','english',1450.23); 
    insert into instructor2 values(00005,'ye','english',3421.34); 
    insert into instructor2 values(00006,'er','technology',10000.65);
  • 刪除所有元組,語法如下:
    delete from <關係名>//關係名,即表名

    使用該語句刪除所有元組後,關係和屬性仍是存在,你可以繼續對該關係進行插入元組操作。

  • 刪除關係,語法如下:
    drop table <關係名> [RESTRICT | CASCADE]//關係名,即表名

    使用該語句刪除關係後,該關係就徹底被銷燬了。

    []內的內容可選,若選擇RESTRICT,則該表的刪除是有限制條件的。欲刪除的表不能被其他表的約束所引用(CHECK, FOREIGN KEY等約束),不能有檢視,不能有觸發器,不能有儲存過程或函式等,如果存在這些依賴該表的物件,則此表不能被刪除。

    若選擇CASCADE:則該表的刪除沒有限制條件,在刪除表的同時,相關的依賴物件,例如檢視,都將被一起刪除。

    預設情況是RESTRICT;

  • 修改表
    表的修改操作包括,新增、刪除、修改屬性等。修改表的語法如下:
    alter table <關係名> 
    [add <新列名> <資料型別> [完整性約束]]
    [drop <完整性約束名>]
    [alter column <列名> <資料型別>]

    add子句用於增加新列和新的完整性約束條件,drop子句用於刪除指定的完整性約束條件,alter column子句用於修改原有的列定義,包括修改列名和資料型別。
【示例1】新增新的屬性

    alter table instructor2 add firstname varchar(20),
				lastname varchar(20); 

【示例2】刪除已有屬性

    alter table instructor2 drop 
    			firstname ,lastname ;

【示例3】修改已有屬性的資料型別

    alter table instructor2 alter column id int;

【示例4】增加某個屬性的唯一值的約束條件

    alter table instructor2 add unique(id);

(3)資料查詢

表單查詢

選擇查詢若干列:

    select Sno from Student;

查詢全部列:

    select * from Student;

查詢經過計算的列:

    select 2004-Sage from Student;

    使用者可以通過指定別名來改變查詢結果的列標題,這對於含算數表示式、常量、函式名的目標列表達式尤為有用。例如:

    select Sname NAME, 'Year of Birth:' BIRTH, 2004-Sage BIRTHDAY,
           LOWER(Sdept) DEPARTMENT 
    from Student;

消除取值重複的行:

    select distinct Sno from SC;

查詢滿足條件的元組
    查詢滿足指定條件的元組可以通過WHERE子句實現。WHERE子句常用的查詢條件如下表所示:

查詢條件 謂詞
比較 =, >, <, >=, <=, !=, <>, !>, !<, NOT+等比較運算子
確定範圍 BETWEEN AND, NOT BETWEEN AND
確定集合 IN, NOT IN
字元匹配 LIKE, NOT LIKE
空值 IS NULL, IS NOT NULL
多重條件(邏輯運算) AND,OR,NOT

(a)比較大小
    進行比較的運算子一般包括:
=(等於), >(大於), <(小於), >=(大於等於), <=(小於等於), !=或<>(不等於), !>(不大於), !<(不小於)。
【示例】

    select Sname from Student WHERE Sdept = 'CS';

    RDBMS執行該查詢的一種可能過程是:對Student表進行全表掃描,取出一個元組,檢查該元組在Sdept列的值是否等與’CS’。如果相等,則取出Sname列的值形成一個新的元組輸出,否則則跳過該元組,取下一個元組。

    如果全校有數萬個學生,計算機系的學生人數是全校的5%左右,可以在Student表的Sdept列上建立索引,系統會利用該索引找出Sdept='CS’的元組,從中取出Sname列值形成結果關係。這就避免了對Student表的全表掃描,加快查詢。注意如果學生較少,索引查詢不一定能提高查詢效率,系統仍會使用權標掃描。這由查詢優化器按照某些規則或估計執行代價來做出選擇。

(b)確定範圍
    謂詞BETWEEN…AND…和NOT BETWEEN…AND…可以用來查詢屬性值在(或不在)指定範圍內的元組,其中BETWEEN後是範圍的下限(即低值),AND後面是範圍的上限(即高值)。

    select Sname, Sdept, Sage from Student where Sage between 20 and 30;

(c)確定集合
    謂詞IN可以用來查詢屬性值屬於指定集合的元組。

【示例】查詢計算機系(CS)、數學系(MA)和資訊系(IS)學生姓名和學號。

    select Sname, Ssex from Student where Sdept IN ('CS', 'MA', 'IS');

    與謂詞IN相對的謂詞是NOT IN,用於查詢屬性值不屬於某個集合的元組。

(d)字元匹配
    謂詞LIKE可以用來進行字串匹配。其一般語法格式如下:

    [NOT] LIKE '<匹配串>'[ESCAPE '<換碼字元>']

    其含義是查詢指定的屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個完整的字串,也可以含有萬用字元%和_。其中:

    %(百分號):代表任意長度(長度可以為0)的字串。例如a%b表示以a開頭,以b結尾的任意長度的字串。如abc、addgb等。

    _(下橫線):代表任意單個字元。例如:a_b表示以a開頭,以b結尾的長度為3的任意字串。

    select * from Student where Sno LIKE '20021232';
    等價於
    select * from Student where Sno='20021232';

    如果LIKE後面匹配串中不含萬用字元,則可以用=運算子取代LIKE謂詞,用!=或者<>運算子取代NOT LIKE謂詞。

    注意:如果使用者要查詢的字串本身就含有萬用字元%或_,這時就要使用ESCAPE’<換碼字元>'短語,對萬用字元進行轉義了。
【示例】

    select Cno, Ccredit from Course where Cname LIKE 'DB\_DESGN' ESCAPE '\';

    ESCAPE ''表示“\”為換碼 字元。這樣匹配串中緊跟在“\”後面的字元“”不再具有萬用字元的含義,轉義為普通的“”字元。

    select * from Course where Cname LIKE 'DB\_%i__' ESCAPE '\';

    這裡的匹配串為’DB_%i__’。第一個_ 前面有個換碼字元\,所以它被轉義為普通的_字元,而後面的兩個__前面均沒有換碼字元\,所以它們仍作為通配字元。

(e)涉及空值的查詢

    select Sno, Cno from SC where Grade is NULL;

注意:這裡的 is 不能用=代替。

(f)多重查詢條件
    邏輯運算子AND和OR可以用來聯結多個查詢條件,AND的優先順序高於OR,當用戶可以用括號改變優先順序。

    select Sname from Student where Sdept='CS' AND Sage < '20'; 

    select Sname, Ssex from Student where Sdept = 'CS' OR Sdept = 'MA' OR Sdept = 'IS';

(g)ORDER BY子句

    使用者可以用ORDER BY子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,預設值為升序。

    select Sno, Grade from SC where Cno='3' ORDER BY Grade DESC;

    對於空值,若按升序排,含空值的元組將最後顯示,若按降序排,空值的元組將最先顯示。

(h)聚集函式
    為了進一步方便使用者使用,增強檢索功能,SQL提供了許多的聚集函式,主要有:

    COUNT(DISTINCT | ALL] *)//統計元組個數
    COUNT([DISTINCT | ALL]<列名>)//統計一列中值的個數
    SUM([DISTINCT | ALL]<列名>)//計算一列值的總和(此列必須是數值型)
    AVG([DISTINCT | ALL]<列名>)//計算一列的平均值
    MAX([DISTINCT | ALL]<列名>)//求一列值中的最大值
    MIN([DISTINCT | ALL]<列名>)//求一列值中的最小值

    如果指定DISTINCT短語,則表示在計算時要取消指定列中的重複值。如果不指定DISTINCT短語或指定ALL短語(ALL為預設值),則表示不取消重複值。

(i)GROUP BY子句

    GROUP BY子句將查詢結果按照某一列或多列的值分組,值相等的為一組。
    對查詢結果分組的目的是為了細化聚集函式的作用物件。如果未對查詢結果進行分組,聚集函式將作用於整個查詢結果,分組後,聚集函式將作用於每個組,即每一組都有一個函式值。

    select Cno, COUNT(Sno) from SC GROUP BY Cno;

    該語句對查詢結果按Cno的值分組,所有具有相同Cno值的元組為一組,然後對每一組作用聚集函式COUNT計算,一求得該組的學生人數。

    如果分組後還要求按一定的條件對這些組進行篩選,最終只輸出滿足指定條件的組,則可以使用HAVING短語指定篩選條件。

    select Sno from SC GROUP BY Sno HAVING COUNT(3) > 3;

    這裡先用GROUP BY子句按Sno進行分組,再用聚集函式COUNT對每一組計數。HAVING短語給出了選擇組的條件,只有滿足條件(即元組個數大於3,表示此學生選修的課超過3門)的組才會被選出來。

    where子句與HAVING短語的區別在於作用物件不同。where子句作用於基本表或檢視,從中選擇滿足條件的元組,HAVING短語作用於組,從中選擇滿足條件的組。

(j)連線查詢

    若一個查詢同時涉及兩個以上的表,則稱之為連線查詢。連線查詢是關係資料庫中最重要的查詢,包括等值連線查詢、自然連線查詢、非等值連線查詢、自身連線查詢、外連線查詢和複合條件連線查詢等。

    連線查詢的where子句中用來連線兩個表的條件稱為連線條件或連線謂詞,其一般格式為:

    [<表名1>.]<列名1> <比較運算子> [<表名2>.]<列名2>

    當連線運算子為=時,稱為等值連線,使用其他運算子稱為非等值連線。

(k)巢狀查詢
    在SQL語句中,一個select-from-where語句稱為一個查血塊。將一個查詢塊巢狀在另一個查詢塊的where子句或者HAVING短語的條件中的查詢稱為巢狀查詢。

(l)集合查詢
    select語句的查詢結果是元組的集合,所以多個select語句的結果可進行集合操作。集合操作主要包括並操作UNION、交操作INTERSECT和差操作EXCEPT。注意,參加集合操作的各查詢結果的列數必須相同;對應項的資料型別也必須相同。

    select語句是SQL的核心語句,從上面的例子可以看出其語句成分豐富多樣,下面總結一下它們的一般格式。

    select [all | distinct]<目標表達式>[別名][,<目標表達式> [別名]] ...
    from <表名或檢視名> [別名][<表名或檢視名> [別名]]...
    [where <條件表示式>]
    [group by <列名1>[HAVING <條件表示式>]]
    [order by <列名2>[ASC | DESC]];

(4)資料控制

    SQL的資料控制功能包括事務管理功能和資料保護功能,即資料庫的回覆、併發控制,資料庫的安全性和完整性控制等。SQL語句有:GRANT(授權)、REVOKE(收權)
    GRANT語句的一般格式:

    GRANT <許可權>[,<許可權>] ...
    [ON <物件名>[,<物件名>]] ...
    TO <使用者>[,<使用者>] ...
    [WITH GRANT OPTION];

GRANT語句的功能:將對指定操作物件的指定操作許可權授予指定的使用者。
操作許可權

物件 物件型別 操作許可權
屬性列 TABLE SELECT, INSERT, UPDATE, DELETE, ALL, RIVIEGES
檢視 TABLE SELECT, INSERT, UPDATE, DELETE, ALL, RIVIEGES
基本表 TABLE SELECT, INSERET, UPDATE, DELETE, ALTER, INDEX, ALL, PRIVIEGES
資料庫 DATABASE CREATERTAB

【示例】把修改學生學號和修改學生姓名的許可權授權個使用者U1

    GRANT UPDATE(Sno), UPDATE(Sname)
    ON Student
    TO U1;

    指定了WITH GRANT OPTION子句:表示獲得某種許可權的使用者還可以吧這種許可權再授權給別的使用者。

    沒有指定WITH GRANT OPTION子句:獲得某種許可權的使用者只能使用該許可權,不能傳播該許可權。
【示例】

    GRANT SELECT 
    ON Course
    TO U1
    WITH GRANT OPTION;

REVOKE語句的功能:收回授予某個使用者的某種許可權。

REVOKE語句的一般格式為:

    REVOKE <許可權>[,<許可權>]
    [ON <物件型別> <物件名>]
    FROM <使用者>[,<使用者>]
    REVOKE select
    ON Student
    FROM U1;