常用函数
字符串函数
函数 | 作用 |
CONCAT(s1,s2,s3…) | 连接s1到sn的字符串(任何字符串和null拼接都是null) |
insert(str,x,y,instr) | 将字符串str从x位置开始,y字符长的子串替换为字符串instr |
lower(str) | 将字符串str中所有字符变为小写 |
UPPER(str) | 大写 |
LEFT(str,x) | 返回字符串str最左边x个字符 |
RIGHT(str,x) | 返回字符串str最右边的x个字符 |
LPAD(str,n,pad) | 用字符串pad对str最左边进行填充,直到长度为n个字符串长度 |
PRPAD(str,n,pad) | 用字符串pad对str最右边进行填充,直到长度为n个字符串长度 |
LTRIM(str) | 去掉字符串str左侧的空格 |
RIGHT(str) | 去掉字符串str行尾的空格 |
REPEAT(str,x) | 返回str重复x次的结果 |
REPLACE(Str,a,b) | 用字符串b替换字符串str中所有出现的字符串a |
(STRCMPs1,s2) | 比较字符串s1和s2 |
TRIM(str) | 去掉行尾和行头的空格 |
SUBSTRING(str,x,y) | 返回字符串str x位置起y字符串长度的字串 |
数字函数
函数 | 功能 |
ABS(X) | 返回x的绝对值 |
CEIL(X) | 返回大于x的最小整数值 |
FLOOR(X) | 返回小于x的最大整数值 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0-1内的随机值 |
ROUND(x,y) | 返回参数x的四舍五入的有y位小数的值 |
TRUNCATE(x,y) | 返回数值x截断为y位小树的结果 |
函数 | 功能 |
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 |
UNIX_TIMESTAMP(date) | 返回date的unix时间戳 |
FROM_UNIXTIME | 返回UNIX时间戳的日期值 |
WEEK(date) | 返回日期date为一年中的第几周 |
YEAR(date) | 返回日期date的年份 |
HOUR(time) | 返回time的小时值 |
MINUTE(time) | 返回time的分钟值 |
MONTHNAME(date) | 返回date的月份名 |
DATE_FROMATE(date,fmt) | 返回按字符串fmt格式化日期date值 |
DATE_ADD(date,interval expr type) | 返回一个日期或时间值加上一个时间间隔的时间值 |
DATEDIFF(expr,expr2) | 返回起始时间expr和结束时间expr2之间的天数 |
流程函数
函数 | 功能 |
IF(value,t f) | 如果value是真 返回 t;否则返回f |
IFNULL(value1,value2) | 如果value1不为空,返回value1,负责返回value2 |
CASE WHEN[value1] THEN[value2]…ELSE[default] END | 如果value1是真,返回result1否则返回defalut |
case [expr] WHEN[value1] THEN[value2]…ELSE[default] END | 如果expr等于value1,返回result1否则返回defalut |
实例
create table salary(userid int ,salary decimal(9,2)); insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null); select * from salary select if(salary>2000,'high','low') from salary; select ifnull(salary,0) from salary; select case when salary <=2000 then 'low' else 'high' end from salary; 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加密版本 |
MD5() | 返回字符串的md5值 |
MySql引擎
MySql支持的存储引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,用户可以选择不同的数据存储引擎来提高应用的效率
创建表如果不指定存储引擎,系统默认使用默认存储引擎,MySql5.5之前的默认引擎是MyISAM,5.5之后改为InnoDB。如果要修改默认的存储引擎,可以在参数文件中设置default-table-type.
show ENGINES //查看的确支持的存储引擎 //通过增加engine关键字设置新建表的储存引擎z create table ai(i bigint(20)not null auto_increment,primary key(i))engine=innodb default charset=gbk; 通过alter 来修改一个表的存储引擎 ALTER TABLE ai ENGINE =MyISAM;
MyISAM
MyISAM 不支持事务、也不 不支持外键,其优点是速度快,对事务完整性没有要求。以SELECT和INSERT为主的应用基本上都就可以使用这个表
InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
create table autoincre_demo (i smallint not null auto_increment,name varchar(10),primary key(i))engine=innodb; insert into autoincre_demo values(1,'1'),(0,'2'),(null,'3') 如果插入空或者0,则实际插入的将是自动增长后的值。 可以通过以下语句强制设置自动增加列的初始值,默认从1开始,但是该强制的默认值是保留到内存中,如果数据库从起,这个强制的默认值会丢失,就需要数据库启动后重新设置 ALTER TABLE *** auto_increment =n
MEMORY
memory 存储引擎使用存在于内存中的内容来创建表,每个MEMORY表实际对应一个磁盘文件,格式是.fm,MEMORY表的访问非常快,因为它的数据是放在内存中,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会
alter table t2 engine=memory; show TABLE status like 't2' 给memory表创建索引。可以指定hash索引还是btree索引 create index mem_hash using hash on tab_memory(city_id);
存储过程和函数的相关操作.
在对储存过程和函数操作时,需要首先确认用户是否具有相应的权限。例如,创建存储过程或者函数需要CREATE ROUTINE权限,修改或者删除存储过程或者函数需要ALTER ROUT
INE权限,执行过程或者函数需要EXECUTE权限
创建一个新的过程 film_in_stock,该过程用来检查 film_id和store_id对应的inventory是否满足要求,并且返回满足的inventory_id 以及满足要求的记录数 CREATE PROCEDURE film_in_stock(in p_fim_id int,in p_store_id int,out p_film_count int) READS sql data begin select inventory_id from inventory where film_id =p_film_id and store_id=p_store_id and inventory_in_stock(inventory_id); SELECT found_rows() into p_film_count; end $$ 通常在创建过程和函数之前,都会通过DELIMITE $$命令将语句的结束符从';'修改成其他符号,这里使用‘$$’,这样在过程和函数中的 ';'就不会被MySql,解释成语句的结束而错误。在存储过程或者函数创建完成 通过‘DELIMITER;'命令在将结束符改回成';' 调用过程 CALL film_in_stock(2,2,@a); 存储过程的好处在于处理逻辑都封装在数据库端,调用者不需要了解中间的处理逻辑,一旦逻辑改变,只需要修改存储过程,对调用者的程序没有影响 删除存储过程或者函数 一次只能删除一个存储过程或者函数,删除需要ALTER ROUTINE权限 drop procedure film_in_stock; 查看存储过程或者函数状态 show procedure status like 'film_in_stock'; 查看存储过程的函数定义 show create procedure film_in_stock 变量使用 存储过程和函数中可以使用变量,在MySql 5.1版本中,变量不区分大小写 变量的定义 通过DECLARE可以定义一个局部变量,该变量的作用范围只能在BEGIN...END中,可以用在嵌套块中 定义一个DATE类型的变量 DECLARE last_month_start date; 变量赋值 可以直接赋值,或者通过查询赋值。直接赋值使用set,可以赋常量或者赋表达式 set var_name=expr [,var_name=expr]... set last_month_start=date_sub(current_date(),interval month); select col_name[,...] into var_name[,...] table_expr;
定义条件和处理
delimiter $$create procedure actor_insert()begin declare continue handler for sqlstate '23000' set @x2=1; set @x=1; insert into actor(actor_id,first_name,last_name) values(201,'test','201'); set @x=2; insert into actor(actor_id,first_name,last_name) values(1,'test','1'); set @x=3;end ;$$ 调用处理函数时遇到主键重的错误会按照定义的处理方式去处理,由于定义的是CONTINUE 会继续执行下面的语句 还支持EXIT表示终止
光标使用
声明光标 declare cursor_name cursor for select_statement open光标 open cursor_name fetch光标 fetch cursor_name into var_name[,var_name]... close光标 close cursor_name delimiter $$ create procedure payment_stat() begin declare i_staff_id int; declare d_amount decimal(5,2); declare cur_payment cursor for select staff_id,amount from payment; declare exit handler for not found close cur_payment; set @x1=0; set @x2=0; open cur_payment; REPEAT FETCH cur_payment into i_staff_id,d_amount; if i_staff_id =2 then set @x1=@x1+d_amount; else set @x2=@x2+d_amount; end if; until 0 end repeat; close cur_payment; end; $$ 变量,条件,处理程序,光标都是通过DECLARE定义的,她们之间是有先后顺序要求的。 变量和条件必须在最前面声明,然后才能是光标的声明,最后才可以是处理程序的声明
控制语句
case when i_staff_id =2 then set @x1=@x1+d_amount; else set @x2=@x2+d_amount;loop 和leave结合create procedure actor_insert()begin set @x=0; ins:loop set @x=@x+1; if @x=100 then leave ins; end if; insert into actor(first_name,last_name) values('Test','201'); end loop ins;end; $$ inerate 语句作用是跳过当前循环的剩下语句,直接进入下一轮循环create procedure actor_insert()begin set @x=0; ins:loop set @x=@x+1; if @x=10 then leave ins; elseif mod(@x,2)=0 then iterate ins; end if; insert into actor(actor_id,first_name,last_name) values(@x+200,'test',@x); end loop ins;end; $$repeat 语句 有条件的循环控制语句,当满足条件的时候退出循环repeat fetch cur_payment into i_staff_id,d_amount; if i_staff_id =2 then set @x1=@x1+d_amount; else set @x2=@x2+d_amount; end if; until 0 end repeat;whiledelimiter $$create procedure loop_demo()begin set @x=1,@x1=1; repeat set @x=@x+1; until @x>0 end repeat; while @x<1 do set @x=@x+1; end while; end; $$//创建事件调度器CREATE EVEN test_event_1 ON SCHEDULE EVERY 5 SECONDDOINSERT INTO dept(deptno,deptname) VALUES(3,'3');//查看本地调度器状态 show variables like '%scheduler%'; //打开调度器 set global event_scheduler=1; //查看后台进程 show processlist; //创建一个新的定时器 定时清空表,防止表变大,这类触发器非常适合去定期清空临时表或者日志表 create event trunc_test on schedule every 1 minute do truncate table test; 禁用调度器或者删除 alter event test_event_1 disable; drop event test_event_1;
SQL Mode
在MySql中,SQLMode常用来解决下面几类问题
通过设置SQL Mode,可以完成不同严格程度的数据校验,有效的保障数据准确性。
通过设置SQL Mode,为ANSI模式,来保证大多数SQL符合标准的Sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务SQL进行较大的修改
在不同数据库之间进行数据迁移之前,通过设置SQL Mode可以使MySQL上的数据更方便地迁移到目标数据库中
查看 SQL Mode命令select @@sql_mode 插入一个出国实际定义值的大小varchar(10)insert into value('123400000000000000000000000000000');//查看warning内容show warningsselect * from t 这里对插入的数据 进行截取前10位 设置SQL Mode为 严格模式set session sql_mode='STRICT_TRANS_TABLES'再次插入insert into value('123400000000000000000000000000000'); 直接给出ERROR,而不是 warning SQL Mode常见功能 校验日期是合法性set seesion sql_mode='ANSI'insert into t values('2007-04-31') 结果是 插入值变成'0000-00-00 00:00:00' 并且系统给出warning 而在TRADITIONAL模式下,直接提示日期非法,拒绝插入,同时Mode(x,0)也会报错 qidon NO_BACKSLASH_ESCAPES模式,使反斜杠成为普通字符,在导入数据时,如果数据含有反斜杠字符,你们启动NO_BACKSLASH_ESCAPES模式,保证数据的正确性 启动PIPES_AS_CONCAT。将(北联网教程,专业提供视频软件下载)
……