数据查询是数据库最常用到的功能,熟练掌握查询的知识点是非常必要的。下面主要深入了解 Mysql 数据库的各种花式查询,如何跟据问题写出一条完美的 Sql.
查询语句的执行顺序
一、一条查询语句的分四个部分:
1、从哪个表。
2、查什么?对于查到的数据是 mysql 的基本数据类型,对于这些数据,我们能够可以进行运算【使用[算数/位]运算符】,使用函数做统计,或者数据处理。。常用聚合函数:Count,SUM ,MIN,MAX...等等。。。
3、过滤条件,数据满足什么条件的情况下获取它,这其中也会用到运算和函数,最常用的是比较运算,查找时间范围,数据范围,判断。。。
4、排序,topn,当我们过滤了数据之后,通常是分组,排序。。或者是获取其中一部分。
sql 语句写错可能是遇到最多的问题,主要还是由于没有搞清楚 sql 的解析过程,执行顺序。
二、sql 语句的正确写法
SELECT DISTINCT
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
ORDER BY
< order_by_condition > LIMIT < limit_number >
三、sql 语句的执行顺序
```sql 1 FROM 2 ON 3 JOIN 4 WHERE 5 GROUP BY 6 HAVING 7 SELECT 8 DISTINCT 9 ORDER BY 10 LIMIT ``` >在这里有几个比较容易错的点: >1、where/having的异同:'Group by'作为where与having的分界点,他们都是条件过滤,但是'having在group by之后,同时特也只能在group by之后',什么意思呢?就是说Having是对分组之后的数据聚合。而'where'必须在group by之前。 >2、在聚合函数使用和多表啦临河查询的时候,经常会使用别名,别名是为了方便其他地方用到,但是经常会出现提示别名不存在,那是因为在 在这个别名还未创建的时候哦我们就去使用它,例如: ``` #假设我查询用户表user 的性别sex人数count(sex)>20的数量 select count(sex) as ss from user group by sex having ss>20 这条语句能执行吗?貌似很完美,其实是错误的,ss这个别名根本找不到,回到上面的'执行顺序'我们可以看到,having在select之前执行,而count在select之后,我们只有首先获取到了原数据,才能聚合。所以having执行的时候这个count还没有执行呢,更不能定义ss这个别名了。所以会报错。 ``` # 四、执行顺序中的核心点 **第一部分**:1,2,3表示数据从哪里查,这里面最重要的就是多表联合,而核心就是笛卡儿积。如果我们连几张该怎么联合程我郁闷要的虚拟表都不清楚,那么更别说去查询这张表了。
第二部分:4,5,6 表示过滤条件,这部分只要搞清楚 where/having 使用的场景,以及条件中的运算和函数。就没什么问题。
第三部分:7,8 没什么说的,对查询出的数据使用函数如;count,distinct,sum,max.min....
第四部分:9,10 固定模式,我们取到最终的数据之后可以排序啊,取 topN.
表的交并,笛卡儿积
...待续
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于