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
'
/
'
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
/**/
/*說明:
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連接。