数据库系统概论 学习笔记(三)第二部分

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連接。

你可能感兴趣的:(数据库,insert,character,delete,sql,null)