SELECT
SELECT是SQL里當(dāng)之無愧的王者,核心中的核心。
作用是從某數(shù)據(jù)庫中根據(jù)客戶要求搜索得到所需信息,按規(guī)定格式整理后,返回給客戶端。
SELECT語句主要是從數(shù)據(jù)庫中檢索行,并允許從一個(gè)或多個(gè)表中選擇一個(gè)或多個(gè)行或列。
SELECT語句完整語法非常復(fù)雜,如下

核心內(nèi)容歸納為
[WITH <common_table_expression>]
SELECT select_lish [INTO new_table_name]
[FROM table_source][WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]]

WITH 子句
指定臨時(shí)命名的結(jié)果集,稱為公用表表達(dá)式(CTE)。在單條SELECT、INSERT、UPDATE或DELETE語句執(zhí)行范圍內(nèi)定義。
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
--只有在查詢定義中為所有結(jié)果列都提供了不同的名稱時(shí),列名稱列表才是可選的。
--運(yùn)行 CTE 的語句為:
SELECT <column_list> FROM expression_name;
WITH [table1 =] table2 [(col_A, col_B[,...n])]
AS
(CTE_query_definition)
SELECT [(col_A, col_B)]
FROM table2
INTO 子句
創(chuàng)建新表并將查詢結(jié)果插入新表中。
INTO new_table
new_table中每列與選擇列表中的相應(yīng)表達(dá)式具有相同的名稱、數(shù)據(jù)類型和值。
WHERE 子句

GROUP BY 子句
按一個(gè)或多個(gè)列或表達(dá)式的值將一組選定行組合成一個(gè)摘要行集,針對(duì)每一組返回一行。
GROUP BY group_by_expression[,...n]
HAVING 子句
指定組或了聚合的搜索條件。HAVING通常在GROUP BY子句中使用,沒有GROUP BY時(shí),作用與WHERE一樣。
在 SQL 中增加 HAVING 子句原因是,WHERE 關(guān)鍵字無法與合計(jì)函數(shù)一起使用。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
例:查找訂單總金額少于 2000 的客戶。
我們使用如下 SQL 語句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
GROUP BY
GROUP BY 語句用于結(jié)合合計(jì)函數(shù),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
我們也可以對(duì)一個(gè)以上的列應(yīng)用 GROUP BY 語句,就像這樣:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate
ORDER BY 子句
排序 ASC順序增加,DESC順序減少
COMPUTE 子句
作為附加的匯總列出現(xiàn)在結(jié)果集的最后。與BY一起用可以在結(jié)果集內(nèi)生成控制中斷??稍谕徊樵儍?nèi)指定COMPUTE BY和COMPUTE。
COMPUTE
{{AVG | COUNT | MAX | MIN| STDEV | STDEVP | VAR | VARP | SUM}
(experssion)} [,...n]
[BY expression[,...n]]

