一、字符串:
mysql中我们对字符串,用单引号括起来表示。以下是我们遇到的常见问题:
1、 当字段不够长时,有两种模式 strict--抛出异常 ANSI 截取字符串
查询模式: select @@session.sql_mode;
设置模式:set sql_mode='ansi';
2、字符串中包括单引号:
用转义字符处理,就是字符串中的引号前加上\
3、包含特殊字符:
很多字符中我们键盘上不能输入的,但我们可以从ACSII字符集中255个字符中任意构建字符串。
select char(148,149,150,152,153);
4、操作字符串:
1)、连接字符串函数:concat() [oracle用 || ]
eg: select concat('wang','xin','chao');
他还有个非常好的用处,就是向已有的字符串后追加字符:
eg: update string_tb1 set text_fld = concat(text_fld, ', but now it is longer');
2)、反查字符的ASCII码:ascii() eg: select ascii('a');
3)、返回字符串的长度:length() eg: select length('vivencet');
4)、返回字符串的位置(如果从任意位置搜索 locate() ):position() 下标从1开始
eg: select position('ven' in 'vivencet');
select locate('ven' ,'vivencet',1);
5)、比较两个字符串:strcmp() like regexp这几个 来操作字符串。
6)、替换字符串的字符:replace(), insert(a,b,c,d)
eg: select replace('goodbye world','goodbye','hello');
select insert('goodbye world',1,7,'hello') string;
7)、 提取字符串:
select substring('goodbye cruel world', 9 ,5) 从第9的位置,提取5个字符串。
结语: 当然各个数据库的内建处理函数是不同的。所以使用时,最好查询当前的文档
二、数值数据
1、算术操作符:+、-、* 、/ 、% 使用括号可以改变他的运算优先级。
2、算术函数:
单参数:
Acos(x)、Asin(x)、Atant(x)、Cos(x)、Cot(x)、Exp(x)、Ln(x)、Sin(x)、Sqrt(x)、Tan(x)
多参数:
(1)、mod(x,y) (等同于%) 求模
select mod(10,4);
(2)、pow(x,y) 表示x的y 次方
3、控制数字精度
(1)、ceil() 向上取整
(2)、floor() 向下取整
eg: select ceil(72.445), floor(72.445);
(3)、round(x,y) 四舍五入
eg:select round(72.0909,2),round(72.0909,-1);
(4)、truncate (x,y)截取字符串
eg:select truncate(72.0909,1),truncate(72.0909,2);
4、处理有符号数字
(1)、sign(x) 判断正负
(2)、abs(x)取得绝对值
eg: select sign(-12.123), abs(-12,123);
三、时间数据
1、处理时区
(1)、GMT
世界各地都把太直射本地的时间作为正午。但为了统一时间,15世纪航海家就把GTM(格林碡威治标准时间)作为标准时间记法,其他时区都可以使用与GMT所差距的小时数来表示。
(2)、UTC
GTM人变种,称为协调世界时。mysql提供了UTC的时间戳utc_timestamp(),他是世界的平均时间,比较我们在东8区。那么我们在utc_timestamp()上加8个小时就是了。 如果你的数据库服务与全世界,那么存入时间就用UTC时间。读取时,你只需要将时间加上你本地时间与存入时间的时差就可以了。
(3)、数据库的时区设置。
mysql 提供了两人个不同时区设置:全局时区与会话时区
查看 : select @@global.time_zone,@@session.time_zone;
或者 show variables like '%time_zone%';
可以通过 set time_zone = '+8:00' ; 可设置系统时间为北京时间(GMT-08:00)
设置完后,可以通过 select now()来查看mysql 时间是不是你设置的时间。
2、日期的数据格式
1、数据格式组件 -- 用它来表示时间数据格式,但不能格式化。
YYYY(年分)、MM(月份)、DD(日)、HH(小时)、HHH(小时过去的)、MI(分钟)、SS(秒)
eg: 三种日期类型对应的数据格式
Date: YYYY-MM-DD
Datetime : YYYY-MM-DD HH:MI:SS
Timestamp : YYYY-MM-DD HH:MI:SS
Time:HHH:MI:SS
2、日期格式部件 -- 用于日期格式化
%Y(4位数字的年份)、%y(两位数据的年份)、%M(月份 1月-12月,英文表示)、%m(月份 01-12)、%d(日序号 0-31 )、%j(日在一年中的序号 001-336 )、%W(明期名称 星期日-星期六,英文表示)、%a(英文表示星期几缩写)、%H(小时 00-23)、%h(01-12)、%i(分钟00-59)、%s(秒钟 0-59)、%f(微秒000000-999999)、%p(A.M 或P.M)
3、时间的格式化函数
将字符串格式化成时间
(1)、date_format('datetimeStr','formatStr')
eg: select date_format('2016-01-12 18:32:12','%Y-%m-%d %H:%i:%s')
select DATE_FORMAT(now(), '%a %M %d')
将bigint格式化成时间
(2)、from_unixtime(bigintNum)
eg : select from_unixtime(1469861992,'%H:%i');
3、生成时间数据
(1)、从date,datetime,time已有列进行复制
(2)、执行返回date、datetime、或 time型数据的内建函数
eg: now() 、current_date()、current_time()、current_timestamp()
(3)、构建可以被服务器识别的代表日期的字符串
a、向数据库存入一条数据时,只要我们的字符串格式满足日期的数据格式,数据库会自动将其转化为时间类型。
eg: insert into temp_course (course_date_time,report_submit) values('2016-08-08 00:00:00',0);
b、字符串转化为时间数据,很多时间,我们数据库时间数据存的是字符串,但我们在查询时需要它作为日期类型(比如:比较大小 ,排序 等等操作)这时就需要我们将字符串转化为日期的格式。
i、cast()
eg: select cast('2016-07-30 13:51:32' as datetime);
select cast('2016-07-30 13:51:32' as date);
select cast('2016-07-30 13:51:32' as time);
字符串的格式必须是严格的时间数据格式,如果不是,则数据通过str_to_date将其排列成严格的格式。
ii、str_to_date('dateStr','formatStr')
eg: select str_to_date('2016-07-21 20:23:14','%Y-%m-%d %H:%i');
select str_to_date('2016-07-23 22:30:12','%H:%i');
iii、from_unixtime(x)
如果是bigint的数据类型,则需要将其转化这对应的时间字符串。其中bigint记录的为从1970-01-01 00:00:00到现在的秒数,且它可以表示的范围为1970到2038。
eg: select from_unixtime(1469861992);
select from_unixtime(1469861992,'%H:%i');
当然这个过程是可逆的:可以将时间字符串转化成bigint.
eg: select unix_timestamp('2016-07-30 16:30:00');
4、操作时间数据
(1)、date_add(x,y) 间隔某个单位后的时间 --返回日期类型数据
eg: select date_add(current_date(), interval '2' day);
'2' 为时间间隔字符串 day为时间间隔元素类型,以下是常用时间间隔类型:
second、minute、hour、week、day、month、year、minute_second(mysql特有)、hour_second(mysql特有)、year_month(mysql特有)
eg: select date_add(now(),interval '2:10:00' hour_second); //现在2小时10分钟后的时间
其中current_date()间隔类型只能是day ,now() 可以是任何类型。
(2) 、date_sub(x,y) 间隔单位时间前的 时间 -- 返回日期类型数据
与(1)的计算间隔方式相反,其他的一样。
(3)、last_day(x) 返回这个月的最后一天的日期(针对二月份,底层自动计算了润年这些,包括大小月都作了处理)--返回日期类型数据
eg: select last_day(now());
(4)、convert_tz(x,y,z) 日期与你需要的不在同一个时区,需要通过他转化成你需要的时区日期
eg: select convert_tz('2016-7-30 14:55:00','-6:00','UTC'); //与现在时间相比,早6个时区 2016-7-30 20:55:00
eg: select convert_tz(now(), 'US/Eastern' ,'UTS') // 将现在的时间,转化成对应时区的时间
(5)、extract(x) 提取时间中需要的元素 -- 返回的为字符串类型数据
eg: select extract(day from now()); day为时间元素类型
select extract(Hour_second from now()); //返回150457
(6)、dayname(x) 返回星期几 -- 返回字符串类型数据
eg: select dayname(now());
(7)、datediff(datetime1,datetime2) 返回两个时间相隔的天数。-- 返回整型数据类型
eg: select datediff(now(),'2017-07-30');
(8)、timestampdiff(unit, time1,time2) //返回两个数时间 间隔(time2-time1)的单位数量值,其中unit为时间间隔元素类型,不支持上面的mysql特有的,但支持quarter (季度) --返回整型数据类型
eg: select timestampdiff(hour,'2016-07-30 00:00:00',now());
select timestampdiff(minute, '2016-07-30 15:50:00',now());
select timestampdiff(quarter,'2016-01-01 00:00:00',now());
(9)、unix_timestamp()将时间转化成对应的bigint类型。
eg: select unix_timestamp(now());
四、数据类型转换
(1)、cast()
eg: select cast('12355' as signed integer);
SELECT CAST('3.35' as DECIMAL(40,20) );
select cast('123abc' as unsigned integer); //不全是数据,则转到不是数字为止,第一个不是数据则返回0。