学习SQL语句需要记住这几点!


01 SQL逻辑

刚学SQL的同学肯定和我一样有过这样的疑问:为什么要先写select,再写from,再写where,再写……

对于这个问题我没法从工程师的角度去回答你,但我有一个技巧可以帮你绕开这个疑问,在写SQL的时候心理不那么别扭。

记SQL语句的执行顺序。

MySQL的执行顺序如下,当然各种类SQL语言的执行顺序可能会有一两点差异,比如Hive SQL、Teradata SQL等等。

MySQL,SQL逻辑,SQL语句,常用函数,谓词

不管你写哪种SQL,首先搞清楚执行顺序,接下来你就可以按照这个执行顺序来写了。

1、FORM and JOIN

首先我们进行查询的时候,肯定是先获得一份数据集的,From语句和JOIN被先执行的,就是为了获得数据集的。

2、WHERE

一旦数据集给拿到了,WHERE限制条件会被用到某些行上,并把不满足的行给抛弃掉。并且,这能够用到各种数据类型中

3、GROUP BY

WHERE条件限定之后,接下来就是GROUP BY语句了,这一语句会根据某一字段进行分组,并对各个组进行求聚合。

想想看,我们先进行的是FROM,紧接着是WHERE,然后才是GROUP BY。所以上面的语句就是错在了WHERE 语句在执行的时候,GROUP BY语句还没有开始,那时聚合值sum()还是未知的。

4、HAVING

having语句在SQL中的主要作用与Where语句作用是相同的,但是having是过滤聚合值,其实上面的正确写法是这样的

5、SELECT

在经过上面的执行之后,终于到了select语句,但是别慌,下面还有呢。

6、DISTINCT

对于剩下的行,Distinct用来去除重复行,只保留唯一的。

7、ORDER BY

此语句用来对select后的结果,进行排序,升序或者是降序。

8、LIMIT

用来限定返回的行数

按照这个逻辑,把每一个子句写出来,最后再按照SQL的书写顺序排个序,一条逻辑清晰、完整的SQL语句就写好啦!

# 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>

牢记SQL执行顺序还有助于理解SQL的语法规定。

比如,“别名”只能在order by中使用,而不能在其他地方使用;在Teradata SQL里,“别名”只可以在order by中使用的。02

有必要的规范习惯

  1. SQL语句的最后不要忘记加分号 ;
  2. 如果用中文作为别名,使用双引号“”
  3. 查询日期或字符串的时候,使用单引号 ”
  4. 不等于用<>,这个写法适用于所有RDBMS,所以也有必要养成书写习惯
  5. order by 默认为升序,降序的写法是 order by desc
  6. order by 是在select之后执行,所以可以使用在select中定义的别名,而其他地方不能使用别名,特别是新手容易在where中使用别名
  7. 字符串是按照字典顺序排序的,字典顺序的意思是相同字符开头的字符串比不同字符开头的字符串更接近,例如下面是一个升序:
‘1’

‘12’

‘123’

‘2’

‘23’

‘3’

03

常用函数
1、算术函数:

  1. 绝对值 ABS()
  2. 求余 MOD()
  3. 四舍五入 ROUND(m, n) #对m保留n位小数

2、字符串函数:

  1. 拼接 CONCAT(str1, str2, str3, …)
  2. 求长度 LENGTH()
  3. 全部大写 UPPER()
  4. 全部小写 LOWER()
  5. 替换 REPLACE(str,str1,str2) #将str中的str1替换成str2
  6. 截取 SUBSTRING(str FROM k FOR n) #从str的第k个字符开始取长度为n的子字符串

注意,SQL是从1开始计数,和一般编程语言不同,它们都是从0开始计数


3、日期函数:

  1. 当前日期 CURRENT_DATE
  2. 当前时间 CURRENT_TIME
  3. 当前日期和时间(时间戳) CURRENT_TIMESTAMP
  4. 截取时间元素EXTRACT (时间元素(year,month,day等) FROM 时间)
  5. 只取日期 DATE(TIMESTAMP)

4、转换函数:

  1. 类型转换 CAST ( s AS 想转换的类型)  #将s转换成指定数据类型
  2. 返回参数中左侧开始第一个不是NULL的值 COALESCE(数据1,数据2,数据3,…)

COALESCE是一个在实际工作环境中非常常用的函数,可以用来将NULL转换为其他值,也可以用来构造新的字段。

04

谓词
1、LIKE

  • LIKE ‘%xxx%’ 中间一致
  • LIKE ‘xxx%’ 前方一致
  • LIKE ‘%xxx’ 后方一致
  • LIKE ‘xxx_’ 查询xxx + 任意1个字符
  • LIKE ‘xxx__’ 查询ddd+任意2个字符

2、BETWEEN …… AND

  • BETWEEN a AND b 等于 [a, b]
  • 如果不想要临界值,就只能使用 < 和 >

3、IS NULL、IS NOT NULL

  • 判断是否为NULL

4、IN

  • IN(数据1,数据2,数据3,…) ;OR 和 = 一起使用的简单用法
  • NOT IN(数据1,数据2,数据3,…) ;AND 和 <> 一起使用的简单用法
  • NULL不能作为IN的参数,否则无法返回任何记录
  • 子查询可以作为IN的参数

05

学习小建议

1.保持专注

时间有限,不要把时间花费在网上盲目检索资料、群里聊天、互相吐槽上。

2.要适当投入资源

如花钱买一些课程、项目数据、书籍等。

  • 对于新手还没有完整的知识框架前,自学是个痛苦的过程,会浪费大量的时间,走一些弯路,并且更容易使人困惑不知该从何处下手,最后不了了之。
  • 前辈带着你梳理知识框架就显得很有效率,并且能大幅提升学习效率,何乐而不为?
  • 适当的花点小钱就能节约大量的时间和精力。

3.要学会自己解决问题的能力

  • 部分问题都能在网上找到解决方法或思路,特别是一些国内外技术网站、博客等。
  • 一定要能自己解决问题,这是个很重要的能力,实际工作中会碰到比学习过程中更麻烦的问题(自学能力)。
  • 对于自己解决不了的问题,再去求助他人。清晰的问题表述能够更快、更准确的帮助你解答疑惑。可以将【当前故障界面】、你做过的【排故工作】,描述清楚再去求助别人。不然尽管人家愿意解答,但不知道