SQL学习打卡2—基础查询与排序

数据库查询

SELECT语句的操作符

在这里插入图片描述

聚合类函数

针对一组数求汇总值的函数,以下常用的五种聚合函数和Excel中的功能一致
在这里插入图片描述
常用法则
COUNT函数的结果根据参数的不同而不同。COUNT()会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。
聚合函数会将NULL排除在外。但COUNT(
)例外,并不会排除NULL。
MAX/MIN函数几乎适用于所有数据类型的列。SUM/AVG函数只适用于数值类型的列。
想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT。
在聚合函数的参数中使用DISTINCT,可以删除重复数据。

SQL查询

语法顺序

SELECT [*|ALL|DISTINCT] column1[,column2]
FROM table1[,table2] 		     #数据来自一个表是单表查询,来自多表是多表查询需要连接语句,这里以单表为例
WHERE conditions				 #数据选择的条件
GROUP BY column1[,column2]]		 #对选择的数据依次按照字段分组
HAVING conditions				 #组选择条件,限制需要显示的分组
ORDER BY column; 			     #对以上查询结果进行排序。

在SELECT语句中使用DISTINCT可以删除重复行。
注释是SQL语句中用来标识说明或者注意事项的部分。分为1行注释"-- “和多行注释两种”/* */"。

1.输出结果中字段的排列顺序由SELECT之后字段的顺序直接决定,与连接语句中的左右边或者主附表没有关系
2.初始默认设置下(sql_mode设置中包含“ONLY_FULL_GROUP_BY”这一项),
只要SELECT中同时出现了字段和聚合函数,后面就必须使用GROUP BY子句;
3.另外如果使用GROUP BY子句,SELECT后出现的非聚合函数字段就必须悉数在GROUP BY之后出现,
但是顺序可以不一样,而GROUP BY之后还可以出现不在SELECT之后的字段。**
4.当进行多表查询时,从FROM之后到WHERE之前出现的表格都可以作为SELECT中字段的数据来源
5.GROUP BY仅仅是进行分组,并不提供排序,所以如果是同一组下的数字型字段排列可能是乱序
6.ORDER BY中字段后加DESC是降序排序,加ASC或者默认是升序排序

 以上语句中命令的相对顺序不能打乱

GROUP BY是对选择的数据分组,类似数据表中的行列标签
聚合函数是按照分组条件对数据汇总计算,类似数据表中的值,即使聚合函数往往在GROUP BY语句
之前,但是实际执行中,是在数据分组后再对分组后的数据进行汇总计算
ORDER BY则是对最后得到的数据进行排序,所以ORDER BY不能出现在对子查询的返回值进行排序
的语句中

HAVING

SELECT city_name,AVG(pm25),AVG(pm10)
FROM monthly_indicator
WHERE pm25>50
GROUP BY city_name,month_key #默认设置下,SELECT中除了聚合函数的字段必须在GROUPBY中出现
HAVING city_name<>'北京'
ORDER BY AVG(pm25) DESC;

HAVING和WHERE都是限定条件,但是HAVING是只针对GROUP BY数据分组后的显示条件,而
WHERE是在分组前对所有数据进行选择时的限制条件

由于HAVING和WHERE很多情况下达到的筛选效果一致,所以HAVING和WHERE同时出现时,优先
考虑HAVING是否能达到筛选效果,如果可以达到效果就不使用WHERE。当不存在GROUP BY语句时,
无法使用HAVING,就只能用WHERE进行筛选

NULL

希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符

错误示例

SELECT *
  FROM product
 WHERE purchase_price = NULL;
SELECT *
  FROM product
 WHERE purchase_price <> NULL;
SELECT *
  FROM product
 WHERE product_name > NULL;

ORDER BY中列名可使用别名

前文讲GROUP BY中提到,GROUP BY 子句中不能使用SELECT 子句中定义的别名,但是在 ORDER BY 子句中却可以使用别名。为什么在GROUP BY中不可以而在ORDER BY中可以呢?

这是因为SQL在使用 HAVING 子句时 SELECT 语句的顺序为:

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。

其中SELECT的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。也就是说,当在ORDER BY中使用别名时,已经知道了SELECT设置的别名存在,但是在GROUP BY中使用别名时还不知道别名的存在,所以不能在ORDER BY中可以使用别名,但是在GROUP BY中不能使用别名

多表查询

在这里插入图片描述
当进行多表查询时,从FROM之后到WHERE之前出现的表格都可以作为SELECT中字段的数据来源

关于别名和字段重名

当一个字段名存在于多个表中,那么引用该字段时必须指定表名,反之则可以省略表名。 这个规则适
用于多表查询语句中所有引用字段的位置 。

强烈建议,查询语句涉及多表的时候在每个字段前指定表名,提高语句的阅读性,如果表名或字段名
较长,可以为表或字段设置临时的别名
关于别名需要注意的是
在一个语句中如果给某个表取了别名,那么就只能用该表的别名来指定这个表中的字段,不再能用该
表的原名指定这个表中的字段

多表连接的条件

在MySQL中联结表时需要注意
这里描述用的“连接”和“联结”是一个意思
应该总是提供联结条件,否则会得出笛卡儿积
保证使用正确的联结条件,否则将返回不正确的数据
笛卡儿积(cartesian product) 由没有联结条件的表关系返回 的结果为笛卡儿积。检索出的行的数目将
是第一个表中的行数乘 以第二个表中的行数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值