好久没有更新了,因为一直在实习,然后前段时间有个读者给我发信息要资料,因为超过了时间,我不能回复,希望这位读者看到了,能在后台再发一遍


SQL学习笔记【4】_javaSQL学习笔记【4】_java_02

往期推荐

SQL学习笔记【1】
SQL学习笔记【2】
SQL学习笔记【3】


之前的推送中介绍了一些基本知识,下面再补充一些内容:

关键字和函数名称全部大写

数据库名,表名,字段名称全部小写

SQL语句必须以分号结尾


SQL语句中的关键字的书写顺序

SQL学习笔记【4】_java_03

SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY


SQL语句中的关键字的执行顺序

SQL学习笔记【4】_java_04

FROM>WHERE>GROUP BY>HAVING>SELECT的字段>DISTINCT>ORDER BY>LIMIT


本文主要介绍如何分组数据,以便汇总表内容的子集


创建分组


分组是使用SELECT语句的GROUP BY子句建立的:


GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集聚集


products表

SQL学习笔记【4】_java_05



输入:




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;

输出:

SQL学习笔记【4】_java_06


其中,这条语句的前三行类似于上面的例子,所以就不多说明了。


最后一行的HAVING,它过滤(两个以上订单)的那些分组。


WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。


例如:

输入:






SELECT vend_id,COUNT(*) AS num_prodsFROM productsWHERE prod_price>=4GROUP BY vend_idHAVING COUNT(*) >=2;

输出:

SQL学习笔记【4】_java_07

其中,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;

输出:

SQL学习笔记【4】_java_08


其中,GROUP BY按订单号(order_num列)分组数据,使用COUNT(*)函数返回每个订单中的物品数目,HAVING子句过滤数据,返回包含三个及以上物品的订单,最后用ORDER BY子句排序输出。