6.1 GROUP BY子句
Last updated
mysql> desc orders;
+----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| orderNumber | int(11) | NO | PRI | NULL | |
| orderDate | date | NO | | NULL | |
| requiredDate | date | NO | | NULL | |
| shippedDate | date | YES | | NULL | |
| status | varchar(15) | NO | | NULL | |
| comments | text | YES | | NULL | |
| customerNumber | int(11) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+-------+
7 rows in setSELECT
status
FROM
orders
GROUP BY status;+------------+
| status |
+------------+
| Cancelled |
| Disputed |
| In Process |
| On Hold |
| Resolved |
| Shipped |
+------------+SELECT DISTINCT
status
FROM
orders;+------------+
| status |
+------------+
| Shipped |
| Resolved |
| Cancelled |
| On Hold |
| Disputed |
| In Process |
+------------+SELECT
status, COUNT(*) AS total_number
FROM
orders
GROUP BY status;+------------+--------------+
| status | total_number |
+------------+--------------+
| Cancelled | 6 |
| Disputed | 3 |
| In Process | 6 |
| On Hold | 4 |
| Resolved | 4 |
| Shipped | 303 |
+------------+--------------+
6 rows in setSELECT
status, SUM(quantityOrdered * priceEach) AS amount
FROM
orders
INNER JOIN
orderdetails USING (orderNumber)
GROUP BY status;+------------+------------+
| status | amount |
+------------+------------+
| Cancelled | 238854.18 |
| Disputed | 61158.78 |
| In Process | 135271.52 |
| On Hold | 169575.61 |
| Resolved | 134235.88 |
| Shipped | 8865094.64 |
+------------+------------+SELECT
orderNumber,
SUM(quantityOrdered * priceEach) AS total
FROM
orderdetails
GROUP BY orderNumber;+-------------+----------+
| orderNumber | total |
+-------------+----------+
| 10100 | 10223.83 |
| 10101 | 10549.01 |
| 10102 | 5494.78 |
| 10103 | 50218.95 |
| 10104 | 40206.20 |
| 10105 | 53959.21 |
|... ...
|... 这里省略了一大波数据 ...
|... ...
| 10423 | 8597.73 |
| 10424 | 29310.30 |
| 10425 | 41623.44 |
+-------------+----------+
326 rows in setSELECT
YEAR(orderDate) AS year,
SUM(quantityOrdered * priceEach) AS total
FROM
orders
INNER JOIN
orderdetails USING (orderNumber)
WHERE
status = 'Shipped'
GROUP BY YEAR(orderDate);+------+------------+
| year | total |
+------+------------+
| 2013 | 3223095.80 |
| 2014 | 4300602.99 |
| 2015 | 1341395.85 |
+------+------------+SELECT
YEAR(orderDate) AS year,
SUM(quantityOrdered * priceEach) AS total
FROM
orders
INNER JOIN
orderdetails USING (orderNumber)
WHERE
status = 'Shipped'
GROUP BY year
HAVING year > 2013;+------+------------+
| year | total |
+------+------------+
| 2014 | 4300602.99 |
| 2015 | 1341395.85 |
+------+------------+SELECT
YEAR(orderDate) AS year, COUNT(orderNumber)
FROM
orders
GROUP BY year;+------+--------------------+
| year | COUNT(orderNumber) |
+------+--------------------+
| 2013 | 111 |
| 2014 | 151 |
| 2015 | 64 |
+------+--------------------+SELECT
status, COUNT(*)
FROM
orders
GROUP BY status DESC;+------------+----------+
| status | COUNT(*) |
+------------+----------+
| Shipped | 303 |
| Resolved | 4 |
| On Hold | 4 |
| In Process | 6 |
| Disputed | 3 |
| Cancelled | 6 |
+------------+----------+