欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

sqlserver斷言,sql中的斷言機(jī)制用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)的

T-SQL的基本語(yǔ)法

經(jīng)典SQL語(yǔ)句大全下列語(yǔ)句部分是Mssql語(yǔ)句,不可以在access中使用。

目前創(chuàng)新互聯(lián)建站已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、沁水網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

SQL分類:

DDL—數(shù)據(jù)定義語(yǔ)言(CREATE,ALTER,DROP,DECLARE)

DML—數(shù)據(jù)操縱語(yǔ)言(SELECT,DELETE,UPDATE,INSERT)

DCL—數(shù)據(jù)控制語(yǔ)言(GRANT,REVOKE,COMMIT,ROLLBACK)

首先,簡(jiǎn)要介紹基礎(chǔ)語(yǔ)句:

1、說(shuō)明:創(chuàng)建數(shù)據(jù)庫(kù)

CREATE DATABASE database-name

2、說(shuō)明:刪除數(shù)據(jù)庫(kù)

drop database dbname

3、說(shuō)明:備份sql server

--- 創(chuàng)建 備份數(shù)據(jù)的 device

USE master

EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

--- 開(kāi)始 備份

BACKUP DATABASE pubs TO testBack

4、說(shuō)明:創(chuàng)建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根據(jù)已有的表創(chuàng)建新表:

A:create table tab_new like tab_old (使用舊表創(chuàng)建新表)

B:create table tab_new as select col1,col2… from tab_old definition only

5、說(shuō)明:

刪除新表:drop table tabname

6、說(shuō)明:

增加一個(gè)列:Alter table tabname add column col type

注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長(zhǎng)度。

7、說(shuō)明:

添加主鍵:Alter table tabname add primary key(col)

說(shuō)明:

刪除主鍵:Alter table tabname drop primary key(col)

8、說(shuō)明:

創(chuàng)建索引:create [unique] index idxname on tabname(col….)

刪除索引:drop index idxname

注:索引是不可更改的,想更改必須刪除重新建。

9、說(shuō)明:

創(chuàng)建視圖:create view viewname as select statement

刪除視圖:drop view viewname

10、說(shuō)明:幾個(gè)簡(jiǎn)單的基本的sql語(yǔ)句

選擇:select * from table1 where 范圍

插入:insert into table1(field1,field2) values(value1,value2)

刪除:delete from table1 where 范圍

更新:update table1 set field1=value1 where 范圍

查找:select * from table1 where field1 like ’%value1%’ ---like的語(yǔ)法很精妙,查資料!

排序:select * from table1 order by field1,field2 [desc]

總數(shù):select count * as totalcount from table1

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1

11、說(shuō)明:幾個(gè)高級(jí)查詢運(yùn)算詞

A: UNION 運(yùn)算符

UNION 運(yùn)算符通過(guò)組合其他兩個(gè)結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 UNION 一起使用時(shí)(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來(lái)自 TABLE1 就是來(lái)自 TABLE2。

B: EXCEPT 運(yùn)算符

EXCEPT 運(yùn)算符通過(guò)包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時(shí) (EXCEPT ALL),不消除重復(fù)行。

C: INTERSECT 運(yùn)算符

INTERSECT 運(yùn)算符通過(guò)只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時(shí) (INTERSECT ALL),不消除重復(fù)行。

注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。

12、說(shuō)明:使用外連接

A、left outer join:

左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join:

右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。

C:full outer join:

全外連接:不僅包括符號(hào)連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。

其次,大家來(lái)看一些不錯(cuò)的sql語(yǔ)句

1、說(shuō)明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b) (Access可用)

法一:select * into b from a where 11

法二:select top 0 * into b from a

2、說(shuō)明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標(biāo)表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、說(shuō)明:跨數(shù)據(jù)庫(kù)之間表的拷貝(具體數(shù)據(jù)使用絕對(duì)路徑) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具體數(shù)據(jù)庫(kù)’ where 條件

例子:..from b in '"Server.MapPath(".")"\data.mdb" "' where..

