3.4 數據更新
3.4.1 插入數據(Insert Into)
一、插入單個元組
格式:Insert Into <表名> [(<列1>[,<列2>...)] values (<常量1>[,<常量2>]...);
說明:Into子句可以不指明任何列名,但values子句中必須為所有列指定值;
Insert Into Employees Values ( ' SH0001 ' , ' 劉備 ' , ' 男 ' , 36 , ' 蜀 ' ); -- Into子句後不帶列名
-- 插入一條子程序記錄('fmSys001','系統權限')到Programs表中:
Insert Into Programs(Pid,Pname) Values ( ' fmSys001 ' , ' 系統權限 ' ); -- Into子句後帶列名,Pdescription列上取空值
二、插入子查詢結果
格式:Insert into <表名>[(<列1>(,<列2>...)] 子查詢;
說明:如果不帶列名,則表示為所有的列插入值;子查詢返回的列個數和類型必須與表名後的列名個數和類型一致。
Insert Into Programs2(Pid,Pname) Select Pid,Pname from programs;
3.4.2 修改數據
格式:Update <表名> Set <列名>=<表達式>[,<列名>=表達式>]... [where <條件>];
說明:如果不帶where子句,將對表中所有元組根據SET子句中給出的表達式的值取代相應的列值。
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子句時,將刪除表中的全部元組,但不會刪除表的定義。
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方可。
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
一、單表查詢
單表查詢比較簡單,比如:
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"等等。
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連接。