如何提升查询技能
这篇文章主要介绍“如何提升查询技能”,在日常操作中,相信很多人在如何提升查询技能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何提升查询技能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
让我们以一个虚构的业务为例。假设你是亚马逊电子商务分析团队的一员,需要运行几个简单的查询。你手头有两个表,分别为“product(产品)”和“discount (折扣)”。
1.计算NULL字段的数目
为了计算null字段的数目,要掌握COUNT函数的工作原理。假设计算产品数量时,要求计入表格“product”的“product id”主键列中遗漏的字段。
SELECTCOUNT(product_id)FROMproduct;Result:3
由于要求计入“product id”列中的null值,查询结果应该为4,但COUNT()函数不会将null值计数。
解决方法:使用COUNT(*)函数。该函数可以将null值计数。
SelectCount(*)Fromproduct;Result:4
这个操作很简单,但是在编写复杂的查询时总会被忽略。
2.使用保留字作为列名
SELECTproduct_id,RANK()OVER(ORDERBYpricedesc)AsRankFROMproduct;
由于列名“Rank”是Rank函数的保留字,该查询结果出错。
解决方法:
SELECTproduct_id,RANK()OVER(ORDERBYpricedesc)As‘Rank’FROMproduct;
加上单引号,即可得到想要的结果。
3.NULL的比较运算
SELECTproduct_nameFROMproductWHEREproduct_id=NULL;
由于使用了比较运算符“=”,此处运算会出现异常,使用另一比较运算符“!=”运算也会出现异常。这里的逻辑问题在于,你编写的查询得出的是“product id”列的值是否未知,而无法得出这一列的值是否是未知的产品。
解决方法:
SELECTproduct_nameFROMproductWHEREproduct_idISNULL;
4.ON子句过滤和WHERE子句过滤的区别
这是一个非常有趣的概念,会提高你对于ON子句过滤和WHERE子句过滤之间区别的基本理解。这并不完全是一个错误,只是演示了两者的用法,你可以根据业务需求选择最佳方案。
SELECTd.product_id,price,discountFROMproductpRIGHTJOINdiscountdONp.product_id=d.product_idWHEREp.product_id>1;
结果:
在这种情况下,过滤条件在两个表格连接之后生效。因此,所得结果不包含d.product_id≤1的行(同理,显然也不包含p.product≤1的行)。
解决方法:使用AND,注意结果上的不同。
SELECTd.product_id,price,discountFROMproductpRIGHTJOINdiscountdONp.product_id=d.product_idANDp.product_id>1;
结果:
在这里,条件语句AND在两个表格连接发生之前计算。可以把此查询看作只适用于一个表(“product”表)的WHERE子句。现在,由于右连接,结果中出现了d.product_id≤1的行(显然还有p.product_id>1的行)。
请注意,ON子句过滤和WHERE子句过滤只在左/右/外连接时不同,而在内连接时相同。
5.在同一查询的WHERE子句中使用Windows函数生成的列&使用CASE WHEN子句
注意,不要在同一查询的WHERE子句中使用通过Windows函数生成的列名以及CASE WHEN子句。
SELECTproduct_id,RANK()OVER(ORDERBYpricedesc)ASrkFROMproductWHERErk=2;
因为列rk由Windows函数生成,并且在同一查询的WHERE子句中使用了该列,这个查询结果会出现异常。
解决方法:这一问题可以通过使用临时表或者子查询解决。
WITHCTEAS(SELECTproduct_id,RANK()OVER(ORDERBYpricedesc)ASrkFROMproduct)SELECTproduct_idFROMCTEWHERErk=2;
或
SELECTproduct_idFROM(SELECTproduct_id,RANK()OVER(ORDERBYpricedesc)ASrkFROMproduct;)WHERErk=2;
同样的方法也适用于使用CASE WHEN子句创建的列。请记住,Windows函数只能出现在SELECT或ORDER BY子句中。
6.BETWEEN的使用不正确
如果不清楚BETWEEN的有效范围,也许会得不到想要的查询结果。BETWEEN x AND y语句的有效范围包含x和y。
SELECT*FROMdiscountWHEREoffer_valid_tillBETWEEN‘2019/01/01’AND‘2020/01/01’ORDERBYoffer_valid_till;
结果:
在查询中,也许我们只想得到2019年的所有日期,但是结果中还包含了2020年1月1日。这是因为BETWEEN语句的有效范围包含2019/01/01和2020/01/01。
解决方法:相应地调整范围可以解决这个问题。
SELECT*FROMdiscountWHEREoffer_valid_tillBETWEEN‘2019/01/01’AND‘2019/12/31’ORDERBYoffer_valid_till;
结果:
现在,所有查询结果均为2019年的日期。
7.在GROUP BY语句后使用WHERE子句
在编写GROUP BY语句时,请注意WHERE子句的位置。
SELECTcategory,AVG(price)FROMproductpINNERJOINdiscountdONp.product_id=d.product_idGROUPBYcategoryWHEREdiscount_amount>10;
由于将WHERE子句放在GROUP BY语句后,此查询是错误的。这是为什么呢?
WHERE子句用于过滤查询结果,这一步要在将查询结果分组之前实现,而不是先分组再过滤。正确的做法是先应用WHERE条件过滤减少数据,再使用GROUP BY子句通过聚合函数将数据分组(此处使用聚合函数AVG)。
解决方法:
SELECTcategory,AVG(price)FROMproductpINNERJOINdiscountdONp.product_id=d.product_idWHEREdiscount_amount>10GROUPBYcategory;
请注意主要SQL语句的执行顺序:
FROM 子句
WHERE 子句
GROUP BY 子句
HAVING 子句
SELECT 子句
ORDER BY 子句
到此,关于“如何提升查询技能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。