AND和OR:
AND:表示两个条件都达成。
OR:表示两个条件其一达成。
AND和OR可以任意组合,但要注意,数据库会先执行AND再计算OR,就像先乘除后加减一样。
例子:
SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR vend_id=1003 AND prod_price>=10;
该语句查出的是,vend_id=1002或者vend_id=1003且prod_price>=10的数据,即等同于:
SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR (vend_id=1003 AND prod_price>=10);
解决方法:加入(),标明执行顺序,防止因为执行顺序错误而导致数据出错。
ORDER BY:
ORDER BY用于排序,当用于多条件排序时,即对多列进行排序时,是根据写的顺序进行依次排序的。
例子:
SELECT prod_id,prod_name,prod_price FROM products ORDER BY prod_price,prod_name;
该语句的排序是,先根据prod_price进行排序,如果有prod_price相同,才使用其prod_name进行排序。也就是说,如果该表中不存在具有相同prod_price值的数据,呢么加不加prod_name的结果是一样的。
ASC(默认):升序
DESC:降序
两个关键字只作用于直接位于它前面的列名。
例子:
SELECT prod_id,prod_name,prod_price FROM products ORDER BY prod_price DESC,prod_name;
该语句的排序是,先根据prod_price进行降序排序,如果有prod_price相同,才使用其prod_name进行升序排序。即DESC只对
prod_price 有作用,prod_name依旧是默认的升序。
若要使多个列都按降序排序,则需要每个列后都加DESC。
SELECT prod_id,prod_name,prod_price FROM products ORDER BY prod_price DESC,prod_name DESC;
SUM,AVG等:
当数据是分组的时候,即GROUP BY 的时候,其值是计算整个组的值,当数据是通过窗口函数分窗口的时候,其值是逐条计算出来的。
例如对一个组内有10条数据的使用SUM,呢么10条数据的SUM值都是一样的,即全部加起来,而分组使用SUM,第一条的结果等于它本身,第二条等于第一条加第二条,第三条等于第一条加第二条加第三条,依此类推,最后第十条的结果便是与分组SUM的结果相同。
GROUP BY:
分组语句,可以对数据进行分组计算,即可对每个分组中的数据各自进行平均值等计算
使用 ROLLUP 使用 WITH ROLLUP 关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值,
在具体使用 GROUP BY 子句前,需要知道一些重要的规定。
- GROUP BY 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
- 如果在 GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
- GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在GROUP BY 子句中指定相同的表达式。不能使用别名。
- 除聚集计算语句外, SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
- 如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
- GROUP BY 子句必须出现在 WHERE 子句之后, ORDER BY 子句之前。
having与where的区别:
having:对组进行过滤
where: 对行进行过滤
WHERE 在数据分组前进行过滤, HAVING 在数据分组后进行过滤。这是一个重要的区别, WHERE 排除的行不包括在分组中。这可能会改变计算值,从而影响 HAVING 子句中基于这些值过滤掉的分组。