关于Mysql的认识
本文主要是关于mysql的一些个人理解,如果文中用词或者理解方面出现问题,欢迎指出。此文旨在分享我对于mysql的整一些个人理解,对于细节方面不会去深究,若有名词或者理解方面的问题,欢迎指出
Mysql
须知:在此是默认读者熟悉了sql的一些概念,在此只是记录平时经常用到的一些sql以及背后的原理
mysql的执行顺序
select[distinct]
from
join(如left join)
on
where
group by
having
union
order by
limit
Mysql的执行顺序是
- from
- on
- join
- where
- group by
- having
- select
- distinct
- union
- order by
- limit
让我们一步一步去认识执行顺序
-
首先from,拿到某个表,如果from这里有多个表,它会做一个表之间的笛卡尔积。
-
通过on的条件去join一个表,这里假设我的on条件是两个表的某个字段相等,这时相当于将字段相等的两条记录拼接在一起
-
where在上述操作得到的临时表后筛选符合条件的记录,得到一个临时表
-
group by是将字段进行分组,就是将重复的字段合并成一个字段,分开来去展示,可以将已经分好的字段执行聚合函数。
MySql从5.7版本开始默认开启only_full_group_by规则,规则核心原则如下,没有遵循原则的sql会被认为是不合法的sql
- group by后面的字段必须是select后面所有的字段,having和order by的字段根据执行顺序,它们后面的字段也必须是select里面的字段,但不像group by要求全部,它们可以选择单个字段。
- 如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
-
having:过滤分组,having在group by的基础上继续筛选,所以也叫组级筛选,而与之相对的where是对from的表进行行级过滤
HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。不过通常having是和group by成对出现的
-
select,将所要展示的字段从临时结果集中展示出来
-
distinct :去除重复的字段
-
union:将union前后得到的表组合起来,这里要求两张表的字段是一样的,否则mysql中会将第二个表的记录组合进第一个表,而字段显示第一张表的字段。
-
order by:对上述操作产生的临时表针对某字段进行排序操作。
-
limit: 取出临时表中的前几条记录
补充:
- join是内连接还是外连接,无非就是记录连接的方式不同。内连接inner join相当于where,相当于将条件满足的记录拼接到一起。而外连接又分为left outer join(left join)和right outer join(right join),左外连接:A LEFT JOIN B,保持左表不变,而右表根据on的条件将满足符合的记录拼接到左表中去。右外连接反之亦然。
- where :由于where的执行顺序在from on join之后,条件里是不允许用临时表不存在的字段,像聚合函数、其他表的字段是不允许用的。
- group by:group by后面的字段要用select中的所有字段
mysql函数使用
数字型函数
| ABS | 求绝对值 |
|---|---|
| SQRT | 求二次方根 |
| MOD | 求余数 |
| CEIL 和 CEILING | 两个函数功能相同,都是返回不小于参数的最小整数,即向上取整 |
| FLOOR | 向下取整,返回值转化为一个BIGINT |
| RAND | 生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列 |
| ROUND | 对所传参数进行四舍五入 |
| SIGN | 返回参数的符号 |
| POW 和 POWER | 两个函数的功能相同,都是所传参数的次方的结 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
