在数据库的选择操作SELECT中经常会用到聚合条件,最常见也是最常用的是WHERE语句(本文不会着重介绍WHERE语句)。
现假设在某数据库中有一个名为PRODUCT的表,表结构及内部数据如下
CREATE TABLE PRODUCT(
Pno CHAR(20) PRIMARY KEY,
Pname CHAR(10),
Pamount INT
);
+-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 001 | a | 1 |
| 002 | a | 2 |
| 003 | b | 1 |
| 004 | b | 2 |
| 005 | b | 6 |
+-----+-------+---------+
1.ORDER BY
这一语句主要是显示排序用,如果选择了多条类似的记录,那么在查询语句中便可用到此语句,使用如下
SELECT * FROM PRODUCT ORDER BY Pno ASC;
上面的语句根据Pno的值来对产品记录进行升序排列(仅当次查询有效),即根据ORDER BY后跟的列名进行升序排列。
mysql> SELECT * FROM PRODUCT ORDER BY Pno ASC;
+-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 001 | a | 1 |
| 002 | a | 2 |
| 003 | b | 1 |
| 004 | b | 2 |
| 005 | b | 6 |
+-----+-------+---------+
5 rows in set (0.00 sec)
如果需要降序排列,只需把最后的ASC更换为DESC即可。
mysql> SELECT * FROM PRODUCT ORDER BY Pno DESC;
+-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 005 | b | 6 |
| 004 | b | 2 |
| 003 | b | 1 |
| 002 | a | 2 |
| 001 | a | 1 |
+-----+-------+---------+
5 rows in set (0.00 sec)
§ 当排序列含空值时,排序列为空值的原组最后显示。
2.GROUP BY
这一语句主要是作分类汇总,如需要相同名称记录的合计库存量,在查询语句中可用到GROUP BY如下
SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname;
结果如下
mysql> SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname;
+-------+--------------+
| Pname | SUM(Pamount) |
+-------+--------------+
| a | 3 |
| b | 9 |
+-------+--------------+
2 rows in set (0.00 sec)
3.HAVING
HAVING可以作为WHERE的拓展,因为在WHERE中不可用到聚合函数,而在HAVING中可以使用聚合函数。
如需了解总量大于5的相同名称记录的合计库存量,则可用到HAVING使用如下
SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname HAVING SUM(Pamount)>5;
结果如下
mysql> SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname HAVING SUM(Pamount)>5;
+-------+--------------+
| Pname | SUM(Pamount) |
+-------+--------------+
| b | 9 |
+-------+--------------+
1 row in set (0.00 sec)
HAVING与WHERE作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 在分组和聚合运算之前选取输入行(因此,它控制进入聚合运算的记录), 而 HAVING 在分组和聚合之后选取分组的行。因此,WHERE 子句不能包含聚合函数;因为试图用聚合函数判断那些行输入做聚合运算是没有意义的。 相反,HAVING 子句总是包含聚合函数。
以上纯属个人对于选择操作中的ORDER BY、GROUP BY以及HAVING的看法及见解,如有误,感谢各位的指证