在业务开发中,mysql其实也有很多常用的函数,来方便查询数据。
有的时候根据业务需要也可以写到存储进程中,但是这是不建议的,因为业务一旦复杂起来存储进程中的sql会越来越长,可读性太差,后期维护起来会很难。
好了,开始说正题吧。
字符串相关函数:
concat(s1,s2,s3,...) --把传入的参数连接成为一个字符串。 //例如,select concat('aaa','bbb','ccc'),concat('aaa',null);任何字符串与 NULL 进行连接的结果都将是 NULL INSERT(str ,x,y,instr) --将字符串 str 从第 x 位置开始,y 个字符长的子串替换为字符串 instr。 //例如,select insert('beijing2008you',12,3,'me') LOWER(str)和 UPPER(str) --把字符串转换成小写或大写 //例如,select lower('BEIJING');select upper('beijing'); LEFT(str,x)和 RIGHT(str,x) --分别返回字符串最左边的 x 个字符和最右边的 x 个字符。 //例如,select left('qwertasd',1);select right('qwertasd',1);如果第二个参数是 NULL,那么将不返回任何字符串。 LPAD(str,n ,pad)和 RPAD(str,n ,pad) --用字符串 pad 对 str 最左边和最右边进行填充,直到长度为 n 个字符长度。 //例如,select lpad('2008',20,'beijing');select rpad('2008',20,'beijing') LTRIM(str)和 RTRIM(str) --去掉字符串 str 左侧和右侧空格。 //例如,select ltrim(' |beijing');select rtrim('beijing| '); LTRIM(str)和 RTRIM(str) --去掉字符串 str 左侧和右侧空格。 //例如,select ltrim(' |beijing');select rtrim('beijing| '); REPEAT(str,x) --返回 str 重复 x 次的结果。 //例如,select repeat('mysql',3) REPLACE(str,a,b) --用字符串 b 替换字符串 str 中所有出现的字符串 a。 //例如,select replace('beijing_2012','_2012','2008'); STRCMP(s1,s2) --比较字符串 s1 和 s2 的 ASCII 码值的大小。如果 s1 比 s2 小,那么返回-1;如果 s1 与 s2 相等,那么返回 0;如果 s1 比 s2 大,那么返回 1。 //例如,select strcmp('a','b'),strcmp('b','b'),strcmp('c','b'); TRIM(str) --去掉目标字符串的开头和结尾的空格。 //例如,select trim(' $ beijing2008 $ '); SUBSTRING(str,x,y) --返回从字符串 str 中的第 x 位置起 y 个字符长度的字串。 //例如,select substring('beijing2008',8,4),substring('beijing2008',1,7);
数组函数:
ABS(x) --返回 x 的绝对值。 //例如,select abs(-0.8); CEIL(x) --返回大于 x 的最大整数。 //例如,select ceil(-0.4);select ceil(0.4); FLOOR(x) --返回小于 x 的最大整数,和 CEIL 的用法刚好相反。 //例如,select floor(0.4); MOD(x,y) --返回 x/y 的模。和 x%y 的结果相同,模数和被模数任何一个为 NULL 结果都为 NULL。 //例如,select MOD(15,10),MOD(1,11),MOD(NULL,10); RAND() --返回 0 到 1 内的随机值。每次执行结果都不一样。 //例如,select RAND(),RAND(); //例如,select ceil(100*rand()),ceil(100*rand()); ROUND(x,y) --返回参数 x 的四舍五入的有 y 位小数的值。如果是整数,将会保留 y 位数量的 0;如果不写 y,则默认 y 为 0,即将 x 四舍五入后取整。适合于将所有数字保留同样小数位的情况。
//例如,select ROUND(1.1),ROUND(1.136,2),ROUND(1,2); TRUNCATE(x,y) --返回数字 x 截断为 y 位小数的结果。 //例如,select ROUND(1.235,2),TRUNCATE(1.235,2);
AVG(str) --取平均值
//例如,select avg(`amount`) from table where name in('刘亚鹏','李四') and amount > 90;
日期和时间函数:
CURDATE() --返回当前日期,只包含年月日。 //例如,select CURDATE(); CURTIME() --返回当前时间,只包含时分秒。 //例如,select CURTIME(); NOW() --返回当前的日期和时间,年月日时分秒全都包含。 //例如,select NOW(); UNIX_TIMESTAMP(date) --返回日期 date 的 UNIX 时间戳。 //例如,select UNIX_TIMESTAMP(now()); FROM_UNIXTIME(unixtime) --返回UNIXTIME时间戳的日期值。 //例如,select FROM_UNIXTIME(1184134516); WEEK(DATE)和 YEAR(DATE) --前者返回所给的日期是一年中的第几周,后者返回所给的日期是哪一年。
//例如,select WEEK(now()),YEAR(now()); HOUR(time)和 MINUTE(time) --前者返回所给时间的小时,后者返回所给时间的分钟。 //例如, select HOUR(CURTIME()),MINUTE(CURTIME()); MONTHNAME(date) --返回 date 的英文月份名称。 //例如,select MONTHNAME(now()); DATE_FORMAT(date,fmt) --按字符串 fmt 格式化日期 date 值。 //例如 ,select DATE_FORMAT(now(),'%M,%D,%Y'); DATE_ADD(date,INTERVAL expr type) --返回与所给日期 date 相差 INTERVAL 时间段的日期。 //例如,select now() current,date_add(now(),INTERVAL 31 day) after31days,date_add(now(),INTERVAL '1_2' year_month) after_oneyear_twomonth;
DATEDIFF(date1,date2) --用来计算两个日期之间相差的天数。 //例如,select DATEDIFF('2008-08-08',now());
流程函数:
IF(value,t f) --如果 value 是真,返回 t;否则返回 f。 //例如,select if(salary>2000,'high','low') from salary; IFNULL(value1,value2) --如果 value1 不为空返回 value1,否则返回 value2。 //例如,select ifnull(salary,0) from salary; CASE WHEN [value1] THEN[result1]…ELSE[default]END --如果 value1 是真,返回 result1,否则返回 default。
//例如, select case when salary<=2000 then 'low' else 'high' end from salary; CASE [expr] WHEN [value1] THEN[result1]…ELSE[default]END --如果 expr 等于 value1,返回 result1,否则返回 default。
//例如,select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;
其他函数:
DATABASE() --返回当前数据库名。 VERSION() --返回当前数据库版本。 USER() --返回当前登录用户名。 INET_ATON(IP) --返回 IP 地址的网络字节序表示。 INET_NTOA(num) --返回网络字节序代表的 IP 地址。 PASSWORD(str) --返回字符串 str 的加密版本,一个 41 位长的字符串。(只可用于密码) MD5(str) --返回字符串 str 的 MD5 值,常用来对应用中的数据进行加密。