我们使用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子句时,有几点需要注意:
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的高级查询了,敬请期待。 |
|