數(shù)據(jù)庫第次課數(shù)據(jù)完整性和語言_第1頁
數(shù)據(jù)庫第次課數(shù)據(jù)完整性和語言_第2頁
數(shù)據(jù)庫第次課數(shù)據(jù)完整性和語言_第3頁
數(shù)據(jù)庫第次課數(shù)據(jù)完整性和語言_第4頁
數(shù)據(jù)庫第次課數(shù)據(jù)完整性和語言_第5頁
已閱讀5頁,還剩145頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)據(jù)庫第次課數(shù)據(jù)完整性和語言本章內(nèi)容8.1數(shù)據(jù)完整性概述8.2使用規(guī)則實施數(shù)據(jù)完整性8.3使用默認值實施數(shù)據(jù)完整性8.4使用約束實施數(shù)據(jù)完整性第2頁,共150頁,星期六,2024年,5月8.1數(shù)據(jù)完整性概述數(shù)據(jù)完整性防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。數(shù)據(jù)完整性有4種類型:實體完整性(EntityIntegrity)、域完整性(DomainIntegrity)、參照完整性(ReferentialIntegrity)、用戶定義的完整性(User-definedIntegrity)。在SQLServer中可以通過各種規(guī)則(Rule)、默認(Default)、約束(Constraint)和觸發(fā)器(Trigger)等數(shù)據(jù)庫對象來保證數(shù)據(jù)的完整性。第3頁,共150頁,星期六,2024年,5月8.2使用規(guī)則實施數(shù)據(jù)完整性8.2.1創(chuàng)建規(guī)則8.2.2查看和修改規(guī)則8.2.3規(guī)則的綁定與松綁8.2.4刪除規(guī)則第4頁,共150頁,星期六,2024年,5月8.2.1創(chuàng)建規(guī)則規(guī)則(Rule)就是數(shù)據(jù)庫中對存儲在表的列或用戶定義數(shù)據(jù)類型中的值的規(guī)定和限制。規(guī)則是單獨存儲的獨立的數(shù)據(jù)庫對象。規(guī)則和約束可以同時使用,表的列可以有一個規(guī)則及多個約束。規(guī)則與檢查約束在功能上相似,但在使用上有所區(qū)別。檢查約束是在CREATETABLE或ALTERTABLE語句中定義的,嵌入了被定義的表結(jié)構(gòu),即刪除表的時候檢查約束也就隨之被刪除。而規(guī)則需要用CREATERULE語句定義后才能使用,是獨立于表之外的數(shù)據(jù)庫對象,刪除表并不能刪除規(guī)則,需要用DROPRULE語句才能刪除。相比之下,使用在CREATETABLE或ALTERTABLE語句中定義的檢查約束是更標準的限制列值的方法,但檢查約束不能直接作用于用戶定義數(shù)據(jù)類型。第5頁,共150頁,星期六,2024年,5月1.用企業(yè)管理器創(chuàng)建規(guī)則8.2.1創(chuàng)建規(guī)則在企業(yè)管理器中選擇數(shù)據(jù)庫對象“規(guī)則”,單擊右鍵從快捷菜單中選擇“新建規(guī)則”選項,即會彈出如圖所示的“規(guī)則屬性”對話框。輸入規(guī)則名稱和表達式之后,單擊“確定”按鈕,即完成規(guī)則的創(chuàng)建。第6頁,共150頁,星期六,2024年,5月2.用CREATERULE語句創(chuàng)建規(guī)則8.2.1創(chuàng)建規(guī)則CREATERULE語句用于在當前數(shù)據(jù)庫中創(chuàng)建規(guī)則,其語法格式如下:

CREATERULErule_nameAScondition_expression例8-1創(chuàng)建雇傭日期規(guī)則hire_date_rule。CREATERULEhire_date_ruleAS@hire_date>='1980-01-01'and@hire_date<=getdate()CREATERULEsex_ruleAS@sexin('男','女')例8-2創(chuàng)建性別規(guī)則sex_rule。第7頁,共150頁,星期六,2024年,5月例8-4創(chuàng)建字符規(guī)則my_character_rule。Createrulemy_character_ruleAs@valuelike'[a-z]%[0-9]'例8-3創(chuàng)建評分規(guī)則grade_rule。CREATERULEgrade_ruleAS@valuebetween1and1008.2.1創(chuàng)建規(guī)則第8頁,共150頁,星期六,2024年,5月1.用企業(yè)管理器查看和修改規(guī)則在企業(yè)管理器的數(shù)據(jù)庫對象中選擇“規(guī)則”對象,即可從右邊的任務(wù)板中看到規(guī)則的大部分信息,包括規(guī)則的名稱、所有者、創(chuàng)建時間等。8.2.2查看和修改規(guī)則8.2使用規(guī)則實施數(shù)據(jù)完整性第9頁,共150頁,星期六,2024年,5月8.2.2查看和修改規(guī)則使用sp_helptext系統(tǒng)存儲過程可以查看規(guī)則的文本信息。例8-5查看規(guī)則hire_date_rule的文本信息EXECUTEsp_helptexthire_date_rule運行結(jié)果如圖所示2.用系統(tǒng)存儲過程sp_helptext查看規(guī)則第10頁,共150頁,星期六,2024年,5月8.2.3規(guī)則的綁定與松綁需要將規(guī)則與數(shù)據(jù)庫表或用戶定義對象聯(lián)系起來,才能發(fā)生作用。聯(lián)系的方法稱為綁定,所謂綁定就是指定規(guī)則作用于哪個表的哪一列或哪個用戶定義數(shù)據(jù)類型。表的一列或一個用戶定義數(shù)據(jù)類型只能與一個規(guī)則相綁定,而一個規(guī)則可以綁定多對象。解除規(guī)則與對象的綁定稱為松綁。8.2使用規(guī)則實施數(shù)據(jù)完整性第11頁,共150頁,星期六,2024年,5月8.2.3規(guī)則的綁定與松綁在企業(yè)管理器中,展開數(shù)據(jù)庫(Sales)文件夾,鼠標單擊“規(guī)則”選項,在右窗格中選擇要進行綁定的規(guī)則(hire_date),單擊鼠標右鍵,從快捷菜單中選擇“屬性”菜單項,打開“規(guī)則屬性”對話框,如圖8-4所示。圖中的“綁定UDT(U)”按鈕用于綁定規(guī)則到用戶定義的數(shù)據(jù)類型,“綁定列(B)”按鈕用于綁定規(guī)則到表的列。1.用企業(yè)管理器管理規(guī)則的綁定和松綁第12頁,共150頁,星期六,2024年,5月8.2.3規(guī)則的綁定與松綁在圖8-4中單擊“綁定UDT(U)”按鈕,則出現(xiàn)“將綁定規(guī)則到用戶定義的數(shù)據(jù)類型”對話框,如圖8-5所示;第13頁,共150頁,星期六,2024年,5月8.2.3規(guī)則的綁定與松綁單擊“綁定列(B)”按鈕,則出現(xiàn)如圖8-6所示的“將綁定規(guī)則到列”對話框。在“將規(guī)則綁定列”對話框的左邊“未綁定的列”列表框中選擇一列“添加”到右邊“綁定列”列表框中,就實現(xiàn)規(guī)則綁定了。同樣,去掉“將規(guī)則綁定到用戶定義的數(shù)據(jù)類型”對話框的列表框的“綁定”列下的標識或刪除“將規(guī)則綁定列”對話框的右邊“綁定列”列表框的列,就實現(xiàn)了規(guī)則的松綁操作。第14頁,共150頁,星期六,2024年,5月8.2.3規(guī)則的綁定與松綁2.用系統(tǒng)存儲過程sp_bindrule綁定規(guī)則系統(tǒng)存儲過程sp_bindrule可以綁定一個規(guī)則到表的一個列或一個用戶定義數(shù)據(jù)類型上。其語法格式如下:sp_bindrule[@rulename=]'rule',[@objname=]'object_name'例8-6將例8-1創(chuàng)建的規(guī)則hire_date_rule綁定到employee表的hire_date列上。EXECsp_bindrulehire_date_rule,'employee.hire_date'

