SQL(三)——mysql数据生成,转化与操作

一、字符串:

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。

 

转载于:https://my.oschina.net/u/2413865/blog/715304

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值