數(shù)據(jù)庫是為了便于有效地管理信息而創(chuàng)建的,人們希望數(shù)據(jù)庫可以隨時(shí)提供所需要的數(shù)據(jù)信息。因此,對(duì)用戶來講,數(shù)據(jù)查詢是數(shù)據(jù)庫最重要的功能。在數(shù)據(jù)庫中創(chuàng)建了對(duì)象并且在基表中添加了數(shù)據(jù)后,用戶即可以從數(shù)據(jù)庫中檢索特定信息。
1.常規(guī)型
常規(guī)型數(shù)據(jù)查詢是通過SELECT語句來完成的。SELECT語句可以從數(shù)據(jù)庫中按用戶要求檢索數(shù)據(jù),并將查詢結(jié)果以表格的情勢(shì)返回。
1.1SELECT語句概述
SELECT子句是SQL編程人員最經(jīng)常使用的語句之1,也是SQL標(biāo)準(zhǔn)中最靈活和利用最為廣泛的語句之1。SELECT語句是1個(gè)查詢表達(dá)式,它以關(guān)鍵字SELECT開頭,并且包括大量構(gòu)成該表達(dá)式的元素。SELECT語句可以從數(shù)據(jù)庫中按用戶的要求查詢行,而且允許從1個(gè)表或多個(gè)表當(dāng)選擇滿足給定條件的1個(gè)或多個(gè)行或列,并將數(shù)據(jù)用用戶規(guī)定的格式進(jìn)行整理后返回給客戶端。
SELECT語句可以精確地對(duì)數(shù)據(jù)庫進(jìn)行查找,并且SELECT語句的SQL語法顯得直觀、結(jié)構(gòu)化。固然,SELECT語句也能夠進(jìn)行模糊查找。
由于SELECT語句的完全語句比較復(fù)雜,所以在這里只羅列它的主要子句。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>]
其中,[ ]表示可選項(xiàng),SELECT子句和FROM子句是必選的,其他子句都是可選的。其具體含義以下:
SELECT子句 [用來指定由查詢返回的列。各列在SELECT子句中的順序決定了它們?cè)诮Y(jié)果表中的順序。]
FROM子句 [用來指定從中查詢行的源表。]
WHERE子句 [用來指定限定返回的行的搜索條件。]
GROUP BY子句 [用來指定查詢結(jié)果的分組條件,即歸納信息類型。]
HAVING子句 [用來指定組或聚合的搜索條件。]
ORDER BY子句 [用來指定結(jié)果集的排序方式。]
1.2使用SELECT子句
SELECT子句是查詢的第1部份,在SELECT子句中指定所需列、列的順序和列名。SELECT子句1共有3種情勢(shì),分別為:
SELECT列 在該情勢(shì)下能夠獲得列出的列,并按這些列在被列出的列表中的順序放置這些列,還可以對(duì)列名進(jìn)行重命名。(例如:
SELECT 客戶姓名 AS NAME,客戶地址 AS ADDRESS,聯(lián)系電話 AS TELEPHONE_NUM
FROM 客戶信息
)SELECT *或SELECT 表名.* 在該情勢(shì)下能夠獲得表中所有列,并且其放置順序與表中的順序相同。但是,不能再SQL語句中重新對(duì)列名命名。另外,在添加表中的列之外的其他列時(shí),需要在星號(hào)"*"前輸入表名,表名與星號(hào)之間用1個(gè)句點(diǎn)隔開。(例如:
SELECT *
FROM 業(yè)務(wù)員信息
)SELECT DISTINCT列在該情勢(shì)下,除完成SELECT列情勢(shì)下的功能外,還可以去除結(jié)果中的而重復(fù)行。(例如:
SELECT DISTINCT 客戶地址
FROM 客戶信息
)
1.3使用WHERE子句
用戶在查詢數(shù)據(jù)庫時(shí)常常不需要檢索全部的數(shù)據(jù),而只需要查詢其中1部份滿足給定條件的信息,此時(shí)需要在SELECT語句中加入條件,以選擇其中的部份記錄。這就用到WHERE子句來指定查詢返回行的條件,WHERE子句用于選取需要檢索的數(shù)據(jù)行。帶WHERE子句的SELECT語句的基本格式以下:
SELECT <select_list>
FROM <table_reference>
WHERE <search_condition>
其中,<search_condition>為指定查詢時(shí)要返回的行記錄所應(yīng)滿足的條件,該條件由表達(dá)式及邏輯運(yùn)算符等組成。
WHERE子句獲得FROM子句返回的值,每行都要根據(jù)搜索條件進(jìn)行評(píng)估。若評(píng)估為真,則作為查詢結(jié)果的1部份返回;若評(píng)估如果為未知或假,則這些行不包括在查詢結(jié)果中。而評(píng)估的關(guān)鍵是<search_condition>所指定的搜索條件。
1.3.1WHERE子句中比較運(yùn)算符的使用:
其語法格式:
SELECT <select_list>
FROM <table_reference>
WHERE <expression1> <comparision operator> <expression2>
舉例來講:
SELECT 供應(yīng)商名稱,供應(yīng)商所在城市,聯(lián)系人姓名,聯(lián)系電話
FROM 供應(yīng)商名稱
WHERE 供應(yīng)商所在城市='北京市'
1.3.2WHERE子句中邏輯運(yùn)算符的使用:
其格式以下:
SELECT <select_list>
FROM <table_reference>
WHERE {NOT <expression> | <expression> <logical operator> <expression2>}
其中,<logical operator>表示邏輯運(yùn)算符,它可以是AND、OR兩個(gè)邏輯表達(dá)式中的任意1個(gè),用到NOT時(shí),要將NOT放在表達(dá)式的前面。舉例來講:
SELECT 操作人員姓名,入庫權(quán)限,出庫權(quán)限,聯(lián)系電話
FROM 操作人員信息
WHERE 入庫人員=1 AND 出庫人員=1
1.3.3WHERE子句中IN條件的使用:
SELECT <select_list>
FROM <table_reference>
WHERE <expression> [NOT] IN <value_list>
其中,[NOT]為可選項(xiàng),<value_list>表示值列表。
在WHERE子句中使用IN或NOT IN關(guān)鍵字指定條件時(shí),IN關(guān)鍵字用來顯示1個(gè)組中的成員關(guān)系。當(dāng)有1個(gè)滿足條件的離散值列表時(shí),就會(huì)用到IN關(guān)鍵字。
有效值列表中不能包括NULL值得數(shù)據(jù),由于在WHERE子句中使用IN關(guān)鍵字作為指定條件時(shí)不允許數(shù)據(jù)中有NULL值。
舉例來講:
SELECT 客戶姓名,客戶地址,聯(lián)系電話
FROM 客戶信息
WHERE 客戶地址 IN ('北京市宣武區(qū)','北京市海淀區(qū)')
1.3.4WHERE子句中LIKE條件的使用:
其格式以下:
SELECT <select_list>
FROM <table_reference>
WHERE <expression> [NOT] LIKE 'string'
其中,[NOT]為可選項(xiàng),'string'表示用來進(jìn)行比較的字符串。利用WHERE子句進(jìn)行查詢的進(jìn)程中,為了實(shí)現(xiàn)對(duì)字符串的模糊匹配,可以在string字符串中使用通配符。
舉例來講:
SELECT 商品名稱,供應(yīng)商編號(hào),產(chǎn)地,單價(jià)
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]為可選項(xiàng)。舉例來講:
SELECT 消費(fèi)者姓名,消費(fèi)者消費(fèi)金額,消費(fèi)者所在城市,聯(lián)系電話
FROM 顧客信息
WHERE 聯(lián)系電話 IS NULL
1.4使用ORDER BY子句
SELECT語句取得的數(shù)據(jù)1班沒有任何的按1定的規(guī)律進(jìn)行排序。也就是說,這1次提取的數(shù)據(jù)組的排列順序與下次提取的數(shù)據(jù)組的排序順序可以截然不同。為了方便瀏覽和使用,最好對(duì)查詢結(jié)果進(jìn)行排序。SQL語言中,ORDER BY子句用來指定查詢結(jié)果是依照升序(使用關(guān)鍵字ASC)還是降序(使用關(guān)鍵字DESC)進(jìn)行排序。ORDER BY子句的基本語法格式為:
SELECT <select_list>
FROM <table_reference>
ORDER BY[{<order_by_expression> []ASC | DESC}...]
其中,<order_by_expression>表示用于排序的列的列名或列的別名和表達(dá)式,或指定為代表選擇列表內(nèi)的名稱、別名或表達(dá)式的位置的負(fù)整數(shù)。如果需按多列進(jìn)行排序,則根據(jù)ORDER BY后各列的次序前后決定排序的優(yōu)先級(jí);ASC指定查詢結(jié)果依照升序進(jìn)行排序,DESC指定查詢結(jié)果依照降序進(jìn)行排序。
ORDER BY子句是1個(gè)可選的子句。在使用ORDER BY子句時(shí),只需指定1列或多列和可選關(guān)鍵字ASC或DESC(沒列只使用1個(gè)關(guān)鍵字)。如果沒有指定關(guān)鍵字,那末ASC為默許的關(guān)鍵字。
舉例來講,從數(shù)據(jù)庫“ 銷售管理系統(tǒng)”中,以列“出庫單編號(hào)”、“客戶編號(hào)”、“庫存編號(hào)”和“出庫日期”的情勢(shì)返回“出庫日期”的降序排序。
SELECT 出庫單編號(hào),客戶編號(hào),庫存編號(hào),出庫日期
FROM 出庫單信息
ORDER BY 出庫日期 DESC
ORDER BY子句后的列名通常是SELECT列表中的列名,而另外一種比較簡單的方法是用數(shù)字來代替列名,該數(shù)字的值是指定排序的列在SELECT列表中的位置,改值有“1”開始 ,從左到右1次加1。例如,在上述的查詢語句中,將ORDER BY子句后的列名“出庫日期”改成數(shù)字“4”,由于“出庫日期”在SELECT列表中的位置是“4”。
履行該語句后,其查詢結(jié)果與上述語句結(jié)果查詢完全相同。
又如,從數(shù)據(jù)庫“銷售管理系統(tǒng)”中,以列“收入明細(xì)編號(hào)”、“收入日期”、“收入金額”和“盈利金額”的情勢(shì)返回“收入明細(xì)信息”,并將查詢結(jié)果先按“收入金額”的降序排序,再按“盈利金額”的升序排序。
SELECT 收入明細(xì)編號(hào),收入日期,收入金額,盈利金額
FROM 收入明細(xì)
ORDER BY 收入金額 DESC,盈利金額 ASC
1.5使用GROUP BY子句
在使用SELECT語句進(jìn)行數(shù)據(jù)查詢時(shí),如果需要按某1列數(shù)據(jù)的值進(jìn)行分類,然后在分類的基礎(chǔ)上再進(jìn)行查詢,可使用GROUP BY子。GROUP BY子句用于歸納信息類型,以匯總相干數(shù)據(jù)。不論是否使用WHERE子句,GROUP BY子句都可以包括在SELECT語句中。GROUP BY子句的語法格式以下:
SELECT <select_list>
FROM <table_reference>
GROUP BY <grouping_specificition>
其中,<grouping_specificition>可以分解為1下格式:
<column_name> [{,<column_name>...}
| {ROLLUP | CUBE} ( <column_name> [ { , <column_name>}...])
上述語句中的CUBE表示了除返回由GROUP BY子句指定的列外,還返回按組統(tǒng)計(jì)的行。返回的結(jié)果先按分組的第1條件列排序顯示,再按第2個(gè)條件列排序顯示,1次類推。統(tǒng)計(jì)行包括了GROUP BY子句指定的列的各種組合的數(shù)據(jù)統(tǒng)計(jì)。ROLLUP與CUBE不同的是,它只返回第1個(gè)分組條件指定的列的統(tǒng)計(jì)行。改變列的順序會(huì)使返回的結(jié)果行數(shù)產(chǎn)生變化。
例如,從數(shù)據(jù)庫“經(jīng)銷商”的“銷售信息”表中,依照“銷售人員編號(hào)”分組,查詢每一個(gè)銷售人員的銷售金額,并按銷售金額的降序進(jìn)行排序。
SELECT 銷售人員編號(hào),SUM(金額) AS 銷售金額
FROM 銷售信息
GROUP BY 銷售人員編號(hào)
ORDER BY 2 DESC
在包括GROUP BY子句的SELECT語句中依然可使用WHERE子句。例如,假設(shè)在上個(gè)例子中,若只有列“金額”大于100時(shí)才可以加入“銷售金額”中,則可使用以下語句來實(shí)現(xiàn):
SELECT 銷售人員編號(hào),SUM(金額) AS 銷售金額
FROM 銷售信息
WHERE 金額 > 100
GROUP BY 銷售人員編號(hào)
ORDER BY 2 DESC
前面的兩個(gè)例子中,GROUP BY子句都指定了1列,但是也能夠根據(jù)需要指定其他的列,這樣句可以創(chuàng)建在主鍵范圍內(nèi)分組數(shù)據(jù)的子組。例如,從數(shù)據(jù)庫“珠寶銷售系統(tǒng)”的“銷售明細(xì)信息”表中,依照“明細(xì)編號(hào)”和“單價(jià)”分組,查詢銷售的“單價(jià)”及“總利潤”,并依照“明細(xì)編號(hào)”的升序排序。SELECT 明細(xì)編號(hào),單價(jià),SUM(利潤) AS 總利潤
FROM 銷售明細(xì)信息
GROUP BY 明細(xì)編號(hào),單價(jià)
ORDER BY 明細(xì)編號(hào)
在GROUP BY子句的語法中曾簡單介紹過運(yùn)算符ROLLUP和CUBE。這兩個(gè)運(yùn)算符在功能上相似,當(dāng)把他們添加到GROUP BY子句時(shí),它們都將在查詢結(jié)果中返回附加摘要值。
例如,以下SELECT語句中,GROUP BY子句將ROLLUP運(yùn)算符利用于列“明細(xì)編號(hào)”和“單價(jià)”:
SELECT 明細(xì)編號(hào),單價(jià),SUM(利潤) AS 總利潤
FROM 銷售明細(xì)信息
GROUP BY 明細(xì)編號(hào),單價(jià) WITH ROLLUP
當(dāng)履行上述語句后,在查詢結(jié)果中對(duì)“明細(xì)編號(hào)”列中的每一個(gè)值都增加了1行。3個(gè)附加行提供對(duì)應(yīng)于“明細(xì)編號(hào)”列中的每一個(gè)值的總數(shù)量。而最后增加的1行表示“明細(xì)編號(hào)”列中所有值得總數(shù)量。
CUBE運(yùn)算符返回的數(shù)據(jù)和ROLLUP運(yùn)算符相同,但要比ROLLUP運(yùn)算符返回的信息多。而在下面的SELECT語句中,僅僅是用運(yùn)算符CUBE替換ROLLUP:
SELECT 明細(xì)編號(hào),單價(jià),SUM(利潤) AS 總利潤
FROM 銷售明細(xì)信息
GROUP BY 明細(xì)編號(hào),單價(jià) WITH CUBE
可以看出,3個(gè)附加行添加到查詢結(jié)果中, 每行對(duì)應(yīng)于“明細(xì)編號(hào)”列中的每一個(gè)不同的值。和ROLLUP運(yùn)算符不同,CUBE匯總了每一個(gè)自組的值。
1.6使用HAVING子句