運行結(jié)果為:已將規(guī)則綁定到表的列上。第15頁,共150頁,星期六,2024年,5月8.2.3規(guī)則的綁定與松綁系統(tǒng)存儲過程sp_unbindrule可解除規(guī)則與列或用戶定義數(shù)據(jù)類型的綁定,其語法格式如下:sp_unbindrule[@objname=]'object_name'[,[@futureonly=]'futureonly']3.用系統(tǒng)存儲過程sp_unbindrule解除規(guī)則的綁定例8-9解除例8-6綁定在employee表的hire_date列和用戶定義數(shù)據(jù)類型pat_char上的規(guī)則。EXECsp_unbindrule'employee.hire_date'運行結(jié)果如下:(所影響的行數(shù)為1行)已從表的列上解除了規(guī)則的綁定。第16頁,共150頁,星期六,2024年,5月8.2.4刪除規(guī)則使用DROPRULE語句刪除當前數(shù)據(jù)庫中的一個或多個規(guī)則。其語法格式如下:DROPRULE{rule_name}[,...n]注意:在刪除一個規(guī)則前,必須先將與其綁定的對象解除綁定。例8-10刪除例8-1和8-2中創(chuàng)建的規(guī)則。DROPRULEsex_rule,hire_date_rule8.2使用規(guī)則實施數(shù)據(jù)完整性第17頁,共150頁,星期六,2024年,5月8.3.1創(chuàng)建默認值8.3.2查看默認值8.3.3默認值的綁定與松綁8.3.4刪除默認值8.3使用默認值實施數(shù)據(jù)完整性第18頁,共150頁,星期六,2024年,5月8.3使用默認值實施數(shù)據(jù)完整性8.3.1創(chuàng)建默認值默認值(Default)是用戶輸入記錄時往沒有指定具體數(shù)據(jù)的列中自動插入的數(shù)據(jù)。默認值對象與CREATETABLE或ALTERTABLE語句操作表時用默認約束指定的默認值功能相似,兩者的區(qū)別類似于規(guī)則與檢查約束在使用上的區(qū)別。默認值對象可以用于多個列或用戶定義數(shù)據(jù)類型。表的一列或一個用戶定義數(shù)據(jù)類型只能與一個默認值相綁定。默認值的創(chuàng)建、查看、綁定、松綁和刪除等操作可在企業(yè)管理器中進行,也可利用Transact-SQL語句進行。第19頁,共150頁,星期六,2024年,5月8.3.1創(chuàng)建默認值8.3.1創(chuàng)建默認值1.用企業(yè)管理器創(chuàng)建默認值在企業(yè)管理器中選擇數(shù)據(jù)庫對象的“默認值”對象,單擊右鍵,從快捷菜單中選擇“新建默認值”選項,打開“默認屬性”對話框,如圖8-7所示。輸入默認值名稱和值表達式之后,單擊“確定”按鈕,即完成默認值的創(chuàng)建。第20頁,共150頁,星期六,2024年,5月8.3.1創(chuàng)建默認值2.用CREATEDEFAULT語句創(chuàng)建默認值CREATEDEFAULT語句用于在當前數(shù)據(jù)庫中創(chuàng)建默認值對象,其語法格式如下:CREATEDEFAULTdefault_nameASconstant_expression例8-11創(chuàng)建生日默認值birthday_defa。CREATEDEFAULTbirthday_defaAS'1978-1-1'例8-12創(chuàng)建當前日期默認值today_defa。CREATEDEFAULTtoday_defaASgetdate()第21頁,共150頁,星期六,2024年,5月1.用企業(yè)管理器查看默認值在企業(yè)管理器中選擇數(shù)據(jù)庫對象的“默認值”對象,即可從右邊的任務(wù)板中看到默認值的大部分信息,如圖8-8所示。8.3.2查看默認值8.3使用默認值實施數(shù)據(jù)完整性第22頁,共150頁,星期六,2024年,5月8.3.2查看默認值選擇要查看的默認值,單擊右鍵,從快捷菜單中選擇“屬性”選項,就會出現(xiàn)圖8-9所示的“默認屬性”對話框,可以從中編輯默認值的值表達式。第23頁,共150頁,星期六,2024年,5月2.用系統(tǒng)存儲過程sp_helptext查看默認值使用sp_helptext系統(tǒng)存儲過程可以查看默認值的細節(jié)。例8-13查看默認值today_defa。EXECsp_helptexttoday_defa運行結(jié)果如圖8-10所示。8.3.2查看默認值第24頁,共150頁,星期六,2024年,5月8.3.3默認值的綁定與松綁1.用企業(yè)管理器管理默認值的綁定和松綁在企業(yè)管理器中,選擇要進行綁定設(shè)置的默認值,單擊右鍵,從快捷菜單中選擇“屬性”選項,打開“默認屬性”對話框,參見圖8-9。圖8-9中的“綁定UDT(U)”按鈕用于將默認值綁定到用戶定義數(shù)據(jù)類型,“綁定列(B)”按鈕用于將默認值綁定到表的列。單擊“綁定UDT(U)”按鈕,則出現(xiàn)如圖8-11所示的“將綁定默認值到用戶定義的數(shù)據(jù)類型”對話框8.3使用默認值實施數(shù)據(jù)完整性第25頁,共150頁,星期六,2024年,5月8.3.3默認值的綁定與松綁單擊“綁定列(B)”按鈕,則出現(xiàn)如圖8-12所示的“將綁定默認值到表的列”對話框。管理默認值與用戶定義數(shù)據(jù)類型以及表的列之間的綁定和松綁與規(guī)則相同。第26頁,共150頁,星期六,2024年,5月8.3.3默認值的綁定與松綁2.用sp_bindefault綁定默認值系統(tǒng)存儲過程sp_bindefault可以綁定一個默認值到表的一個列或一個用戶定義數(shù)據(jù)類型上。其語法格式如下:sp_bindefault[@defname=]'default',[@objname=]'object_name'例8-14綁定默認值today_defa到employee表的hire_date列上。 EXECsp_bindefaulttoday_defa,'employee.hire_date'運行結(jié)果如下:已將默認值綁定到列。第27頁,共150頁,星期六,2024年,5月8.3.3默認值的綁定與松綁3.用sp_unbindefault解除默認值的綁定系統(tǒng)存儲過程sp_unbindefault可以解除默認值與表的列或用戶定義數(shù)據(jù)類型的綁定,其語法格式如下:

sp_unbindefault[@objname=]'object_name' [,[@futureonly=]'futureonly']例8-15解除默認值today_defa與表employee的hire_date列的綁定。EXECsp_unbindefault'employee.hire_date'運行結(jié)果如下:(所影響的行數(shù)為1行)已從表的列上解除了默認值的綁定。第28頁,共150頁,星期六,2024年,5月8.3使用默認值實施數(shù)據(jù)完整性8.3.4刪除默認值可以在企業(yè)管理器中選擇默認值,單擊右鍵,從快捷菜單中選擇“刪除”選項刪除默認值,也可以使用DROPDEFAULT語句刪除當前數(shù)據(jù)庫中的一個或多個默認值。其語法格式如下:DROPDEFAULT{default_name}[,...n]例8-16刪除生日默認值birthday_defa。DROPDEFAULTbirthday_defa第29頁,共150頁,星期六,2024年,5月8.4.1主鍵約束8.4.2外鍵約束8.4.3惟一性約束8.4.4檢查約束8.4.5默認約束8.4使用約束實施數(shù)據(jù)完整性第30頁,共150頁,星期六,2024年,5月8.4使用約束實施數(shù)據(jù)完整性8.4.1主鍵約束約束(Constraint)是SQLServer提供的自動保持數(shù)據(jù)庫完整性的一種機制,它定義了可輸入表或表的單個列中的數(shù)據(jù)的限制條件。使用約束優(yōu)先于使用觸發(fā)器、規(guī)則和默認值。約束獨立于表結(jié)構(gòu),作為數(shù)據(jù)庫定義部分在CREATETABLE語句中聲明,可以在不改變表結(jié)構(gòu)的基礎(chǔ)上,通過ALTERTABLE語句添加或刪除。當表被刪除時,表所帶的所有約束定義也隨之被刪除。第31頁,共150頁,星期六,2024年,5月8.4.1主鍵約束主鍵表的一列或幾列的組合的值在表中惟一地指定一行記錄,這樣的一列或多列稱為表的主鍵(PrimaryKey,PK),通過它可強制表的實體完整性。主鍵不允許為空值,且不同兩行的鍵值不能相同。表中可以有不止一個鍵惟一標識行,每個鍵都稱為侯選鍵,只可以選一個侯選鍵作為表的主鍵,其他侯選鍵稱作備用鍵。如果一個表的主鍵由單列組成,則該主鍵約束可以定義為該列的列約束。如果主鍵由兩個以上的列組成,則該主鍵約束必須定義為表約束。第32頁,共150頁,星期六,2024年,5月定義列級主鍵約束的語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]定義表級主鍵約束的語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column_name[,…n])}第33頁,共150頁,星期六,2024年,5月8.4.1主鍵約束例8-17在Sales數(shù)據(jù)庫中創(chuàng)建customer表,并聲明主鍵約束。CREATETABLESales.dbo.customer(customer_idbigintNOTNULLIDENTITY(0,1)PRIMARYKEY,customer_namevarchar(50)NOTNULL,linkman_namechar(8),addressvarchar(50),telephonechar(12)NOTNULL)第34頁,共150頁,星期六,2024年,5月8.4.1主鍵約束非聚集主鍵約束若要定義customer_id列為非聚集主鍵約束,并指定約束名為PK_customer,使用以下語句:

