|
Andy Niu Help
1.0.0.0
|
变量 | |
| Mysql语法注意事项 | |
| Mysql执行动态sql语句 | |
| Mysql游标示例 | |
| mysql循环控制 | |
| mysql的return语句 | |
| 主键 | |
| 索引 | |
| 类型转换 | |
详细描述
变量说明
| mysql循环控制 |
1、使用while
DROP PROCEDURE IF EXISTS `addstudent`;
DELIMITER ;;
CREATE PROCEDURE `addstudent`(iNum int)
BEGIN
declare vI int default 0;
start transaction;
while(vI < iNum) do
insert into student(id,name) values(vI,concat('Andy',vI));
set vI = vI+1;
end while;
commit;
END
;;
DELIMITER ;
2、使用repeat
BEGIN
declare vI int default 0;
start transaction;
repeat
insert into student(id,name) values(vI,concat('Andy',vI));
set vI = vI+1;
until vI >= iNum end repeat;
commit;
END
3、使用loop
BEGIN
declare vI int default 0;
start transaction;
label_insert: LOOP
insert into student(id,name) values(vi,concat('Andy',vi));
set vI = vI+1;
if(vI >= iNum) then
leave label_insert;
end if;
end LOOP label_insert;
commit;
END
4、考虑下面的需求,在编程语言中循环控制中有continue,如何实现continue的功能?
使用 iterate label_insert; 对于LOOP如下:
BEGIN
declare vI int default 0;
start transaction;
label_insert: LOOP
if(vI=2) then
set vI = vI+1;
iterate label_insert;
end if;
insert into student(id,name) values(vi,concat('Andy',vi));
set vI = vI+1;
if(vI >= iNum) then
leave label_insert;
end if;
end LOOP label_insert;
commit;
END
5、注意:对于while和repeat也是同样的道理,但是需要在while和repeat 前面增加一个标签,表示再次循环的位置,如下:
label_insert: while
label_insert: repeat
mysql中暂时没有for循环。
| Mysql执行动态sql语句 |
DROP PROCEDURE IF EXISTS `exe_dynamic_sql`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `exe_dynamic_sql`(iDynamicSql TEXT)
BEGIN
set @exeSql = iDynamicSql;
prepare stmt from @exeSql;
execute stmt;
deallocate prepare stmt; -- 释放掉预处理段
END
;;
DELIMITER ;
| Mysql游标示例 |
BEGIN
declare vPartitionName varchar(32) default '';
declare vIsOver int default 0;
declare vCursorPartitionName cursor for select partition_name from information_schema.partitions where table_name='alarmlog';
declare continue handler for sqlstate '02000' set vIsOver = 1;
open vCursorPartitionName;
fetch vCursorPartitionName into vPartitionName;
while(vIsOver = 0) do
-- do sth
fetch vCursorPartitionName into vPartitionName;
end while;
close vCursorPartitionName;
END
- 参见
| mysql的return语句 |
1、mysql存储过程没有return语句,怎么办?
2、使用变通的办法,在BEGIN处打一个标签,leave这个标签,就等价于return,如下:
label_1:BEGIN
if(i > 5) then
leave label_1;
end if;
select "aaa";
END
3、注意:标签一般只能打在begin和loop
| Mysql语法注意事项 |
1、名称在前,类型在后 2、中划线与下划线有时候是等价的 3、value与values有时候是等价的
| 主键 |
1、创建主键
alter table t1 add primary key(c1);
2、删除主键
alter table t1 drop primary key;
3、查看主键
show index from t1;
或者
desc t1;
| 类型转换 |
1、类型转换有两种方法,如下:
mysql> select cast('123' as unsigned integer);
+---------------------------------+
| cast('123' as unsigned integer) |
+---------------------------------+
| 123 |
+---------------------------------+
1 row in set
mysql> select convert('123',unsigned integer);
+---------------------------------+
| convert('123',unsigned integer) |
+---------------------------------+
| 123 |
+---------------------------------+
1 row in set
2、需要注意的是,目标类型只能是下面的类型。
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
3、注意:在Mysql中float,double是非标准的数据类型,在数据库中保存的是近似值。
而decimal是标准的数据类型,Mysql内部用字符串保存decimal,精确地保存它们的值。
4、在mysql中,数值作为字符串,字符串作为数值,不需要特殊转化,mysql会自动识别,并转化,如下:
mysql> select 12.1+13.4;
+-----------+
| 12.1+13.4 |
+-----------+
| 25.5 |
+-----------+
1 row in set
mysql> select '12.1'+'13.4';
+---------------+
| '12.1'+'13.4' |
+---------------+
| 25.5 |
+---------------+
1 row in set
mysql> select concat('12.1','13.4');
+-----------------------+
| concat('12.1','13.4') |
+-----------------------+
| 12.113.4 |
+-----------------------+
1 row in set
mysql> select concat(12.1,13.4);
+-------------------+
| concat(12.1,13.4) |
+-------------------+
| 12.113.4 |
+-------------------+
1 row in set
注意:字符串转换为数值失败,当做0来处理,如下:
mysql> select '12.1'+'aaa';
+--------------+
| '12.1'+'aaa' |
+--------------+
| 12.1 |
+--------------+
1 row in set
5、数值作为字符串,字符串作为数值,不需要特殊转化,如下:
mysql> desc t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| c1 | int(11) | NO | | 0 | |
| c2 | double | YES | | NULL | |
| c3 | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set
mysql> select * from t1;
+----+-------+-------+
| c1 | c2 | c3 |
+----+-------+-------+
| 1 | 12.35 | 12345 |
+----+-------+-------+
1 row in set
// 下面的update语句,数值作为字符串,字符串作为数值,没有问题。
mysql> update t1 set c2='25.6',c3=100 where c1='1';
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t1;
+----+------+-----+
| c1 | c2 | c3 |
+----+------+-----+
| 1 | 25.6 | 100 |
+----+------+-----+
1 row in set
| 索引 |
1、创建索引
alter table t1 add index index_c2(c2);
或者
create index index_c2 on t1(c2);
2、删除索引
alter table t1 drop index index_c2;
或者
drop index index_c2 on t1;
3、查看索引
show index from t1;
或者
desc t1;
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.