SQL基础入门学习(3)
2017-09-04 20:16
162 查看
/* 对表进行分组 GROUP BY 1、只能写在SELECT子句之中。 2、GROUP BY子句中不能使用SELECT子句列的别名 3、GROUP BY子句的聚合结果是无序的 4、WHERE子句中不能使用聚合函数 */ 根据商品种类统计数据行数 SELECT product_type,COUNT(*) FROM product GROUP BY product_type; 书写顺序(暂定):SELECT ——> FROM ——> WHERE ——> GROUP BY /* 在GROUP BY子句中指定的列称为聚合键或分组列。 */ 聚合键中包含NULL的情况。在聚合键中包含NULL时,在结果中会以"不确定"行(空行)的形式表现出来。 SELECT purchase_price,COUNT(*) FROM product GROUP BY purchase_price; /* GROUP BY 和 WHERE 并用时,执行顺序如下: FROM ——> WHERE ——> GROUP BY ——> SELECT */ SELECT product_name,purchase_price,COUNT(*) FROM product WHERE product_type = '衣服' GROUP BY purchase_price; /* 为聚合结果指定条件 1、使用COUNT函数等对表中数据进行聚合操作时,为其指定条件的不是WHERE子句,而需要使用HAVING子句。 2、聚合函数可以在SELECT子句、HAVING子句和ORDER BY子句中使用。 3、HAVING子句要写在GROUP BY子句之后。 4、WHERE子句用来指定数据行的条件,HAVING子句用来指定分组的条件。 */ SELECT * FROM product; SELECT product_type,COUNT(*) FROM product GROUP BY product_type HAVING product_type <> '衣服'; SELECT product_type,COUNT(*) FROM product GROUP BY product_type HAVING COUNT(*) = 2; SELECT product_type,COUNT(*),SUM(sale_price),AVG(sale_price) FROM product GROUP BY product_type HAVING AVG(sale_price) >= 2500; /* product_name列并不包含在GROUP BY子句之中,因此不允许写在HAVING子句里。 */ SELECT product_type,COUNT(*) FROM product GROUP BY product_type HAVING product_name='菜刀' /* WHERE子句 = 指定行所对应的条件 HAVING子句 = 指定组所对应的条件 聚合键所对应的条件不应该书写在HAVING子句当中,而应该书写在WHERE子句当中。 */ SELECT product_type,COUNT(*) FROM product GROUP BY product_type HAVING product_type = '衣服'; SELECT product_type,COUNT(*) FROM product WHERE product_type='衣服' GROUP BY product_type; /* 对查询结果进行排序: 1、使用ORDER BY子句对查询进行排序 2、在ORDER BY子句中列名的后面使用关键字ASC可以进行升序排序,使用DESC关键字可以进行降序排序。 3、ORDER BY子句中可以指定多个排序键。 4、排序键中包含NULL时,会在开头或末尾进行汇总。 5、ORDER BY子句中可以使用SELECT子句中定义的列的别名。 6、ORDER BY子句中可以使用SELECT子句中未出现的列或聚合函数。 7、ORDER BY子句中不能使用列的编号。 */ /* 不论何种情况,ORDER BY 子句都需要写在SELECT语句的末尾。这是因为 对数据行进行排序的操作必须在结果即将返回时执行。ORDER BY子句中 书写的列名称为排序键。该子句与其他子句执行的顺序关系如下所示。 使用HAVING子句时SELECT语句的顺序: 1.SELECT子句 ——>2.FROM子句 ——>3.WHERE子句 ——>4.GROUP BY子句 ——> 5.HAVING子句 ——>6.ORDER BY子句 ORDER BY子句通常写在SELECT语句的末尾。 由于ASC和DESC这两个关键字是以列为单位指定的,所以可以同时指定一个列 为升序,指定其他列为降序。 */ SELECT * FROM product ORDER BY product_id;-- ASC 默认升序 SELECT * FROM product ORDER BY product_id DESC;-- 降序 SELECT product_id,product_name,product_type,sale_price,purchase_price,regist_date FROM product ORDER BY sale_price,product_id; /* 使用含有NULL的列作为排序键时,NULL会在结果的开头或末尾汇总显示。 */ SELECT * FROM product ORDER BY purchase_price ASC; /* 注意:在排序键中可以使用显示用别名 在GROUP BY子句中不能使用SELECT子句中定义的别名。但是在ORDER BY子句中却是 允许使用别名的。 使用HAVING子句时SELECT语句的顺序: FROM——>WHERE——>GROUP BY——>HAVING——>SELECT——>ORDER BY 这只是一个粗略的总结,虽然具体的执行顺序根据DBMS的不同而不同,但是大家有这样一个大致 的印象就可以了。一定要记住SELECT子句的执行顺序在GROUP BY子句之后,ORDER BY子句之前。 因此,在执行GROUP BY子句时,SELECT语句中定义的别名无法被识别。对于在SELECT 子句之后执行的ORDER BY子句来说,就没有这样的问题了。 */ SELECT product_id AS id,product_name,product_type,sale_price AS price,purchase_price FROM product ORDER BY price,id; /* 在ORDER BY子句中可以使用SELECT子句中未使用的列和聚合函数。 */ SELECT product_name,product_type,sale_price FROM product ORDER BY product_id; SELECT product_type,COUNT(*) FROM product GROUP BY product_type ORDER BY COUNT(*); 练习2 SELECT product_type,SUM(sale_price),SUM(purchase_price) FROM product GROUP BY product_type HAVING SUM(sale_price) > SUM(purchase_price)*1.5; 练习3 SELECT * FROM product ORDER BY regist_date DESC,product_id;
相关文章推荐
- java 从零开始,学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- java 从零开始,学习笔记之基础入门<SQL_Server>(二十一)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server>(二十一)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- SQL基础入门学习(1)
- SQL基础入门学习(2)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- java 从零开始,学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- Scala基础学习入门
- Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐
- JavaSE入门学习41:文件传输基础之二进制基础
- 基础知识04 - 零基础入门学习汇编语言04
- 意识流php入门基础学习笔记
- Python学习入门基础教程(learning Python)--2.3.1 Python传参函数设计
- 零基础入门学习Python(9)--了不起的分支和循环3
- Python学习入门基础教程(learning Python)--3.3.2 Python的关系运算
- salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解
- Linux基础入门(六) --学习笔记-正则表达式
- 浅谈Delphi过程与函数03 - 零基础入门学习Delphi22
- Socket.IO学习之基础入门