3.4 數據更新
3.4.1 插入數據(Insert Into) 一、插入單個元組
格式:Insert Into <表名> [(<列1>[,<列2>...)] values (<常量1>[,<常量2>]...);
說明:Into子句可以不指明任何列名,但values子句中必須為所有列指定值;
--插入一個新職員記錄(職員號:SH0001;姓名:劉備;性別:男;年齡:36;所在系:蜀)到Employees中:
Insert Into Employees Values('SH0001','劉備','男',36,'蜀'); --Into子句後不帶列名
--插入一條子程序記錄('fmSys001','系統權限')到Programs表中:
Insert Into Programs(Pid,Pname) Values('fmSys001','系統權限'); --Into子句後帶列名,Pdescription列上取空值
二、插入子查詢結果
格式:Insert into <表名>[(<列1>(,<列2>...)] 子查詢;
說明:如果不帶列名,則表示為所有的列插入值;子查詢返回的列個數和類型必須與表名後的列名個數和類型一致。
--復制Programs表中的記錄到另一個表(假設表名為programs2,少了一個Pdescription列):
Insert Into Programs2(Pid,Pname) Select Pid,Pname from programs;
3.4.2 修改數據
格式:Update <表名> Set <列名>=<表達式>[,<列名>=表達式>]... [where <條件>];
說明:如果不帶where子句,將對表中所有元組根據SET子句中給出的表達式的值取代相應的列值。
--將職員SH0001的年齡改為38歲:
Update Employees Set Eage=38 where Eid='SH0001' --只修改一個元組的值
--將所有職員的年齡加1歲:
Update Employees Set Eage=Eage+1 --修改多個元組的值
--將部門為“蜀”的所有職員的權限都改為1:
Update Authority Set Adefinition=1 where Eid=(select Eid from Employees where Edept='蜀' and Employees.Eid=Authority.Eid) --帶子查詢的修改語句
3.4.3 刪除數據
格式:Delete From <表名> [where <條件>];
說明:省略where子句時,將刪除表中的全部元組,但不會刪除表的定義。

/**//*刪除職員號為SH0001的職員記錄(依據上面表中的定義,刪除某一職員的記錄將會同步刪除Authority表的權限記錄:*/
Delete From Employees where Eid='SH0001' --刪除某一個元組的值
--刪除所有的職員權限記錄:
Delete From Authority --刪除多個元組的值
--刪除部門為“蜀”的所有職員的權限記錄:
Delete From Authority where Eid=(select Eid from Employees where Edept='蜀' and Employees.Eid=Authority.Eid) --帶子查詢的刪除語句
注意:在進行數據的更新操作時,需要注意數據的參照完整性問題,比如如果不對職員表與職員權限表定
義同步刪除的參照完整性,在刪除職員記錄時可能會因為某些原因而未能刪除權限表中的記錄,從而引起
數據的不一致。
3.3 查詢
數據庫查詢是數據庫的核心操作。動詞:Select。Select的定義很繁雜,略過不記,只需記住主體語句就可。Select語句相當於關係運算中的投影運算,但投影運算會去掉重復元組,而在SQL中要去掉重復元組須在Select語句後指定Distinct方可。
SQL表达式的基本结构由select子句、from子句和where子句构成,其中where子句可以省略,如下所示:
Select A1, A2, …, An 对应投影,列出要显示的属性
From r1, r2, …, rm 对应笛卡尔积,对关系进行扫描
Where P 对应谓词,指出查询条件
常用的查詢條件
比較:=、>、<、>=、<=、!=、!>、!<、Not +上述比較運算符
確定范圍:Between ? And ?、Not Between ? And ?
確定集合:In、Not In
字符匹配:Like、Not Like
空值:Is Null、Is Not Null
多重條件:And、Or
一、單表查詢
單表查詢比較簡單,比如:
--從Employees表中找出所有年齡在20到30歲之間的“蜀”部門的職員姓名和年齡:
Select Ename,Eage from Employees where Edept='蜀' and Eage between 20 and 30;
1、字符串操作
如果我们要对定长的字符串进行整体匹配,可以用"=",否则只能用like操作符。另外字符串除了进行匹配之外,还可以按照字典顺序等进行比较,例如字符串"a">字符串"b"。
另外需要特别注意的是,字符串常量可以括在双引号中,也可以括在单引号中。如果习惯使用单引号,则一定要注意字符串本身的单引号的转义问题,因为在很多时候,字符串是需要用单引号的。例如:This is Bonny's Article。
在like操作符的模式中:
⑴ 用百分号%(有时是星号*)匹配任意子串;
⑵ 用下划线_(有时是问号?)匹配任意一个字符;
⑶ 模式中是要区分字母的大小写的;
⑷ 在模式中为了使用特殊字符%和_等,允许用反斜线字符/将特殊字符转义成普通字符。例如:"a/%b%"和"a//b"等等。
--查詢程序名稱以“fm_”開頭,倒數第三個字符是“9”的所有子程序的詳細情況:
select *
from Programs
where Pname like 'fm/_%i__' ESCAPE '/'

/**//*說明:
ESCAPE 'escape_character'
允許萬用字元在字元字串中進行搜尋,而不是用來做為萬用字元,escape_character 是置於萬用字元前方的字元,用以代表這項特殊用途。
*/
2、排序
用Order By對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列
3、集合函數
主要有Count、Sum、Max、Min、Avg五種。
4、分組
Group by子句將照查詢結果表按某一列或多列值分組,值相同的為一組。
Having子句將分組後的結果按指定條件進行篩選。
--查詢各個子程序號及相應被賦予權限的人數
select Pid,count(Pid)
from Authority
Group by pid
--查詢被賦予了三個以上權限的職員代號
select Eid
from Authority
Group by Eid
Having count(*)>3
二、連接查詢
同時涉及兩個以上表的查詢稱之為連接查詢。
1、等值和非等值連接
連接運算符為=的稱之為等值連接,其它的叫非等值連接。
2、自身連接
這種情況發生在一個表與其自身進行連接的時候。
3、外連接
適用於同時需要查詢滿足條件和不滿足條件的信息。
--查詢所有職員的權限分配情況
select E.*,A.Pid
from Employees E,Authority A
where E.Eid=A.Eid(*)
--以上語句是標准SQL語法,Transact-SQL語法為:
select E.*,A.Pid
from Employees E left join Authority A ON E.Eid=A.Eid
4、復合條件連接
where子句中有多個連接條件的。各個連接條件用AND連接。