MySQL
MySQL常用操作
字符串
LENGTH(FName) 计算字符串长度 LENGTH(FName)
LOWER(FName) 字符串转换成小写
UPPER(FName) 字符串转换成大写
LTRIM(‘ abc ‘) 截去字符串左侧空格
RTRIM(‘ abc ‘) 截去字符串右侧空格
TRIM(‘ abc ‘) 截去字符串两侧空格
SUBSTRING(string,start_position,length) 截取子串 SUBSTRING(string,开始位置,截取长度)
INSTR(FName,‘m‘) 计算‘m‘在字段中的位置 都是从1开始
LEFT(FName,3) 从左开始截取子串 LEFT(FName,截取的位数)
RIGHT(FName,3) 从右侧开始截取子串 RIGHT(FName,截取的长度)
REPLACE(FName,‘i‘,‘e‘) 字符串替换 将指定字符替换成新的字符 若要删除子串将之替换成空字符串即可REPLACE(FName,‘m‘,‘‘)
REPLACE(‘ abc 123 wpf‘,‘ ‘,‘‘) 删除字符串中间的空格(trim的三个函数无法实现)
ASCII(‘abc‘) 得到字符串的ASCII码,若为多个字符则返回第一个的ASCII码
CHAR(56) 得到一个ASCII码对应的字符
-- 实际案例
FIND_IN_SET( ‘a‘,‘a,b,c‘ ) 判断一个字符串是否在另一个字符串中,存在返回索引1开始,不存在返回0 是完全匹配,用,分割
select FIND_IN_SET( ‘ab‘,‘ab,c‘ ),FIND_IN_SET( ‘a‘,‘ab,c‘ ),FIND_IN_SET( ‘a‘,‘a,c‘ ),FIND_IN_SET( ‘a,b‘,‘a,b,c‘ ),FIND_IN_SET( ‘1‘,‘2,1,3‘ )
-- 1 0 1 0 2
用于一个告警字段解决所有告警,如 告警规则:1(14:30告警),2(20:00) 如有多个时间告警,使用,分隔写入,如 1,2,3 使用FIND_IN_SET()匹配规则
字符串截取实现split的功能
日期
日期:年月日
时间:时分秒
日期时间:年月日 时分秒
时间戳:毫秒数
1.获取日期时间
得到当前日期时间 NOW(),别名:SYSDATE(),CURRENT_TIMESTAMP 2008-01-12 01:13:19
得到当前的日期 CURDATE(),CURRENT_DATE 2008-01-12
得到当前时间 CURTIME(),CURRENT_TIME 01:17:09
一天的开始时间 date_format(curdate(),‘%Y-%m-%d %H:%i:%s‘)
2.日期增减
DATE_ADD (date,INTERVAL expr type) 别名:ADDDATE() expr type:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER(季度),YEAR
DATE_ADD(FBirthDay,INTERVAL 2 MONTH) 也可为负数表示之前
若想增加3天2小时分钟 DATE_ADD(date,INTERVAL ‘3 2:10‘ DAY_MINUTE)
计算指定日期前的特定时间段的日期 DATE_SUB() ,与DATE_ADD()中参数为负数时效果一样,用法也几乎相同
DATE_SUB(FBirthDay, INTERVAL ‘3 2:10‘ DAY_MINUTE) 3天2小时分钟前的时间
3.计算日期差额
DATEDIFF((date1,date2) 只能计算两个日期见的天数差额
DATEDIFF(FRegDay, FBirthDay)/7 周数差额
计算时间差值 TIMESTAMPDIFF(interval,datetime_start,datetime_end) 根据不同的interval返回不同的时间间隔单位(前小返回正,前大返回负)
interval:
SECOND 秒 SECONDS
MINUTE 分钟 MINUTES
HOUR 时间 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
4.计算一个日期是星期几
DAYNAME(FBirthDay) 返回英文的日期表示法
5.指定日期格式化
DATE_FORMAT(date,format)
format:
%S 秒数(00..59)
%H 24小时制的小时 (00..23)
%d 当月的第几天,两位数字,不足补零
%m 两位数字表示的月份(00..12)
%Y 年份数,四位数字
%h 12小时制的小时(01..12)
%i 数字形式的分钟(00..59)
%j 日期在当年中的天数(001..366)
%M 月份名(January..December)
%p 上午还是下午(AM.. PM)
%r 12小时制时间,比如08:09:29 AM
%s 秒数(00..59)
%T 时间,24小时制,格式为hh:mm:ss
%U 所属周是当年的第几周,周日当作第一天(00..53)
%u 所属周是当年的第几周,周一当作第一天(00..53)
%V 所属周是当年的第几周,周日当作第一天(01..53)
%v 所属周是当年的第几周,周一当作第一天(01..53)
%W 星期几(Sunday..Saturday)
%w 星期几,数字形式(0=Sunday..6=Saturday)
%X 本周所属年,周日当作第一天
%x 本周所属年,周一当作第一天
%y 年份数,两位数字
转换函数
MYSQL中提供了CAST()函数和CONVERT()函数用于进行类型转换
CAST(expression AS type) CONVERT(expression,type)
type: CHAR 字符串,DATE日期,DATETIME时间日期,TIME时间,SIGNED INTEGER有符号整数(缩写SIGNED),UNSIGNED INTEGER无符号整数(缩写UNSIGNED)
CAST(‘123.456‘ as decimal) 将会得到 123(小数点后面的将会被省略掉)
CAST(‘123.456‘ as decimal(38, 2)) ===>123.46
string转时间
其中第1要在一个“宽松”的语法是被允许的:以任何标点符号作为日期部分和时间部分中的定界符,如:
一个 YYYYMMDD 或 YYMMDD 格式的数字,只要数字看起来像是一个日期。
例如,19830905 和 830905 被解释成为 ‘1983-09-05 ‘。
String转date
DATE(Str)
string转timestamp
TIMESTAMP(Str)
TIMESTAMP(CONCAT(date_id,hour_id,minute_id,‘00‘))
插入或更新 replace
- replace into
- replace into set
- replace select
举一个实际工作中的例子:定时扫描hive元数据库中的表分区及大小,汇总成表的总大小后写入到MySQL中。粒度为每天一条记录,但为了尽可能的体现表的最新大小,且不至于占用太多的资源,方案定为每天扫描6次,每4小时扫描写入一次。
其插入更新的操作可以交由数据库来完成,也可以交由程序代码来完成。下面记录的是交由数据库来完成的实现方案:
MySQL常用操作及语句