为提高用户对数据库和数据的管理和操作效率,MySQL提供了大量的内置函数供开发者使用。内置函数也可以称为系统函数,无须开发者定义,直接调用即可。这些内置函数从功能方面划分,可分为数学函数、字符串函数、日期和时间函数、条件判断函数、加密函数等。由于MySQL内置函数数量较多,因此不可能进行一一讲解,接下来对其中一些常用的函数进行说明,具体如下。
ABS(x) |
返回x的绝对值 |
SQRT(x) |
返回x的非负2次方根 |
MOD(x,y) |
返回x被y除后的余数 |
CEILING(x) |
返回不小于x的最小整数 |
FLOOR(x) |
返回不大于x的最大整数 |
ROUND(x,y) |
对x进行四舍五入操作,小数点后保留y位 |
TRUNCATE(x,y) |
舍去×中小数点y位后面的数 |
SIGN(x) |
返回x的符号,x的值为负数、零和正数时依次返回-1、0和1 |
LENGTH(str) |
返回字符串 str 的长度 |
CONCAT(s1,s2,…) |
返回一个或多个字符串连接产生的新字符串 |
TRIM(str) |
删除字符串两侧的空格 |
REPLACE(str,s1,s2) |
使用字符串s2替换字符串str中所有的字符串s1 |
SUBSTRING(str,n,len) |
返回字符串str的子串,起始位置为n,长度为len |
REVERSE(str) |
返回字符串反转后的结果 |
LOCATE(s1,str) |
返回子串 s1在字符串 str中的起始位置 |
CURDATE() |
获取系统当前日期 |
CURTIME() |
获取系统当前时间 |
SYSDATE() |
获取当前系统日期和时间 |
TIME_TO_SEC() |
返回将时间转换成秒的结果 |
ADDDATE() |
执行日期的加运算 |
SUBDATE() |
执行日期的减运算 |
DATE_FORMAT() |
格式化输出日期和时间值 |
IF(expr,v1,v2) |
如果expr表达式为true返回v1,否则返回v2 |
IFNULL(vl,v2) |
如果v1不为NULL返回v1,否则返回v2 |
CASE expression WHEN cl THEN result1 WHEN c2 THEN result2 ... WHEN CN THEN resultN ELSE result END |
CASE表示函数开始,END表示函数结束。如果cl成立,则返回result1;如果c2成立,则返回result2;当全部不成立,则返回result。在执行过程中,当有一个条件成立后,后面的就不执行。 |
MD5(str) |
对字符串str进行MD5加密 |
ENCODE(str,pwd_str) |
使用pwd_str作为密码加密字符串str |
DECODE(str,pwd_str) |
使用pwd_str作为密码解密字符串str |
这五个表格中的内容对MySQL中常见函数的用法作了介绍,由于篇幅关系,下面以函数CONCAT(s1,s2,...)和IF(expr,v1,v2)为例进行演示。
执行CONCAT()函数会返回函数参数链接之后的字符串。例如执行CONCAT('a','_','b'),会返回'a_b'。
例如,我们想要使用SQL语句查询员工信息时,将员工为销售的职业、编号、姓名信息在一列中展示,各个字段值之间使用下划线进行链接。此时就可以使用CONCAT()函数进行实现,具体SQL语句及执行结果如下:
mysql> SELECT CONCAT(empno,'_',job,'_',ename) FROM emp WHERE job='销售';
+---------------------------------+
| CONCAT(empno,'_',job,'_',ename) |
+---------------------------------+
| 9775_销售_王五 |
| 9880_销售_张三 |
| 9888_销售_郑十 |
| 9900_销售_孙七 |
+---------------------------------+
4 rows in set (0.00 sec)
从执行结果来看,通过调用CONCAT()函数将员工编号、职位、员工姓名的值使用下划线链接起来了。
需要注意的是,CONCAT(str1,,str2,..)的返回结果为所有参数连接后组成的字符串。如果CONCAT函数有任何一个参数为NULL,则返回值为NULL。例如,我们想要使用SQL语句查询员工信息时,将员工职位为销售的员工姓名、员工奖金及员工部门编号的信息在一列中显示,各个字段值之间使用下画线“_”进行连接,具体SQL语句及执行结果如下。
mysql> select*from emp;
+-------+--------+--------+------+------+
| empno | ename | job | sal | bon |
+-------+--------+--------+------+------+
| 9770 | 吴九 | 保洁 | 2500 | NULL |
| 9775 | 王五 | 销售 | 3500 | 500 |
| 9880 | 张三 | 销售 | 3000 | 200 |
| 9885 | 李四 | 保洁 | 2500 | 100 |
| 9888 | 郑十 | 销售 | 3500 | NULL |
| 9900 | 孙七 | 销售 | 2500 | 200 |
| 9990 | 周八 | 经理 | 7000 | 1000 |
+-------+--------+--------+------+------+
7 rows in set (0.00 sec)
先看一下表的具体结构,发现郑十这位员工的奖金为空,那么其链接的数据结果是否为空呢?
mysql> SELECT CONCAT(empno,'_',bon,'_',ename) FROM emp WHERE job='销售';
+---------------------------------+
| CONCAT(empno,'_',bon,'_',ename) |
+---------------------------------+
| 9775_500_王五 |
| 9880_200_张三 |
| NULL |
| 9900_200_孙七 |
+---------------------------------+
4 rows in set (0.00 sec)
在上述SELECT语句中,使用WHERE子句筛选出职位为销售的记录,再使用CONCAT函数将这些记录的多个字段的值通过下画线进行连接并返回。由执行结果可以看到,有1条记录显示NULL,因为职位为销售的的员工中有1个员工的奖金为NULL。
IF函数有3个参数,具体格式为IF(expr,v1,v2)。如果表达式expr成立,返回结果v1;否则返回结果v2。例如,我们想要使用SQL语句查询员工表中部门保洁的员工姓名、员工奖金及员工部门编号的信息;如果奖金为NULL,则返回"无奖金"。查询时可以使用IF()函数对奖金进行判断,具体SQL语句及执行结果如下:
mysql> SELECT empno,IF(ISNULL(bon),'无奖金',bon),ename,job FROM emp WHERE job='保洁';
+-------+---------------------------------+--------+--------+
| empno | IF(ISNULL(bon),'无奖金',bon) | ename | job |
+-------+---------------------------------+--------+--------+
| 9770 | 无奖金 | 吴九 | 保洁 |
| 9885 | 100 | 李四 | 保洁 |
+-------+---------------------------------+--------+--------+
2 rows in set (0.00 sec)
在上述SELECT语句中,先使用WHERE语句筛选出职位为保洁的员工记录,并且使用IF()函数判断奖金是否为空,如果为空,则返回无奖金,不为空则返回正常奖金。由执行结果来看保洁部门有一个员工没有奖金。
在查询数据时,可以为数据表和字段取别名,可使用这个别名代替原来的数据表名和字段名。
在进行查询操作时,如果数据表名很长或者需要执行一些特殊查询,为方便操作,可以为数据表取一个别名,用这个别名代替数据表的名称。MySQL中为数据表起别名的基本语法格式如下。
SELECT*FROM 数据表名 [AS] 别名;
在上面的语法格式中,AS为可选项,用于指定数据表的别名。下面通过一个案例演示在SELECT语句中为数据表设置别名。
例如,我们想要使用SQL语句查询员工信息时,为emp数据表起一个别名。并且使用别名e查询职位为经理的员工信息,具体SQL语句及执行结果如下。
mysql> SELECT * FROM emp e WHERE e.job='经理';
+-------+--------+--------+------+------+
| empno | ename | job | sal | bon |
+-------+--------+--------+------+------+
| 9990 | 周八 | 经理 | 7000 | 1000 |
+-------+--------+--------+------+------+
1 row in set (0.00 sec)
在上述SELECT语句中,emp e表示为emp数据表定义别名为e,此时在语句中使用别名e和数据表名emp有相同的效果;e..job='经理'表示筛选emp数据表中job字段的值为经理的记录。
在前面的查询操作中,每条记录中的列名都是定义表时的字段名,有时为了将查询结果更加直观地显示,可以为查询的字段取一个别名。SELECT语句中为字段起别名的基本语法格式如下。
SELECT 字段名 [AS] 别名 [,字段名[AS]别名,...] FROM 数据表名;
在上面的语法格式中,AS为可选项,用于指定字段的别名。下面通过一个案例演示在SELECT语句中为字段设置别名。
例如,我们想要使用SQL语句查询员工表中职位为销售的员工姓名、员工奖金及员工部门编号的信息,查询结果返回时将字段ename的名称设置别名“姓名”,字段bon的名称设置别名“奖金”,字段empno的名称设置别名“部门编号”,具体SQL语句及执行结果如下。
mysql> SELECT empno '部门编号',ename '姓名',bon '奖金' FROM emp WHERE job='销售';
+--------------+--------+--------+
| 部门编号 | 姓名 | 奖金 |
+--------------+--------+--------+
| 9775 | 王五 | 500 |
| 9880 | 张三 | 200 |
| 9888 | 郑十 | NULL |
| 9900 | 孙七 | 200 |
+--------------+--------+--------+
4 rows in set (0.00 sec)
AS可写可不写,想简写的可以不写,但是写上的话别人更容易看懂,我是懒得写。
下篇文章是多表操作,以及如何使用这些多表操作。
点个关注不迷路。