我们使用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子句时,有几点需要注意:
-
在select子句中只可以写常数、聚合函数以及group by后指定的聚合列。但我们看到上图中也有type列,是的,只有MySQL是支持这种写法的。其他的RDBMS并不支持。
-
group by子句中不可以写列的别名,原因跟SQL语句的执行顺序有关。我们的书写顺序是select→from→where→group by,但执行顺序却是from→where→group by→select,因为group by先于select执行,所以你使用别名时,系统并不会识别,自然会报错。
-
group by聚合后的结果是无序的。
-
where子句中只可以使用条件表达式,不能使用聚合函数。事实上,只有select子句和后面马上要说的having子句可以使用聚合函数。
-
在使用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的高级查询了,敬请期待。