前言
SQL 的内置函数的笔记。重点是:
- 什么是 SQL 函数?
- 内置的 SQL 函数都包括哪些?
- 如何使用 SQL 函数对一个数据表进行操作
- 什么情况下使用 SQL 函数?为什么使用 SQL 函数有时候会带来问题?
一、什么是 SQL 函数
SQL 中的函数一般是在数据上执行的,可以很方便地转换和处理数据。一般来说,当我们从数据表中检索出数据之后,就可以进一步对这些数据进行操作,得到更有意义的结果,比如返回指定条件的函数,或者求某个字段的平均值等。
二、常用的 SQL 函数有哪些
- 算术函数
- 字符串函数
- 日期函数
- 转换函数
算术函数
SELECT ABS(-2),运行结果为 2。
SELECT MOD(101,3),运行结果 2。
SELECT ROUND(37.25,1),运行结果 37.3。
字符串函数
SELECT CONCAT(‘abc’, 123),运行结果为 abc123。
SELECT LENGTH(‘你好’),运行结果为 6。
SELECT CHAR_LENGTH(‘你好’),运行结果为 2。
SELECT LOWER(‘ABC’),运行结果为 abc。
SELECT UPPER(‘abc’),运行结果 ABC。
SELECT REPLACE(‘fabcd’, ‘abc’, 123),运行结果为 f123d。
SELECT SUBSTRING(‘fabcd’, 1,3),运行结果为 fab。
日期函数
SELECT CURRENT_DATE(),运行结果为 2019-04-03。
SELECT CURRENT_TIME(),运行结果为 21:26:34。
SELECT CURRENT_TIMESTAMP(),运行结果为 2019-04-03 21:26:34。
SELECT EXTRACT(YEAR FROM ‘2019-04-03’),运行结果为 2019。
SELECT DATE(‘2019-04-01 12:00:05’),运行结果为 2019-04-01。
转换函数
SELECT CAST(123.123 AS INT),运行结果会报错。
SELECT CAST(123.123 AS DECIMAL(8,2)),运行结果为 123.12。
SELECT COALESCE(null,1,2),运行结果为 1。
如何使用 SQL 函数对一个数据表进行操作
SELECT * FROM heros WHERE DATE(birthdate)>'2016-10-01'
需要注意的是下面这种写法是不安全的:
SELECT * FROM heros WHERE birthdate>'2016-10-01'
因为很多时候你无法确认 birthdate 的数据类型是字符串,还是 datetime 类型,如果你想对日期部分进行比较,那么使用DATE(birthdate)来进行比较是更安全的。
为什么使用 SQL 函数会带来问题
尽管 SQL 函数使用起来会很方便,但我们使用的时候还是要谨慎,因为你使用的函数很可能在运行环境中无法工作,这是为什么呢?
第一、我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即 DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数是被 DBMS 同时支持的。比如,大多数 DBMS 使用(||)或者(+)来做拼接符,而在 MySQL 中的字符串拼接函数为Concat()。大部分 DBMS 会有自己特定的函数,这就意味着采用 SQL 函数的代码可移植性是很差的,因此在使用函数的时候需要特别注意。
第二、它会导致查询不走索引,直接全表遍历,影响查询效率。这才是最重要的问题。现实工作中一般是禁止 where条件 出现函数。
关于大小写的规范
在 SQL 中,要确定大小写的规范,因为在 Linux 和 Windows 环境下,你可能会遇到不同的大小写问题。
比如 MySQL 在 Linux 的环境下,数据库名、表名、变量名是严格区分大小写的,而字段名是忽略大小写的。
而 MySQL 在 Windows 的环境下全部不区分大小写。
规范建议:
- 关键字和函数名称全部大写;
- 数据库名、表名、字段名称全部小写;
- SQL 语句必须以分号结尾。