4、說(shuō)明:子查詢(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說(shuō)明:顯示文章、提交人和最后回復(fù)時(shí)間

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、說(shuō)明:外連接查詢(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說(shuō)明:在線視圖查詢(表名1:a )

select * from (SELECT a,b,c FROM a) T where t.a 1;

8、說(shuō)明:between的用法,between限制查詢數(shù)據(jù)范圍時(shí)包括了邊界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 數(shù)值1 and 數(shù)值2

9、說(shuō)明:in 的使用方法

select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、說(shuō)明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒(méi)有的信息

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、說(shuō)明:四表聯(lián)查問(wèn)題:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、說(shuō)明:日程安排提前五分鐘提醒

SQL: select * from 日程安排 where datediff('minute',f開(kāi)始時(shí)間,getdate())5

13、說(shuō)明:一條sql 語(yǔ)句搞定數(shù)據(jù)庫(kù)分頁(yè)

select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

14、說(shuō)明:前10條記錄

select top 10 * form table1 where 范圍

15、說(shuō)明:選擇在每一組b值相同的數(shù)據(jù)中對(duì)應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績(jī)排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、說(shuō)明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表

(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、說(shuō)明:隨機(jī)取出10條數(shù)據(jù)

select top 10 * from tablename order by newid()

18、說(shuō)明:隨機(jī)選擇記錄

select newid()

19、說(shuō)明:刪除重復(fù)記錄

Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、說(shuō)明:列出數(shù)據(jù)庫(kù)里所有的表名

select name from sysobjects where type='U'

21、說(shuō)明:列出表里的所有的

select name from syscolumns where id=object_id('TableName')

22、說(shuō)明:列示type、vender、pcs字段,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,類似select 中的case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type

顯示結(jié)果:

type vender pcs

電腦 A 1

電腦 A 1

光盤 B 2

光盤 A 2

手機(jī) B 3

手機(jī) C 3

23、說(shuō)明:初始化表table1

TRUNCATE TABLE table1

24、說(shuō)明:選擇從10到15的記錄

select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

隨機(jī)選擇數(shù)據(jù)庫(kù)記錄的方法(使用Randomize函數(shù),通過(guò)SQL語(yǔ)句實(shí)現(xiàn))

對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)來(lái)說(shuō),隨機(jī)數(shù)特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個(gè)隨機(jī)數(shù)”然后打印出來(lái)。實(shí)際上常見(jiàn)的解決方案是建立如下所示的循環(huán):

Randomize

RNumber = Int(Rnd*499) +1

 

While Not objRec.EOF

If objRec("ID") = RNumber THEN

... 這里是執(zhí)行腳本 ...

end if

objRec.MoveNext

Wend

這很容易理解。首先,你取出1到500范圍之內(nèi)的一個(gè)隨機(jī)數(shù)(假設(shè)500就是數(shù)據(jù)庫(kù)內(nèi)記錄的總數(shù))。然后,你遍歷每一記錄來(lái)測(cè)試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執(zhí)行由THEN 關(guān)鍵字開(kāi)始的那一塊代碼。假如你的RNumber 等于495,那么要循環(huán)一遍數(shù)據(jù)庫(kù)花的時(shí)間可就長(zhǎng)了。雖然500這個(gè)數(shù)字看起來(lái)大了些,但相比更為穩(wěn)固的企業(yè)解決方案這還是個(gè)小型數(shù)據(jù)庫(kù)了,后者通常在一個(gè)數(shù)據(jù)庫(kù)內(nèi)就包含了成千上萬(wàn)條記錄。這時(shí)候不就死定了?

采用SQL,你就可以很快地找出準(zhǔn)確的記錄并且打開(kāi)一個(gè)只包含該記錄的recordset,如下所示:

Randomize

RNumber = Int(Rnd*499) + 1

 

SQL = "SELECT * FROM Customers WHERE ID = " RNumber

 

set objRec = ObjConn.Execute(SQL)

Response.WriteRNumber " = " objRec("ID") " " objRec("c_email")

不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對(duì)以上代碼的工作滿意,你自可按需操作“隨機(jī)”記錄。Recordset沒(méi)有包含其他內(nèi)容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時(shí)間。

再談隨機(jī)數(shù)

現(xiàn)在你下定決心要榨干Random 函數(shù)的最后一滴油,那么你可能會(huì)一次取出多條隨機(jī)記錄或者想采用一定隨機(jī)范圍內(nèi)的記錄。把上面的標(biāo)準(zhǔn)Random 示例擴(kuò)展一下就可以用SQL應(yīng)對(duì)上面兩種情況了。

為了取出幾條隨機(jī)選擇的記錄并存放在同一recordset內(nèi),你可以存儲(chǔ)三個(gè)隨機(jī)數(shù),然后查詢數(shù)據(jù)庫(kù)獲得匹配這些數(shù)字的記錄:

SQL = "SELECT * FROM Customers WHERE ID = " RNumber " OR ID = " RNumber2 " OR ID = " RNumber3

假如你想選出10條記錄(也許是每次頁(yè)面裝載時(shí)的10條鏈接的列表),你可以用BETWEEN 或者數(shù)學(xué)等式選出第一條記錄和適當(dāng)數(shù)量的遞增記錄。這一操作可以通過(guò)好幾種方式來(lái)完成,但是 SELECT 語(yǔ)句只顯示一種可能(這里的ID 是自動(dòng)生成的號(hào)碼):

SQL = "SELECT * FROM Customers WHERE ID BETWEEN " RNumber " AND " RNumber "+ 9"

注意:以上代碼的執(zhí)行目的不是檢查數(shù)據(jù)庫(kù)內(nèi)是否有9條并發(fā)記錄。

隨機(jī)讀取若干條記錄,測(cè)試過(guò)

Access語(yǔ)法:SELECT top 10 * From 表名 ORDER BY Rnd(id)

Sql server:select top n * from 表名 order by newid()

mysql select * From 表名 Order By rand() Limit n

Access左連接語(yǔ)法(最近開(kāi)發(fā)要用左連接,Access幫助什么都沒(méi)有,網(wǎng)上沒(méi)有Access的SQL說(shuō)明,只有自己測(cè)試, 現(xiàn)在記下以備后查)

語(yǔ)法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...

使用SQL語(yǔ)句 用...代替過(guò)長(zhǎng)的字符串顯示

語(yǔ)法:

SQL數(shù)據(jù)庫(kù):select case when len(field)10 then left(field,10)+'...' else field end as news_name,news_id from tablename

Access數(shù)據(jù)庫(kù):SELECT iif(len(field)2,left(field,2)+'...',field) FROM tablename;

Conn.Execute說(shuō)明

Execute方法

該方法用于執(zhí)行SQL語(yǔ)句。根據(jù)SQL語(yǔ)句執(zhí)行后是否返回記錄集,該方法的使用格式分為以下兩種:

1.執(zhí)行SQL查詢語(yǔ)句時(shí),將返回查詢得到的記錄集。用法為:

Set 對(duì)象變量名=連接對(duì)象.Execute("SQL 查詢語(yǔ)言")

Execute方法調(diào)用后,會(huì)自動(dòng)創(chuàng)建記錄集對(duì)象,并將查詢結(jié)果存儲(chǔ)在該記錄對(duì)象中,通過(guò)Set方法,將記錄集賦給指定的對(duì)象保存,以后對(duì)象變量就代表了該記錄集對(duì)象。

2.執(zhí)行SQL的操作性語(yǔ)言時(shí),沒(méi)有記錄集的返回。此時(shí)用法為:

連接對(duì)象.Execute "SQL 操作性語(yǔ)句" [, RecordAffected][, Option]

·RecordAffected 為可選項(xiàng),此出可放置一個(gè)變量,SQL語(yǔ)句執(zhí)行后,所生效的記錄數(shù)會(huì)自動(dòng)保存到該變量中。通過(guò)訪問(wèn)該變量,就可知道SQL語(yǔ)句隊(duì)多少條記錄進(jìn)行了操作。

·Option 可選項(xiàng),該參數(shù)的取值通常為adCMDText,它用于告訴ADO,應(yīng)該將Execute方法之后的第一個(gè)字符解釋為命令文本。通過(guò)指定該參數(shù),可使執(zhí)行更高效。

·BeginTrans、RollbackTrans、CommitTrans方法

這三個(gè)方法是連接對(duì)象提供的用于事務(wù)處理的方法。BeginTrans用于開(kāi)始一個(gè)事物;RollbackTrans用于回滾事務(wù);CommitTrans用于提交所有的事務(wù)處理結(jié)果,即確認(rèn)事務(wù)的處理。

事務(wù)處理可以將一組操作視為一個(gè)整體,只有全部語(yǔ)句都成功執(zhí)行后,事務(wù)處理才算成功;若其中有一個(gè)語(yǔ)句執(zhí)行失敗,則整個(gè)處理就算失敗,并恢復(fù)到處里前的狀態(tài)。

BeginTrans和CommitTrans用于標(biāo)記事務(wù)的開(kāi)始和結(jié)束,在這兩個(gè)之間的語(yǔ)句,就是作為事務(wù)處理的語(yǔ)句。判斷事務(wù)處理是否成功,可通過(guò)連接對(duì)象的Error集合來(lái)實(shí)現(xiàn),若Error集合的成員個(gè)數(shù)不為0,則說(shuō)明有錯(cuò)誤發(fā)生,事務(wù)處理失敗。Error集合中的每一個(gè)Error對(duì)象,代表一個(gè)錯(cuò)誤信息。

SQL語(yǔ)句大全精要

2006/10/26 13:46

DELETE語(yǔ)句

DELETE語(yǔ)句:用于創(chuàng)建一個(gè)刪除查詢,可從列在 FROM 子句之中的一個(gè)或多個(gè)表中刪除記錄,且該子句滿足 WHERE 子句中的條件,可以使用DELETE刪除多個(gè)記錄。

語(yǔ)法:DELETE [table.*] FROM table WHERE criteria

語(yǔ)法:DELETE * FROM table WHERE criteria='查詢的字'

說(shuō)明:table參數(shù)用于指定從其中刪除記錄的表的名稱。

criteria參數(shù)為一個(gè)表達(dá)式,用于指定哪些記錄應(yīng)該被刪除的表達(dá)式。

可以使用 Execute 方法與一個(gè) DROP 語(yǔ)句從數(shù)據(jù)庫(kù)中放棄整個(gè)表。不過(guò),若用這種方法刪除表,將會(huì)失去表的結(jié)構(gòu)。不同的是當(dāng)使用 DELETE,只有數(shù)據(jù)會(huì)被刪除;表的結(jié)構(gòu)以及表的所有屬性仍然保留,例如字段屬性及索引。UPDATE

有關(guān)UPDATE,急!!!!!!!!!!!

在ORACLE數(shù)據(jù)庫(kù)中

表 A ( ID ,FIRSTNAME,LASTNAME )

表 B( ID,LASTNAME)

表 A 中原來(lái)ID,FIRSTNAME兩個(gè)字段的數(shù)據(jù)是完整的

表 B中原來(lái)ID,LASTNAME兩個(gè)字段的數(shù)據(jù)是完整的

現(xiàn)在要把表 B中的LASTNAME字段的相應(yīng)的數(shù)據(jù)填入到A表中LASTNAME相應(yīng)的位置。兩個(gè)表中的ID字段是相互關(guān)聯(lián)的。

先謝謝了!!!!

update a set a.lastname=(select b.lastname from b where a.id=b.id)掌握SQL四條最基本的數(shù)據(jù)操作語(yǔ)句:Insert,Select,Update和Delete。

練掌握SQL是數(shù)據(jù)庫(kù)用戶的寶貴財(cái) 富。在本文中,我們將引導(dǎo)你掌握四條最基本的數(shù)據(jù)操作語(yǔ)句—SQL的核心功能—來(lái)依次介紹比較操作符、選擇斷言以及三值邏輯。當(dāng)你完成這些學(xué)習(xí)后,顯然你已經(jīng)開(kāi)始算是精通SQL了。

在我們開(kāi)始之前,先使用CREATE TABLE語(yǔ)句來(lái)創(chuàng)建一個(gè)表(如圖1所示)。DDL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)對(duì)象如表、列和視進(jìn)行定義。它們并不對(duì)表中的行進(jìn)行處理,這是因?yàn)镈DL語(yǔ)句并不處理數(shù)據(jù)庫(kù)中實(shí)際的數(shù)據(jù)。這些工作由另一類SQL語(yǔ)句—數(shù)據(jù)操作語(yǔ)言(DML)語(yǔ)句進(jìn)行處理。

SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于這是大多數(shù)SQL用戶經(jīng)常用到的,我們有必要在此對(duì)它們進(jìn)行一一說(shuō)明。在圖1中我們給出了一個(gè)名為EMPLOYEES的表。其中的每一行對(duì)應(yīng)一個(gè)特定的雇員記錄。請(qǐng)熟悉這張表,我們?cè)诤竺娴睦又袑⒁玫剿?/p>

TOP

DB2和其他數(shù)據(jù)庫(kù)在一些SQL語(yǔ)法上的區(qū)別?

Access是一種桌面數(shù)據(jù)庫(kù),只適合數(shù)據(jù)量少的應(yīng)用,在處理少量數(shù)據(jù)和單機(jī)訪問(wèn)的數(shù)據(jù)庫(kù)時(shí)是很好的,效率也很高。但是它的同時(shí)訪問(wèn)客戶端不能多于4個(gè)。access數(shù)據(jù)庫(kù)有一定的極限,如果數(shù)據(jù)達(dá)到100M左右,很容易造成服務(wù)器iis假死,或者消耗掉服務(wù)器的內(nèi)存導(dǎo)致服務(wù)器崩潰。

SQL Server是基于服務(wù)器端的中型的數(shù)據(jù)庫(kù),可以適合大容量數(shù)據(jù)的應(yīng)用,在功能上管理上也要比Access要強(qiáng)得多。在處理海量數(shù)據(jù)的效率,后臺(tái)開(kāi)發(fā)的靈活性,可擴(kuò)展性等方面強(qiáng)大。因?yàn)楝F(xiàn)在數(shù)據(jù)庫(kù)都使用標(biāo)準(zhǔn)的SQL語(yǔ)言對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理,所以如果是標(biāo)準(zhǔn)SQL語(yǔ)言,兩者基本上都可以通用的。SQL Server還有更多的擴(kuò)展,可以用存儲(chǔ)過(guò)程,數(shù)據(jù)庫(kù)大小無(wú)極限限制。

mysql2000和sql2000數(shù)據(jù)庫(kù)的區(qū)別

1.根本的區(qū)別是它們遵循的基本原則

