在数据库的选择操作SELECT
中经常会用到聚合条件,最常见也是最常用的是WHERE
语句,故本文不会着重介绍WHERE语句。
现假设在某数据库中有一个名为PRODUCT
的表,表结构及内部数据如下
1
2
3
4
5
| CREATE TABLE PRODUCT(
Pno CHAR(20) PRIMARY KEY,
Pname CHAR(10),
Pamount INT
);
|
1
2
3
4
5
6
7
8
9
| +-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 001 | a | 1 |
| 002 | a | 2 |
| 003 | b | 1 |
| 004 | b | 2 |
| 005 | b | 6 |
+-----+-------+---------+
|
ORDER BY#
这一语句主要是显示排序用,如果选择了多条类似的记录,那么在查询语句中便可用到此语句,使用如下
SELECT * FROM PRODUCT ORDER BY Pno ASC;
上面的语句根据Pno
的值来对产品记录进行升序排列(仅当次查询有效),即根据ORDER BY
后跟的列名进行升序排列。
1
2
3
4
5
6
7
8
9
10
11
| 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
即可。
1
2
3
4
5
6
7
8
9
10
11
| 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)
|
§ 当排序列含空值时,排序列为空值的原组最后显示。
GROUP BY#
这一语句主要是作分类汇总,如需要相同名称记录的合计库存量,在查询语句中可用到GROUP BY
如下
SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname;
结果如下
1
2
3
4
5
6
7
8
| mysql> SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname;
+-------+--------------+
| Pname | SUM(Pamount) |
+-------+--------------+
| a | 3 |
| b | 9 |
+-------+--------------+
2 rows in set (0.00 sec)
|
HAVING#
HAVING
可以作为WHERE
的拓展,因为在WHERE
中不可用到聚合函数,而在HAVING
中可以使用聚合函数。
如需了解总量大于5
的相同名称记录的合计库存量,则可用到HAVING
使用如下
1
| SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname HAVING SUM(Pamount)>5;
|
结果如下
1
2
3
4
5
6
7
| 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
的看法及见解,如有误,感谢各位的指证