customer_idchar(5)CONSTRAINTPK_customerPRIMARYKEYNONCLUSTERED第35頁,共150頁,星期六,2024年,5月8.4.1主鍵約束CREATETABLEgoods1(goods_idchar(6)NOTNULL,goods_namevarchar(50)NOTNULL,classification_idchar(6)NOTNULL,unit_pricemoneyNOTNULL,stock_quantityfloatNOTNULL,order_quantityfloatNULL

CONSTRAINTpk_p_idPRIMARYKEY(goods_id))ON[PRIMARY]例8-18創(chuàng)建一個產(chǎn)品信息表goods1,將產(chǎn)品編號goods_id列聲明為主鍵。第36頁,共150頁,星期六,2024年,5月8.4.1主鍵約束例8-19根據(jù)商品銷售的時間和商品類別來確定銷售的商品的數(shù)量。CREATETABLEg_order(good_typeint,order_timedatetime,order_numint,

CONSTRAINTg_o_keyPRIMARYKEY(good_type,order_time))第37頁,共150頁,星期六,2024年,5月8.4.2外鍵約束外鍵約束定義了表與表之間的關(guān)系。通過將一個表中一列或多列添加到另一個表中,創(chuàng)建兩個表之間的連接,這個列就成為第二個表的外鍵(ForeignKey,F(xiàn)K),即外鍵是用于建立和加強兩個表數(shù)據(jù)之間的連接的一列或多列,通過它可以強制參照完整性。第38頁,共150頁,星期六,2024年,5月例如,Sales數(shù)據(jù)庫中的employee、sell_order、goods這3個表之間存在以下邏輯聯(lián)系:sell_order(銷售訂單)表中employee_id(員工編號)列的值必須是employee表employee_id列中的某一個值,因為簽訂銷售訂單的人必須是當前公司員工;而sell_order表中g(shù)oods_id(貨物編號)列的值必須是goods(貨物)表的goods_id列中的某一個值,因為銷售訂單上售出的只能是已知貨物。因此,在sell_order表上應(yīng)建立兩個外鍵約束FK_sell_order_employee和FK_sell_order_goods來限制sell_order表employee_id列和goods_id列的值必須分別來自employee表的employee_id列及goods表的goods_id列。8.4.2外鍵約束第39頁,共150頁,星期六,2024年,5月8.4.2外鍵約束級聯(lián)操作SQLServer提供了兩種級聯(lián)操作以保證數(shù)據(jù)完整性:(1)級聯(lián)刪除確定當主鍵表中某行被刪除時,外鍵表中所有相關(guān)行將被刪除。(2)級聯(lián)修改確定當主鍵表中某行的鍵值被修改時,外鍵表中所有相關(guān)行的該外鍵值也將被自動修改為新值。第40頁,共150頁,星期六,2024年,5月8.4.2外鍵約束外鍵的表約束與列約束定義表級外鍵約束的語法格式如下:[CONSTRAINT約束名]FOREIGNKEY(列名[,…n])REFERENCES參照主表[(參照列[,…n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}]][NOTFORREPLICATION]定義列級外鍵約束的語法格式如下:[CONSTRAINT約束名][FOREIGNKEY]REFERENCES參照主表[NOTFORREPLICATION]第41頁,共150頁,星期六,2024年,5月CREATETABLEsell_order1(order_id1char(6)NOTNULL,goods_idchar(6)NOTNULL,employee_idchar(4)NOTNULL,customer_idchar(4)NOTNULL,transporter_idchar(4)NOTNULL,order_numfloatNULL,discountfloatNULL,order_datedatetimeNOTNULL,send_datedatetimeNULL,arrival_datedatetimeNULL,costmoneyNULL,

CONSTRAINTpk_order_idPRIMARYKEY(order_id1),

FOREIGNKEY(goods_id)REFERENCESgoods1(goods_id))例8-20創(chuàng)建一個訂貨表sell_order1,與例8-18創(chuàng)建的產(chǎn)品表goods1相關(guān)聯(lián)。8.4.2外鍵約束第42頁,共150頁,星期六,2024年,5月CREATETABLEsell_order2(order_id1char(6)PRIMARYKEY,goods_idchar(6)NOTNULL

CONSTRAINTFK_goods_idFOREIGNKEY(goods_id)REFERENCESGoods1(goods_id)ONDELETENOACTIONONUPDATECASCADE,employee_idchar(4)NOTNULL

FOREIGNKEY(employee_id)REFERENCESemployee(employee_id)ONUPDATECASCADE,customer_idchar(4)NOTNULL,……

CONSTRAINTFK_customer_idFOREIGNKEY(customer_id)REFERENCEScustomer(customer_id))例8-21創(chuàng)建表sell_order2,并為goods_id、employee_id、custom_id三列定義外鍵約束。8.4.2外鍵約束第43頁,共150頁,星期六,2024年,5月8.4使用約束實施數(shù)據(jù)完整性8.4.3惟一性約束惟一性(Unique)約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重復(fù)的值,為表中的一列或者多列提供實體完整性。惟一性約束指定的列可以有NULL屬性。主鍵也強制執(zhí)行惟一性,但主鍵不允許空值,故主鍵約束強度大于惟一約束。因此主鍵列不能再設(shè)定惟一性約束。第44頁,共150頁,星期六,2024年,5月8.4.3惟一性約束定義列級惟一性約束的語法格式如下:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED]惟一性約束應(yīng)用于多列時的定義格式:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED](column_name[,…n])第45頁,共150頁,星期六,2024年,5月8.4.3惟一性約束例8-23定義一個員工信息表employees,其中員工的身份證號emp_cardid列具有惟一性。CREATETABLEemployees(emp_idchar(8),emp_namechar(10),emp_cardidchar(18),CONSTRAINTpk_emp_idPRIMARYKEY(emp_id),CONSTRAINTuk_emp_cardidUNIQUE(emp_cardid))第46頁,共150頁,星期六,2024年,5月8.4使用約束實施數(shù)據(jù)完整性8.4.4檢查約束檢查(Check)約束對輸入列或整個表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫的數(shù)據(jù)完整性。當對具有檢查約束列進行插入或修改時,SQLServer將用該檢查約束的邏輯表達式對新值進行檢查,只有滿足條件(邏輯表達式返回TRUE)的值才能填入該列,否則報錯??梢詾槊苛兄付ǘ鄠€CHECK約束。第47頁,共150頁,星期六,2024年,5月8.4.4檢查約束定義檢查約束的語法格式:[CONSTRAINTconstraint_name]CHECK[NOTFORREPLICATION](logical_expression)例8-25創(chuàng)建一個訂貨表orders,保證各訂單的訂貨量必須不小于10。CREATETABLEorders(order_idchar(8),p_idchar(8),p_namechar(10),quantitysmallintCONSTRAINTchk_quantityCHECK(quantity>=10),CONSTRAINTpk_orders_idPRIMARYKEY(order_id))第48頁,共150頁,星期六,2024年,5月CREATETABLEtransporters(transporter_idchar(4)NOTNULL,transport_namevarchar(50),linkman_namechar(8),addressvarchar(50),telephonechar(12)NOTNULLCHECK(telephoneLIKE'0[1-9][0-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9]'ORtelephoneLIKE'0[1-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))8.4.4檢查約束例8-26創(chuàng)建transporters表并定義檢查約束第49頁,共150頁,星期六,2024年,5月8.4使用約束實施數(shù)據(jù)完整性8.4.5默認約束默認(Default)約束通過定義列的默認值或使用數(shù)據(jù)庫的默認值對象綁定表的列,以確保在沒有為某列指定數(shù)據(jù)時,來指定列的值。默認值可以是常量,也可以是表達式,還可以為NULL值。第50頁,共150頁,星期六,2024年,5月8.4.5默認約束定義默認約束的語法格式[CONSTRAINTconstraint_name]DEFAULTconstant_expression[FORcolumn_name]例8-27在Sales數(shù)據(jù)庫中,為員工表employee的sex列添加默認約束,默認值是“男”。ALTERTABLEemployeeADDCONSTRAINTsex_defaultDEFAULT'男'FORsex例8-28更改表employee,為hire_date列定義默認約束。ALTERTABLEemployeeADDCONSTRAINThire_date_dfDEFAULT(getdate())FORhire_date第51頁,共150頁,星期六,2024年,5月8.4.5默認約束例8-31為表purchase_orders定義多個約束CREATETABLEpurchase_orders(order_id2char(6)NOTNULL,goods_idchar(6)NOTNULL,employee_idchar(4)NOTNULL,supplier_idchar(5)NOTNULL,transporter_idchar(4),order_numfloatNOTNULL,discountfloat

CHECK(discount>=0ANDdiscount<=50)DEFAULT(0),order_datedatetimeNOTNULLDEFAULT(GetDate()),send_datedatetime,arrival_datedatetime,

CONSTRAINTCK_Send_dateCHECK(send_date>order_date),CHECK(arrival_date>send_date))第52頁,共150頁,星期六,2024年,5月

本章小結(jié)(1)數(shù)據(jù)完整性有4種類型:實體完整性、域完整性、參照完整性和用戶定義的完整性。在SQLServer2000中可以通過各種約束、默認、規(guī)則和觸發(fā)器等數(shù)據(jù)庫對象來保證數(shù)據(jù)的完整性。(2)規(guī)則實施數(shù)據(jù)的完整性:規(guī)則就是數(shù)據(jù)庫中對存儲在表的列或用戶定義數(shù)據(jù)類型中的值的規(guī)定和限制??梢酝ㄟ^企業(yè)管理器和Transact-SQL語句來創(chuàng)建、刪除、查看規(guī)則以及規(guī)則的綁定與松綁。(3)默認值實施數(shù)據(jù)完整性:默認值是用戶輸入記錄時沒有指定具體數(shù)據(jù)的列中自動插入的數(shù)據(jù)。默認值對象可以用于多個列或用戶定義數(shù)據(jù)類型,它的管理與應(yīng)用同規(guī)則有許多相似之處。表的一列或一個用戶定義數(shù)據(jù)類型也只能與一個默認值相綁定。在SQLServer中使用企業(yè)管理器和Transact-SQL語句實現(xiàn)默認值的創(chuàng)建、查看、刪除以及默認值的綁定與松綁。(4)使用約束實施數(shù)據(jù)完整性:約束是SQLServer提供的自動保持數(shù)據(jù)庫完整性的一種方法,定義了可輸入表或表的單個列中的數(shù)據(jù)的限制條件。在SQLServer中有6種約束:非空值約束、主鍵約束、外鍵約束、惟一性約束、檢查約束和默認約束。第53頁,共150頁,星期六,2024年,5月第9章Transact-SQL程序設(shè)計

第54頁,共150頁,星期六,2024年,5月本章內(nèi)容9.1數(shù)據(jù)與表達式9.2函數(shù)9.3程序控制流語句9.4游標管理與應(yīng)用第55頁,共150頁,星期六,2024年,5月9.1數(shù)據(jù)與表達式9.1.1用戶定義數(shù)據(jù)類型9.1.2常量與變量9.1.3運算符與表達式第56頁,共150頁,星期六,2024年,5月9.1數(shù)據(jù)與表達式9.1.1用戶定義數(shù)據(jù)類型1.使用系統(tǒng)存儲過程來創(chuàng)建用戶定義數(shù)據(jù)類型,命令格式如下:sp_addtype[@typename=]type,[@phystype=]system_data_type[,[@nulltype=]'null_type'][,[@owner=]'owner_name']第57頁,共150頁,星期六,2024年,5月9.1.1用戶定義數(shù)據(jù)類型例如,為Sales數(shù)據(jù)庫創(chuàng)建—個不允許為NULL值的test_add用戶定義數(shù)據(jù)類型。 USESales GO EXECsp_addtypetest_add,'Varchar(10)','NOTNULL' GO此后,test_add可用為數(shù)據(jù)列或變量的數(shù)據(jù)類型。第58頁,共150頁,星期六,2024年,5月9.1.1用戶定義數(shù)據(jù)類型2.使用企業(yè)管理器創(chuàng)建用戶定義數(shù)據(jù)類型在企業(yè)管理器中,為Sales數(shù)據(jù)庫創(chuàng)建—個不允許NULL值的test_add用戶定義數(shù)據(jù)類型,操作步驟如下。(1)選擇Sales數(shù)據(jù)庫。(2)在右窗格中選擇“用戶定義的數(shù)據(jù)類型”項,單擊鼠標右鍵,在出現(xiàn)的快捷菜單中選擇“新建用戶定義數(shù)據(jù)類型”命令。(3)在“用戶定義的數(shù)據(jù)類型屬性”對話框中的文本框內(nèi)輸入test_add。(4)在“數(shù)據(jù)類型”下拉列表框中,選擇char。(5)在“長度”文本框中輸入10。(6)選中“允許NULL值”復(fù)選框。(7)單擊“確定”按鈕完成創(chuàng)建用戶自定義數(shù)據(jù)類型。第59頁,共150頁,星期六,2024年,5月9.1數(shù)據(jù)與表達式9.1.2常量與變量在程序運行中保持常值的數(shù)據(jù),即程序本身不能改變其值的數(shù)據(jù),稱為常量,在程序中經(jīng)常直接使用文字符號表示。相應(yīng)地,在程序運行過程中可以改變其值的數(shù)據(jù),稱為變量。第60頁,共150頁,星期六,2024年,5月9.1.2常量與變量1.常量常量是表示特定數(shù)據(jù)值的符號,其格式取決于其數(shù)據(jù)類型(1)字符串和二進制常量字符串常量括在單引號內(nèi)并包含字母數(shù)字字符(a-z、A-Z和0-9)以及特殊字符,如感嘆號(!)、at符(@)和數(shù)字號(#)。例如:‘Cincinnati’、‘O’‘Brien’、‘ProcessXis50%complete.’、“O‘Brien”為字符串常量。二進制常量具有前輟0x并且是十六進制數(shù)字字符串,它們不使用引號。例如0xAE、0x12Ef、0x69048AEFDD010E、0x(空串)為二進制常量。第61頁,共150頁,星期六,2024年,5月(2)日期/時間常量datetime常量使用特定格式的字符日期值表示,用單引號括起來。輸入時,可以使用“/”、“.”、“-”作日期/時間常量的分隔符。輸入格式datetime值Smalldatetime值Sep3,20051:34:34.1222005-09-0301:34:34.1232005-09-0301:35:009/3/20051PM2005-09-0313:00:00.0002005-09-0313:00:009.3.200513:002005-09-0313:00:00.0002005-09-0313:00:0013:25:191900-01-0113:25:19.0001900-01-0113:25:009/3/20052005-09-0300:00:00.0002005-09-0300:00:009.1.2常量與變量第62頁,共150頁,星期六,2024年,5月(3)數(shù)值常量①整型常量由沒有用引號括起來且不含小數(shù)點的一串數(shù)字表示。例如,1894、2為整型常量。②浮點常量主要采用科學(xué)記數(shù)法表示,例如,101.5E5、0.5E-2為浮點常量。③精確數(shù)值常量由沒有用引號括起來且包含小數(shù)點的一串數(shù)字表示。例如,1894.1204、2.0為精確數(shù)值常量。④貨幣常量是以“$”為前綴的一個整型或?qū)嵭统A繑?shù)據(jù),不使用引號。例如,$12.5、$542023.14為貨幣常量。⑤uniqueidentifier常量是表示全局惟一標識符GUID值的字符串??梢允褂米址蚨M制字符串格式指定。9.1.2常量與變量第63頁,共150頁,星期六,2024年,5月邏輯數(shù)據(jù)常量使用數(shù)字0或1表示,并且不使用引號。非0的數(shù)字當作1處理。(5)空值在數(shù)據(jù)列定義之后,還需確定該列是否允許空值(NULL)。允許空值意味著用戶在向表中插入數(shù)據(jù)時可以忽略該列值??罩悼梢员硎菊?、實型、字符型數(shù)據(jù)。(4)邏輯數(shù)據(jù)常量9.1.2常量與變量第64頁,共150頁,星期六,2024年,5月變量用于臨時存放數(shù)據(jù),變量中的數(shù)據(jù)隨著程序的運行而變化,變量有名字與數(shù)據(jù)類型兩個屬性。變量的命名使用常規(guī)標識符,即以字母、下劃線(_)、at符號(@)、數(shù)字符號(#)開頭,后續(xù)字母、數(shù)字、at符號、美元符號($)、下劃線的字符序列。不允許嵌入空格或其他特殊字符。2.變量9.1.2常量與變量第65頁,共150頁,星期六,2024年,5月全局變量由系統(tǒng)定義并維護,通過在名稱前面加“@@”符號局部變量的首字母為單個“@”。全局變量和局部變量9.1.2常量與變量第66頁,共150頁,星期六,2024年,5月(1)局部變量局部變量使用DECLARE語句定義DECLARE{@local_variabledata_type}[,...n]變量名最大長度為30個字符。一條DECLARE語句可以定義多個變量,各變量之間使用逗號隔開。例如DECLARE@namevarchar(30),@typeint9.1.2常量與變量第67頁,共150頁,星期六,2024年,5月局部變量的賦值①用SELECT為局部變量賦值SELECT@variable_name=expression[,…n]FROM…WHERE…例如DECLARE@int_varintSELECT@int_var=12/*給@int_var賦值*/SELECT@int_var/*將@int_var的值輸出到屏幕上*/9.1.2常量與變量第68頁,共150頁,星期六,2024年,5月在一條語句中可以同時對幾個變量進行賦值例如DECLARE@LastNamechar(8),@Firstnamechar(8),@BirthDatedatetimeSELECT@LastName='Smith',@Firstname='David',@BirthDate='1985-2-20'SELECT@LastName,@Firstname,@BirthDate局部變量沒有被賦值前,其值是NULL,若要在程序中引用它,必須先賦值。9.1.2常量與變量第69頁,共150頁,星期六,2024年,5月例9-1使用SELECT語句從customer表中檢索出顧客編號為“C0002”的行,再將顧客的名字賦給變量@customer。DECLARE@customervarchar(40),@curdatedatetimeSELECT@customer=customer_name,@curdate=getdate()FROMcustomerWHEREcustomer_id='C0002'9.1.2常量與變量第70頁,共150頁,星期六,2024年,5月②利用UPDATE為局部變量賦值例9-2將sell_order表中的transporter_id列值為“T001”、goods_id列值為“G00003”的order_num列的值賦給局部變量@order_num。DECLARE@order_numfloatUPDATEsell_orderSET@order_num=order_num*2 WHEREtransporter_id='T001'ANDgoods_id='G00003'9.1.2常量與變量第71頁,共150頁,星期六,2024年,5月③用SET給局部變量賦值SET語句格式為:SET{@local_variable=expression}使用SET初始化變量的方法與SELECT語句相同,但一個SET語句只能為一個變量賦值。例9-3計算employee表的記錄數(shù)并賦值給局部變量@rows。DECLARE@rowsintSET@rows=(SELECTCOUNT(*)FROMemployee)SELECT@rows9.1.2常量與變量第72頁,共150頁,星期六,2024年,5月(2)全局變量全局變量通常被服務(wù)器用來跟蹤服務(wù)器范圍和特定會話期間的信息,不能顯式地被賦值或聲明。全局變量不能由用戶定義,也不能被應(yīng)用程序用來在處理器之間交叉?zhèn)鬟f信息。9.1.2常量與變量第73頁,共150頁,星期六,2024年,5月①@@rowcount@@rowcount存儲前一條命令影響到的記錄總數(shù),除了DECLARE語句之外,其他任何語句都可以影響@@rowcount的值。例如DECLARE@rowsintSELECT@rows=@@rowcount9.1.2常量與變量第74頁,共150頁,星期六,2024年,5月②@@error如果@@error為非0值,則表明執(zhí)行過程中產(chǎn)生了錯誤,此時應(yīng)當在程序中采取相應(yīng)的措施加以處理。@@error的值與@@rowcount一樣,會隨著每一條SQLServer語句的變化而改變。例9-4使服務(wù)器產(chǎn)生服務(wù),并用顯示錯誤號。raiserror('miscellaneouserrormessage',16,1)/*產(chǎn)生一個錯誤*/if@@error<>0SELECT@@erroras'lasterror'運行結(jié)果:服務(wù)器:消息50000,級別16,狀態(tài)1,行1miscellaneouserrormessagelasterror09.1.2常量與變量第75頁,共150頁,星期六,2024年,5月例9-5捕捉例9-4中服務(wù)器產(chǎn)生的錯誤號,并顯示出來。DECLARE@my_errorintRAISERROR('miscellaneouserrormessage',16,1)SELECT@my_error=@@errorIF@my_error<>0SELECT@my_erroras'lasterror'運行結(jié)果:服務(wù)器:消息50000,級別16,狀態(tài)1,行2miscellaneouserrormessagelasterror500009.1.2常量與變量第76頁,共150頁,星期六,2024年,5月③@@trancount@@trancount記錄當前的事務(wù)數(shù)量,當某個事務(wù)當前并沒有結(jié)束會話過程時,@@trancount的值大于0。④@@version@@version的值代表服務(wù)器的當前版本和當前操作系統(tǒng)版本,是SQLServer中一項較實用的技術(shù)支持,通常對識別網(wǎng)絡(luò)中某個未命名的服務(wù)器時非常有用。⑤@@spid@@spid返回當前用戶進程的服務(wù)器進程ID,可以用來識別sp_who輸出中的當前用戶進程。9.1.2常量與變量第77頁,共150頁,星期六,2024年,5月例9-6使用@@spid返回當前用戶進程的ID。SELECT@@spidas'ID',SYSTEM_USERAS'LoginName',USERAS'UserName'運行結(jié)果:IDLoginNameUserName52sa dbo 9.1.2常量與變量第78頁,共150頁,星期六,2024年,5月9.1數(shù)據(jù)與表達式9.1.3運算符與表達式運算符用來執(zhí)行數(shù)據(jù)列之間的數(shù)學(xué)運算或比較操作。表達式是符號與運算符的組合。簡單的表達式可以是一個常量、變量、列或函數(shù),復(fù)雜表達式是由運算符連接一個或多個簡單表達式。第79頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式1.算術(shù)運算符與表達式算術(shù)運算符用于數(shù)值型列或變量間的算術(shù)運算。算術(shù)運算符包括加(+)、減(-)、乘(*)、除(/)和取模(%)運算等。例9-9使用“+”將goods表中高于9000的商品價格增加15元:SELECTgoods_name,unit_price,(unit_price+15)ASnowpriceFROMgoodsWHEREunit_price>9000運行結(jié)果如圖所示。第80頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式2.位運算符與表達式位運算符用以對數(shù)據(jù)進行按位與(&)、或(|)、異或(^)、求反(~)等運算。&運算只有當兩個表達式中的兩個位值都為1時,結(jié)果中的位才被設(shè)置為1,否則結(jié)果中的位被設(shè)置為0。|運算時,如果在兩個表達式的任一位為1或者兩個位均為1,那么結(jié)果的對應(yīng)位被設(shè)置為1;如果表達式中的兩個位都不為1,則結(jié)果中該位的值被設(shè)置為0。^運算時,如果在兩個表達式中,只有一位的值為1,則結(jié)果中位的值被設(shè)置為1;如果兩個位的值都為0或者都為1,則結(jié)果中該位的值被清除為0。第81頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式例如,170與75進行&運算先將170和75轉(zhuǎn)換為二進制數(shù)0000000010101010和0000000001001011,再進行&運算的結(jié)果是0000000000001010,即十進制數(shù)10。同樣,表達式5^2,~1,5|2的運算結(jié)果為:7,0,7。第82頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式3.比較運算符與表達式比較運算符用來比較兩個表達式的值是否相同,可用于字符、數(shù)字或日期數(shù)據(jù)。SQLServer中的比較運算符有大于(>)、小于(<)、大于等于(>=)、小于等于(<=)和不等于(!=)等,比較運算返回布爾值,通常出現(xiàn)在條件表達式中。比較運算符的結(jié)果為布爾數(shù)據(jù)類型,其值為TRUE、FALSE及UNKNOWN。例如,表達式2=3的運算結(jié)果為FALSE。第83頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式4.邏輯運算符與表達式邏輯運算符與(AND)、或(OR)、非(NOT)等,用于對某個條件進行測試,以獲得其真實情況。邏輯運算符和比較運算符一樣,返回TRUE或FALSE的布爾數(shù)據(jù)值。第84頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式表9-5邏輯運算符運算符含義AND如果兩個布爾表達式都為TRUE,那么結(jié)果為TRUE。OR如果兩個布爾表達式中的一個為TRUE,那么結(jié)果就為TRUE。NOT對任何其他布爾運算符的值取反。LIKE如果操作數(shù)與一種模式相匹配,那么值為TRUE。IN如果操作數(shù)等于表達式列表中的一個,那么值為TRUE。ALL如果一系列的比較都為TRUE,那么值為TRUE。ANY如果一系列的比較中任何一個為TRUE,那么值為TRUE。BETWEEN如果操作數(shù)在某個范圍之內(nèi),那么值為TRUE。EXISTS如果子查詢包含一些行,那么值為TRUE。第85頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式邏輯運算符通常和比較運算一起構(gòu)成更為復(fù)雜的表達式。邏輯運算符的操作數(shù)都只能是布爾型數(shù)據(jù)。例如,在表employee中查找1973年以前與1980年以后出生的男員工的表達式為:(year(birth_date)<1973ORyear(birth_date)>1980)ANDsex='男'第86頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式LIKE運算符確定給定的字符串是否與指定的模式匹配,通常只限于字符數(shù)據(jù)類型。LIKE的通配符如下表運算符描述示例%包含零個或多個字符的任意字符串。addressLIKE'%公司%'將查找地址任意位置包含公司的所有職員。_下劃線,對應(yīng)任何單個字符。employee_nameLIKE'_海燕'將查找以“海燕”結(jié)尾的所有6個字符的名字。[]指定范圍([a-f])或集合([abcdef])中的任何單個字符。employee_nameLIKE'[張李王]海燕'將查找張海燕、李海燕、王海燕等。[^]不屬于指定范圍([a-f])或集合([abcdef])的任何單個字符。employee_nameLIKE'[^張李]海燕'將查找不姓張、李的名為海燕的職員。第87頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式例如,查找所有姓“錢”的員工及住址SELECTemployee_name,addressFROMemployeeWHEREemployee_nameLIKE'錢%'第88頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式4.連接運算符與表達式連接運算符(+)用于兩個字符串數(shù)據(jù)的連接,通常也稱為字符串運算符。在SQLServer中,對字符串的其他操作通過字符串函數(shù)進行。字符串連接運算符的操作數(shù)類型有char、varchar和text等。例如,‘Dr.’+‘Computer’的運算結(jié)果:'Dr.Computer'第89頁,共150頁,星期六,2024年,5月9.1.3運算符與表達式5.運算符的優(yōu)先級別SQLServer中各種運算符的優(yōu)先順序如下:()→~→^→&→|→*、/、%→+、-→NOT→AND→OR

排在前面的運算符的優(yōu)先級高于其后的運算符。在一個表達式中,先計算優(yōu)先級較高的運算,后計算優(yōu)先級低的運算,相同優(yōu)先級的運算按自左向右的順序依次進行。第90頁,共150頁,星期六,2024年,5月9.2函數(shù)9.2.1常用函數(shù)9.2.2用戶定義函數(shù)第91頁,共150頁,星期六,2024年,5月9.2函數(shù)9.2.1常用函數(shù)函數(shù)是—組編譯好的Transact-SQL語句,它們可以帶一個或一組數(shù)值做參數(shù),也可不帶參數(shù),它返回一個數(shù)值、數(shù)值集合,或執(zhí)行一些操作。函數(shù)能夠重復(fù)執(zhí)行一些操作,從而避免不斷重寫代碼。SQLServer2000支持兩種函數(shù)類型:(1)內(nèi)置函數(shù):是一組預(yù)定義的函數(shù),是Transact-SQL語言的一部分,按Transact-SQL參考中定義的方式運行且不能修改。(2)用戶定義函數(shù):由用戶定義的Transact-SQL函數(shù)。它將頻繁執(zhí)行的功能語句塊封裝到一個命名實體中,該實體可以由Transact-SQL語句調(diào)用。第92頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)1.字符串函數(shù)字符串函數(shù)用來實現(xiàn)對字符型數(shù)據(jù)的轉(zhuǎn)換、查找、分析等操作,通常用做字符串表達式的一部分。表9-7中列出了SQLServer的常用字符串函數(shù)。第93頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)(1)使用datalength和Len函數(shù)datalength函數(shù)主要用于判斷可變長字符串的長度,對于定長字符串將返回該列的長度。要得到字符串的真實長度,通常需要使用rtrim函數(shù)截去字符串尾部的空格。Len函數(shù)可以獲取字符串的字符個數(shù),而不是字節(jié)數(shù),也不包含尾隨空格。第94頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)例9-10從表department中讀取manger列的各記錄的實際長度。SELECTDatalength(rtrim(manger))AS'DATALENGTH',Len(rtrim(manger))AS'LEN'FROMdepartment運行結(jié)果如下:DATALENGTHLEN42636363第95頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)(2)使用Soundex函數(shù)soundex函數(shù)將char_expr轉(zhuǎn)換為4個字符的聲音碼,其中第一個碼為原字符串的第一個字符,第2~4個字符為數(shù)字,是該字符串的聲音字母所對應(yīng)的數(shù)字,但忽略了除首字母外的串中的所有元音。Soundex函數(shù)可用來查找聲音相似的字符串,但它對數(shù)字和漢字均只返回0值。例如SELECTsoundex('1'),soundex('a'),soundex('計算機'),soundex('abc'),soundex('abcd'),soundex('a12c'),soundex('a數(shù)字')返回值為:0000A0000000A120A120A000A000第96頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)(4)使用Charindex函數(shù)實現(xiàn)串內(nèi)搜索charindex函數(shù)主要用于在串內(nèi)找出與指定串匹配的串,如果找到的話,charindex函數(shù)返回第一個匹配的位置。格式:Charindex(expr1,expr2[,start_location])expr1是待查找的字符串expr2是用來搜索expr1的字符表達式,start_location是在expr2中查找expr1的開始位置,如果此值省略、為負或為0,均從起始位置開始查找。第97頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)例如SELECTcharindex(',','red,white,blue')

