MySQL-复杂查询

203 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

聚合函数

聚合函数通常对 GROUP BY 语句进行分组后的每个分组起作用,即,如果在查询语句中不使用 GROUP BY 对结果集分组,则聚合函数就对结果集的所有行起作用。

count	计数
sum	求和
avg	平均值
max	最大值
min	最小值

分组查询

在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。

即使用GROUP BY 按某个字段或者多个字段进行分组。(按分组条件分组后每一组只会显示第一条记录)

  • 分组函数必须先分完组之后才能使用

注意点:

  • GROUP BY 应该位于where语句的后面(先过滤,后排序)
  • HAVING和WHERE的作用相同,区别在于HAVING 条件可以和聚合函数使用,而WHERE 关键字不能。
  • HAVING 关键字需和GROUP BY一起使用,用于对分组后的结果进行过滤。
  • where 用于分组之前的过滤,而 having 是分组之后的

从优化策略考虑: where和 having,优先选择where, where实在完成不了了,再选择having

排序

Order by 可以对查询结果进行排序

在该语法中指定的字段名是对查询结果进行排序的依据,ASC表示升序排列,DESC 表示降序排列,默认情况是升序排列。(order by 语句一般写在最后)

查询执行的顺序

  1. from
  2. where
  3. group by
  4. having
  5. select
  6. order by
  7. limit

多表查询

内连接:

解释:只列出这些连接表中与连接条件相匹配的数据行。

INNER可以不写,则默认为内连接。 [ON join_condition]里面写的是连接的条件。

外连接:

语法:

解释:不仅列出与连接条件(on)相匹配的行,还列出左表table1(左外连接)、或右表table2(右外连接)、或两个表(全外连接)中所有符合WHERE过滤条件的数据行。

  • 左连接的含义是:在内连接的基础上增加左边有右边没有的结果
  • 右连接是左连接的相反。
  • 全连接在mysql不支持

子查询

作用:子查询是将一个查询语句嵌套在另一个查询语句中

定义:内层查询语句的查询结果,可以作为外层查询语句提供的查询条件。先执行子查询,根据子查询的结果,再执行主查询。

关键字:用于子查询可以包括IN、NOT IN、EXIST、NOT EXIST、=、<>等(符号“<>”的意思是:不等于)。

第四句其实就把前两句给结合起来了。

  • 不要嵌套太多子查询,消耗资源。