SQL應用與開發:(七)資料操作 · 查 · (一)常規型,sql常規
資料庫是為了便於有效地管理資訊而建立的,人們希望資料庫可以隨時提供所需要的資料資訊。因此,對使用者來說,資料查詢是資料庫最重要的功能。在資料庫中建立了對象並且在基表中添加了資料後,使用者便可以從資料庫中檢索特定資訊。
1.常規型
常規型資料查詢是通過SELECT語句來完成的。SELECT語句可以從資料庫中按使用者要求檢索資料,並將查詢結果以表格的形式返回。
1.1SELECT語句概述
SELECT子句是SQL編程人員最常用的語句之一,也是SQL標準中最靈活和應用最為廣泛的語句之一。SELECT語句是一個查詢運算式,它以關鍵字SELECT開頭,並且包括大量構成該運算式的元素。SELECT語句可以從資料庫中按使用者的要求查詢行,而且允許從一個表或多個表中選擇滿足給定條件的一個或者多個行或列,並將資料用使用者規定的格式進行整理後返回給用戶端。
SELECT語句可以精確地對資料庫進行尋找,並且SELECT語句的SQL文法顯得直觀、結構化。當然,SELECT語句也可以進行模糊尋找。
由於SELECT語句的完整語句比較複雜,所以在這裡只列舉它的主要子句。SELECT語句的主要格式如下:
SELECT [ALL | DISTINCT ] { * | <select_list>}
FROM <table_reference> [ {, <table_reference>}...]
[WHERE <search_condition>]
[GROUP BY <grouping_specifition>]
[HAVING <search_condition>]
[ORDER BY <order_condition>]
其中,[ ]表示可選項,SELECT子句和FROM子句是必選的,其他子句都是可選的。其具體含義如下:
SELECT子句 [用來指定由查詢返回的列。各列在SELECT子句中的順序決定了它們在結果表中的順序。]
FROM子句 [用來指定從中查詢行的源表。]
WHERE子句 [用來指定限定返回的行的搜尋條件。]
GROUP BY子句 [用來指定查詢結果的分組條件,即歸納資訊類型。]
HAVING子句 [用來指定組或彙總的搜尋條件。]
ORDER BY子句 [用來指定結果集的排序方式。]
1.2使用SELECT子句
SELECT子句是查詢的第一部分,在SELECT子句中指定所需列、列的順序以及列名。SELECT子句一共有三種形式,分別為:
SELECT列 在該形式下能夠擷取列出的列,並按這些列在被列出的列表中的順序放置這些列,還可以對列名進行重新命名。(例如:
SELECT 客戶姓名 AS NAME,客戶地址 AS ADDRESS,聯絡電話 AS TELEPHONE_NUM
FROM 客戶資訊
)
SELECT *或SELECT 表名.* 在該形式下能夠擷取表中所有列,並且其放置順序與表中的順序相同。但是,不能再SQL語句中重新對列名命名。另外,在添加表中的列以外的其他列時,需要在星號"*"前輸入表名,表名與星號之間用一個句點隔開。(例如:
SELECT *
FROM 業務員資訊
)
SELECT DISTINCT列在該形式下,除了完成SELECT列形式下的功能外,還可以去除結果中的而重複行。(例如:
SELECT DISTINCT 客戶地址
FROM 客戶資訊
)
1.3使用WHERE子句
使用者在查詢資料庫時往往不需要檢索全部的資料,而只需要查詢其中一部分滿足給定條件的資訊,此時需要在SELECT語句中加入條件,以選擇其中的部分記錄。這就用到WHERE子句來指定查詢返回行的條件,WHERE子句用於選取需要檢索的資料行。帶WHERE子句的SELECT語句的基本格式如下:
SELECT <select_list>
FROM <table_reference>
WHERE <search_condition>
其中,<search_condition>為指定查詢時要返回的行記錄所應滿足的條件,該條件由運算式及邏輯運算子等組成。
WHERE子句擷取FROM子句返回的值,每一行都要根據搜尋條件進行評估。若評估為真,則作為查詢結果的一部分返回;若評估如果為未知或假,則這些行不包括在查詢結果中。而評估的關鍵是<search_condition>所指定的搜尋條件。
1.3.1WHERE子句中比較子的使用:
其文法格式:
SELECT <select_list>
FROM <table_reference>
WHERE <expression1> <comparision operator> <expression2>
舉例來說:
SELECT 供應商名稱,供應商所在城市,連絡人姓名,聯絡電話
FROM 供應商名稱
WHERE 供應商所在城市='北京市'
1.3.2WHERE子句中邏輯運算子的使用:
其格式如下:
SELECT <select_list>
FROM <table_reference>
WHERE {NOT <expression> | <expression> <logical operator> <expression2>}
其中,<logical operator>表示邏輯運算子,它可以是AND、OR兩個邏輯運算式中的任意一個,用到NOT時,要將NOT放在運算式的前面。
舉例來說:
SELECT 操作人員姓名,入庫許可權,出庫許可權,聯絡電話
FROM 操作人員資訊
WHERE 入庫人員=1 AND 出庫人員=1
1.3.3WHERE子句中IN條件的使用:
SELECT <select_list>
FROM <table_reference>
WHERE <expression> [NOT] IN <value_list>
其中,[NOT]為可選項,<value_list>表示值列表。
在WHERE子句中使用IN或NOT IN關鍵字指定條件時,IN關鍵字用來顯示一個組中的成員關係。當有一個滿足條件的離散值列表時,就會用到IN關鍵字。
有效值列表中不能包含NULL值得資料,因為在WHERE子句中使用IN關鍵字作為指定條件時不允許資料中有NULL值。
舉例來說:
SELECT 客戶姓名,客戶地址,聯絡電話
FROM 客戶資訊
WHERE 客戶地址 IN ('北京市宣武區','北京市海澱區')
1.3.4WHERE子句中LIKE條件的使用:
其格式如下:
SELECT <select_list>
FROM <table_reference>
WHERE <expression> [NOT] LIKE 'string'
其中,[NOT]為可選項,'string'表示用來進行比較的字串。利用WHERE子句進行查詢的過程中,為了實現對字串的模糊比對,可以在string字串中使用萬用字元。
舉例來說:
SELECT 商品名稱,供應商編號,產地,單價
FROM 商品資訊
WHERE 商品名稱 LIKE '[A-M]%'
1.3.5WHERE子句中IS NULL的使用:
其格式如下:
SELECT <select_list>
FROM <table_reference>
WHERE <column_name> IS [NOT] NULL
其中,<column_name>表示列名,[NOT]為可選項。
舉例來說:
SELECT 消費者姓名,消費者消費金額,消費者所在城市,聯絡電話
FROM 顧客資訊
WHERE 聯絡電話 IS NULL
1.4使用ORDER BY子句
SELECT語句獲得的資料一班沒有任何的按一定的規律進行排序。也就是說,這一次提取的資料群組的排列順序與下次提取的資料群組的排序次序可以截然不同。為了方便閱讀和使用,最好對查詢結果進行排序。SQL語言中,ORDER BY子句用來指定查詢結果是按照升序(使用關鍵字ASC)還是降序(使用關鍵字DESC)進行排序。ORDER BY子句的基本文法格式為:
SELECT <select_list>
FROM <table_reference>
ORDER BY[{<order_by_expression> []ASC | DESC}...]
其中,<order_by_expression>表示用於排序的列的列名或列的別名和運算式,或者指定為代表挑選清單內的名稱、別名或運算式的位置的負整數。如果需按多列進行排序,則根據ORDER BY後各列的次序先後決定排序的優先順序;ASC指定查詢結果按照升序進行排序,DESC指定查詢結果按照降序進行排序。
ORDER BY子句是一個可選的子句。在使用ORDER BY子句時,只需指定一列或多列以及可選關鍵字ASC或DESC(沒列只使用一個關鍵字)。如果沒有指定關鍵字,那麼ASC為預設的關鍵字。
舉例來說,從資料庫“ 銷售管理系統”中,以列“出庫單編號”、“客戶編碼”、“庫存編號”和“出庫日期”的形式返回“出庫日期”的降序排序。
SELECT 出庫單編號,客戶編碼,庫存編號,出庫日期
FROM 出庫單資訊
ORDER BY 出庫日期 DESC
ORDER BY子句後的列名通常是SELECT列表中的列名,而另一種比較簡單的方法是用數字來代替列名,該數位值是指定排序的列在SELECT列表中的位置,改值有“1”開始 ,從左至右一次加1。例如,在上述的查詢語句中,將ORDER BY子句後的列名“出庫日期”改為數字“4”,因為“出庫日期”在SELECT列表中的位置是“4”。
執行該語句後,其查詢結果與上述語句結果查詢完全相同。
又如,從資料庫“銷售管理系統”中,以列“收入明細編號”、“收入日期”、“收入金額”和“盈利金額”的形式返回“收入明細資訊”,並將查詢結果先按“收入金額”的降序排序,再按“盈利金額”的升序排序。
SELECT 收入明細編號,收入日期,收入金額,盈利金額
FROM 收入明細
ORDER BY 收入金額 DESC,盈利金額 ASC
1.5使用GROUP BY子句
在使用SELECT語句進行資料查詢時,如果需要按某一列資料的值進行分類,然後在分類的基礎上再進行查詢,可以使用GROUP BY子。GROUP BY子句用于歸納資訊類型,以匯總相關資料。不管是否使用WHERE子句,GROUP BY子句都可以包括在SELECT語句中。GROUP BY子句的文法格式如下:
SELECT <select_list>
FROM <table_reference>
GROUP BY <grouping_specificition>
其中,<grouping_specificition>可以分解為一下格式:
<column_name> [{,<column_name>...}
| {ROLLUP | CUBE} ( <column_name> [ { , <column_name>}...])
上述語句中的CUBE表示了除了返回由GROUP BY子句指定的列外,還返回按組統計的行。返回的結果先按分組的第一條件列排序顯示,再按第二個條件列排序顯示,一次類推。統計行包括了GROUP BY子句指定的列的各種組合的資料統計。ROLLUP與CUBE不同的是,它只返回第一個分組條件指定的列的統計行。改變列的順序會使返回的結果行數發生變化。
例如,從資料庫“經銷商”的“銷售資訊”表中,按照“銷售人員編號”分組,查詢每個銷售人員的銷售金額,並按銷售金額的降序進行排序。
SELECT 銷售人員編號,SUM(金額) AS 銷售金額
FROM 銷售資訊
GROUP BY 銷售人員編號
ORDER BY 2 DESC
在包括GROUP BY子句的SELECT語句中仍然可以使用WHERE子句。例如,假如在上個例子中,若只有列“金額”大於100時才可以加入“銷售金額”中,則可以使用下列語句來實現:
SELECT 銷售人員編號,SUM(金額) AS 銷售金額
FROM 銷售資訊
WHERE 金額 > 100
GROUP BY 銷售人員編號
ORDER BY 2 DESC
前面的兩個例子中,GROUP BY子句都指定了一列,但是也可以根據需要指定其他的列,這樣句可以建立在主鍵範圍內分組資料的子組。例如,從資料庫“珠寶銷售系統”的“銷售明細資訊”表中,按照“明細編號”和“單價”分組,查詢銷售的“單價”及“總利潤”,並按照“明細編號”的升序排序。
SELECT 明細編號,單價,SUM(利潤) AS 總利潤
FROM 銷售明細資訊
GROUP BY 明細編號,單價
ORDER BY 明細編號
在GROUP BY子句的文法中曾經簡單介紹過運算子ROLLUP和CUBE。這兩個運算子在功能上相似,當把他們添加到GROUP BY子句時,它們都將在查詢結果中返回附加摘要值。
例如,下列SELECT語句中,GROUP BY子句將ROLLUP運算子應用於列“明細編號”和“單價”:
SELECT 明細編號,單價,SUM(利潤) AS 總利潤
FROM 銷售明細資訊
GROUP BY 明細編號,單價 WITH ROLLUP
當執行上述語句後,在查詢結果中對於“明細編號”列中的每個值都增加了一行。三個附加行提供對應於“明細編號”列中的每個值的總數量。而最後增加的一行表示“明細編號”列中所有值得總數量。
CUBE運算子返回的資料和ROLLUP運算子相同,但要比ROLLUP運算子返回的資訊多。而在下面的SELECT語句中,僅僅是用運算子CUBE替換ROLLUP:
SELECT 明細編號,單價,SUM(利潤) AS 總利潤
FROM 銷售明細資訊
GROUP BY 明細編號,單價 WITH CUBE
可以看出,三個附加行添加到查詢結果中, 每一行對應於“明細編號”列中的每個不同的值。和ROLLUP運算子不同,CUBE匯總了每個自組的值。
1.6使用HAVING子句
HAVING子句是指定組或彙總的搜尋條件。HAVING子句通常與GROUP BY子句一起使用;在完成資料結果的查詢和統計後,可以使用HAVING子句對分組的結果進行進一步的篩選;如果不使用GROUP BY子句,HAVING子句的功能與WHERE子句一樣。HAVING子句的格式為:HAVING <search_condition>HAVING子句可以引用挑選清單中,按照“明細編號”和“單價”分組,查詢銷售的“單價”及“總利潤”,並要求在查詢結果中只顯示“總利潤”大於150的資訊。
SELECT 明細編號,單價,SUM(利潤) AS 總利潤
FROM 銷售明細資訊
GROUP BY 明細編號,單價
HAVING SUM(利潤) > 150如果HAVING子句中包含有多個條件,那麼可以通過關鍵字AND、OR或NOT組合為HAVING子句的搜尋條件。例如,在上個例子中,要求返回的結果為“單價”大於300或者“總利潤”大於150的資訊。
SELECT 明細編號,單價,SUM(利潤) AS 總利潤
FROM 銷售明細資訊
GROUP BY 明細編號,單價
HAVING 單價> 300 OR SUM(利潤) > 150
關於資料庫的查操作,未完待續......