SELECT
SELECT是SQL里当之无愧的王者,核心中的核心。
作用是从某数据库中根据客户要求搜索得到所需信息,按规定格式整理后,返回给客户端。
SELECT语句主要是从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。
SELECT语句完整语法非常复杂,如下
核心内容归纳为
[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 子句
指定临时命名的结果集,称为公用表表达式(CTE)。在单条SELECT、INSERT、UPDATE或DELETE语句执行范围内定义。
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
--只有在查询定义中为所有结果列都提供了不同的名称时,列名称列表才是可选的。
--运行 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 子句
创建新表并将查询结果插入新表中。
INTO new_table
new_table中每列与选择列表中的相应表达式具有相同的名称、数据类型和值。
WHERE 子句
GROUP BY 子句
按一个或多个列或表达式的值将一组选定行组合成一个摘要行集,针对每一组返回一行。
GROUP BY group_by_expression[,...n]
HAVING 子句
指定组或了聚合的搜索条件。HAVING通常在GROUP BY子句中使用,没有GROUP BY时,作用与WHERE一样。
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
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 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
我们也可以对一个以上的列应用 GROUP BY 语句,就像这样:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate
ORDER BY 子句
排序 ASC顺序增加,DESC顺序减少
COMPUTE 子句
作为附加的汇总列出现在结果集的最后。与BY一起用可以在结果集内生成控制中断。可在同一查询内指定COMPUTE BY和COMPUTE。
COMPUTE
{{AVG | COUNT | MAX | MIN| STDEV | STDEVP | VAR | VARP | SUM}
(experssion)} [,...n]
[BY expression[,...n]]
如果是用COMPUTE子句指定的行聚合函数,不允许它们使用DISTINCT关键字。
COMPUTE不加BY里返回两个结果集,一个是详细记录集,另一个是聚合函数计算结果集。
COMPUTE BY会按BY划分的分组,对每个组分别返回上述两个结果集。
DISTINCT 关键字
从SELECT语句的结果中去掉重复的记录。
SELECT DISTINCT expression
TOP 关键字
限制查询结果显示的行数
SELECT TOP n [PERCENT]
[PERCENT] 控制返回百分之n的内容。不加则返回n行。
UNION
将两个表的行合并到一个表中,要求两个表列数据同样多且类型相同,合并后的列名字或别名由第一个表决定。
注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
- UNION默认删除重复行,否则需指定ALL关键字。
- 如果合并操作的两个SELECT的INTO操作只能在第一个中
- 如果合并后的集使用ORDER BY子句,则必须放置在最后一个SELECT中,子句中列名必须使用第一个SELECT中的列名。
- 最多合并10个表。
- UNION和JOIN的区别是,UNION是将新行合并到前一表行下面,列不变;JOIN是将列合并到前一表列一侧,行不变。
- 需要将不同列数的两表合并时,需要向其中一个表源中添加列。
可以使用SELECT a_col, b_col, null FROM table
这样的表达。 - 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
子查询
子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其它子查询中的查询。
- 子查询的SELECT查询总使用圆括号括起来。
- 不能包括COMPUTE或FOR BROWSE子句;
- 若子查询中指定TOP关键字,则子句中只能使用ORDER BY;
- 子查询最多嵌套32层;
- 任何可以使用表达式的地方都可以使用子查询,但要求返回的是单个值;
- 只在子查询中出现的表,其各列无法包含在输出中。
嵌套查询
将一个查询块嵌套在另一个查询块的WHERE或HAVING子句中。
- 上层查询称为外查询或父查询,下层称为内查询或子查询。可以多层嵌套,但ORDER BY只能出现在最外层。
- 嵌套查询通常实现方法是在WHERE或HAVING语句中由IN,NOT IN, ANY, SOME(和ANY一样), ALL,EXSITS引导的子查询。
- 不是由EXSITS引导的子查询中,只能查询一列。
联接查询
联接是在水平方向上合并两个数据集合,并产生一个新结果集。过程首先对两数据集采用笛卡尔乘积运算,之后对结果集进行选取,以提取来自两个数据集且具有重叠部分的行合并到一起。
- 内联接 [INNER] JOIN
结果集不包含两数据集中不重叠的行,所以可能会丢失数据。
SELECT expression
FROM table1 [INNER] JOIN table2
ON table1.col_a = table2. col_b
- 外部联接
左联接(LEFT JOIN)或右联接(RIGHT JOIN),分别包括左表所有行或右表所有行。未匹配行则自动增加Null填充。
SELECT expression
FROM table1 LEFT JOIN|RIGHT JOIN table2
ON table1.col_a = table2. col_b
完整外联接(FULL JOIN)会保留左右表中所有行,未匹配处自动填充Null。
SELECT expression
FROM table1 FULL JOIN table2
ON table1.col_a = table2. col_b
- 交叉联接(CROSS JOIN)
SELECT expression
FROM table1 CROSS JOIN table2
结果集列数 = table1列数+table2列数
结果集行数 = table1行数*table2行数
联接多个表
- 在WHERE子句中联接多个表
在FROM中写要联接的多个表的名称,在WHERE中写所有的联接条件
SELECT expression
FROM table1, table2, table3...
WHERE table1.col_a = table2. col_b
AND table2.col_c=table3.col_d AND...
- 在FROM子句中联接多表
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): 在表中存在至少一个匹配时,则返回行。
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行,组合后右表没有匹配处为空
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行,组合后左表没有匹配处为空
FULL JOIN: 只要其中一个表中存在匹配,就返回行,组合后任意一侧表没有匹配处均为空
在使用left jion时,on和where条件的区别如下(详细解释见此链接):
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left 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’)
递归表达式
WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,n ] ) ]
AS (
CTE_query_definition1 -- 定位点成员(也就是初始值或第一个结果集)
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