740 likes | 911 Views
第 9 章 T-SQL語法與參數的SQL查詢. 第 9 章 T-SQL語法與參數的SQL查詢. 9-1 SQL語言的基礎 9-2 SELECT敘述的基本查詢 9-3 建立參數的SQL查詢 9-4 新增、更新與刪除記錄. 9-1 SQL語言的基礎- 說明.
E N D
第9章 T-SQL語法與參數的SQL查詢 • 9-1 SQL語言的基礎 • 9-2 SELECT敘述的基本查詢 • 9-3 建立參數的SQL查詢 • 9-4 新增、更新與刪除記錄
9-1 SQL語言的基礎-說明 • 「SQL」(Structured Query Language)的全名是結構化查詢語言,本書簡稱SQL語言。SQL語言是「ANSI」(American National Standards Institute)制定的標準資料庫語言,其版本分為1989年的ANSI-SQL 89和1992年制定的ANSI-SQL 92,也稱為SQL 2。 • 1974年Chamberlin和Boyce建立SEQUEL語言,這是SQL的原型。IBM稍加修改後作為其關聯式資料庫管理系統的資料庫語言,稱為System R,1980年SQL的名稱正式誕生,從哪天開始,SQL逐漸壯大成為一種標準的關聯式資料庫語言。
9-1 SQL語言的基礎-指令種類 • 「資料定義語言DDL」(Data Definition Language):資料表建立和欄位定義的SQL語法。 • 「資料操作語言DML」(Data Manipulation Language):資料表記錄插入、刪除和更新的INSERT、DELETE和UPDATE指令,和資料表查詢的SELECT指令。 • 「資料控制語言DCL」(Data Control Language):資料庫安全設定和權限管理的相關指令。
9-1 SQL語言的基礎-指令 • 在ASP.NET網頁資料庫的程式碼,或SqlDataSource控制項的SelectCommand、InsertCommand、UpdateCommand和DeleteCommand屬性,都可以使用SQL指令來執行資料庫操作和查詢,其基本指令如下表所示:
9-2 SELECT敘述的基本查詢 • 9-2-1 SELECT子句 • 9-2-2 WHERE子句的比較運算子 • 9-2-3 WHERE子句的邏輯運算子 • 9-2-4 WHERE子句的算術運算子 • 9-2-5 聚合函數的摘要查詢 • 9-2-6 排序ORDER BY子句
9-2 SELECT敘述的基本查詢-語法 • SELECT指令是DML指令中語法最複雜的一個,其基本語法如下所示: SELECT 欄位清單 FROM 資料表來源 [WHERE 搜尋條件] [ORDER BY 欄位清單]
9-2 SELECT敘述的基本查詢-子句說明 • SELECT指令各子句的說明,如下表所示:
9-2 SELECT敘述的基本查詢-查詢工具 • 在本節說明的SQL指令是使用ASP.NET網頁的SQL查詢工具來測試查詢結果。請啟動VWD開啟「範例網站\Ch09\Ch9-2」資料夾的ASP.NET網站,執行SQLQuery.aspx網頁,如下圖所示:
9-2-1 SELECT子句-語法 • 在SELECT指令的SELECT子句可以指定查詢結果包含哪些欄位,其語法如下所示: SELECT [ALL | DISTINCT] 欄位名稱 [[AS] 欄位別名] [, 欄位名稱 [[AS] 欄位別名]] • 上述ALL是預設值可以顯示所有記錄的欄位值,DISTINCT只顯示不重複欄位值的記錄。
9-2-1 SELECT子句-查詢資料表的部分欄位 • SELECT子句可以指明查詢結果所需的欄位清單,只查詢資料表中的部分欄位。例如:查詢Books資料表的圖書記錄,只顯示BookID、BookTitle和BookPrice三個欄位,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books
9-2-1 SELECT子句-查詢資料表的所有欄位 • 查詢結果如果需要顯示資料表的所有欄位,SELECT指令可以直接使用「*」符號代表資料表的所有欄位,而不用一一列出欄位清單。 • 例如:查詢Books資料表的所有圖書記錄且顯示所有欄位,如下所示: SELECT * FROM Books • 上述SELECT指令的執行結果顯示Books資料表的所有記錄和欄位。
9-2-1 SELECT子句-欄位別名(說明) • SELECT指令預設使用資料表定義的欄位名稱來顯示查詢結果,基於需要,我們可以使用AS關鍵字指定欄位別名,其中AS關鍵字本身可有可無。
9-2-1 SELECT子句-欄位別名(範例) • 例如:查詢Books資料表的BookID、BookTitle和BookPrice三個欄位資料,顯示欄位名稱為書號、書名和書價的中文欄位別名,如下所示: SELECT BookID AS 書號, BookTitle AS 書名, BookPrice AS 書價 FROM Books
9-2-1 SELECT子句-刪除重複記錄 - ALL與DISTINCT • 如果資料表記錄的欄位有重複值,SELECT子句的預設值ALL是顯示所有欄位值,我們可以使用DISTINCT關鍵字刪除重複欄位值,一旦欄位擁有重複值,就只會顯示其中一筆記錄。 • 例如:查詢Books資料表的圖書資料擁有幾種不同的書價,如下所示: SELECT DISTINCT BookPrice FROM Books
9-2-2 WHERE子句的比較運算子-語法 • SELECT指令和FROM字句是指出查詢哪個資料表的哪些欄位,WHERE子句的篩選條件才是真正的查詢條件,可以過濾記錄和找出符合條件的記錄資料,其基本語法如下所示: WHERE 搜尋條件 • 上述搜尋條件就是使用比較和邏輯運算子建立的過濾條件,查詢結果可以取回符合條件的記錄資料。
9-2-2 WHERE子句的比較運算子-比較運算子 • T-SQL支援的比較運算子(Comparison Operators)說明,如下表所示:
9-2-2 WHERE子句的比較運算子-條件值為字串 • WHERE子句的條件運算式可以使用比較運算子來執行字串比較,欄位條件的字串需要使用單引號括起。例如:在Books資料表查詢書號為'FS499'圖書的詳細資料,如下所示: SELECT * FROM Books WHERE BookID = 'FS499'
9-2-2 WHERE子句的比較運算子-條件值為數值 • WHERE子句條件運算式的條件值如果是數值,數值不需使用單引號括起。例如:查詢Books資料表的BookPrice欄位小於600元的圖書記錄,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookPrice < 600
9-2-2 WHERE子句的比較運算子-條件值為日期/時間 • WHERE子句的條件運算式如果是日期/時間的比較,如同字串,也需要使用單引號括起。例如:查詢Books資料表的BookPubDate是2006-10-01的圖書記錄,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookPubDate ='2006-10-01'
9-2-3 WHERE子句的邏輯運算子-說明 • 在WHERE子句的搜尋條件可以使用邏輯運算子(Logical Operators)來連接條件運算式,以便建立複雜的搜尋條件。常用的邏輯運算子說明,如下表所示:
9-2-3 WHERE子句的邏輯運算子- LIKE包含子字串運算子(說明) • WHERE子句的條件欄位可以使用LIKE運算子進行比較,LIKE運算子是子字串查詢,只需是子字串就符合條件。我們還可以配合萬用字元來進行範本字串的比對,如下表所示:
9-2-3 WHERE子句的邏輯運算子- LIKE包含子字串運算子(範例1) • 例如:查詢Books資料表中,書名有Java的圖書記錄,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookTitle LIKE '%Java%'
9-2-3 WHERE子句的邏輯運算子- LIKE包含子字串運算子(範例2) • 例如:查詢Books資料表中,書號是P-S範圍字母開頭的圖書資料,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookID LIKE '[P-S]%'
9-2-3 WHERE子句的邏輯運算子- BETWEEN/AND範圍運算子 • BETWEEN/AND運算子可以定義欄位值需要符合的範圍,其範圍值可以是文字、數值或和日期/時間資料。例如:因為購書預算在590~620之間,所以我們可以查詢Books資料表看看有哪些書可以購買,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookPrice BETWEEN 590 AND 620
9-2-3 WHERE子句的邏輯運算子- IN運算子(說明) • IN運算子只需是清單其中之一即可,我們需要列出一串文字或數值清單作為條件,欄位值只需是其中之一,就符合條件。
9-2-3 WHERE子句的邏輯運算子- IN運算子(範例) • 例如:我們準備購買書號FS499、F6472和P780三本書,所以查詢Books資料表關於這些書籍的詳細資料,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookID IN ('FS499', 'F6472', 'P780')
9-2-3 WHERE子句的邏輯運算子- NOT運算子(說明) • NOT運算子可以搭配邏輯運算子,取得與條件相反的查詢結果,如下表所示:
9-2-3 WHERE子句的邏輯運算子- NOT運算子(範例) • 例如:我們已經買了FS499、F6472和P780三本書,所以準備查詢Books資料表,看看還有什麼圖書沒有購買,如下所示: SELECT BookID, BookTitle, BookPrice F ROM Books WHERE BookID NOT IN ('FS499', 'F6472', 'P780')
9-2-3 WHERE子句的邏輯運算子- AND運算子 • AND運算子連接的前後運算式都必須同時為真,整個WHERE子句的條件才為真。例如:查詢Books資料表的BookID欄位包含'5'子字串,而且BookTitle有'程式'子字串,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookID LIKE '%5%' AND BookTitle LIKE '%程式%'
9-2-3 WHERE子句的邏輯運算子- OR運算子 • OR運算子連接的前後條件,只需任何一個條件為真,即為真。例如:查詢Books資料表的BookID欄位包含'5'子字串,或BookTitle有'程式'子字串,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookID LIKE '%5%' OR BookTitle LIKE '%程式%'
9-2-3 WHERE子句的邏輯運算子-連接多個條件與括號(說明) • 在WHERE子句的條件可以使用AND和OR來連接多個不同條件。其優先順序是位在括號中的運算式優先。
9-2-3 WHERE子句的邏輯運算子-連接多個條件與括號(範例) • 例如:查詢Books資料表BookID欄位包含‘2’子字串,和BookTitle欄位有‘程式’子字串,或BookPrice大於等於600,後2個條件以括號括起,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookID LIKE '%2%' AND (BookTitle LIKE '%程式%' OR BookPrice >=600)
9-2-4 WHERE子句的算術運算子 • 在WHERE子句的運算式條件也支援算術運算子的加、減、乘、除和餘數,我們可以在WHERE子句的條件加上算術運算子。例如:查詢Books資料表的BookPrice在打八折後,售價大於500元的圖書記錄,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE (BookPrice * 0.8) > 500
9-2-5 聚合函數的摘要查詢-說明 • 「聚合函數」(Aggregate Functions)也稱為「欄位函數」(Column Functions),可以進行選取記錄欄位值的筆數、平均、範圍和統計函數,以便提供進一步欄位資料的分析結果。 • 一般來說,如果SELECT指令敘述擁有聚合函數,稱為「摘要查詢」(Summary Query)。
9-2-5 聚合函數的摘要查詢-種類 • 常用的聚合函數說明,如下表所示:
9-2-5 聚合函數的摘要查詢-COUNT()函數 • SQL指令可以配合COUNT()函數計算查詢的記錄數,「*」參數可以統計資料表的所有記錄數,或指定欄位來計算欄位不是空值的記錄數。 • 例如:查詢Books資料表的BookPrice高過600元的圖書種類,如下所示: SELECT COUNT(*) AS 圖書數 FROM Books WHERE BookPrice > 600
9-2-5 聚合函數的摘要查詢-AVG()函數 • SQL指令只需配合AVG()函數,就可以計算指定欄位的平均值。例如:在Books資料表查詢BookID包含'5'子字串的圖書總數,和書價的平均值,如下所示: SELECT COUNT(*) AS 圖書總數, AVG(BookPrice) AS 書價平均值 FROM Books WHERE BookID LIKE '%5%'
9-2-5 聚合函數的摘要查詢-MAX()函數 • SQL指令只需配合MAX()函數,就可以計算符合條件記錄的欄位最大值。例如:在Books資料表查詢BookID包含'5'子字串的最貴書價,如下所示: SELECT MAX(BookPrice) AS 最貴書價 FROM Books WHERE BookID LIKE '%5%'
9-2-5 聚合函數的摘要查詢-MIN()函數 • SQL指令如果配合MIN()函數,就可以計算出符合條件記錄的欄位最小值。例如:在Books資料表查詢BookID包含'5'子字串的最低書價,如下所示: SELECT MIN(BookPrice) AS 最低書價 FROM Books WHERE BookID LIKE '%5%'
9-2-5 聚合函數的摘要查詢-SUM()函數 • SQL指令配合SUM()函數,可以計算出符合條件記錄的欄位總和。例如:在Books資料表計算圖書書價的總和和平均,如下所示: SELECT SUM(BookPrice) AS 書價總額, SUM(BookPrice)/COUNT(*) AS 書價平均 FROM Books
9-2-6 排序ORDER BY子句-語法 • SELECT指令可以使用ORDER BY子句依照欄位由小到大或由大到小進行排序,其語法如下所示: ORDER BY 運算式 [ASC | DESC] [, 運算式 [ASC | DESC] • 上述語法的排序方式預設是由小到大排序的ASC,如果希望由大至小,請使用DESC關鍵字。
9-2-6 排序ORDER BY子句-範例 • 例如:在Books資料表查詢BookPrice小於等於600元的圖書記錄,並且使用BookPrice欄位進行由大至小排序,如下所示: SELECT BookID, BookTitle, BookPrice FROM Books WHERE BookPrice <= 600 ORDER BY BookPrice DESC
9-3 建立參數的SQL查詢 • 9-3-1 從TextBox控制項取得參數值 • 9-3-2 從DropDownList控制項取得參數值 • 9-3-3 從URL參數取得SQL的參數值 • 9-3-4 改為使用Session變數取得SQL參數值
9-3 建立參數的SQL查詢 • 在SqlDataSource控制項使用設定資料來源精靈建立的SQL指令敘述,就是指定SelectCommand屬性值,可以切換原始檔檢視來檢視SelectCommand屬性值的SQL指令敘述。 • WHERE子句的條件不只可以是常數,還可以使用其他控制項、Session變數或QueryString的URL參數值來建立過濾條件,即建立參數的SQL查詢,此時過濾條件的參數值不是常數值,而是從其他來源取得的參數值。
9-3-1 從TextBox控制項取得參數值-說明 • 參數的SQL查詢可以從TextBox控制項取得參數值,例如:在TextBox控制項輸入書名的部分子字串,就可以在GridView控制項顯示符合條件的記錄資料。
9-3-1 從TextBox控制項取得參數值-設定 • 在SQL陳述式的步驟,按【WHERE】鈕新增WHERE子句,可以看到「加入WHERE子句」對話方塊。 在【資料行】欄選欄位【BookTitle】,【運算子】欄位選【LIKE】,來源選【Control】後,在右上方【控制項ID】欄位選【txtTitle】,按【加入】鈕建立WHERE子句
9-3-1 從TextBox控制項取得參數值-範例網站 ASP.NET網站:Ch9-3-1 • 在ASP.NET網頁建立TextBox控制項取得參數值,以便建立參數的SQL查詢,可以查詢符合書名條件的圖書記錄,如下圖所示:
9-3-2 從DropDownList控制項取得參數值-說明 • 參數的SQL查詢除了可以從TextBox控制項取得參數值外,我們也可以從DropDownList控制項取得參數值,例如:在DropDownList控制項選取圖書種類後,就可以在下方GridView控制項顯示此類別的圖書資料。 • 因為ASP.NET網頁的DropDownList控制項本身也是從SqlDataSource控制項取得資料,換句話說,此ASP.NET網頁共有2個SqlDataSource控制項,分別對應DropDownList和GridView控制項。
9-3-2 從DropDownList控制項取得參數值-設定 • 在SQL陳述式的步驟,按【WHERE】鈕新增WHERE子句,可以看到「加入WHERE子句」對話方塊。 在【資料行】欄選欄位【BookCatalog】,【運算子】欄位選【=】,來源選【Control】後,在右上方【控制項ID】欄位選【DropDownList1】,按【加入】鈕建立WHERE子句