分享

SQL简单查询

 L罗乐 2019-03-03

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

1 运算符


选取null记录

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

where 列名 is null;

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

where 列名 is not null;

表示否定

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

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

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

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

2 聚合


聚合函数

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

count:计算表中的行数

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

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

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

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

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

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

再来看看合计值sum:

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

均值avg:

最大值和最小值:

计算商品的种类:

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

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

group by子句

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

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

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

如图,当有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的商品:

如果去掉having子句:

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

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

3 排序


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

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

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

特别要注意的是,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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多