为什么使用MySQL函数?
为了简化操作,MySql提供了大量的函数给程序员使用(比如你想输入当前时间,可y以调用now()函数)
在哪里使用MySQL函数
插入语句的values()中,更新语句中,删除语句中,查询语句及其子句中。
MySQL常见函数
字符串函数
函数操作符 | 方法描述 |
---|---|
CONCAT(S1,S2,…,Sn) | 连接S1,S2,…,Sn为一个字符串 |
CONCAT(s, S1,S2,…,Sn) | 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上s |
CONCAT_WS(separator, str1, str2, …) | 可以指定间隔符将多个字符串进行连接; |
CHAR_LENGTH(s) | 返回字符串s的字符数 |
LENGTH(s) | 返回字符串s的字节数,和字符集有关 |
INSERT(str, index , len, instr) | 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr |
UPPER(s) 或 UCASE(s) | 将字符串s的所有字母转成大写字母 |
LOWER(s) 或LCASE(s) | 将字符串s的所有字母转成小写字母 |
LEFT(s,n) | 返回字符串s最左边的n个字符 |
RIGHT(s,n) | 返回字符串s最右边的n个字符 |
LPAD(str, len, pad) | 用字符串pad对str最左边进行填充,直到str的长度为len个字符 |
RPAD(str ,len, pad) | 用字符串pad对str最右边进行填充,直到str的长度为len个字符 |
LTRIM(s) | 去掉字符串s左侧的空格 |
RTRIM(s) | 去掉字符串s右侧的空格 |
TRIM(s) | 去掉字符串s开始与结尾的空格 |
TRIM(【BOTH 】s1 FROM s) | 去掉字符串s开始与结尾的s1 |
TRIM(【LEADING】s1 FROM s) | 去掉字符串s开始处的s1 |
TRIM(【TRAILING】s1 FROM s) | 去掉字符串s结尾处的s1 |
REPEAT(str, n) | 返回str重复n次的结果 |
REPLACE(str, a, b) | 用字符串b替换字符串str中所有出现的字符串a |
STRCMP(s1,s2) | 比较字符串s1,s2 |
SUBSTRING(s,index,len) | 返回从字符串s的index位置其len个字符 |
数学函数
函数操作符 | 方法描述 |
---|---|
ABS(x) | 返回x的绝对值 |
CEIL(x) | 返回大于x的最小整数值 |
FLOOR(x) | 返回大于x的最大整数值 |
MOD(x,y) | 返回x/y的模 |
RAND(x) | 返回0~1的随机值 |
ROUND(x,y) | 返回参数x的四舍五入的有y位的小数的值 |
TRUNCATE(x,y) | 返回数字x截断为y位小数的结果 |
SQRT(x) | 返回x的平方根 |
POW(x,y) | 返回x的y次方 |
日期时间函数
函数操作符 | 方法描述 |
---|---|
current_date() | 获取当前日期,如 2019-10-18 |
current_time() | 获取当前时:分:秒,如:15:36:11 |
now() | 获取当前的日期和时间,如:2019-10-18 15:37:17 |
WEEK(date) WEEKOFYEAR(date) | 返回一年中的第几周 |
DAYOFWEEK() | 返回周几,注意:周日是1,周一是2,。。。周六是7 |
WEEKDAY(date) | 返回周几,注意,周1是0,周2是1,。。。周日是6 |
DAYNAME(date) | 返回星期:MONDAY,TUESDAY…SUNDAY |
MONTHNAME(date) | 返回月份:January,。。。。。 |
DATEDIFF(date1,date2) TIMEDIFF(time1, time2) | 返回date1 - date2的日期间隔 返回time1 - time2的时间间隔 |
DATE_ADD(datetime, INTERVALE expr type) | 返回与给定日期时间相差INTERVAL时间段的日期时间 |
DATE_FORMAT(datetime ,fmt) | 按照字符串fmt格式化日期datetime值 |
STR_TO_DATE(str, fmt) | 按照字符串fmt对str进行解析,解析为一个日期 |
流程函数
函数操作符 | 方法描述 |
---|---|
IF(value,t ,f) | 如果value是真,返回t,否则返回f |
IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2 … [ELSE resultn] END | 相当于Java的if…else if… |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 … [ELSE 值n] END | 相当于Java的switch |
聚合函数
函数操作符 | 方法描述 |
---|---|
max(列名) | 求这一列的最大值 |
min(列名) | 求这一列的最小值 |
avg(列名) | 求这一列的平均值 |
count(列名) | 统计这一列有多少条记录 |
sum(列名) | 对这一列求总和 |
分组函数
语法:
GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。
SELECT 字段1,字段2... FROM 表名 [where 条件] GROUP BY 列 [HAVING 条件];.
< 分组的目的就是为了统计,一般分组会跟聚合函数一起使用 >
注意事项:
- 根据某一列进行分组, 将分组字段结果中相同内容作为一组; 有几组 返回的记录就有几条
- 单独分组 没有意义, 返回每一组的第一条记录
- 分组的目的一般为了做统计使用, 所以经常和聚合函数一起使用
- 在分组里面, 如果select后面的列没有出现在group by后面 展示这个组的这个列的第一个数据
连接查询
内连接:
隐式内连接: select … from 表1,表2 where 外键字段的值 = 主表主键的值 and 条件…;
显式内连接: select … from 表1 inner join 表2 on 外键字段的值 = 主表主键的值 [where 条件];
外连接:
左外连接: select … from 左表 left [outer] join 右表 on 外键字段的值 = 主表主键的值 [where 条件];
右外连接: select … from 左表 right [outer] join 右表 on 外键字段的值 = 主表主键的值 [where 条件];
子查询:
子查询的结果是一个值: select … from 表名 where 字段 (= > < >= <= <>) (子查询);
子查询的结果是单列多行: select … from 表名 where 字段 in (子查询);
子查询的结果是多列多行:
select … from (子查询) 别名 where 条件;
select … from (子查询) 别名,表名 别名 where 条件;
select … from (子查询) 别名 left join 表名 别名 on 条件;
select … from (子查询) 别名 right join 表名 别名 on 条件;