二者所遵循的基本原則是它們的主要區(qū)別:開(kāi)放vs保守。SQL服務(wù)器的狹隘的,保守的存儲(chǔ)引擎與MySQL服務(wù)器的可擴(kuò)展,開(kāi)放的存儲(chǔ)引擎絕然不同。雖然你可以使用SQL服務(wù)器的Sybase引擎,但MySQL能夠提供更多種的選擇,如MyISAM, Heap, InnoDB, and Berkeley DB。MySQL不完全支持陌生的關(guān)鍵詞,所以它比SQL服務(wù)器要少一些相關(guān)的數(shù)據(jù)庫(kù)。同時(shí),MySQL也缺乏一些存儲(chǔ)程序的功能,比如MyISAM引擎聯(lián)支持交換功能。

2.性能:先進(jìn)的MySQL

純粹就性能而言,MySQL是相當(dāng)出色的,因?yàn)樗粋€(gè)缺省桌面格式MyISAM。MyISAM 數(shù)據(jù)庫(kù)與磁盤非常地兼容而不占用過(guò)多的CPU和內(nèi)存。MySQL可以運(yùn)行于Windows系統(tǒng)而不會(huì)發(fā)生沖突,在UNIX或類似UNIX系統(tǒng)上運(yùn)行則更好。你還可以通過(guò)使用64位處理器來(lái)獲取額外的一些性能。因?yàn)镸ySQL在內(nèi)部里很多時(shí)候都使用64位的整數(shù)處理。Yahoo!商業(yè)網(wǎng)站就使用MySQL作為后臺(tái)數(shù)據(jù)庫(kù)。

當(dāng)提及軟件的性能,SQL服務(wù)器的穩(wěn)定性要比它的競(jìng)爭(zhēng)對(duì)手強(qiáng)很多。但是,這些特性也要付出代價(jià)的。比如,必須增加額外復(fù)雜操作,磁盤存儲(chǔ),內(nèi)存損耗等等。如果你的硬件和軟件不能充分支持SQL服務(wù)器,我建議你最好選擇其他如DBMS數(shù)據(jù)庫(kù),因?yàn)檫@樣你會(huì)得到更好的結(jié)果。

3.發(fā)行費(fèi)用:MySQL不全是免費(fèi),但很便宜

當(dāng)提及發(fā)行的費(fèi)用,這兩個(gè)產(chǎn)品采用兩種絕然不同的決策。對(duì)于SQL服務(wù)器,獲取一個(gè)免費(fèi)的開(kāi)發(fā)費(fèi)用最常的方式是購(gòu)買微軟的Office或者Visual Studio的費(fèi)用。但是,如果你想用于商業(yè)產(chǎn)品的開(kāi)發(fā),你必須還要購(gòu)買SQL Server Standard Edition。學(xué)校或非贏利的企業(yè)可以不考慮這一附加的費(fèi)用。

4.安全功能

MySQL有一個(gè)用于改變數(shù)據(jù)的二進(jìn)制日志。因?yàn)樗嵌M(jìn)制,這一日志能夠快速地從主機(jī)上復(fù)制數(shù)據(jù)到客戶機(jī)上。即使服務(wù)器崩潰,這一二進(jìn)制日志也會(huì)保持完整,而且復(fù)制的部分也不會(huì)受到損壞。

在SQL服務(wù)器中,你也可以記錄SQL的有關(guān)查詢,但這需要付出很高的代價(jià)。

安全性

這兩個(gè)產(chǎn)品都有自己完整的安全機(jī)制。只要你遵循這些安全機(jī)制,一般程序都不會(huì)出現(xiàn)什么問(wèn)題。這兩者都使用缺省的IP端口,但是有時(shí)候很不幸,這些IP也會(huì)被一些黑客闖入。當(dāng)然,你也可以自己設(shè)置這些IP端口。

恢復(fù)性:先進(jìn)的SQL服務(wù)器

恢復(fù)性也是MySQL的一個(gè)特點(diǎn),這主要表現(xiàn)在MyISAM配置中。這種方式有它固有的缺欠,如果你不慎損壞數(shù)據(jù)庫(kù),結(jié)果可能會(huì)導(dǎo)致所有的數(shù)據(jù)丟失。然而,對(duì)于SQL服務(wù)器而言就表現(xiàn)得很穩(wěn)鍵。SQL服務(wù)器能夠時(shí)刻監(jiān)測(cè)數(shù)據(jù)交換點(diǎn)并能夠把數(shù)據(jù)庫(kù)損壞的過(guò)程保存下來(lái)。

Oracle和SQL Server之間的區(qū)別,已經(jīng)有很多篇文章從企業(yè)的角度和數(shù)據(jù)庫(kù)管理員的角度出發(fā)描寫了兩者之間的一般差別。在這篇文章里面,我將會(huì)從應(yīng)用程序的角度向你描述SQL erver 和oracle平臺(tái)之間的區(qū)別,并且將會(huì)討論開(kāi)發(fā)不依賴于數(shù)據(jù)庫(kù)環(huán)境的應(yīng)用程序的幾種可能的方法。與此同時(shí),我不會(huì)再論討對(duì)于應(yīng)用程序來(lái)說(shuō),兩個(gè)平臺(tái)之間顯而易見(jiàn)的區(qū)別,例如表的分割和索引。

定義通用接口和語(yǔ)言有很少的幾種通用語(yǔ)言和接口可以讓應(yīng)用程序不依賴于數(shù)據(jù)庫(kù),想來(lái)也可以以同樣的方式應(yīng)用在關(guān)系型數(shù)據(jù)庫(kù)上面: ANSI是美國(guó)國(guó)家標(biāo)準(zhǔn)局定義的,這是一家志愿者成員的組織(用私人基金運(yùn)轉(zhuǎn)),他們?cè)谟嘘P(guān)設(shè)備和程序等廣泛領(lǐng)域內(nèi)開(kāi)發(fā)了國(guó)家承認(rèn)的標(biāo)準(zhǔn)。在數(shù)據(jù)庫(kù)領(lǐng)域,ANSI定義了編寫SQL命令的標(biāo)準(zhǔn),假設(shè)命令可以運(yùn)行在任何的數(shù)據(jù)庫(kù)上,而不需要更改命令的語(yǔ)法。ODBC是開(kāi)放數(shù)據(jù)庫(kù)連接(ODBC)接口,微軟定義的,它可以讓應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中的數(shù)據(jù),使用SQL作為訪問(wèn)數(shù)據(jù)的標(biāo)準(zhǔn)。ODBC允許最大的互聯(lián)性,這意味著一個(gè)單個(gè)的應(yīng)用程序可以訪問(wèn)不同的數(shù)據(jù)庫(kù)管理系統(tǒng)。然后,應(yīng)用程序終端用戶可以添加開(kāi)放數(shù)據(jù)庫(kù)連接(ODBC)數(shù)據(jù)庫(kù)驅(qū)動(dòng)來(lái)將應(yīng)用程序與他們所選擇的數(shù)據(jù)庫(kù)管理系統(tǒng)鏈接上。 OLE DB是ODBC的繼承者,是一組允許例如基于VB、C++、Access等任何可以連接到類似SQL Server、Oracle、DB2、MySQL等后臺(tái)的“前臺(tái)”的軟件組件。在許多種情況下,OLE DB組件都比原有的ODBC提供了好得多的性能。 JDBC(Java數(shù)據(jù)庫(kù)連接)應(yīng)用程序接口是Java編程語(yǔ)言和廣泛范圍的數(shù)據(jù)庫(kù),SQL數(shù)據(jù)庫(kù)和其他表列數(shù)據(jù)源(例如電子表格或者普通文本文件)之間,進(jìn)行不依賴于數(shù)據(jù)庫(kù)的連接的行業(yè)標(biāo)準(zhǔn)。JDBD應(yīng)用程序接口為基于SQL的數(shù)據(jù)庫(kù)訪問(wèn)提供了調(diào)用級(jí)別的應(yīng)用程序接口。真實(shí)世界中的通用接口不幸的是,并不是所有數(shù)據(jù)庫(kù)級(jí)別的命令都是ANSI,每個(gè)數(shù)據(jù)庫(kù)平臺(tái)都有自己的擴(kuò)展功能。對(duì)于ANSI或者通用接口,一般來(lái)說(shuō)都代表著幾本功能,因此也可能意味著喪失了性能方面的競(jìng)爭(zhēng)力。對(duì)于小型數(shù)據(jù)庫(kù)和小型應(yīng)用程序來(lái)說(shuō),要維護(hù)對(duì)數(shù)據(jù)庫(kù)的通用訪問(wèn)是簡(jiǎn)單的,但是當(dāng)數(shù)據(jù)庫(kù)和/或應(yīng)用程序變得越來(lái)越大,越來(lái)越復(fù)雜,你就不得不向代碼中添加功能。

SQL Server和Oracle的常用函數(shù)對(duì)比

---------數(shù)學(xué)函數(shù)

1.絕對(duì)值

S:select abs(-1) value

O:select abs(-1) value from dual

2.取整(大)

S:select ceiling(-1.001) value

O:select ceil(-1.001) value from dual

3.取整(小)

S:select floor(-1.001) value

O:select floor(-1.001) value from dual

4.取整(截取)

S:select cast(-1.002 as int) value

O:select trunc(-1.002) value from dual

5.四舍五入

S:select round(1.23456,4) value 1.23460

O:select round(1.23456,4) value from dual 1.2346

6.e為底的冪

S:select Exp(1) value 2.7182818284590451

O:select Exp(1) value from dual 2.71828182

7.取e為底的對(duì)數(shù)

S:select log(2.7182818284590451) value 1

