刚刚接触MySQL的同学应该会有这样的疑问:为什么我要先写select,再写from,再写where,有什么意义?我从后面倒着写可不可以?
这个问题我们可以从另一个角度帮助大家去理解,解决大家的疑问,顺便可以提升一波写MySQL语句的能力。
首先大家要记住MySQL的执行顺序是怎样的,不同类型的数据库执行的顺序总会存在一点点的差异,这个大家不用担心。数据分析优质社群,等你加入哦~
不管我们写什么样的SQL语句,都逃不开执行顺序,只要搞清楚这个,按照顺序写就好了。
1、FROM和JOIN
我们在查询之前,肯定是先要拿到数据表,这时候就要先执行FROM和JOIN的语句,这是我们获取数据的第一步。
2、WHERE
当我们拿到了数据以后,where就要执行我们的限制条件,需要哪些行,不需要哪些行,将不满足条件的删除,这个对所有的数据类型都是通用的。
3、GROUP BY
where条件限定之后就需要根据group by分组语句对数据进行分组,然后对各个组的数据进行求聚合。
在这一大家要注意一下我们在group by的时候是先from和where的,所以我们写在开始的聚合函数sum()、count()等等还是未知的。
4、HAVING
having的用法跟where是一样的,但是它们的区别在于having是在过滤聚合值,也就是跟在having之后的。
5、SELECT
等到所有的处理都执行结束以后,才到了select语句,可以根据自己的需要去选择需要的数据。但并不意味着就结束了。
6、DISTNCT
这是对剩下的数据,去除重复行,只保存唯一的,这时候可以选择需要去重的字段,要记住的是这时候去重保存的是数据中的第一条。
7、ORDER BY
此语句用来对select之后的结果进行排序,可以进行升序或者降序,也可以对多个字段同时进行排序,默认是升序的。
8、LIMIT
用来限定显示返回的行数。
这个可以用来对数据进行取样,这边给大家推荐两种取样的语法。
select from analytical_table order by rand() desc limit 1;
select from analytical_table where rand()<0.015 limit 140
大家以后再写MySQL查询的时候,按照这个逻辑,把每一个子句全部写出来,然后将所有的子句按照SQL的书写数据组合起来,这样一条逻辑分明、完整的MySQL语句就写好了。
# SQL书写顺序
- SELECT DISTINCT<Select_list>
- FROM <left_table> <left/inner/right> JOIN <right_table>
- ON <join_condition>
- WHERE <where_condition>
- GROUP BY <group_by_list>
- WITH {CUBE|ROLLUP}
- HAVING <having_condtion>
- ORDER BY <order_by_list>
- LIMIT <limit_number>
最后给大家推荐几个书写规范,这个需要大家在书写的过程中慢慢去改正,如果大家是新手的话,那么希望大家从开始就养成这种习惯,对大家以后很有很大帮助的。
1、每一段MySQL语句之后要加分号;
2、用中文名字作为别名的话,记得加反引号``
(不同的数据库需要不同操作哦~)
3、查询日期或字符串的时候,使用单引号‘’
4、不等于使用的是<>,而不是!=
5、order by默认是升序,如果大家需要降序的话加order by desc
6、order by是在select之后执行的,所以可以使用大家在select中设置的别名,在where中是不能使用别名的
7、字符串是按照字典顺序排序的,字典顺序的意思是相同字符开头的字符串比不同字符开头的字符串更接近,也就是说字符串排序的时候会按照左边位为依据排序。