SQL核心语句

SELECT

SELECT是SQL里当之无愧的王者,核心中的核心。
作用是从某数据库中根据客户要求搜索得到所需信息,按规定格式整理后,返回给客户端。
SELECT语句主要是从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。
SELECT语句完整语法非常复杂,如下

《SQL核心语句》 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]]

《SQL核心语句》 SELECT参数说明

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 子句

《SQL核心语句》 语法格式

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]]

《SQL核心语句》 行聚合函数(自动忽略null)

如果是用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
  1. UNION默认删除重复行,否则需指定ALL关键字。
  2. 如果合并操作的两个SELECT的INTO操作只能在第一个中
  3. 如果合并后的集使用ORDER BY子句,则必须放置在最后一个SELECT中,子句中列名必须使用第一个SELECT中的列名。
  4. 最多合并10个表。
  • UNION和JOIN的区别是,UNION是将新行合并到前一表行下面,列不变;JOIN是将列合并到前一表列一侧,行不变。
  • 需要将不同列数的两表合并时,需要向其中一个表源中添加列。
    可以使用SELECT a_col, b_col, null FROM table 这样的表达。
  • 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

子查询

子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其它子查询中的查询。

  1. 子查询的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

    原文作者:李彪_哈工大
    原文地址: https://www.jianshu.com/p/4e312808a43e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