【正文】
不過(guò)在多數(shù)情況下,索引對(duì)于的數(shù)據(jù)檢索速度的提高大大超過(guò)它的不足之處。 SQL Server 以兩種方法訪問(wèn)數(shù)據(jù): ?使用表掃描訪問(wèn)數(shù)據(jù) ?使用索引訪問(wèn)數(shù)據(jù) 索引的類型 ? SQL Server 的兩種類型為聚集索引和非聚集索引。 標(biāo)識(shí)列 Identity ? 例程 :創(chuàng)建公司信息表,使公司代碼為自動(dòng)增加,編號(hào)從 1開(kāi)始,后面的代碼依次加 1。 ALTER TABLE Company ADD CONSTRAINT uni_CompanyName UNIQUE NONCLUSTERED(CompanyName) PRIMARY KEY約束 ? 例程 :公司信息表中,要求公司代碼( CompanyID)不能有空值,不能有重復(fù)的值,因此需要建立一個(gè)PRIMARY KEY約束。( P96) 利用約束維護(hù)數(shù)據(jù)的完整性 ?利用約束可以實(shí)現(xiàn)數(shù)據(jù)完整性,約束包括:DEFAULT約束、 CHECK約束、 UNIQUE約束、 PROMARY KEY約束、 FOREIGN KEY 約束和級(jí)聯(lián)引用完整性約束。 更改用戶定義數(shù)據(jù)類型 ?例程 :更改用戶定義的數(shù)據(jù)類型SignDate為 ContractDate,代碼如下: EXEC sp_rename ‘SignDate’,’ContractDate’,’ USERDATATYPE’ 使用數(shù)據(jù)類型 EXEC sp_addtype ContractDate, datetime, 39。 ? 例程 :創(chuàng)建一個(gè)數(shù)據(jù)類型郵政編碼 PostCode,基于字符型 Varchar創(chuàng)建 , 要求最大數(shù)據(jù)長(zhǎng)度為 6位 , 可以為空 , 代碼如下: EXEC sp_addtype PostCode, ‘Varchar(6)’, 39。 DROP TRIGGER Company_attention 第六章 用戶定義數(shù)據(jù)類型與自定義函數(shù) ? 用戶定義數(shù)據(jù)類型簡(jiǎn)介 ? 創(chuàng)建用戶定義數(shù)據(jù)類型 ? 刪除用戶定義數(shù)據(jù)類型 ? 更改用戶定義數(shù)據(jù)類型 ? 使用數(shù)據(jù)類型 ? 用戶定義函數(shù)簡(jiǎn)介 用戶定義數(shù)據(jù)類型簡(jiǎn)介 ? SQL SERVER2022允許用戶自己定義數(shù)據(jù)類型 , 用戶定義的數(shù)據(jù)類型基于 SQL Server 2022中的系統(tǒng)數(shù)據(jù)類型 。 ?觸發(fā)器在對(duì)表進(jìn)行操作時(shí)( UPDATE、INSERT 或 DELETE)激活。 加密存儲(chǔ)過(guò)程的關(guān)鍵字是:WITH ENCRYPTION , 使用 ENCRYPTION 可防止將過(guò)程作為 SQL Server 復(fù)制的一部分發(fā)布 。北京怡神工貿(mào)有限公司 39。 帶參數(shù)的存儲(chǔ)過(guò)程 ?帶輸出參數(shù)的存儲(chǔ)過(guò)程 ? 例程 :創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,返回指定公司的合同明細(xì)金額。 CREATE PROCEDURE Co_Contract_Info AS SELECT CompanyName,ContractDetailID,Volume FROM Company INNER JOIN Contract ON = INNER JOIN ContractDetail ON = 帶參數(shù)的存儲(chǔ)過(guò)程 ? 例程 :創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,返回的指定公司的所有合同明細(xì)情況。 DECLARE Company_cursor CURSOR FOR SELECT CompanyID,CompanyName FROM Company DECLARE ID char(10), Name char(30) OPEN Company_cursor FETCH NEXT FROM Company_cursor INTO ID, Name WHILE fetch_status = 0 BEGIN IF Name = 39。23:3039。 GOTO loop_Over END SET i=i+1 IF Itest=i PRINT 39。 BREAK END SET i=i+1 IF Itest=i PRINT 39。 流程控制語(yǔ)句 ?用 BEGIN...END 定義語(yǔ)句塊 ?例程 :在單位信息表的觸發(fā)器中的一段語(yǔ)句塊如下: BEGIN ROLLBACK TRANSACTION PRINT 39。 IF (SELECT ContractVolume FROM Contract WHERE ContractID=’101’) 10000 PRINT 39。如果需要修改加密視圖,則必須刪除該視圖并重新創(chuàng)建一個(gè)。 更新視圖中的數(shù)據(jù) ? 例程 :創(chuàng)建一個(gè)公司信息視圖,并向其中添加一條記錄:公司代碼 000公司名稱:上海日化三廠。 建立視圖 CREATE VIEW View_Contract AS SELECT CompanyName,ContractID FROM Contract,Company WHERE = 通過(guò)視圖查詢: SELECT CompanyName,ContractDetailID,ume FROM View_Contract,ContractDetail WHERE = 使用視圖提供聚合值 ? 可以使用視圖來(lái)提供聚合值,這樣可以簡(jiǎn)化查詢語(yǔ)言,建議對(duì)于常用的聚合值都采用預(yù)先定義視圖的方式,以此降低 SQL語(yǔ)句的實(shí)現(xiàn)難度。 創(chuàng)建視圖 (如果該視圖已存在,先刪除它 ) IF EXISTS (SELECT TABLE_NAME FROM WHERE TABLE_NAME = 39。 CREATE VIEW View_Contract 3 AS SELECT CompanyName,SUM() as TotalPayment FROM Company LEFT JOIN Contract ON = LEFT JOIN ContractDetail ON = LEFT JOIN ContractPayment ON = GROUP BY CompanyName 修改視圖定義 ?例如要更新上一節(jié)中例程一中的創(chuàng)建的視圖 View_Contract1,使其顯示所有在 2022年 1月份簽定的合同,用如下的 SQL語(yǔ)句: ALTER VIEW View_Contract1 AS SELECT * FROM Contract WHERE SignDate=’20220101’ AND SignDate=’20220131’ 刪除視圖 ?用 DROP VIEW從當(dāng)前數(shù)據(jù)庫(kù)中刪除視圖。 ?視圖是虛擬的表,它只包含表的一部分。 交叉表查詢 ? 以合同表為例,查詢各公司在本年的付款金額,要求每公司用一行記錄顯示,每個(gè)月用一列顯示, SQL語(yǔ)句如下: SELECT as 公司名稱 , SUM(CASE WHEN MONTH(PaymentDate)=1 THEN ELSE 0 END) as [1月 ], SUM(CASE WHEN MONTH(PaymentDate)=2 THEN ELSE 0 END) as [2月 ], SUM(CASE WHEN MONTH(PaymentDate)=3 THEN ELSE 0 END) as [3月 ], SUM(CASE WHEN MONTH(PaymentDate)=4 THEN ELSE 0 END) as [4月 ], SUM(CASE WHEN MONTH(PaymentDate)=5 THEN ELSE 0 END) as [5月 ], SUM(CASE WHEN MONTH(PaymentDate)=6 THEN ELSE 0 END) as [6月 ], SUM(CASE WHEN MONTH(PaymentDate)=7 THEN ELSE 0 END) as [7月 ], SUM(CASE WHEN MONTH(PaymentDate)=8 THEN ELSE 0 END) as [8月 ], SUM(CASE WHEN MONTH(PaymentDate)=9 THEN ELSE 0 END) as [9月 ], SUM(CASE WHEN MONTH(PaymentDate)=10 THEN ELSE 0 END) as [10月 ], SUM(CASE WHEN MONTH(PaymentDate)=11 THEN ELSE 0 END) as [11月 ], SUM(CASE WHEN MONTH(PaymentDate)=12 THEN ELSE 0 END) as [12月 ] FROM Company LEFT JOIN Contract ON = LEFT JOIN ContractDetail ON = LEFT JOIN ContractPayment ON = WHERE YEAR(PaymentDate)=2022 GROUP BY CompanyName 查詢語(yǔ)句的性能優(yōu)化 ? 當(dāng)數(shù)據(jù)量不是很大的時(shí)候, SQL語(yǔ)句的優(yōu)劣基本無(wú)法比較,但是當(dāng)數(shù)據(jù)達(dá)到海量以后,劣質(zhì)的SQL語(yǔ)句與優(yōu)質(zhì)的 SQL語(yǔ)句的執(zhí)行效率可能會(huì)相差幾十倍甚至幾百倍。 ? UNION ? SELECT CompanyName, ? FROM Contract,Company,ContractDetail ? WHERE = ? AND = ? AND Volume=10000 聯(lián)合查詢的關(guān)鍵字 ALL ? 查詢?cè)?2022年 5月 1日簽定的合同以及在合同總金額大于10000元的合同,如果使用了 ALL關(guān)鍵字, SQL語(yǔ)句如下: SELECT * FROM Contract WHERE SignDate=’20220501’ UNION ALL SELECT * FROM Contract WHRE ContractVolume10000 使用 INNER JOIN ?查詢?cè)诤贤碇写嬖诘墓镜幕拘畔?,為此需要建立合同表與公司信息表的連接,SQL語(yǔ)句如下: SELECT ,CompanyName FROM Company INNER JOIN Contract ON = 使用 LEFT JOIN 和 RIGHT JOIN 建立連接 ? 查詢所有公司的合同簽定總額,不管該公司有沒(méi)有簽定合同,分別使用 LEFT JOIN 和 ROGHT JOIN , SQL語(yǔ)句如下 ? 用 LEFT JOIN ? SELECT CompanyName,SUM(ContractVolume) ? FROM Company LEFT JOIN Contract ? ON = ? GROUP BY CompanyName ? 用 RIGHT JOIN ? SELECT CompanyName,SUM(ContractVolume) ? FROM Contract RIGHT JOIN COMPANY ? ON = ? GROUP BY CompanyName 使用交叉連接( CROSS JOIN) ? 現(xiàn)有部門表( Depart)與職員表 (Employee),現(xiàn)在要生成一張新的表 NewTable,要求在新表中包括每個(gè)部門的每個(gè)職員,部門表結(jié)構(gòu):Depart(DepartID,DepartName),職員表結(jié)構(gòu):Employee(EmployeeID,EmployeeName), SQL語(yǔ)句如下: SELECT DepartName,EmployeeName INTO NewTable FROM Depart CROSS JOIN Employee 其他復(fù)雜應(yīng)用 ? 使用 Compute( By)子句 ? 交叉表查詢 使用 Compute( By)子句 ? COMPUTE BY 子句使您得以用同一 SELECT 語(yǔ)句既查看明細(xì)行 , 又查看匯總行 。 子查詢 ?在 SQL語(yǔ)言中,當(dāng)一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢的查詢條件之中時(shí),稱為子查詢。 系統(tǒng)統(tǒng)計(jì)函數(shù) ?顯示自 SQL SERVER啟動(dòng)后到當(dāng)前日期和時(shí)間為止 SQL Server CPU 的工作時(shí)間,SQL語(yǔ)句如下: SELECT CPU_BUSY AS 39。, TOTAL_WRITE AS 39。 聚合函數(shù) ? 列出所有公司的所有合同的合同總金額的平均值,要求列出公司名稱,合同平均值, SQL語(yǔ)句如下: SELECT CompanyName,AVG(ContractVolume) as [合同平均值 ] FROM Contract,Company