在数据库的选择操作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)

HAVINGWHERE作用的对象不同。WHERE子句作用于表和视图,HAVING子句作用于组。 WHERE在分组和聚合运算之前选取输入行(因此,它控制进入聚合运算的记录),而HAVING在分组和聚合之后选取分组的行。因此,WHERE子句不能包含聚合函数;因为试图用聚合函数判断那些行输入做聚合运算是没有意义的。 相反,HAVING子句总是包含聚合函数。

以上纯属个人对于选择操作中的ORDER BYGROUP BY以及HAVING的看法及见解,如有误,感谢各位的指证