好久没有更新了,因为一直在实习,然后前段时间有个读者给我发信息要资料,因为超过了时间,我不能回复,希望这位读者看到了,能在后台再发一遍
往期推荐
SQL学习笔记【1】
SQL学习笔记【2】
SQL学习笔记【3】
之前的推送中介绍了一些基本知识,下面再补充一些内容:
关键字和函数名称全部大写
数据库名,表名,字段名称全部小写
SQL语句必须以分号结尾
SQL语句中的关键字的书写顺序
SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY
SQL语句中的关键字的执行顺序
FROM>WHERE>GROUP BY>HAVING>SELECT的字段>DISTINCT>ORDER BY>LIMIT
本文主要介绍如何分组数据,以便汇总表内容的子集
创建分组
分组是使用SELECT语句的GROUP BY子句建立的:
GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集聚集
products表
输入:
SELECT vend_id,COUNT(*) AS num_prodsFROM productsGROUP BY vend_id;
输出:
其中:
函数COUNT(*)返回表中的记录数,GROUP BY子句指示DBMS按vend_id而不是整个表计算num_prods一次。从输出看出,供应商BRS01有3个产品,供应商DLL01有4个产品,供应商FNG01有2个产品。
过滤分组
过滤分组可以规定,包括哪些分组,排除哪些分组。以前学过的WHERE过滤指定的是行而不是分组,WHERE没有分组的概念。
WHERE过滤行,HAVING过滤分组。
输入:
SELECT cust_id,COUNT(*) AS ordersFROM ordersGROUP BY cust_idHAVING COUNT(*) >=2;
输出:
其中,这条语句的前三行类似于上面的例子,所以就不多说明了。
最后一行的HAVING,它过滤(两个以上订单)的那些分组。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
例如:
输入:
SELECT vend_id,COUNT(*) AS num_prodsFROM productsWHERE prod_price>=4GROUP BY vend_idHAVING COUNT(*) >=2;
输出:
其中,WHERE子句过滤所有prod_price至少为4的行,然后按vend_id分组数据,HAVING过滤计数为2或2以上的分组。
总之,HAVING与WHERE非常类似,使用HAVING应该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。
分组和排序
一般在使用GROUP BY子句时,应该也给出ORDER BY子句,这是保证数据正确排序的唯一方法。
输入:
SELECT order_num,COUNT(*) AS itemsFROM orderitemsGROUP BY order_numHAVING COUNT(*) >=3ORDER BY items,order_num;
输出:
其中,GROUP BY按订单号(order_num列)分组数据,使用COUNT(*)函数返回每个订单中的物品数目,HAVING子句过滤数据,返回包含三个及以上物品的订单,最后用ORDER BY子句排序输出。