該查詢確定了字符串'red,white,blue'中第一個逗號的位置。第98頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)(5)使用Patindex函數(shù)patindex函數(shù)返回在指定表達式中模式第一次出現(xiàn)的起始位置,如果模式?jīng)]有則返回0。格式:Patindex('%pattern%',expression)pattern是字符串,%字符必須出現(xiàn)在模式的開頭和結(jié)尾。expression通常是搜索指定子串的表達式或列。例如:

SELECTpatindex('%abc%','abc123'),patindex('123','abc123')

子串“abc”和“123”在字符串“abc123”中出現(xiàn)的起始位置分別為:1和0。因為子串“123”不是以%開頭和結(jié)尾。第99頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)2.數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)用來實現(xiàn)各種數(shù)學(xué)運算,如指數(shù)運算、對數(shù)運算、三角運算等,其操作數(shù)為數(shù)值型數(shù)據(jù),如int、float、real、money等表9-8列出了SQLServer的數(shù)學(xué)函數(shù)。第100頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)例9-11在同一表達式中使用sin、atan、rand、pi、sign函數(shù)。 SELECTsin(23.45),atan(1.234),rand(),pi(),sign(-2.34)運行結(jié)果如下:-0.993740710172659640.889762448959189320.19756617656167863.1415926535897931-1.00第101頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)例9-12用ceiling和floor函數(shù)返回大于或等于指定值的最小整數(shù)值和小于或等于指定值的最大整數(shù)值。 SELECTceiling(123),floor(321),ceiling(12.3),ceiling(-32.1),floor(-32.1)運行結(jié)果如下:123 321 13 -32 -33第102頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)

