sql查询值按条件去重_SQL简单查询

a110436d35412dff8a8d0519d7888a53.png

我们使用SQL的主要目的,还是为了查询,也就是从表中取出我们想要的数据。因此,查询语句的使用是重中之重,也是学习SQL的重点。

1 运算符

选取null记录

什么是null值呢?就是缺失的值,也就是表中缺失的数据。比如我们往表格中插入数据时,可能会发生遗漏,可以用下面的语句来查询缺失数据:

where 列名 is null;

注意这里不能写为 = null ,如果要查询非缺失数据,使用下列语句:

where 列名 is not null;

表示否定

可以用<>或者!=来表示不等的条件,除此之外,还有not运算符,使用范围更广。举个例子,登录数据库shell,现在我们要从cargo表中选出销售价格大于10000的商品:

07b3c615107d28c5179b926000fc9f33.png

如果我们又想选择售价小于10000的商品,可以用not运算符:

cca44d0113f01492db9ed0541c0505a4.png

这个查询条件跟我们使用where sale_price < 10000 语句是等价的。

除此之外,还有+、-、*、/、and、or等运算符,由于比较简单易懂,就不一一介绍了。

2 聚合

聚合函数

什么是聚合函数?简单的说,就是需要把数据合起来计算而产生的一系列函数,常用的有以下几个:

count:计算表中的行数

sum:计算数据的合计值(列)

avg:计算数据的平均值(列)

max:计算数据的最大值(列)

min:计算数据的最小值(列)

我们来看几个例子,首先是count计算行数:

03daeb814c9bbf0858e79bede6174169.png

当count后跟列名时,会返回列中非null值的行;若以count(*)(*号代表所有列)进行查找,则会返回所有行,包括null值所在的行。

再来看看合计值sum:

c48b8f2fef118e50b3fe6ce532944f58.png

这里我们选取了售价和成本两列,进行求和操作。在计算过程中,自动忽略null值,只进行非null值的计算。

均值avg:

824d6bbd1c55eeb6b5ef3bbc8e5ab2c3.png

最大值和最小值:

626ec8777e6b7ef0c0b0a71ca21c205e.png

计算商品的种类:

我们经常会计算品类的数量,这是可在count函数中嵌套一个distinct关键字即可。

77a3d888536f95961aa67a722ddfc9e5.png

如上图,我们在去除重复类型和未去重之间进行对比。其他的任何聚合函数都可以使用distinct来达到去重的效果。

group by子句

group by,顾名思义,就是按表的一列或各列进行分组,也可以看成对数据进行排序后的行切割。举个例子,我们想要知道cargo表中商品所有类型的数量,思路是先将商品按类型分组,再对各个组进行count计数。对应语句如下:

12764db7f2c91d067a133186729d0f76.png

如果group by后的列有null值,也会参与分组,并且会显示出null值的数量。

现在我们又想知道在电脑类别下,不同价位的机器有多少个,可以插入where子句进行过滤:

0c882b11468bd9bd74f2bcaa79abf099.png

如图,当有where子句出现时,会先进行过滤,然后对过滤后的数据进行分组。

在使用group by子句时,有几点需要注意:

  1. 在select子句中只可以写常数、聚合函数以及group by后指定的聚合列。但我们看到上图中也有type列,是的,只有MySQL是支持这种写法的。其他的RDBMS并不支持。
  2. group by子句中不可以写列的别名,原因跟SQL语句的执行顺序有关。我们的书写顺序是select→from→where→group by,但执行顺序却是from→where→group by→select,因为group by先于select执行,所以你使用别名时,系统并不会识别,自然会报错。
  3. group by聚合后的结果是无序的。
  4. where子句中只可以使用条件表达式,不能使用聚合函数。事实上,只有select子句和后面马上要说的having子句可以使用聚合函数。
  5. 在使用group by聚合列时,若select子句中没有使用聚合函数,其效果相当于对该列进行去重(distinct)。但一般并不建议这么做,会加大理解难度。

having子句

having子句,只能对分组后的结果进行过滤。其作用类似where子句,但只能用在group by之后。若没有写group by,则不可以使用having。

现在我们要从cargo表中找出商品类型个数恰好为2的商品:

dd3f39035ec8abca15eec0a4e28cff89.png

如果去掉having子句:

af834ff624cef9f3a1c6b85f7ef89257.png

通过对比可以看到,having子句的用法和where是类似的,都是在后面跟一个条件表达式,是对分组之后的结果进行一些条件限制。

最后,having子句也是只可以写常数、聚合函数以及group by中的列名。

3 排序

我们经常会遇到排序的问题,先来看下我们的cargo表:

7419e190a04b9bd31339b34fa5d3df2a.png

现在想让表格按sale_price列,也就是售价,进行从小到大的排列。可以使用order by子句:

48fc6a27243e9cd1ad69668b0d6091b7.png

如上图,可以看到order by默认升序排列,关键字是asc(意为ascend);如果我们想要降序排列,可以在后面加上desc(意为descend)关键字:

51cfbbc380945109598ed360e2c937fb.png

特别要注意的是,order by子句中可以使用列的别名,原因是select子句的执行顺序在order by之前。

至此为止,基本的SQL语句就是这些了。特别要关注的是,SQL语句的书写顺序和执行顺序是不一样的。我们先来看书写顺序:

select→from→where→group by→having→order by

而执行顺序却是这样的:

from→where→group by→having→select→order by

排序操作永远是在最后才完成的,牢记这两个顺序可以理解之前各个子句的书写规则。

这一篇到此结束,下一篇就要开始对SQL的高级查询了,敬请期待。


更多干货内容,欢迎关注今日头条账号“人人都会机器学习”;你也可以搜索知识星球“自学机器学习”,里面也有精彩内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值