1. 函数的理解
1.1 什么是函数
- 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。
- 这样既 提高了代码效率 ,又 提高了可维护性 。
- 在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。
- 使用这些函数,可以极大地 提高用户对数据库的管理效率 。
- 从函数定义的角度出发,我们可以将函数分成
内置函数
和自定义函数
- 在 SQL 语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的
1.2 不同DBMS函数的差异
- 我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即DBMS
- DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异
- 实际上,只有很少的函数是被 DBMS 同时支持的。比如,大多数 DBMS 使用(||)或者(+)来做拼接符,而在 MySQL 中的字符串拼接函数为concat()。
- 大部分 DBMS 会有自己特定的函数,这就意味着采用 SQL 函数的代码可移植性是很差的,因此在使用函数的时候需要特别注意
2. MySQL函数分类
- MySQL提供的内置函数从 实现的功能角度 可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。
- 这里,我将这些丰富的内置函数再分为两类: 单行函数 、 聚合函数(或分组函数)
2.1 两种SQL函数
2.2 单行函数
- 操作数据对象
- 接受参数返回一个结果
只对一行进行变换
每行返回一个结果
- 可以嵌套
- 参数可以是一列或一个值
3. 数值函数
3.1 基本函数
mysql> SELECT ABS(-123), ABS(32),SIGN(-23), SIGN(43), PI(), CEIL(32.32), CEILING(-43.23), FLOOR(32.32), FLOOR(-43.23),MOD(12,5) FROM dual;
+-----------+---------+-----------+----------+----------+-------------+-----------------+--------------+---------------+-----------+
| ABS(-123) | ABS(32) | SIGN(-23) | SIGN(43) | PI() | CEIL(32.32) | CEILING(-43.23) | FLOOR(32.32) | FLOOR(-43.23) | MOD(12,5) |
+-----------+---------+-----------+----------+----------+-------------+-----------------+--------------+---------------+-----------+
| 123 | 32 | -1 | 1 | 3.141593 | 33 | -43 | 32 | -44 | 2 |
+-----------+---------+-----------+----------+----------+-------------+-----------------+--------------+---------------+-----------+
1 row in set (0.00 sec)
mysql>
mysql> SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1);
+-------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| RAND() | RAND() | RAND(10) | RAND(10) | RAND(-1) | RAND(-1) |
+-------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 0.709063702923305 | 0.5131437885697407 | 0.6570515219653505 | 0.6570515219653505 | 0.9050373219931845 | 0.9050373219931845 |
+-------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)
mysql>
mysql> SELECT ROUND(12.33),ROUND(12.343,2),ROUND(12.343,-1),TRUNCATE(12.66,1),TRUNCATE(12.66,-1),SQRT(16), SQRT(-16);
+--------------+-----------------+------------------+-------------------+--------------------+----------+-----------+
| ROUND(12.33) | ROUND(12.343,2) | ROUND(12.343,-1) | TRUNCATE(12.66,1) | TRUNCATE(12.66,-1) | SQRT(16) | SQRT(-16) |
+--------------+-----------------+------------------+-------------------+--------------------+----------+-----------+
| 12 | 12.34 | 10 | 12.6 | 10 | 4 | NULL |
+--------------+-----------------+------------------+-------------------+--------------------+----------+-----------+
1 row in set (0.00 sec)
mysql>
3.2 弧度和角度装换的函数
mysql> SELECT RADIANS(30),RADIANS(60),RADIANS(90),DEGREES(2*PI()),DEGREES(RADIANS(90)) FROM dual;
+--------------------+--------------------+--------------------+-----------------+----------------------+
| RADIANS(30) | RADIANS(60) | RADIANS(90) | DEGREES(2*PI()) | DEGREES(RADIANS(90)) |
+--------------------+--------------------+--------------------+-----------------+----------------------+
| 0.5235987755982988 | 1.0471975511965976 | 1.5707963267948966 | 360 | 90 |
+--------------------+--------------------+--------------------+-----------------+----------------------+
1 row in set (0.00 sec)
mysql>
3.3 三角函数
- ATAN2(M,N)函数返回两个参数的反正切值。 与ATAN(X)函数相比,ATAN2(M,N)需要两个参数
- 例如有两个点point(x1,y1)和point(x2,y2),使用ATAN(X)函数计算反正切值为ATAN((y2-y1)/(x2-x1)),
- 使用ATAN2(M,N)计算反正切值则为ATAN2(y2-y1,x2-x1)。
- 由使用方式可以看出,当x2-x1等于0时,ATAN(X)函数会报错,而ATAN2(M,N)函数则仍然可以计算
mysql> SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1)),DEGREES(ATAN2(1,1) )FROM DUAL;
+---------------------+------------------+--------------------+------------------+----------------------+
| SIN(RADIANS(30)) | DEGREES(ASIN(1)) | TAN(RADIANS(45)) | DEGREES(ATAN(1)) | DEGREES(ATAN2(1,1) ) |
+---------------------+------------------+--------------------+------------------+----------------------+
| 0.49999999999999994 | 90 | 0.9999999999999999 | 45 | 45 |
+---------------------+------------------+--------------------+------------------+----------------------+
1 row in set (0.00 sec)
mysql>
3.4 幂函数
mysql> SELECT POW(2,5),POWER(2,4),EXP(2),LN(10),LOG10(10),LOG2(4) FROM dual;
+----------+------------+------------------+-------------------+-----------+---------+
| POW(2,5) | POWER(2,4) | EXP(2) | LN(10) | LOG10(10) | LOG2(4) |
+----------+------------+------------------+-------------------+-----------+---------+
| 32 | 16 | 7.38905609893065 | 2.302585092994046 | 1 | 2 |
+----------+------------+------------------+-------------------+-----------+---------+
1 row in set (0.00 sec)
mysql>
3.5 进制间的转换
mysql> SELECT BIN(10),HEX(10),OCT(10),CONV(10,2,8) FROM dual;
+---------+---------+---------+--------------+
| BIN(10) | HEX(10) | OCT(10) | CONV(10,2,8) |
+---------+---------+---------+--------------+
| 1010 | A | 12 | 2 |
+---------+---------+---------+--------------+
1 row in set (0.00 sec)
mysql>
4. 字符串函数