O:select ln(2.7182818284590451) value from dual; 1

8.取10為底對(duì)數(shù)

S:select log10(10) value 1

O:select log(10,10) value from dual; 1

9.取平方

S:select SQUARE(4) value 16

O:select power(4,2) value from dual 16

10.取平方根

S:select SQRT(4) value 2

O:select SQRT(4) value from dual 2

11.求任意數(shù)為底的冪

S:select power(3,4) value 81

O:select power(3,4) value from dual 81

12.取隨機(jī)數(shù)

S:select rand() value

O:select sys.dbms_random.value(0,1) value from dual;

13.取符號(hào)

S:select sign(-8) value -1

O:select sign(-8) value from dual -1

----------三角函數(shù)相關(guān)

14.圓周率

S:SELECT PI() value 3.1415926535897931

O:不知道

15.sin,cos,tan 參數(shù)都以弧度為單位

例如:select sin(PI()/2) value 得到1(SQLServer)

16.Asin,Acos,Atan,Atan2 返回弧度

17.弧度角度互換(SQLServer,Oracle不知道)

DEGREES:弧度-〉角度

RADIANS:角度-〉弧度

---------數(shù)值間比較

18. 求集合最大值

S:select max(value) value from

(select 1 value

union

select -2 value

union

select 4 value

union

select 3 value)a

O:select greatest(1,-2,4,3) value from dual

19. 求集合最小值

S:select min(value) value from

(select 1 value

union

select -2 value

union

select 4 value

union

select 3 value)a

O:select least(1,-2,4,3) value from dual

20.如何處理null值(F2中的null以10代替)

S:select F1,IsNull(F2,10) value from Tbl

O:select F1,nvl(F2,10) value from Tbl

--------字符串函數(shù)

21.求字符序號(hào)

S:select ascii('a') value

O:select ascii('a') value from dual

22.從序號(hào)求字符

S:select char(97) value

O:select chr(97) value from dual

23.連接

S:select '11'+'22'+'33' value

O:select CONCAT('11','22')||33 value from dual

23.子串位置 --返回3

S:select CHARINDEX('s','sdsq',2) value

O:select INSTR('sdsq','s',2) value from dual

23.模糊子串的位置 --返回2,參數(shù)去掉中間%則返回7

// 本文轉(zhuǎn)自 C++Builder 研究 - [url][/url]

S:select patindex('%d%q%','sdsfasdqe') value

O:oracle沒(méi)發(fā)現(xiàn),但是instr可以通過(guò)第四個(gè)參數(shù)控制出現(xiàn)次數(shù)

select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

24.求子串

S:select substring('abcd',2,2) value

O:select substr('abcd',2,2) value from dual

25.子串代替 返回aijklmnef

S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value

O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

26.子串全部替換

S:Replace

O:select Translate('fasdbfasegas','fa','我' ) value from dual

27.長(zhǎng)度

S:len,datalength

O:length

28.大小寫轉(zhuǎn)換 lower,upper

29.單詞首字母大寫

S:沒(méi)發(fā)現(xiàn)

O:select INITCAP('abcd dsaf df') value from dual

30.左補(bǔ)空格(LPAD的第一個(gè)參數(shù)為空格則同space函數(shù))

S:select space(10)+'abcd' value

O:select LPAD('abcd',14) value from dual

31.右補(bǔ)空格(RPAD的第一個(gè)參數(shù)為空格則同space函數(shù))

S:select 'abcd'+space(10) value

O:select RPAD('abcd',14) value from dual

32.刪除空格

S:ltrim,rtrim

O:ltrim,rtrim,trim

33. 重復(fù)字符串

S:select REPLICATE('abcd',2) value

O:沒(méi)發(fā)現(xiàn)

34.發(fā)音相似性比較(這兩個(gè)單詞返回值一樣,發(fā)音相同)

S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')

O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual

SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差

返回0-4,4為同音,1最高

--------------日期函數(shù)

35.系統(tǒng)時(shí)間

S:select getdate() value

O:select sysdate value from dual

36.前后幾日

直接與整數(shù)相加減

37.求日期

S:select convert(char(10),getdate(),20) value

O:select trunc(sysdate) value from dual

select to_char(sysdate,'yyyy-mm-dd') value from dual

38.求時(shí)間

S:select convert(char(8),getdate(),108) value

O:select to_char(sysdate,'hh24:mm:ss') value from dual

39.取日期時(shí)間的其他部分

S:DATEPART 和 DATENAME 函數(shù) (第一個(gè)參數(shù)決定)

O:to_char函數(shù) 第二個(gè)參數(shù)決定

參數(shù)---------------------------------下表需要補(bǔ)充

year yy, yyyy

quarter qq, q (季度)

month mm, m (m O無(wú)效)

dayofyear dy, y (O表星期)

day dd, d (d O無(wú)效)

week wk, ww (wk O無(wú)效)

weekday dw (O不清楚)

Hour hh,hh12,hh24 (hh12,hh24 S無(wú)效)

minute mi, n (n O無(wú)效)

second ss, s (s O無(wú)效)

millisecond ms (O無(wú)效)

----------------------------------------------

40.當(dāng)月最后一天

S:不知道

O:select LAST_DAY(sysdate) value from dual

41.本星期的某一天(比如星期日)

S:不知道

O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

42.字符串轉(zhuǎn)時(shí)間

S:可以直接轉(zhuǎn)或者select cast('2004-09-08'as datetime) value

O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

43.求兩日期某一部分的差(比如秒)

S:select datediff(ss,getdate(),getdate()+12.3) value

O:直接用兩個(gè)日期相減(比如d1-d2=12.3)

SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

44.根據(jù)差值求新的日期(比如分鐘)

S:select dateadd(mi,8,getdate()) value

O:SELECT sysdate+8/60/24 vaule FROM DUAL;

45.求不同時(shí)區(qū)時(shí)間

S:不知道

O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

-----時(shí)區(qū)參數(shù),北京在東8區(qū)應(yīng)該是Ydt-------

AST ADT 大西洋標(biāo)準(zhǔn)時(shí)間

BST BDT 白令海標(biāo)準(zhǔn)時(shí)間

CST CDT 中部標(biāo)準(zhǔn)時(shí)間

EST EDT 東部標(biāo)準(zhǔn)時(shí)間

GMT 格林尼治標(biāo)準(zhǔn)時(shí)間

HST HDT 阿拉斯加—夏威夷標(biāo)準(zhǔn)時(shí)間

MST MDT 山區(qū)標(biāo)準(zhǔn)時(shí)間

NST 紐芬蘭標(biāo)準(zhǔn)時(shí)間

PST PDT 太平洋標(biāo)準(zhǔn)時(shí)間

YST YDT YUKON標(biāo)準(zhǔn)時(shí)間

Oracle支持的字符函數(shù)和它們的Microsoft SQL Server等價(jià)函數(shù):

函數(shù) Oracle Microsoft SQL Server

把字符轉(zhuǎn)換為ASCII ASCII ASCII

字串連接 CONCAT (expression + expression)

把ASCII轉(zhuǎn)換為字符 CHR CHAR

返回字符串中的開(kāi)始字符(左起) INSTR CHARINDEX

把字符轉(zhuǎn)換為小寫 LOWER LOWER

把字符轉(zhuǎn)換為大寫 UPPER UPPER

填充字符串的左邊 LPAD N/A

清除開(kāi)始的空白 LTRIM LTRIM

清除尾部的空白 RTRIM RTRIM

字符串中的起始模式(pattern) INSTR PATINDEX

多次重復(fù)字符串 RPAD REPLICATE

字符串的語(yǔ)音表示 SOUNDEX SOUNDEX

重復(fù)空格的字串 RPAD SPACE

從數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù) TO_CHAR STR

子串 SUBSTR SUBSTRING

替換字符 REPLACE STUFF

將字串中的每個(gè)詞首字母大寫 INITCAP N/A

翻譯字符串 TRANSLATE N/A

字符串長(zhǎng)度 LENGTH DATELENGTH or LEN

列表中最大的字符串 GREATEST N/A

列表中最小的字符串 LEAST N/A

如果為NULL則轉(zhuǎn)換字串 NVL ISNULL

日期函數(shù)

函數(shù) Oracle Microsoft SQL Server

日期相加 (date column +/- value) or

ADD_MONTHS DATEADD

兩個(gè)日期的差 (date column +/- value) or

MONTHS_BETWEEN DATEDIFF

當(dāng)前日期和時(shí)間 SYSDATE GETDATE()

一個(gè)月的最后一天 LAST_DAY N/A

時(shí)區(qū)轉(zhuǎn)換 NEW_TIME N/A

日期后的第一個(gè)周日 NEXT_DAY N/A

代表日期的字符串 TO_CHAR DATENAME

代表日期的整數(shù) TO_NUMBER

(TO_CHAR)) DATEPART

日期舍入 ROUND CONVERT

日期截?cái)?TRUNC CONVERT

字符串轉(zhuǎn)換為日期 TO_DATE CONVERT

如果為NULL則轉(zhuǎn)換日期 NVL ISNULL

轉(zhuǎn)換函數(shù)

函數(shù) Oracle Microsoft SQL Server

數(shù)字轉(zhuǎn)換為字符 TO_CHAR CONVERT

字符轉(zhuǎn)換為數(shù)字 TO_NUMBER CONVERT

日期轉(zhuǎn)換為字符 TO_CHAR CONVERT

字符轉(zhuǎn)換為日期 TO_DATE CONVERT

