if mysql where 中 变量 mysql where条件顺序_mysql 分组求平均值

if mysql where 中 变量 mysql where条件顺序_mysql where条件执行顺序_02

MySQL一般特指MySQL RDBMS,是一个开源的关系型数据库管理系统(Relational Database Management System),现在属于Oracle公司。随着MySQL功能的不断完善,性能不断提高,又有开源免费的优势,越来越多的企业选择使用MySQL,而放弃商用收费的Oracle。

了解SQL查询的操作顺序是非常有价值的,因为它可以简化编写新查询的过程,同时在尝试优化SQL查询时也非常有利。



if mysql where 中 变量 mysql where条件顺序_mysql where条件执行顺序_03

MySQL常用关键字览表



关键字

名称

用法

insert

增加

insert into user(name,age,sex) values(值1,值2,值3);

delete

删除

delete from user where 条件;

update

修改

update user set 字段1=值1,字段2=值2 where 条件;

select

查询

select * from user;

distinct

去重

select distinct 去重字段 from user;

between

在···之间

select *from user where age between 20 and 30; (查询年龄在20-30之间的用户)

like

模糊匹配

select *from user where name like ‘张*%’; (其中*匹配 一个字符,%匹配 一个或多个)

LIMIT

分页查询

SELECT *FROM user LIMIT 5; (查询前 5 个记录行)

count

记录条数

select COUNT(*) from user; (查询user表所有记录条数)

sum

求和

select sum(age) from user;(查询所有的年龄和)

max、min

最大最小值

select max(age) from user;(最大的年龄最小同理)

avg

平均值

select avg(age) from user;(所有人年龄的平均值)

order by

排序

select *from user order by age;(默认从小到大的正序, asc 正序,desc倒序)

group by

分组

select sex,count(*) from user group by sex;(分组查询男女总人数)

having

分组后筛选

其实与where用法相似,having后能用聚合函数where不行,分组筛选后建议用having关键字



SQL查询的逻辑操作顺序,也称为执行顺序:

  1. FROM, including JOINs
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. DISTINCT
  7. UNION
  8. ORDER BY
  9. LIMIT and OFFSET

但实际情况并不是那么简单也不是那么直接。正如我们所说,SQL标准定义了不同SQL查询子句的执行顺序。说到这里,现代数据库已经在challanaging这个默认的顺序,通过应用一些优化技巧,可能会改变实际的执行顺序,不过它们最终返回的结果一定和以默认执行顺序运行查询的结果一样。

为什么他们会这样做呢?好吧,如果数据库会先获取FROM子句中提到的所有数据(包括JOIN),然后再研究WHERE子句及其索引,那可就傻眼了。这些表可以容纳很多数据,所以你可以想象如果数据库的优化器会坚持SQL查询的传统操作顺序会发生什么。

让我们根据SQL查询的执行顺序来看看每一个部分。

if mysql where 中 变量 mysql where条件顺序_mysql 执行顺序_04

FROM和JOINs

在FROM子句中指定的表(包括JOINs),将首先被评估,以确定与查询相关的整个工作集。数据库会根据JOINs ON子句合并所有表的数据,同时也会从子查询中获取数据,甚至可能会创建一些临时表来保存从该子句中子查询返回的数据。

不过在很多情况下,数据库的优化器会选择先评估WHERE部分,看看工作集的哪一部分可以省略(最好是使用索引),所以如果不是真的有必要的话,它不会把数据集膨胀得太厉害。

WHERE子句

WHERE子句将是继FROM子句之后第二个被评估的子句。我们已经有了工作数据集,现在我们可以根据WHERE子句中的条件来过滤数据。

这些条件可以包括对FROM子句中的数据和表的引用,但不能包括对SELECT子句中定义的别名的任何引用,因为该数据和这些别名在该上下文中可能还不 "存在",因为该子句还没有被数据库评估。

另外,WHERE子句的一个常见陷阱是试图在WHERE子句中过滤掉聚合值,例如用这个子句。"WHERE sum(available_stock) > 0"。这条语句将使查询执行失败,因为聚合值将在后面的过程中被评估(参见下面的GROUP BY部分)。要在聚合数据上应用过滤条件,你应该使用HAVING子句而不是WHERE子句。

GROUP BY子句

现在我们使用WHERE子句对数据集进行了过滤,我们可以根据GROUP BY子句中出现的一列或多列对数据进行聚合。对数据进行分组实际上就是将数据分割成不同的块或桶,每个桶有一个键和与该键匹配的行列表。如果没有GROUP BY子句,就像把所有的行都放在一个巨大的桶里。

一旦聚合了数据,现在可以使用聚合函数来返回每个桶的每组值。这样的聚合函数包括COUNT、MIN、MAX、SUM等。

HAVING子句

现在我们已经使用GROUP BY子句对数据进行了分组,我们可以使用HAVING子句来筛选出一些桶。HAVING子句中的条件可以引用聚合函数,所以上面那个在WHERE子句中不起作用的例子,在HAVING子句中就可以正常使用。"HAVING sum(available_stock) > 0".

由于我们已经对数据进行了分组,此时已经不能再访问原来的行,所以我们只能应用条件来过滤整个桶,而不能过滤桶中的单行。

另外,正如我们在前面的章节中提到的,在SELECT子句中定义的别名也不能在本节中访问,因为它们还没有被数据库评估(大多数数据库都是如此)。