SELECTround(12.34512,3),round(12.34567,3),round(12.345,-2),round(54.321,-2)運行結(jié)果如下:12.34500 12.34600.000 100.000Round(numeric_expr,int_expr)的int_expr為負數(shù)時,將小數(shù)點左邊第int_expr位四舍五入。

例9-13round函數(shù)的使用。第103頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)3.日期函數(shù)日期函數(shù)用來操作datetime和smalldatetime類型的數(shù)據(jù),執(zhí)行算術(shù)運算。與其他函數(shù)一樣,可以在SELECT語句和WHERE子句以及表達式中使用日期函數(shù)。第104頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)表9-9SQLServer的日期函數(shù)函數(shù)名稱及格式描述Getdate()返回當前系統(tǒng)的日期和時間Datename(datepart,date_expr)以字符串形式返回date_expr中的指定部分,如果合適的話還將其轉(zhuǎn)換為名稱(如June)Datepart(datepart,date_expr)以整數(shù)形式返回date_expr中的datepart指定部分Datediff(datepart,date_expr1,date_expr2)以datepart指定的方式,返回date_expr2與date_expr1之差Dateadd(datepart,number,date_expr)返回以datepart指定方式表示的date_expr加上number以后的日期Day(date_expr)返回date_expr中的日期值Month(date_expr)返回date_expr中的月份值Year(date_expr)返回date_expr中的年份值第105頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)表9-10SQLServer的日期部分日期部分寫法取值范圍Yearyy1753~9999Quarterqq1~4Monthmm1~12Dayofyeardy1~366Daydd1~31Weekwk1~54Weekdaydw1~7(Mon~Sun)Hourhh0~23Minutemi0~59Secondss0~59Millisecondms0~999第106頁,共150頁,星期六,2024年,5月9.2.1常用函數(shù)例9-14使用datediff函數(shù)來確定貨物是否按時送給客戶。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論