SELECT

SELECT

基本结构

--语句顺序
SELECT COLUNM_NAME    --COLUNM_NAME 字段名
FROM TABLE_NAME       --表名
WHERE                 --限制条件
GROUP BY              --分组
HAVING                --对分组后的结果进行筛选
ORDER BY              --显示顺序,可以使用 select 中的别名

--执行顺序
-- FROM -- WHERE -- GROUP BY -- HAVING--SELECT -- ORDER BY 
--OEDER BY 执行顺序在 SELECT 之后,所以可以使用别名。

SELECT 子句

SELECT (ALL) *   --查询所有字段,ALL可以不写,包含重复行。
select select_list  --select_list:指定字段
SELECT  DISTINCT *  --查询所有字段,ALL可以不写,不包含重复字段。
SELECT TOP 10 *   -- 返回前 10 个未定义的行,因为此时没有使用 ORDER BY 子句
SELECT PERCENT 10.1 *   --前 10.1% 的行。 小数部分的值向上舍入到下一个整数值

 

GROUP BY 子句

此时select 字句中的字段要么是在group by中的字段、要么是聚合函数。

1.表格:

 CREATE TABLE Sales ( Country varchar(50), Region varchar(50), Sales int );

INSERT INTO sales VALUES (N'Canada', N'Alberta', 100);
INSERT INTO sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO sales VALUES (N'United States', N'Montana', 100);

2.允许形式:

SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB;  
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA, ColumnB;  
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA + ColumnB;  
SELECT ColumnA + ColumnB + constant FROM T GROUP BY ColumnA, ColumnB;
ROW_NUMBER() OVER(ORDER BY 字段1 DESC)    as RN
--是先把字段1降序,再为降序以后的每条记录返回一个序号
ROW_NUMBER() OVER (partition BY  字段1  ORDER BY 字段2) AS RN 
--表示根据字段1分组,在分组内部根据字段2排序,返回排序值

3.GROUP BY ROLLUP

为每个列表达式的组合创建一个组。 此外,它将结果“汇总”到小计和总计。 为此,它会从右向左减少创建的组和聚合的列表达式的数量。

例如,GROUP BY ROLLUP (col1, col2, col3, col4) 为以下列表中的每个列表达式组合创建组。

  • col1、col2、col3、col4
  • col1、col2、col3、NULL       --col1、col2、col3的小计
  • col1、col2、NULL、NULL    --col1、col2的小计
  • col1、NULL、NULL、NULL   --col1的小计
  • NULL、NULL、NULL、NULL - 这是总计

4.GROUP BY CUBE

GROUP BY CUBE 为所有可能的列组合创建组。 对于 GROUP BY CUBE (a, b),结果具有 (a, b)、(NULL, b)、(a, NULL) 和 (NULL, NULL) 唯一值的组

5.GROUP BY GROUPING SETS()

GROUPING SETS 选项可将多个 GROUP BY 子句组合到一个 GROUP BY 子句中。 其结果与针对指定的组执行 UNION ALL 运算等效。

SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS ( ROLLUP (Country, Region), CUBE (Country, Region) );


--等效于
SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP (Country, Region)
UNION ALL
SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE (Country, Region);

SQL 不会合并为 GROUPING SETS 列表生成的重复组。在 GROUP BY ( (), CUBE (Country, Region) ) 中,两个元素都返回总计行并且这两行都会列在结果中。

6.GROUP BY ()

指定生成总计的空组。 这作为 GROUPING SET 的元素之一来说非常有用。 例如,此语句给出每个国家/地区的总销售额,然后给出了所有国家/地区的总和。

SELECT Country, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS ( Country, () );

7.配合子句

经常与order by 字句、having 字句连用。

HAVING  子句

对GROUP BY 字句中的结果进行筛选。

HAVING  子句

可以使用select 子句中的别名

类别作为特征的语法元素
基本语法 ORDER BY
指定升序和降序 DESC • ASC
指定排序规则 COLLATE
指定条件顺序 CASE 表达式
在排名函数中使用 ORDER BY 排名函数
限制返回的行数 OFFSET • FETCH
将 ORDER BY 与 UNION、EXCEPT 和 INTERSECT 一起使用 ORDER BY 必须放到最后使用

在与 SELECT…INTO 语句一起使用以从另一来源插入行时,ORDER BY 子句不能保证按指定的顺序插入这些行。

在视图中使用 OFFSET 和 FETCH 并不会更改该视图的 Updateability 属性?

OVER  子句

参考:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

APPLY 子句

参考:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/from-transact-sql?view=sql-server-2017

JOIN  子句

1.LEFT  JOIN 

2.RIGHT  JOIN 

3.FULL JOIN

4.CROSS  JOIN 

5.INNER  JOIN 

 

PIVOT 与UNPIVOT  子句.

参考:https://www.cnblogs.com/hbwy/p/4914000.html

1.PIVOT

行转列

TABLE_SOURCE AS P

PIVOT( 聚合函数(value_column) FOR  P.pivot_column  IN(<column_list>) AS T
SELECT  * FROM Guocheng .DBO.每日消费  AS P
PIVOT (SUM(数值) FOR 数据类型 in ([展现],[点击],[消费])) as t 
where 日期 >='2019-06-08' 

2.UNPIVOT 

列转行

TABLE_SOURCE AS P
UNPIVOT( value_column FOR P.pivot_column  IN(<column_list>) AS U
)
select * from 
(SELECT  * FROM Guocheng .DBO.每日消费  AS P
PIVOT (SUM(数值) FOR 数据类型 in ([展现],[点击],[消费])) as t 
where 日期 >='2019-06-08' 
) as u 
UNPIVOT (数值 FOR 数据类型 in ([展现],[点击],[消费]) ) as UN

.

 

 

原文地址:https://www.cnblogs.com/qianslup/p/11001064.html