16進(jìn)制轉(zhuǎn)換為2進(jìn)制 HEX_TO_RAW CONVERT

2進(jìn)制轉(zhuǎn)換為16進(jìn)制 RAW_TO_HEX CONVERT

其它行級(jí)別的函數(shù)

函數(shù) Oracle Microsoft SQL Server

返回第一個(gè)非空表達(dá)式 DECODE COALESCE

當(dāng)前序列值 CURRVAL N/A

下一個(gè)序列值 NEXTVAL N/A

如果exp1 = exp2, 返回null DECODE NULLIF

用戶登錄賬號(hào)ID數(shù)字 UID SUSER_ID

用戶登錄名 USER SUSER_NAME

用戶數(shù)據(jù)庫(kù)ID數(shù)字 UID USER_ID

用戶數(shù)據(jù)庫(kù)名 USER USER_NAME

當(dāng)前用戶 CURRENT_USER CURRENT_USER

用戶環(huán)境(audit trail) USERENV N/A

在CONNECT BY子句中的級(jí)別 LEVEL N/A

合計(jì)函數(shù)

函數(shù) Oracle Microsoft SQL Server

Average AVG AVG

Count COUNT COUNT

Maximum MAX MAX

Minimum MIN MIN

Standard deviation STDDEV STDEV or STDEVP

Summation SUM SUM

Variance VARIANCE VAR or VARP

Oracle還有一個(gè)有用的函數(shù)EXTRACT,提取并且返回日期時(shí)間或時(shí)間間隔表達(dá)式中特定的時(shí)間域:

EXTRACT(YEAR FROM 日期)

如何對(duì)數(shù)升級(jí)之后的數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)完整性和準(zhǔn)確性的校驗(yàn)

(3)數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS):對(duì)數(shù)據(jù)實(shí)行專門管理,提供安全性和完整性等統(tǒng)一機(jī)制,可以對(duì)數(shù)據(jù)庫(kù)的建立、使用和維護(hù)進(jìn)行管理。 (4)數(shù)據(jù)庫(kù)系統(tǒng)(DBS):是指

關(guān)于SQL基礎(chǔ)版 無(wú)法啟動(dòng)服務(wù)器

幫你在網(wǎng)上搜索一下,應(yīng)該是master數(shù)據(jù)庫(kù)損壞了,可以通過(guò)以下3步修復(fù)吧,網(wǎng)上是這么說(shuō)的

1 .備份自己的重要的數(shù)據(jù)庫(kù)文件 MDF,LDF文件

2 .重建Master 如果不行,重裝 sqlserver

3 .附加你的數(shù)據(jù)庫(kù)文件進(jìn)sqlserver

自己仔細(xì)看這個(gè)

如果是master文件損壞,有兩咱辦法可以解決:

1.重新安裝SQL,對(duì)master進(jìn)行修復(fù)

也可能通過(guò)SQL的命令來(lái)實(shí)現(xiàn)修復(fù)數(shù)據(jù)庫(kù),具體操作方法:

2.從其他地方復(fù)制一個(gè)同版本的master數(shù)據(jù)庫(kù)文件,這種方法操作比較復(fù)雜,可參考:

如果是Master壞了,又不想重裝的話,可以用SQL自帶的工具進(jìn)行重建。具體做法,可以參考:

上面寫了一些我在重建Master中的心得。

-----------------

SQL語(yǔ)句是什么意思?

以下摘自百度 SQL基本語(yǔ)句 來(lái)自:SQL編程技巧

掌握SQL四條最基本的數(shù)據(jù)操作語(yǔ)句:Insert,Select,Update和Delete。

練掌握SQL是數(shù)據(jù)庫(kù)用戶的寶貴財(cái) 富。在本文中,我們將引導(dǎo)你掌握四條最基本的數(shù)據(jù)操作語(yǔ)句—SQL的核心功能—來(lái)依次介紹比較操作符、選擇斷言以及三值邏輯。當(dāng)你完成這些學(xué)習(xí)后,顯然你已經(jīng)開(kāi)始算是精通SQL了。

在我們開(kāi)始之前,先使用CREATE TABLE語(yǔ)句來(lái)創(chuàng)建一個(gè)表(如圖1所示)。DDL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)對(duì)象如表、列和視進(jìn)行定義。它們并不對(duì)表中的行進(jìn)行處理,這是因?yàn)镈DL語(yǔ)句并不處理數(shù)據(jù)庫(kù)中實(shí)際的數(shù)據(jù)。這些工作由另一類SQL語(yǔ)句—數(shù)據(jù)操作語(yǔ)言(DML)語(yǔ)句進(jìn)行處理。

SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于這是大多數(shù)SQL用戶經(jīng)常用到的,我們有必要在此對(duì)它們進(jìn)行一一說(shuō)明。在圖1中我們給出了一個(gè)名為EMPLOYEES的表。其中的每一行對(duì)應(yīng)一個(gè)特定的雇員記錄。請(qǐng)熟悉這張表,我們?cè)诤竺娴睦又袑⒁玫剿?/p>

INSERT語(yǔ)句

用戶可以用INSERT語(yǔ)句將一行記錄插入到指定的一個(gè)表中。例如,要將雇員John Smith的記錄插入到本例的表中,可以使用如下語(yǔ)句:

INSERT INTO EMPLOYEES VALUES

('Smith','John','1980-06-10',

'Los Angles',16,45000);

通過(guò)這樣的INSERT語(yǔ)句,系統(tǒng)將試著將這些值填入到相應(yīng)的列中。這些列按照我們創(chuàng)建表時(shí)定義的順序排列。在本例中,第一個(gè)值“Smith”將填到第一個(gè)列LAST_NAME中;第二個(gè)值“John”將填到第二列FIRST_NAME中……以此類推。

我們說(shuō)過(guò)系統(tǒng)會(huì)“試著”將值填入,除了執(zhí)行規(guī)則之外它還要進(jìn)行類型檢查。如果類型不符(如將一個(gè)字符串填入到類型為數(shù)字的列中),系統(tǒng)將拒絕這一次操作并返回一個(gè)錯(cuò)誤信息。

如果SQL拒絕了你所填入的一列值,語(yǔ)句中其他各列的值也不會(huì)填入。這是因?yàn)镾QL提供對(duì)事務(wù)的支持。一次事務(wù)將數(shù)據(jù)庫(kù)從一種一致性轉(zhuǎn)移到另一種一致性。如果事務(wù)的某一部分失敗,則整個(gè)事務(wù)都會(huì)失敗,系統(tǒng)將會(huì)被恢復(fù)(或稱之為回退)到此事務(wù)之前的狀態(tài)。

回到原來(lái)的INSERT的例子,請(qǐng)注意所有的整形十進(jìn)制數(shù)都不需要用單引號(hào)引起來(lái),而字符串和日期類型的值都要用單引號(hào)來(lái)區(qū)別。為了增加可讀性而在數(shù)字間插入逗號(hào)將會(huì)引起錯(cuò)誤。記住,在SQL中逗號(hào)是元素的分隔符。

同樣要注意輸入文字值時(shí)要使用單引號(hào)。雙引號(hào)用來(lái)封裝限界標(biāo)識(shí)符。

對(duì)于日期類型,我們必須使用SQL標(biāo)準(zhǔn)日期格式(yyyy-mm-dd),但是在系統(tǒng)中可以進(jìn)行定義,以接受其他的格式。當(dāng)然,2000年臨近,請(qǐng)你最好還是使用四位來(lái)表示年份。

既然你已經(jīng)理解了INSERT語(yǔ)句是怎樣工作的了,讓我們轉(zhuǎn)到EMPLOYEES表中的其他部分:

INSERT INTO EMPLOYEES VALUES

('Bunyan','Paul','1970-07-04',

'Boston',12,70000);

INSERT INTO EMPLOYEES VALUES

('John','Adams','1992-01-21',

'Boston',20,100000);

INSERT INTO EMPLOYEES VALUES

('Smith','Pocahontas','1976-04-06',

'Los Angles',12,100000);

INSERT INTO EMPLOYEES VALUES

('Smith','Bessie','1940-05-02',

'Boston',5,200000);

INSERT INTO EMPLOYEES VALUES

('Jones','Davy','1970-10-10',

'Boston',8,45000);

INSERT INTO EMPLOYEES VALUES

('Jones','Indiana','1992-02-01',

'Chicago',NULL,NULL);

在最后一項(xiàng)中,我們不知道Jones先生的工薪級(jí)別和年薪,所以我們輸入NULL(不要引號(hào))。NULL是SQL中的一種特殊情況,我們以后將進(jìn)行詳細(xì)的討論。現(xiàn)在我們只需認(rèn)為NULL表示一種未知的值。

有時(shí),像我們剛才所討論的情況,我們可能希望對(duì)某一些而不是全部的列進(jìn)行賦值。除了對(duì)要省略的列輸入NULL外,還可以采用另外一種INSERT語(yǔ)句,如下:

INSERT INTO EMPLOYEES(

FIRST_NAME, LAST_NAME,

HIRE_DATE, BRANCH_OFFICE)

VALUE(

'Indiana','Jones',

'1992-02-01','Indianapolis');

這樣,我們先在表名之后列出一系列列名。未列出的列中將自動(dòng)填入缺省值,如果沒(méi)有設(shè)置缺省值則填入NULL。請(qǐng)注意我們改變了列的順序,而值的順序要對(duì)應(yīng)新的列的順序。如果該語(yǔ)句中省略了FIRST_NAME和LAST_NAME項(xiàng)(這兩項(xiàng)規(guī)定不能為空),SQL操作將失敗。

