480 likes | 693 Views
資料庫系統概論 CH09 T-SQL 設計. 鄧姚文. 大綱. 關於 T-SQL 基本語法說明 實務說明. 9-1 關於 T-SQL 關於 T-SQL. 全名是 Transact-SQL 是 SQL Serrver 提供的程式語言 T-SQL 的組成 基本語法 系統資源 資料定義語言 資料操作語言. 9-1 關於 T-SQL 撰寫及執行. 可以在查詢視窗中測試及執行. 9-1 關於 T-SQL 撰寫及執行. 提示清單. 9-1 關於 T-SQL 撰寫及執行. 剖析及驗證. 9-1 關於 T-SQL 撰寫及執行. 批次執行
E N D
大綱 關於T-SQL 基本語法說明 實務說明
9-1關於T-SQL關於T-SQL • 全名是Transact-SQL • 是SQL Serrver提供的程式語言 • T-SQL的組成 • 基本語法 • 系統資源 • 資料定義語言 • 資料操作語言
9-1關於T-SQL撰寫及執行 • 可以在查詢視窗中測試及執行
9-1關於T-SQL撰寫及執行 提示清單
9-1關於T-SQL撰寫及執行 • 剖析及驗證
9-1關於T-SQL撰寫及執行 • 批次執行 • 批次是編譯及執行的單位,也就是「GO」關鍵字,多個GO之間是一個批次 • 有些陳述式或語法,SQL Server規定必須自成一個批次 • 變數生命週期無法跨越批次
9-1關於T-SQL撰寫及執行 • 部份執行 • 只要執行部份程式,可以選取後再按下按鈕 • 逐行執行及中斷點 • 按下F5鍵,表示執行全部程式或選取的部份程式碼 • 按下F11鍵,逐行執行 • 設定中斷點
9-2 基本語法說明變數及常數 • 變數 • 名稱以@為首 • 以DECLARE予以宣告 • DECLARE @manager NVarChar(10); • 不區分英文字母大小寫 • 分號(;)可以省略
9-2 基本語法說明變數及常數 • 常數 • 固定不變的『資料』(Literal) • 文字:字串以單引號括住,前頭加 N 表示編碼方式為 Unicode • SET @pid = N'981AE123' • 二進位資料 • DECLARE @x BINARY; -- 宣告成二進位資料 • SET @x = 0x123; -- 數值前加 0x 以16進位表示
9-2 基本語法說明變數及常數 • 常數 • 數字 • DECLARE @x INT, @y MONEY; • SET @x = 12; • SET @y = $10.5; • 日期與時間 • DECLARE @x DateTime, @y DateTime, @z DateTime; • SET @x = '2012/05/17 12:00'; • SET @y = '05/17/2012'; • SET @z = '05 17, 2012';
9-2 基本語法說明資料類型優先順序 • 在一個運算式中,有不同的型態的資料時,SQL Server引擎會嘗試予以轉換 • 當一個運算式裡有兩個不同型態的資料時,將優先順序較低者轉換成優先順序較高者
使用函數 ISNULL ( check_expression , replacement_value ) http://msdn.microsoft.com/en-us/library/ms184325.aspx
9-2 基本語法說明流程控制 • IF...ELSE • 沒有EndIF • 加上Begin…End,表示區段的開始及結束 • WHILE迴圈-程式9-2, pp.9-17 • Continue及Break -程式9-3, pp.9-18 • Return-中止執行 • Goto -程式9-4
WHILE 迴圈 RAND ( [ seed ] )產生亂數,介於0和1之間,包括0不包括1 ROUND() 四捨五入 DATEADD() 日期加減
在迴圈內使用 break 和 continue Break 中斷,迴圈結束 Continue 結束這一個回合,立即開始下一回合
這個日期已經抓過了,跳過不儲存 日期轉換成字串
GOTO • 配合 IF-ELSE 和行標記 使用 • 在特定的情況下跳到指定的位置,以改變程式執行路徑 • 行標記:LINE_BABEL: • 程式 9-4, pp.9-20
GOTO 星期六、星期日不抽查 重新產生亂數
9-2 基本語法說明其它 • WaitFor • 等待一段時間,再執行以下的程式 • WaitFor Delay '00:00:05' • exec sp_helpdb • 錯誤處理 • 傳統的@@ERROR-程式9-6, pp.9-22 • Try…Catch敘述-程式9-7, pp.9-23 • 註解文字 • 兩個「-」符號為始 • 以「/*」為始及以「*/」結束
9-3 實務說明日期處理 http://msdn.microsoft.com/en-us/library/ms189491.aspx http://msdn.microsoft.com/en-us/library/ms187928.aspx • 格式設定 • SET DATEFORMAT敘述 • Convert函數-可使用在任何型態的轉換
9-3 實務說明日期的加減處理 http://msdn.microsoft.com/en-US/library/ms186819%28v=sql.105%29.aspx • 可直接加或減 • 使用DateAdd函數 • 使用DateDiff函數計算兩個日期之間的差距 • 使用GetDate函數取得今天日期
9-3 實務說明小數資料處理 http://msdn.microsoft.com/en-us/library/ms175003.aspx • 兩種方式執行四捨五入 • 型態的自動處理 • ROUND函數
9-3 實務說明自動編號 Set IDENTITY_INSERT Category On; Insert Into Category (CateID, CateName, CateType) Values(60,'教育','行業別'); Set IDENTITY_INSERT Category Off; • 輸入資料至自動編號 • 使用 SET IDENTITY_INSERT 開啟或關閉手動輸入 ID
9-3 實務說明自動編號 • 取得剛產生的自動編號 • 取出@@IDENTITY
9-3 實務說明uniqueIdentifier • NewID() • 使用於uniqueIdentifier類型的函數 • 16位元GUID值 • 使用NewID()函數做為預設值
多種情況的條件判斷 CASE…WHEN 條件1 THEN 動作1WHEN 條件2 THEN 動作2…ELSE 以上皆非時的動作END
計算年資 SELECT E.EMPCode AS 員工編號, e.NameChn as 員工姓名, CONVERT(DATE, E.InDate, 111) AS 到職日期, CASE WHEN MONTH(GETDATE()) < MONTH(E.InDate) OR (MONTH(GETDATE()) = MONTH(E.InDate) AND (DAY(GETDATE()) < DAY(E.InDate))) THEN DATEDIFF(YEAR, E.InDate, GETDATE()) - 1 ELSE DATEDIFF(YEAR, E.InDate, GETDATE()) END AS 年資 FROM Employee E WHERE E.OutDate IS NULL;
這個月的第一天 DECLARE @firstDay Date; SELECT @firstDay = DateAdd(day, -DAY(GetDate())+1, GetDate()); PRINT @firstDay;
這個月的最後一天 DECLARE @today DATE; DECLARE @firstDay Date, @lastDay Date; DECLARE @y INT, @m INT; SET @today = GETDATE(); SET @y = YEAR(@today); SET @m = MONTH(@today); SET @firstDay = CONVERT(Date, CAST(@y AS VARCHAR)+'-'+CAST(@m AS VARCHAR)+'-01', 111); SET @lastDay = DATEADD(month, 1, @firstDay);--下一個月的第一天 SET @lastDay = DATEADD(day, -1, @lastDay);--這一個月的最後一天 為何不直接算?@lastDay=CONVERT(Date, CAST(@y AS NVARCHAR)+'-'+CAST(@m AS NVARCHAR)+'-31', 111);
下一個月的第一天 DECLARE @firstDay Date; SET @firstDay = DateAdd(month, 1, GetDate()); SET @firstDay = DateAdd(day, -DAY(@firstDay)+1, @firstDay); PRINT @firstDay;
練習:季度計算 • 輸入: • 今天日期 • 輸出: • 這一季的第一天日期 • 這一季的最後一天日期 • 這一季總共有多少天