”明月如霜,好风如水,清景无限 “
上一篇文章Mysql基础-(2)与python的在VScode下连接,快Task02的deadline了,链接如下
本篇是主要介绍基础的查询和排序。当然,文远觉得查询和排序的难点,最后都归结到了一个地方,也就是关键字的执行顺序。
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
壹
没弄清语句执行顺序,会出现以下三种错误:
在使用聚合函数及GROUP BY子句时,经常出现的错误有:
- 在聚合函数的SELECT子句中写了聚合健以外的列 使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
- 在GROUP BY子句中使用列的别名 SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。
- 在WHERE中使用聚合函数 原因是聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误。如果想指定条件,可以在SELECT,HAVING(下面马上会讲)以及ORDER BY子句中使用聚合函数。
总结一下:
1.了解以下那5个常见函数:count(计数),sum(求和),ave(均值),max(最大),min(最小),这几个是和group by 配套的,而且先执行分组。
2.因为select在group by后面执行,所以group by中不能使用select里定义的别名,相当于为声明的函数。
3.因为where在group by前执行,因此where不能使用聚合(可以理解成分好组的那个组,而不是单条)的函数,而Having在group by后执行,因此可以包含里面的5个常见函数。
举的例子见源码,即点击阅读原文。
贰
习题:见上面的链接。
2.1
SELECT product_name , regist_date
FROM product
WHERE regist_date > '2009-04-28'
2.2
--1.叉子和圆珠笔行
SELECT *
FROM product
WHERE purchase_price IS NULL;
--啥都不是
SELECT *
FROM product
WHERE purchase_price = NULL;
--1.purchase_price非空行
SELECT *
FROM product
WHERE purchase_price IS NOT NULL;
--啥都不是
SELECT *
FROM product
WHERE purchase_price <> NULL;
--啥都不是
SELECT *
FROM product
WHERE product_name > NULL;
2.3
SELECT product_name , sale_price , purchase_price
FROM product
WHERE sale_price - purchase_price >= 500;
--经典取反
SELECT product_name , sale_price , purchase_price
FROM product
WHERE NOT sale_price - purchase_price < 500;
2.4
SELECT product_name, product_type,
(sale_price * 0.9 - purchase_price) AS profit
FROM product
WHERE (sale_price * 0.9 - purchase_price) > 100;
--报错,别名,执行顺序
SELECT product_name, product_type,
(sale_price * 0.9 - purchase_price) AS profit
FROM product
WHERE profit > 100;
2.5
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
FROM product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
---SUM有问题,总和应该是有组的product_type
---WHERE位置有问题
SELECT product_id,product_type, COUNT(product_type)
FROM product
WHERE regist_date > '2009-09-01'
GROUP BY product_type ;
SELECT * FROM product;
SELECT product_id, COUNT(product_name)
FROM product
WHERE regist_date > '2009-09-01'
GROUP BY product_type
HAVING COUNT(product_name) > 1;
2.6
SELECT product_type ,
SUM(sale_price) ,
SUM(purchase_price)
FROM product
-- WHERE regist_date > '2009-09-01'
GROUP BY product_type
HAVING SUM(sale_price) > 1.5 * SUM(purchase_price);
2.7
SELECT *
FROM product
ORDER BY regist_date IS NULL DESC,regist_date DESC,sale_price;
-----如何把运动T恤放前面,此处很经典
叁
数据原顺序如下:(即SELECT * FROM product)
第2.7题排序后:
肆
源码可点击阅读原文,有帮助的话记得点赞,关注
想来好笑,文远在面对deadline如牛马一般,牛马拉东西累了,停下不愿动了,便有鞭子来打。等到deadline前一秒完成了任务,便欣喜骄傲,而牛马则可能觉得免受几鞭吧。
END
作者:不爱跑马的影迷不是好程序猿
喜欢的话请关注点赞👇 👇👇 👇
公众号:文远的学习笔记
壹句: 朱颜辞镜花辞树