您的位置:首页 > 数据库

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: