SUM() 某列值之和
还支持一些标准偏差聚集函数,这里不涉及。
SELECT AVG(PROD_PRICE) AS avg_price FROMproducts;
+-----------+
| avg_price |
+-----------+
| 16.133571 |
+-----------+
1 row in set (0.03 sec)
12.聚集不同的值
SELECT AVG(DISTINCT prod_price) AS avg_priceFROM products WHERE vend_id = 1003;
+-----------+
| avg_price |
+-----------+
| 15.998000 |
+-----------+
1 row in set (0.03 sec)
可以看到,在使用了DISTINCT后,此例子中的avg_price比较高,因为有多个物品具有相同的较低价格。
12.3组合聚集函数:
SELECT AVG(prod_price) ASavg_price,MIN(prod_price) AS price_min FROM products WHERE vend_id = 1003;
13.分组数据
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
13.1创建分组
mysql> SELECT vend_id,COUNT(*) ASnum_prods FROM products GROUP BY vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
4 rows in set (0.05 sec)
GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果进行聚集。
使用GROUP BY的重要规则:
1) 可以包含任意数目的列,可以嵌套分组
2) 除聚集语句外,SELECT语句中的每个列都必须在GROUPBY子句中给出
3) 如果分组中有NULL值,则将NULL作为一个分组
4) GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
13.2过滤分组
HAVING支持所有WHERE操作符。
mysql> SELECT cust_id,COUNT(*) AS ordersFROM orders GROUP BY cust_id HAVING COU
NT(*) >= 2;
+---------+--------+
| cust_id | orders |
+---------+--------+
| 10001 | 2 |
+---------+--------+
1 row in set (0.00 sec)
这里的最后一行它过滤COUNT(*)>=2(两个以上的订单)的那些分组。
HAVING和WHERE的区别:WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
13.3分组和排序
SELECT order_num,SUM(quantity*item_price) AS ordertotal FROMorderitems GROUP BY order_num HAVING SUM(quantity*item_price)>=50;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20005 | 149.87 |
| 20006 | 55.00 |
| 20007 | 1000.00 |
| 20008 | 125.00 |
+-----------+------------+
4 rows in set (0.00 sec)
13.4 SELECT子句的顺序
SELECT->FROM->WHERE->GROUP BY->HAVING->ORDERBY->LIMIT
14 使用子查询
14.1利用子查询进行过滤
SELECT cust_name,cust_contact FROM customers WHERE cust_id IN(SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROMorderitems WHERE prod
_id = 'TNT2'));
+----------------+--------------+
| cust_name |cust_contact |
+----------------+--------------+
| Coyote Inc. | Y Lee |
| Yosemite Place | Y Sam |
+----------------+--------------+
2 rows in set (0.11 sec)
虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。
14.2作为计算字段使用子查询
SELECT cust_name,cust_state,(SELECT COUNT(*) FROM orders WHEREorders.cust_id = customers.cust_id) AS orders FROM customers ORDER BYcust_name;
+----------------+------------+--------+
| cust_name | cust_state| orders |
+----------------+------------+--------+
| Coyote Inc. | MI | 2 |
| E Fudd | IL | 1 |
| Mouse House | OH | 0 |
| Wascals | IN | 1 |
| Yosemite Place | AZ | 1 |
+----------------+------------+--------+
5 rows in set (0.00 sec)
这条select语句对customers表中每个客户返回3列:cust_name,cust_state和orders.orders是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个客户执行一次。在此例子中,该子查询执行了5次,因为检索除了5个客户。
==参考MySQL必知必会