创建分组
mysql> select vend_id,
-> count(*) as num_prods
-> from Products
-> group by vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| BRS01 | 3 |
| DLL01 | 4 |
| FNG01 | 2 |
+---------+-----------+
3 rows in set (0.00 sec)
mysql> select vend_id, count(*) as num_prods from Products;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| BRS01 | 9 |
+---------+-----------+
1 row in set (0.00 sec)
mysql> select *
-> from Products;
+---------+---------+---------------------+------------+-----------------------------------------------------------------------+
| prod_id | vend_id | prod_name | prod_price | prod_desc |
+---------+---------+---------------------+------------+-----------------------------------------------------------------------+
| BR01 | BRS01 | 8 inch teddy bear | 5.99 | 8 inch teddy bear, comes with cap and jacket |
| BR02 | BRS01 | 12 inch teddy bear | 8.99 | 12 inch teddy bear, comes with cap and jacket |
| BR03 | BRS01 | 18 inch teddy bear | 11.99 | 18 inch teddy bear, comes with cap and jacket |
| BNBG01 | DLL01 | Fish bean bag toy | 3.49 | Fish bean bag toy, complete with bean bag worms with which to feed it |
| BNBG02 | DLL01 | Bird bean bag toy | 3.49 | Bird bean bag toy, eggs are not included |
| BNBG03 | DLL01 | Rabbit bean bag toy | 3.49 | Rabbit bean bag toy, comes with bean bag carrots |
| RGAN01 | DLL01 | Raggedy Ann | 4.99 | 18 inch Raggedy Ann doll |
| RYL01 | FNG01 | King doll | 9.49 | 12 inch king doll with royal garments and crown |
| RYL02 | FNG01 | Queen doll | 9.49 | 12 inch queen doll with royal garments and crown |
+---------+---------+---------------------+------------+-----------------------------------------------------------------------+
9 rows in set (0.00 sec)
group by 在WHERE 之后 在ORDER BY 之前。WHERE 没有分组的概念,用having过滤分组。
mysql> select cust_id, count(*) as orders
-> from Orders
-> group by cust_id
-> having count(*) >= 2;
+------------+--------+
| cust_id | orders |
+------------+--------+
| 1000000001 | 2 |
+------------+--------+
1 row in set (0.01 sec)
mysql> select vend_id,count(*) as num_prod
-> from Products
-> where prod_price>=4
-> group by vend_id
-> having count(*) >=2;
+---------+----------+
| vend_id | num_prod |
+---------+----------+
| BRS01 | 3 |
| FNG01 | 2 |
+---------+----------+
SELECT 子句的使用顺序
最近在学习数据库的相关知识,想和大家分享一下学习后的相关笔记。
当SELECT语句被DBMS执行时,其子句会按照固定的先后顺序执行:
顺序序号 | 子句关键词 | 子句功能 |
---|---|---|
1. | FROM: | 对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。 |
2. | ON: | 对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。 |
3. | OUTER(JOIN): | 如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。 |
4. | WHERE | 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。 |
5. | GROUP BY: | 按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。 |
6. | CUBE ROLLUP: | 把超组插入VT5,生成VT6。 |
7. | HAVING: | 对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。 |
8. | SELECT: | 处理SELECT列表,产生VT8。 |
9. | DISTINCT: | 将重复的行从VT8中移除,产生VT9。 |
10. | ORDER BY: | 将VT9中的行按ORDER BY子句中的列列表排序,生成一个有序表(VC10)。 |
11. | TOP: | 从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。 |
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
常用子句使用顺序:
顺序序号 | 子句关键词 | 子句功能 |
---|---|---|
1 | SELECT | 从指定表中取出指定列的数据 |
2 | FROM | 指定要查询操作的表 |
3 | WHERE | 用来规定一种选择查询的标准 |
4 | GROUP BY | 对结果集进行分组,常与聚合函数一起使用 |
5 | HAVING | 返回选取的结果集中行的数目 |
6 | ORDER BY | 指定分组的搜寻条件 |