如果是用COMPUTE子句指定的行聚合函數(shù),不允許它們使用DISTINCT關(guān)鍵字。
COMPUTE不加BY里返回兩個(gè)結(jié)果集,一個(gè)是詳細(xì)記錄集,另一個(gè)是聚合函數(shù)計(jì)算結(jié)果集。
COMPUTE BY會(huì)按BY劃分的分組,對(duì)每個(gè)組分別返回上述兩個(gè)結(jié)果集。
DISTINCT 關(guān)鍵字
從SELECT語句的結(jié)果中去掉重復(fù)的記錄。
SELECT DISTINCT expressionTOP 關(guān)鍵字
限制查詢結(jié)果顯示的行數(shù)
SELECT TOP n [PERCENT]
[PERCENT] 控制返回百分之n的內(nèi)容。不加則返回n行。
UNION
將兩個(gè)表的行合并到一個(gè)表中,要求兩個(gè)表列數(shù)據(jù)同樣多且類型相同,合并后的列名字或別名由第一個(gè)表決定。
注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語句中的列的順序必須相同。
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
- UNION默認(rèn)刪除重復(fù)行,否則需指定ALL關(guān)鍵字。
- 如果合并操作的兩個(gè)SELECT的INTO操作只能在第一個(gè)中
- 如果合并后的集使用ORDER BY子句,則必須放置在最后一個(gè)SELECT中,子句中列名必須使用第一個(gè)SELECT中的列名。
- 最多合并10個(gè)表。
- UNION和JOIN的區(qū)別是,UNION是將新行合并到前一表行下面,列不變;JOIN是將列合并到前一表列一側(cè),行不變。
- 需要將不同列數(shù)的兩表合并時(shí),需要向其中一個(gè)表源中添加列。
可以使用SELECT a_col, b_col, null FROM table這樣的表達(dá)。 - 默認(rèn)地,UNION 操作符選取不同的值。如果允許重復(fù)的值,請(qǐng)使用 UNION ALL。
UNION 結(jié)果集中的列名總是等于 UNION 中第一個(gè) SELECT 語句中的列名。
子查詢
子查詢是一個(gè)嵌套在SELECT、INSERT、UPDATE或DELETE語句或其它子查詢中的查詢。
- 子查詢的SELECT查詢總使用圓括號(hào)括起來。
- 不能包括COMPUTE或FOR BROWSE子句;
- 若子查詢中指定TOP關(guān)鍵字,則子句中只能使用ORDER BY;
- 子查詢最多嵌套32層;
- 任何可以使用表達(dá)式的地方都可以使用子查詢,但要求返回的是單個(gè)值;
- 只在子查詢中出現(xiàn)的表,其各列無法包含在輸出中。
嵌套查詢
將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE或HAVING子句中。
- 上層查詢稱為外查詢或父查詢,下層稱為內(nèi)查詢或子查詢??梢远鄬忧短?,但ORDER BY只能出現(xiàn)在最外層。
- 嵌套查詢通常實(shí)現(xiàn)方法是在WHERE或HAVING語句中由IN,NOT IN, ANY, SOME(和ANY一樣), ALL,EXSITS引導(dǎo)的子查詢。
- 不是由EXSITS引導(dǎo)的子查詢中,只能查詢一列。
聯(lián)接查詢
聯(lián)接是在水平方向上合并兩個(gè)數(shù)據(jù)集合,并產(chǎn)生一個(gè)新結(jié)果集。過程首先對(duì)兩數(shù)據(jù)集采用笛卡爾乘積運(yùn)算,之后對(duì)結(jié)果集進(jìn)行選取,以提取來自兩個(gè)數(shù)據(jù)集且具有重疊部分的行合并到一起。
- 內(nèi)聯(lián)接 [INNER] JOIN
結(jié)果集不包含兩數(shù)據(jù)集中不重疊的行,所以可能會(huì)丟失數(shù)據(jù)。
SELECT expression
FROM table1 [INNER] JOIN table2
ON table1.col_a = table2. col_b
- 外部聯(lián)接
左聯(lián)接(LEFT JOIN)或右聯(lián)接(RIGHT JOIN),分別包括左表所有行或右表所有行。未匹配行則自動(dòng)增加Null填充。
SELECT expression
FROM table1 LEFT JOIN|RIGHT JOIN table2
ON table1.col_a = table2. col_b
完整外聯(lián)接(FULL JOIN)會(huì)保留左右表中所有行,未匹配處自動(dòng)填充Null。
SELECT expression
FROM table1 FULL JOIN table2
ON table1.col_a = table2. col_b
- 交叉聯(lián)接(CROSS JOIN)
SELECT expression
FROM table1 CROSS JOIN table2
結(jié)果集列數(shù) = table1列數(shù)+table2列數(shù)
結(jié)果集行數(shù) = table1行數(shù)*table2行數(shù)
聯(lián)接多個(gè)表
- 在WHERE子句中聯(lián)接多個(gè)表
在FROM中寫要聯(lián)接的多個(gè)表的名稱,在WHERE中寫所有的聯(lián)接條件
SELECT expression
FROM table1, table2, table3...
WHERE table1.col_a = table2. col_b
AND table2.col_c=table3.col_d AND...
- 在FROM子句中聯(lián)接多表
SELECT expression
FROM talbe1
JOIN table2
JOIN table3
ON table1.col_a=table2.col_b
AND table2.col_c = table3.col_d
[ON new search_condition]
JOIN... ON
INNER JOIN(= JOIN): 在表中存在至少一個(gè)匹配時(shí),則返回行。
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行,組合后右表沒有匹配處為空
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行,組合后左表沒有匹配處為空
FULL JOIN: 只要其中一個(gè)表中存在匹配,就返回行,組合后任意一側(cè)表沒有匹配處均為空
在使用left jion時(shí),on和where條件的區(qū)別如下(詳細(xì)解釋見此鏈接):
1、 on條件是在生成臨時(shí)表時(shí)使用的條件,它不管on中的條件是否為真,都會(huì)返回左邊表中的記錄。
2、where條件是在臨時(shí)表生成好后,再對(duì)臨時(shí)表進(jìn)行過濾的條件。這時(shí)已經(jīng)沒有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
遞歸表達(dá)式
WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,n ] ) ]
AS (
CTE_query_definition1 -- 定位點(diǎn)成員(也就是初始值或第一個(gè)結(jié)果集)
union all
CTE_query_definition2 -- 遞歸成員
)
以下博客講解非常好
http://www.cnblogs.com/nokiaguy/archive/2009/02/01/1382207.html
http://www.cnblogs.com/CareySon/archive/2011/12/12/2284740.html
http://www.cnblogs.com/sheng-jie/p/6347835.html