讓我們來(lái)看一看上述INSERT語(yǔ)句的語(yǔ)法圖:

INSERT INTO table

[(column { ,column})]

VALUES

(columnvalue [{,columnvalue}]);

和前一篇文章中一樣,我們用方括號(hào)來(lái)表示可選項(xiàng),大括號(hào)表示可以重復(fù)任意次數(shù)的項(xiàng)(不能在實(shí)際的SQL語(yǔ)句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號(hào)。

SELECT語(yǔ)句

SELECT語(yǔ)句可以從一個(gè)或多個(gè)表中選取特定的行和列。因?yàn)椴樵兒蜋z索數(shù)據(jù)是數(shù)據(jù)庫(kù)管理中最重要的功能,所以SELECT語(yǔ)句在SQL中是工作量最大的部分。實(shí)際上,僅僅是訪問(wèn)數(shù)據(jù)庫(kù)來(lái)分析數(shù)據(jù)并生成報(bào)表的人可以對(duì)其他SQL語(yǔ)句一竅不通。

SELECT語(yǔ)句的結(jié)果通常是生成另外一個(gè)表。在執(zhí)行過(guò)程中系統(tǒng)根據(jù)用戶的標(biāo)準(zhǔn)從數(shù)據(jù)庫(kù)中選出匹配的行和列,并將結(jié)果放到臨時(shí)的表中。在直接SQL(direct SQL)中,它將結(jié)果顯示在終端的顯示屏上,或者將結(jié)果送到打印機(jī)或文件中。也可以結(jié)合其他SQL語(yǔ)句來(lái)將結(jié)果放到一個(gè)已知名稱的表中。

SELECT語(yǔ)句功能強(qiáng)大。雖然表面上看來(lái)它只用來(lái)完成本文第一部分中提到的關(guān)系代數(shù)運(yùn)算“選擇”(或稱“限制”),但實(shí)際上它也可以完成其他兩種關(guān)系運(yùn)算—“投影”和“連接”,SELECT語(yǔ)句還可以完成聚合計(jì)算并對(duì)數(shù)據(jù)進(jìn)行排序。

SELECT語(yǔ)句最簡(jiǎn)單的語(yǔ)法如下:

SELECT columns FROM tables;

當(dāng)我們以這種形式執(zhí)行一條SELECT語(yǔ)句時(shí),系統(tǒng)返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個(gè)結(jié)果表。這就是實(shí)現(xiàn)關(guān)系投影運(yùn)算的一個(gè)形式。

讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個(gè)表是我們以后所有SELECT語(yǔ)句實(shí)例都要使用的。而我們?cè)趫D2和圖3中給出了查詢的實(shí)際結(jié)果。我們將在其他的例子中使用這些結(jié)果)。

假設(shè)你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:

SELECT BRANCH_OFFICE FROM EMPLOYEES;

以上SELECT語(yǔ)句的執(zhí)行將產(chǎn)生如圖2中表2所示的結(jié)果。

由于我們?cè)赟ELECT語(yǔ)句中只指定了一個(gè)列,所以我們的結(jié)果表中也只有一個(gè)列。注意結(jié)果表中具有重復(fù)的行,這是因?yàn)橛卸鄠€(gè)雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結(jié)果中的重復(fù)行,只要在SELECT語(yǔ)句中加上DISTINCT子句:

SELECT DISTINCT BRANCH_OFFICE

FROM EMPLOYEES;

這次查詢的結(jié)果如表3所示。

現(xiàn)在已經(jīng)消除了重復(fù)的行,但結(jié)果并不是按照順序排列的。如果你希望以字母表順序?qū)⒔Y(jié)果列出又該怎么做呢?只要使用ORDER BY子句就可以按照升序或降序來(lái)排列結(jié)果:

SELECT DISTINCT BRANCH_OFFICE

FROM EMPLOYEES

ORDER BY BRANCH_OFFICE ASC;

這一查詢的結(jié)果如表4所示。請(qǐng)注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,這就是我們想要對(duì)其進(jìn)行排序的列。為什么即使是結(jié)果表中只有一個(gè)列時(shí)我們也必須指出列名呢?這是因?yàn)槲覀冞€能夠按照表中其他列進(jìn)行排序,即使它們并不顯示出來(lái)。列名BRANCH_ OFFICE之后的關(guān)鍵字ASC表示按照升序排列。如果你希望以降序排列,那么可以用關(guān)鍵字DESC。

同樣我們應(yīng)該指出ORDER BY子句只將臨時(shí)表中的結(jié)果進(jìn)行排序;并不影響原來(lái)的表。

假設(shè)我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號(hào)中的內(nèi)容,我們還希望看到按照聘用時(shí)間從最近聘用的雇員開(kāi)始列出的列表。以下是你將要用到的語(yǔ)句:

SELECT BRANCH_OFFICE,FIRST_NAME,

LAST_NAME,SALARY,HIRE_DATE

FROM EMPLOYEES

ORDER BY SALARY DESC,

HIRE_DATE DESC;

這里我們進(jìn)行了多列的選擇和排序。排序的優(yōu)先級(jí)由語(yǔ)句中的列名順序所決定。SQL將先對(duì)列出的第一個(gè)列進(jìn)行排序。如果在第一個(gè)列中出現(xiàn)了重復(fù)的行時(shí),這些行將被按照第二列進(jìn)行排序,如果在第二列中又出現(xiàn)了重復(fù)的行時(shí),這些行又將被按照第三列進(jìn)行排序……如此類推。這次查詢的結(jié)果如表5所示。

將一個(gè)很長(zhǎng)的表中的所有列名寫出來(lái)是一件相當(dāng)麻煩的事,所以SQL允許在選擇表中所有的列時(shí)使用*號(hào):

SELECT * FROM EMPLOYEES;

這次查詢返回整個(gè)EMPLOYEES表,如表1所示。

下面我們對(duì)開(kāi)始時(shí)給出的SELECT語(yǔ)句的語(yǔ)法進(jìn)行一下更新(豎直線表示一個(gè)可選項(xiàng),允許在其中選擇一項(xiàng)。):

SELECT [DISTINCT]

(column [{, columns}])| *

FROM table [ {, table}]

[ORDER BY column [ASC] | DESC

[ {, column [ASC] | DESC }]];

定義選擇標(biāo)準(zhǔn)

在我們目前所介紹的SELECT語(yǔ)句中,我們對(duì)結(jié)果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對(duì)SELECT語(yǔ)句進(jìn)行限制使得它只返回希望得到的行:

SELECT columns FROM tables [WHERE predicates];

WHERE子句對(duì)條件進(jìn)行了設(shè)置,只有滿足條件的行才被包括到結(jié)果表中。這些條件由斷言(predicate)進(jìn)行指定(斷言指出了關(guān)于某件事情的一種可能的事實(shí))。如果該斷言對(duì)于某個(gè)給定的行成立,該行將被包括到結(jié)果表中,否則該行被忽略。在SQL語(yǔ)句中斷言通常通過(guò)比較來(lái)表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語(yǔ)句:

SELECT * FROM EMPLOYEES

WHERE LAST_NAME = 'Jones';

LAST_NAME = 'Jones'部分就是斷言。在執(zhí)行該語(yǔ)句時(shí),SQL將每一行的LAST_NAME列與“Jones”進(jìn)行比較。如果某一職員的姓為“Jones”,即斷言成立,該職員的信息將被包括到結(jié)果表中(見(jiàn)表6)。

使用最多的六種比較

我們上例中的斷言包括一種基于“等值”的比較(LAST_NAME = 'Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:

等于 =

不等于

小于

大于

小于或等于 =

大于或等于 =

下面給出了不是基于等值比較的一個(gè)例子:

SELECT * FROM EMPLOYEES

WHERE SALARY 50000;

這一查詢將返回年薪高于$50,000.00的職員(參見(jiàn)表7)。

邏輯連接符

有時(shí)我們需要定義一條不止一種斷言的SELECT語(yǔ)句。舉例來(lái)說(shuō),如果你僅僅想查看Davy Jones的信息的話,表6中的結(jié)果將是不正確的。為了進(jìn)一步定義一個(gè)WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員Davy Jones的記錄,用戶可以輸入如下語(yǔ)句:

SELECT * FROM EMPLOYEES

WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';

在本例中,我們通過(guò)邏輯連接符AND將兩個(gè)斷言連接起來(lái)。只有兩個(gè)斷言都滿足時(shí)整個(gè)表達(dá)式才會(huì)滿足。如果用戶需要定義一個(gè)SELECT語(yǔ)句來(lái)使得當(dāng)其中任何一項(xiàng)成立就滿足條件時(shí),可以使用OR連接符:

SELECT * FROM EMPLOYEES

WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';

有時(shí)定義一個(gè)斷言的最好方法是通過(guò)相反的描述來(lái)說(shuō)明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時(shí),你可以進(jìn)行如下的查詢:

SELECT * FROM EMPLOYEES

WHERE NOT(BRANCH_OFFICE = 'Boston');

關(guān)鍵字NOT后面跟著用圓括號(hào)括起來(lái)的比較表達(dá)式。其結(jié)果是對(duì)結(jié)果取否定。如果某一職員所在部門的辦事處在Boston,括號(hào)內(nèi)的表達(dá)式返回true,但是NOT操作符將該值取反,所以該行將不被選中。

斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進(jìn)行求值,可以用括號(hào)將它們括起來(lái):

SELECT * FROM EMPLOYEES

WHERE (LAST_NAME = 'Jones'

AND FIRST_NAME = 'Indiana')

OR (LAST_NAME = 'Smith'

AND FIRST_NAME = 'Bessie');

SQL沿用數(shù)學(xué)上標(biāo)準(zhǔn)的表達(dá)式求值的約定—圓括號(hào)內(nèi)的表達(dá)式將最先進(jìn)行求值,其他表達(dá)式將從左到右進(jìn)行求值。

以上對(duì)邏輯連接符進(jìn)行了說(shuō)明,在對(duì)下面的內(nèi)容進(jìn)行說(shuō)明之前,我們?cè)僖淮螌?duì)SELECT語(yǔ)句的語(yǔ)法進(jìn)行更新:

