此文章主要说明SQL Server常用查询语句基本结构和组成部分,本章测试使用数据表结构如下图所示,表数据可从下方附件获取。

image.png

销售例表.xlsx

销售表

一、基本结构

select … from …
在sql语句中,如需要从数据库中获取数据,一般是通过 select from 两个单词组成的句式,从指定的数据库中的指定表获取指定字段数据。
select后接需要查询的字段名称,from后则为字段的来源表表名

  1. select [字段1],
  2. [字段2],
  3. [字段3]
  4. from [test].[dbo].[sample_table]

以上语句的意思即——从(from) sampletable表中,获取(_select) [字段1]、[字段2]、[字段3]三个字段的信息/数据。字段间须以英文字符逗号“,”隔开。
( test为表格所在数据库,dbo为表格所有者,一般默认dbo即可;在SQL SERVER中,若在指定数据库下查询该数据库内的表格,可省略此部分,from 后直接添加表名即可,如 from [sampletable] )
如例表中,若只想看
年,月,店铺编号,商品编码,销量 _五个字段的数据,语句如下

select [年]
            ,[月]
            ,[店铺编号]
            ,[商品编码]
      ,[销量]
from  销售表

结果如下:
image.png
注意:
1、SQL 中引用字段时,无须在字段名称外加以引号包围,当字段名称开头或结尾出现阿拉伯字数时,则需要用 [] 包围,如 : [1月份销售];非特殊情况时,[] 可忽略不用;
2、SQL Server/MySQL 中语法对大小写不敏感,故使用函数、引用数据源时可不区分大小写;Oracle则不然,需要对大小写加以区分,否则将导致查询失败。

二、聚合函数

聚合函数是指对整组的数据进行计算,并返回单一的结果。常见的聚合函数有
sum 整组求和
count 整组计数
min 组内最小数
max 组内最大数
avg 组平均数
例表中,如需对数据中的销量进行整组求和,语句如下:

select sum([销量]) as 销量
from 销售表

结果如下:
image.png
对于聚合后新生成的字段,可使用 as 对字段进行命名,as 可省略,直接在新字段后输入字段名称并以空格隔开即可,as也可对已有字段进行重新命名,方法同上。

三、分组函数

group by
在查询过程中,聚合函数往往与分组函数结合使用,按照指定字段对计算结果进行分组汇总
如表1的数据中,如想看各个城市的销售情况,则需要按城市对金额、数量进行求和汇总,sql语句如下

select 城市
            ,sum(销售额) as 金额
      ,sum(销量) as 数量
from 销售表
group by 城市

结果如下:
image.png

四、条件函数

where

当查询的表数据量非常巨大时,查询整表往往会影响查询效率,此时可以通过使用where对指定的字段进行条件筛选/限制,锁定查询目标、减少查询数据量级,提升查询效率。
在查询语句中,where 放在最后一张引用的表的名称之后 group by 之前,语法为: where 字段名称 关系运算符(如=、>、<等) 匹配内容 。
如例表中,若想要筛选出城市为广州的所有数据,语句如下:

select [年]
      ,[月]
      ,[大区]
      ,[门店属性]
      ,[城市]
      ,[订单日期]
      ,[订单单号]
      ,[店铺编号]
      ,[商品编码]
      ,[销量]
      ,[销售额]
from 销售表 where [城市] = '广州市'

结果如下:
image.png

  • 若用于限制/筛选的字段为文本类型(如表中的[城市]字段),且以文本做为匹配内容进行筛选时,需对文本内容用英文引号“‘’”包裹,如 where 城市 =’上海’ ;
  • 若筛选字段类型为数值(如表中的[销量]字段),且以数值对表格进行筛选,匹配内容不需要用“‘’”包裹,如 where 金额 > 25000。
  • 当出现多个筛选条件时,通常根据需求的不同,用and(和)或者or(或)连接多个条件,代码演示如下: ```sql /*筛选城市为上海、且月份为7月份的数据**/ select [年]
    ,[月]
    ,[大区]
    ,[门店属性]
    ,[城市]
    ,[订单日期]
    ,[订单单号]
    ,[店铺编号]
    ,[商品编码]
    ,[销量]
    ,[销售额]
    
    from 销售表 where [城市] = ‘上海市’ and [月] = 7

/**筛选城市为上海或者广州的数据**/ select [年] ,[月] ,[大区] ,[门店属性] ,[城市] ,[订单日期] ,[订单单号] ,[店铺编号] ,[商品编码] ,[销量] ,[销售额] from 销售表 where [城市] = ‘上海市’ or [城市] = ‘广州市’

/**筛选7月份、城市为上海或者广州的数据**/ select [年] ,[月] ,[大区] ,[门店属性] ,[城市] ,[订单日期] ,[订单单号] ,[店铺编号] ,[商品编码] ,[销量] ,[销售额] from 销售表 where [月] = 7 and ([城市] = ‘上海市’ or [城市] = ‘广州市’)

关于连接关系符的更多介绍,请移步**常用函数**章节了解更多内容:[https://www.yuque.com/docs/share/5647b996-10a5-434a-a10e-5de3aeb437b8?#](https://www.yuque.com/docs/share/5647b996-10a5-434a-a10e-5de3aeb437b8?#) 《常用函数》
<a name="527xn"></a>
### having
同样为条件筛选函数但区别与where,having主要用于对已经汇总过的查询结果进行进一步筛选,其前置条件为group by,故having一般放在group by 后方。<br />如例表中,想按城市查看销售金额,并在查询结果中剔除金额小于25000的数据,语句如下:
```sql
select 城市
            ,sum(销量) as 销量
            ,sum(销售额) as 金额
from 销售表
group by 城市
having sum(金额) >= 25000

结果如下:
image.png

having 后的筛选条件,若是为查询结果中新生成的计算字段,需在having写下完整计算过程,如以上案例中的 sum(销售额) 而不是as后赋予的新名称:金额

where + having
在一段SQL 语句中,where 与 having 可以同时使用,如例表中筛选除北京以外城市中,总金额不小于 25000 的数据,语句如下:

select 城市
            ,sum(销量) as 销量
            ,sum(销售额) as 金额
from 销售表
where 城市 <> '北京市'
group by 城市
having sum(金额) >= 25000

结果如下:
image.png

五、排序函数

order by
order by 放于语句的结尾,可以使查询结果按照指定的列进行排序;ASC 为升序,DESC 为降序,放于指定列后面。
当出现多个指定排序的字段时,排序优先级为从左依次往右
如例表中,想看各月份的销售金额,并按总销售额的降序进行排列,语句如下


  SELECT 月,SUM(销售额) 金额,SUM(销量) 数量
  FROM 销售表
    GROUP BY 月
    ORDER BY SUM(销售额) DESC

结果如下:
image.png

六、常见问题及错误案例演示