逻辑运算符
NOT运算符
not运算符可以表示否定的意思,而且它不能单独使用,一般是搭配其他查询条件来一起使用,如下图:
其中的“not product_price>=200”等价于“product_price<200”,这是因为not代表否定的意思,所以导致语句的意思发生改变。
AND运算符和OR运算符
到目前为止我们讲的SQL语句都是只有一个查询条件,但是实际运用中我们往往是同时指定多个查询条件对数据进行查询的,所以就有了AND运算符和OR运算符来满足查询的需求。
在where子句中使用AND运算符或OR运算符,可以对多个查询条件进行组合。
- AND运算符在其两侧的查询条件都成立时,整个查询条件才成立,相当于“并且”;
- OR运算符在其两侧的查询条件有一个成立时,整个查询条件都成立,相当于“或者”。
例:
AND运算符的使用:
OR运算符的使用:
注意:AND运算符的优先级高于OR运算符。
通过括号改变优先级顺序
上面我们提到AND运算符的优先级高于OR运算符,但是,我们可以使用括号()来改变优先级的顺序,如下:
含有NULL时的真值
在SQL中逻辑表达式的可能值包括真(TRUE)、假(FALSE)和不确定(UNKNOWN),这是SQL中特有的情况,所以SQL中的逻辑运算也被称作三值运算。
所以,之前当我们在使用“product_price>100”语句检索时,会检索不到价格为NULL的商品,因为他们对于该语句既不是真,也不是假,而是处于不确定的状态,所以NULL只能使用IS NULL运算符或IS NOT NULL运算符来检索。
聚合函数
通过SQL对数据进行某种操作或计算时需要使用函数。
常用函数:
名称 | 作用 |
COUNT | 计算表中的记录数(全部数据的行数) |
SUM | 计算表中数值列中数据的合计值 |
AVG | 计算表中数据列中数据的平均值 |
MAX | 求出表中任意列中数据的最大值 |
MIN | 求出表中任意列中数据的最小值 |
如上所示,用于汇总的函数我们称为聚合函数或者聚集函数,所谓聚合,就是将多行汇总为一行。
COUNT函数
使用count函数计算全部数据的行数
例:
“count”后面的括号内输入的“”是参数,输出值“15”称为返回值。我们前面讲到过“”代表全部列的意思。
计算NULL之外的数据的行数
例:
这次得出来得值和我们上面的明显不一样,少了价格为NULL的那两行,也就是说如果想要得到某一列中非空行数的话,将对象列设定为参数即可实现。
由此,我们需要注意,对于COUNT函数来说,参数列不同计算的结果也会发生变化。
COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数,也就是说,在COUNT函数中我们使用“ * ”作为参数和使用某一列作为参数的结果可能是不一样的,如:有一表全空且只有一列,使用“ * ”时,还是该表有多少行就显示多少行,而使用该列的名称作为参数时,只会显示0行,因为该列全空。
注意:除了COUNT函数外,其他函数都不能将星号(*)作为参数。
聚合函数会将NULL排除在外,但COUNT(*)例外,并不会排除NULL。
SUM函数
计算合计值
例:
上面我们计算出了所有价格不为NULL的价格的和。
计算date型数据的和(调皮)
得出的数值很怪,为“303007779”,它的计算挺特别的,大致如下:
先给大家看看数据,
1.日的和
因为超过两位数,所以往前进二。2.月份的和
因为月份和没有超过两位数,所以不用向前进一。3.先计算出年份的和
这样,就得出了303007779这个拼凑起来的数字,其实该数字变为“30300-77-79”这个形式更容易理解(虽然这个日期的格式并不对…)
我们可以看到,其实计算这个date型数据的和是没有太大的意义的…
AVG函数
例:计算平均值
我们由上结果可以看到AVG函数也是先排除NULL来计算平均值的。例:计算date类型平均值
计算方法参考上面“计算date型数据的和”。
MAX函数和MIN函数
例:
我们使用这两个函数取得了价格的最大值和最小值。例:日期的最大值和最小值
使用聚合函数删除重复值(关键字DISTINCT)
例:计算商品种类
在使用COUNT函数之前,我们先使用了DISTINCT关键字将“product_type”中的重复数据给删除了,所以COUNT函数得以计算出商品的种类。当然,DISTINCT关键字也适用于其他聚合函数,如下图:
使用GROUP BY子句对表进行分组
GROUP BY子句
GROUP BY子句可以将表中的列进行分组,在GROUP BY子句中指定的列称为聚合键或者分组列。
GROUP BY子句的语法结构如下:
select <列名1>,<列名2>,<列名3>...
from <表名>
group by <列名1>,<列名2>,<列名3>...;
注意:select中的列要和下面group by子句中的列对应上,否则会出现错误。
例:
从上图来看,GROUP BY子句的作用好像跟DISTINCT关键字类似,
但是GROUP BY子句的用法却是跟DISTINCT关键字不同,如下:
我们可以看到GROUP BY子句指定列后可以跟COUNT函数结合使用。
而图二的对价格的检索中我们可以看到,当聚合键中包含NULL时,也会将NULL作为一组特定的数据。
注:GROUP BY子句的书写顺序必须写在FROM语句之后(如果有WHERE子句的话需要写在WHERE子句之后)。
使用WHERE子句时GROUP BY的执行结果
在使用了GROUP BY子句的SELECT语句中,也可以正常使用WHERE子句,此时会先根据WHERE子句指定的条件进行过滤,然后再进行汇总处理。
例:
上例子中,WHERE子句先进行了过滤,将类型为“生活用品”的商品挑选出来,然后GROUP BY子句再针对挑选出来的商品进行分组。
执行顺序如下:
FROM→WHERE→GROUP BY→SELECT
与聚合函数和GROUP BY子句有关的相关错误
1.在SELECT子句中书写了多余的列
在使用聚合函数时,SELECT子句中的元素有严格的限制,此时SELECT子句中只能存在以下三种元素:
- 常数
- 聚合函数
- GROUP BY子句中指定的列名(也就是聚合键)
这里常出现的错误就是把聚合键之外的列名书写在SELECT子句之中,这点我们在前面也提到过,使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列名。
如下图:
SELECT语句中多“product_price”这一不在聚合键内的列,导致出现了错误。
2.GROUP BY子句的结果是排序的吗
答案是:
不是,GROUP BY子句结果的显示是无序的,如果想要按照某种特定顺序进行排序的话,需要在SELECT语句中进行指定。
3.在WHERE子句中使用聚合函数
where子句中不能使用聚合函数,否则会报错,如下图:
事实上,只有SELECT子句、HAVING子句和ORDER BY子句中能够使用COUNT等聚合函数。