SELECT [DISTINCT]

(column [{, column } ] )| *

FROM table [ { , table} ]

[ORDER BY column [ASC] | [DESC

[{ , column [ASC] | [DESC } ] ]

WHERE predicate [ { logical-connector predicate } ];

NULL和三值邏輯

在SQL中NULL是一個(gè)復(fù)雜的話題,關(guān)于NULL的詳細(xì)描述更適合于在SQL的高級(jí)教程而不是現(xiàn)在的入門教程中進(jìn)行介紹。但由于NULL需要進(jìn)行特殊處理,并且你也很可能會(huì)遇到它,所以我們還是簡(jiǎn)略地進(jìn)行一下說(shuō)明。

首先,在斷言中進(jìn)行NULL判斷時(shí)需要特殊的語(yǔ)法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語(yǔ)句:

SELECT * FROM EMPLOYEES

WHERE SALARY IS NULL;

相反,如果用戶需要所有已知年薪數(shù)據(jù)的職員的信息,你可以使用以下語(yǔ)句:

SELECT * FROM EMPLOYEES

WHERE SALARY IS NOT NULL;

請(qǐng)注意我們?cè)诹忻笫褂昧岁P(guān)鍵字IS NULL或IS NOT NULL,而不是標(biāo)準(zhǔn)的比較形式:COLUMN = NULL、COLUMN NULL或是邏輯操作符NOT(NULL)。

這種形式相當(dāng)簡(jiǎn)單。但當(dāng)你不明確地測(cè)試NULL(而它們確實(shí)存在)時(shí),事情會(huì)變得很混亂。

例如,回過(guò)頭來(lái)看我們圖1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等級(jí)或年薪值都是未知的。這兩個(gè)列都包含NULL。可以想象運(yùn)行如下的查詢:

SELECT * FROM EMPLOYEES

WHERE GRADE = SALARY;

此時(shí),Indiana Jones應(yīng)該出現(xiàn)在結(jié)果表中。因?yàn)镹ULL都是相等的,所以可以想象它們是能夠通過(guò)GRADE小于等于SALARY的檢查的。這其實(shí)是一個(gè)毫無(wú)疑義的查詢,但是并沒(méi)有關(guān)系。SQL允許進(jìn)行這樣的比較,只要兩個(gè)列都是數(shù)字類型的。然而,Indiana Jones并沒(méi)有出現(xiàn)在查詢的結(jié)果中,為什么?

正如我們?cè)缦忍岬竭^(guò)的,NULL表示未知的值(而不是象某些人所想象的那樣表示一個(gè)為NULL的值)。對(duì)于SQL來(lái)說(shuō)意味著這個(gè)值是未知的,而只要這個(gè)值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許除了在true 和false之外還有第三種類型的真值,稱之為“非確定”(unknown)值。

如果比較的兩邊都是NULL,整個(gè)斷言就被認(rèn)為是非確定的。將一個(gè)非確定斷言取反或使用AND或OR與其他斷言進(jìn)行合并之后,其結(jié)果仍是非確定的。由于結(jié)果表中只包括斷言值為“真”的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符IS NULL和IS NOT NULL。

UPDATE語(yǔ)句

UPDATE語(yǔ)句允許用戶在已知的表中對(duì)現(xiàn)有的行進(jìn)行修改。

例如,我們剛剛發(fā)現(xiàn)Indiana Jones的等級(jí)為16,工資為$40,000.00,我們可以通過(guò)下面的SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新(并清除那些煩人的NULL)。

UPDATE EMPLOYEES

SET GRADE = 16, SALARY = 40000

WHERE FIRST_NAME = 'Indiana'

AND LAST_NAME = 'Jones';

上面的例子說(shuō)明了一個(gè)單行更新,但是UPDATE語(yǔ)句可以對(duì)多行進(jìn)行操作。滿足WHERE條件的所有行都將被更新。如果,你想讓Boston辦事處中的所有職員搬到New York,你可以使用如下語(yǔ)句:

UPDATE EMPLOYEES

SET BRANCH_OFFICE = 'New York'

WHERE BRANCH_OFFICE = 'Boston';

如果忽略WHERE子句,表中所有行中的部門值都將被更新為'New York'。

UPDATE語(yǔ)句的語(yǔ)法流圖如下面所示:

UPDATE table

SET column = value [{, column = value}]

[ WHERE predicate [ { logical-connector predicate}]];

DELETE語(yǔ)句

DELETE語(yǔ)句用來(lái)刪除已知表中的行。如同UPDATE語(yǔ)句中一樣,所有滿足WHERE子句中條件的行都將被刪除。由于SQL中沒(méi)有UNDO語(yǔ)句或是“你確認(rèn)刪除嗎?”之類的警告,在執(zhí)行這條語(yǔ)句時(shí)千萬(wàn)要小心。如果決定取消Los Angeles辦事處并解雇辦事處的所有職員,這一卑鄙的工作可以由以下這條語(yǔ)句來(lái)實(shí)現(xiàn):

DELETE FROM EMPLOYEES

WHERE BRANCH_OFFICE = 'Los Angeles';

如同UPDATE語(yǔ)句中一樣,省略WHERE子句將使得操作施加到表中所有的行。

DELETE語(yǔ)句的語(yǔ)法流圖如下面所示:

DELETE FROM table

[WHERE predicate [ { logical-connector predicate} ] ];

現(xiàn)在我們完成了數(shù)據(jù)操作語(yǔ)言(DML)的主要語(yǔ)句的介紹。我們并沒(méi)有對(duì)SQL能完成的所有功能進(jìn)行說(shuō)明。SQL還提供了許多的功能,如求平均值、求和以及其他對(duì)表中數(shù)據(jù)的計(jì)算,此外SQL還能完成從多個(gè)表中進(jìn)行查詢(多表查詢,或稱之為連接)的工作。這種語(yǔ)言還允許你使用GRANT和REVOKE命令控制使用者的數(shù)據(jù)訪問(wèn)權(quán)限。

數(shù)據(jù)完整性約束的數(shù)據(jù)完整性約束:

1 數(shù)據(jù)的完整性

約束是用來(lái)確保數(shù)據(jù)的準(zhǔn)確性和一致性。數(shù)據(jù)的完整性就是對(duì)數(shù)據(jù)的準(zhǔn)確性和一致性的一種保證。

數(shù)據(jù)完整性(Data Integrity)是指數(shù)據(jù)的精確(Accuracy)和可靠性(Reliability)。

分為以下四類:

1) 實(shí)體完整性:規(guī)定表的每一行在表中是惟一的實(shí)體。

2) 域完整性:是指表中的列必須滿足某種特定的數(shù)據(jù)類型約束,其中約束又包括取值范圍、精度等規(guī)定。

3) 參照完整性:是指兩個(gè)表的主關(guān)鍵字和外關(guān)鍵字的數(shù)據(jù)應(yīng)一致,保證了表之間的數(shù)據(jù)的一致性,防止了數(shù)據(jù)丟失或無(wú)意義的數(shù)據(jù)在數(shù)據(jù)庫(kù)中擴(kuò)散。

4) 用戶定義的完整性:不同的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫(kù)的約束條件,它反映某一具體應(yīng)用必須滿足的語(yǔ)義要求。

2 完整性約束的類型:

可分為三種類型:與表有關(guān)的約束、域(Domain)約束、斷言(Assertion)

1) 與表有關(guān)的約束:是表中定義的一種約束。可在列定義時(shí)定義該約束,此時(shí)稱為列約束,也可以在表定義時(shí)定義約束,此時(shí)稱為表約束。

2) 域(Domain)約束:在域定義中被定義的一種約束,它與在特定域中定義的任何列都有關(guān)系。

3) 斷言(Assertion):在斷言定義時(shí)定義的一種約束,它可以與一個(gè)或多個(gè)表進(jìn)行關(guān)聯(lián)。

一、 與表有關(guān)的約束:包括列約束(表約束+NOT NULL)和表約束(PRIMARY KEY、foreign key、check、UNIQUE) 。

(1) not null(非空)約束: 只用于定義列約束。

語(yǔ)法如下:

Colunm_name datatype | domain not null

實(shí)例:

create table Employee

(

emp_id int not null,

emp_name varchar(10) not null,

address varchar(40) ,

)

創(chuàng)建之后,如果往表Employee表中非空約束中插入空值,insert into Employee values(1,null,'neimeng')將會(huì)出錯(cuò)。如下:

Msg 515, Level 16, State 2, Line 1

Cannot insert the value NULL into column 'emp_name', table 'Student.dbo.Employee';

column does not allow nulls. INSERT fails.

The statement has been terminated.

(2) unique(惟一)約束:用于指明創(chuàng)建惟一約束的列上的取值必須惟一。

語(yǔ)法如下:

Colunm_name datatype | domain unique

實(shí)例:

create table EmployeeInfo

(

emp_id int not null,

emp_name varchar(10) not null,

phone char(11) unique,

address varchar(40) ,

)

如下往EmployeeInfo插入數(shù)據(jù)時(shí),如果兩條記錄的phone不惟一,

insert into EmployeeInfo values(1,'abcdwxc','neimeng','13612345678')

insert into EmployeeInfo values(2,'terry','neimeng','13612345678')

則會(huì)出現(xiàn)錯(cuò)誤。如下:

(1 row(s) affected)

Msg 2627, Level 14, State 1, Line 2

Violation of UNIQUE KEY constraint 'UQ__EmployeeInfo__060DEAE8'. Cannot insert duplicate key in object 'dbo.EmployeeInfo'.

The statement has been terminated.

除了在定義列時(shí)添加unique約束外,也可以將unique約束作為表約束添加。即把它作為表定義的元素。

語(yǔ)法如下:

[CONSTRAINT constraint_name] unique (column1,column2,.....)

實(shí)例:

create table EmployeeInfo

(

emp_id int not null,

emp_name varchar(10) not null,

phone char(11)

address varchar(40) ,

constraint p_uniq unique(phone)

)

(3) primary key(主鍵)約束:用于定義基本表的主鍵,起惟一標(biāo)識(shí)作用,其值不能為null,也不能重復(fù),以此來(lái)保證實(shí)體的完整性。

語(yǔ)法如下:

Colunm_name datatype | domain primary key

實(shí)例:

drop table EmployeeInfo

create table EmployeeInfo

(

emp_id int primary key,

emp_name varchar(10) not null,

phone char(11),

address varchar(40) ,

)

如果向EmployeeInfo表插入的emp_id重復(fù)了或者插入時(shí)emp_id為null值,則會(huì)出錯(cuò)。

可以在創(chuàng)建表時(shí),創(chuàng)建主鍵約束,也可創(chuàng)建表完成以后,創(chuàng)建主鍵,例如:

alter table EmployeeInfo

add constraint e_prim primary key(emp_id)

primary key 與 unique的區(qū)別:

1.在一個(gè)表中,只能定義一個(gè)primary key約束,但可定義多個(gè)unique約束。

2.對(duì)于指定為primary key的一個(gè)列或多個(gè)列的組合,其中任何一個(gè)列都不能出現(xiàn)空值,而對(duì)于unique所約束的惟一鍵,則允許為null,只是null值最多有一個(gè)。

(4) foreign key(外鍵)約束:定義了一個(gè)表中數(shù)據(jù)與另一個(gè)表中的數(shù)據(jù)的聯(lián)系。

foreign key約束指定某一個(gè)列或一組列作為外部鍵,其中包含外部鍵的表稱為子表,包含外部鍵所引用的主鍵的表稱為父表。系統(tǒng)保證,表在外部鍵上的取值要么是父表中某一主鍵,要么取空值,以此保證兩個(gè)表之間的連接,確保了實(shí)體的參照完整性。

語(yǔ)法如下:

Colunm_name datetype | domain references table_name(column)

[match full|partial|simple] //注:sqlserver不支持。

[referential triggered action]

說(shuō)明:table_name為父表的表名,column為父表中與外鍵對(duì)應(yīng)的主鍵值。

[match full|partial|simple]為可選子句,用于設(shè)置如何處理外鍵中的null值。

[referential triggered action]也為可選子句,用于設(shè)置更新、刪除外鍵列時(shí)的操作準(zhǔn)則。

可以為表的一列或多列創(chuàng)建foreign key 約束,如果為多列創(chuàng)建 foreign key約束,將分別與主表中的相應(yīng)主鍵相對(duì)應(yīng)。

實(shí)例:

create table EmployeeInfo

(

emp_id int primary key,

emp_name varchar(10) not null,

account char(4) primary key,

phone char(11)

address varchar(40) ,

)

create table Emp_Sal

(

emp_id int , account CHAR(4) ,salary DECIMAL(5,1),

CONSTRAINT E_SAL FOREIGN KEY(emp_id,account) REFERENCES EmployeeInfo (emp_id,account))

)

也可以表創(chuàng)建以后添加到表上。如下:

create table Emp_Sal

(

emp_id int ,emp_name varchar(10) not null, account CHAR(4) ,salary DECIMAL(5,1),

)

alter table Emp_Sal

add CONSTRAINT E_SAL FOREIGN KEY(emp_id,account) REFERENCES EmployeeInfo (emp_id,account)

該外鍵的作用:確保表Emp_Sal的每個(gè)emp_id列都對(duì)應(yīng)表EmployeeInfo中相應(yīng)的emp_id。此時(shí),表EmployeeInfo為父表,而表Emp_Sal為子表。子表的emp_id列參照父表的emp_id列。

如果想在子表的emp_id列插入一個(gè)值,首先父表的emp_id列必須存在,否則會(huì)插入失敗。如果想從父表的emp_id刪除一個(gè)值,則必須無(wú)刪除子表emp_id列中所有與之對(duì)應(yīng)的值。

(注:foreign key 列上的取值可以取null)。

潛在問(wèn)題:由于foreign key列上可以取空值,DBMS將跳過(guò)對(duì)foreign key約束的檢查,因此如果插入Emp_Sal如下數(shù)據(jù):

insert into Emp_Sal values(6,null,null) 則插入到Emp_Sal中,但其主表的相關(guān)列卻不存在。

解決辦法:

(1)將聯(lián)合外鍵的列添加not null約束,但這限制了用戶的部分操作。

(2)采用Match子句。(sqlserver不支持).

更新、刪除操作規(guī)則:

在刪除或更新有primary key值的行,且該值與子表的foreign key中一個(gè)或多個(gè)值相匹配時(shí),會(huì)引起匹配完整性的喪失。

在foreign key創(chuàng)建語(yǔ)法中,提供了可選的on update和on delete子句,也就是上面的[referential triggered action]。可用此保持引用完整性。

on update / on delete

no action|cascade|restrict|set null|set default

no action:更新或刪除父表中的數(shù)據(jù)時(shí),如果會(huì)使子表中的外鍵違反引用完整性,該動(dòng)作將被禁止執(zhí)行。不過(guò)在某些條件下,可出現(xiàn)暫時(shí)的,但在數(shù)據(jù)的最終狀態(tài)中,不能違反外鍵的引用完整性。

cascade: 當(dāng)父表中被引用列的數(shù)據(jù)被更新或刪除時(shí),子表中的相應(yīng)的數(shù)據(jù)也被更新或刪除。

restrict:與no action規(guī)則基本相同,只是引用列中的數(shù)據(jù)永遠(yuǎn)不能違反外鍵的引用完整性,暫時(shí)的也不行。

set null:當(dāng)父表數(shù)據(jù)被更新或刪除時(shí),子表中的相應(yīng)數(shù)據(jù)被設(shè)置成Null值,前提是子表中的相應(yīng)列允許null值。

set default:當(dāng)父表數(shù)據(jù)被更新或刪除時(shí),子表中的數(shù)據(jù)被設(shè)置成默認(rèn)值。前提是子表中的相應(yīng)列設(shè)置有默認(rèn)值。

(5) check(校驗(yàn))約束:用來(lái)檢查字段值所允許的范圍。DBMS每當(dāng)執(zhí)行delete,insert或update語(yǔ)句時(shí),都對(duì)這個(gè)約束過(guò)濾。如果為true,則執(zhí)行。否則,取消執(zhí)行并提示錯(cuò)誤。

列定義語(yǔ)法如下:

Column datetype | domain check(search condition)

表約束語(yǔ)法如下:

constraint constraint_name check(search condition)

實(shí)例如下:

create table Emp_Sal

(

emp_id int , account CHAR(4) ,salary DECIMAL(5,1),

constraint validsal check(salary =1000 and salary=10000)

)

如果此時(shí),再往表中插入如下語(yǔ)句則會(huì)出錯(cuò):(因?yàn)椴粷M足salary大于等于1000的約束。)

insert into Emp_Sal values(8,'12324343',800.0)

二、 域約束:(sqlserver 不支持)

語(yǔ)法如下:

create domain domain_name as data type

[default default_value]

[constraint constraint_name] check(value condition expression)

例如:

create domain valid_no as int

constraint constraint_no check(value between 100 and 999)

然后創(chuàng)建表時(shí),使用valid_no域。

create table TestDomain

(

emp_id valid_no,

emp_name varchar(10),

)

三、斷言約束:不必與特定的列綁定,可以理解為能應(yīng)用于多個(gè)表的check約束,因此必須在表定義之外獨(dú)立創(chuàng)建斷言。

語(yǔ)法如下:

create assertion constraint_name

check search condition

例如:

create assertion name

check (Emp_Sal.emp_id in(select emp_id from EmployeeInfo where emp_name is not null)

添加斷言后,每當(dāng)試圖添加或修改Emp_Sal表中的數(shù)據(jù)時(shí),就對(duì)斷言中的搜索條件求值,如果為false,則取消執(zhí)行,給出提示

當(dāng)前文章:sqlserver斷言,sql中的斷言機(jī)制用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)的
分享地址:http://chinadenli.net/article46/dseschg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)公司微信小程序自適應(yīng)網(wǎng)站品牌網(wǎng)站設(shè)計(jì)品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站