MySQL数据库概述
数据库存储方式
- 人工存储
- 文件系统阶段
- 数据库系统阶段
数据库SQL语言
- SQL(Structured Query Language) 结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据
- SQL语言分为三个部分:
- DDL 数据定义语言(definition)
create table - DMl 数据操作语言(manipulation)
select insert update delect table - DCL 数据控制语言(control)
grant revoke
- DDL 数据定义语言(definition)
为什么使用MySQL
开放源代码的数据
mysql的跨平台性
价格优势
功能强大使用方便
MySQL数据类型
整数
tinyint(4) smallint(6) mediumint(9) int(11) bingint(20)
浮点数
float double decimal(m,d) m代表总长度 d代表小数点后精确到d位
日期和时间
year 年
date 日期
time 时间 格式为:hh:mm:ss
datetime 日期时间
timestamp 时间(时区),范围小,支持时区 datetime 最通用,year,date,time可以省略一些空间
字符串
char(m) 指定长度的字符串
varchar(m) 不定长度的字符串
tinytext
text 文本
mediumtext
longtext
二进制
binary(m)
varbinary(m)
bit(m)
tinyblob
blob 字节类型 适合存图片
mediumblob
longblob
操作数据库
登录 mysql -h localhost -uroot -proot
- 显示 创建 删除数据库
show databases;
create database xxx;
drop database xxx;
use db_name 使用某个数据库
drop 删除数据库 - 新建用户
create user name identified by “ssapdrow” - 数据库存储引擎
show variables like “%engine%”
创建数据库
create database 数据库名;
create database day14;创建数据库时指定字符集
create database day14 character set gbk;- show databases
查看当前所有数据库 - use employees
使用一个数据库
查看服务器上所有的数据库
show databases;
查看创建数据库的代码
show create database 数据库名;
show create database day13;
修改某个数据库的编码
alter database 数据库名 character set 字符编码 COLLATE 字符集的校验规则;
alter database day13 character set utf8 collate utf8_general_ci;
删除数据库
drop database 数据库名;
drop database day13;
使用某个数据库 (将来建表都放在这个库中)
use 数据库名;
use day13;
操作数据表
创建表
语法
1
2
3
4
5
6
7
8
create table 表名(
属性名 数据类型[完整性约束],
属性名 数据类型[完整性约束],
。。。
属性名 数据类型
);
可以增加主键 和自增长
primary key auto_increment(int类型,主键)
- 显示当前数据库下所有数据表
show tables - 查看创建表的代码
show create table 表名; - 查看表的字段
desc 表名 (以列表的形式显示出结果) - 完整性约束
primary key 主键
foreign key 外键
not null 不能为空
unique 唯一索引
auto_increment 自动增加
default 默认值设置表的主键
- 单字段主键
属性名 数据类型 primary key
stu_id int primary key, 多字段主键
primary key(属性1,属性2…属性n)1
2
3
4
5
6CREATE TABLE student(
stu_id INT,
course_id INT,
grade FLOAT,
PRIMARY KEY(stu_id, course_id)
);创建表之后添加主键
alter table 表名 add primary key (列名)设置表的外键
在创建表的时候添加
1
CONSTRAINT 外键别名 FOREIGN KEY (属性1.1, 属性1.2,…, 属性1.n) REFERENCES 表名(属性 2.1, 属性2.2,…, 属性2.n)
在创建表之后添加
1
alter table 表名 add constarint FK_employee_dept_id foreign key(dept_id) references departement(id)
使用子查询创建表
create table emp1 as
select * from employees;
设置表的非空约束
属性名 数据类型 not null
设置表的唯一性约束
属性名 数据类型 unique
设置表的属性值自动增加
属性名 数据类型 AUTO_INCREMENT
设置表的属性的默认值
属性名 数据类型 default 默认值
查询表
查看表基本结构
DESC 表名
修改表
修改表名
ALTER TABLE 旧表名 RENAME [TO] 新表名;
字段的数据类型
- 修改字段的数据类型 (列)
alter table 表名 modify 属性名 数据类型;
alter table user modify name varchar(30); - 增加字段及数据类型 (列)
alter table 表名 add 属性名1 数据类型 [完整性约束] [first|after 属性2] - 删除字段 (列)
alter table 表名 drop 属性名; - 改变字段数据类型 (列)
alter table 表名 change 旧属性名 新属性名 新数据类型 - 修改表的字符集
alter table 表名 character set 字符集编码 - 添加一列
alter table 表名 add 列名 类型 - 删除表的外键约束
alter table 表名 drop foreign key 外键别名; - 删除表
drop table 表名;
当需要删除被其他表关联的表时,需要先删除外键然后在删除该表
插入数据
- 所有字段插入数据
1、INSERT语句中不指定具体的字段名
insert into 表名 values (值1,值2…值 n)
2、INSERT语句中列出所有字段
insert into 表名 (属性1,属性 2…属性n) values (值1,值2…值n) - 插入指定字段
insert into 表名 (属性1,属性2,属性3) value (值1,值2,值3) - 同时插入多条数据
1
2
3
4insert into 表名
(属性1,属性2,属性3) values (值1,值2,值3),
(属性1,属性2,属性3) values (值1,值2,值3),
(属性1,属性2,属性3) values (值1,值2,值3);
更新数据
update 表名
set 属性1 = 值1,属性2 = 值2,...
where 条件表达式;
删除数据
delete from 表名 [条件表达式];
truncate table 表名 [条件表达式];
- 区别:
- truncate table 删除数据效率更高(先摧毁整个表结构,再重建表)
- delete 删除所有记录时,一条一条往后删除
- truncate table只能删除所有
- delete可以选择性的删除部分记录
数据查询
基本查询语句
select 属性列表
from 表名和视图列表
[where 条件表达式1]
[group by 属性名 1 [having 条件表达式2]]
[order dy 属性名2[asc|desc]]
limit 限制查询的个数(分页)
单表查询
- 查询所有列
select * from 表名
- 查询指定字段
select 列名1,列名2 from 表名 - 查询指定记录
where 条件表达式
=,>,<,!组合查询
[not] between and (不)在…之间
[not] in 在… 里面
[not] like %(匹配零个或多个) _(匹配一个)
is [not] null
and ,or 条件查询
select distinct 属性名 去除重复
order by 属性名 [asc|desc] 排序
GROUP BY, GROUP_CONTACT()凼数非常好用
SELECT sex, GROUP_CONTACT(name) FROM employee GROUP BY sex;
GROUP BY不WITH ROLLUP一起使用,多一行,加统计
SELECT sex COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;
LIMIT [刜始位置,] 记录数 - mysql 中+的作用
运算符
如果两个操作数都为数值型,则做加法运算
如果一方为字符串,将字符串转化为数值型 - 内连接
select a.*,b.* from a,b where a.xid = b.id
或者 select a.*,b.* from a inner join b on a.xid = b.xid - 外连接
select 属性名列表 from 表名1 left|right join 表名2 on 表名1.属性1 = 表名2.属性2;左外连接 left join 左表全记录,右表符合条件
右外连接 right join 由表全记录 左表符合条件子查询
把一个查询的结果在另一个查询中使用就叫子查询 - in or not in
- exists or not exists (不)存在 子查询返回真假值(true|false)
- any 任意一个值
all 满足所有条件
合并查询
select 语句1
union | union ALL
select 语句2
…
union 所有查询结果合并到一起,去掉重复项
union ALL 简单合并为表和字段取别名
表名 表的别名
属性名 [as] 属性的别名使用正则表达式查询
属性名 regexp “匹配方式”
^ 字符串开始
$ 字符串结束
. 任意一个字符 包括回车和换行
[字符集合] 任意一个字符
s1|s2|s3 集合中的任意一个- 匹配多个
匹配一个或者多个
字符串{n} 字符串出现的次数为n
字符串{m,n} 字符串出现至少m次,至多n次select * from student where sname regexp ‘ab{1,3}’
函数
- 算术函数
abs() 取绝对值
mod() 取余
sum()
avg()
max()
min()
ceil() 向上取整
floor() 向下取整
truncate() 截取多少位数字
round() 四舍五入为指定小数位数需要有两个参数 * 字段名称 * 小数位数
- 字符串函数
concat() 字符串拼接
length() 字段长度 汉字三个字符
char_length() 字段长度 汉字一个字符
lower() 将字符串中的字符转化为小写
upper() 将字符串中的字符转化位大写
replace(字段名,需要替换的字符串,替换字符串对象) 替换函数
substr(字段名,开始位置,长度) 截取字符串
instr() 获取指定字符串的下标
注意:mysql中下标从1开始 - 日期函数
now()系统现在的时间
current_date() 系统当前时间 YYYY:MM:DD
current_time() 系统当前时间 hh:mm:ss
current_timestamp() 系统当前时间
extract() 年月日
date() 日期
year() 年份
month() 月份
day() 天数
hour() 小时
minute() 分钟
second() 秒 - 条件判断函数
if(expr ,v1,v2)
ifnull(v1,v2)
如果不是NULL,则返回第一个参数。 否则,IFNULL函数返回第二个参数。 - 统计函数
count()计数
sum()总和
max()最大值
min()最小值
avg()平均值
事物
Transaction Control Language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
- 事务的特性:
ACID
- 原子性:
一个事务不可再分割,要么都执行要么都不执行- 一致性:
一个事务执行会使数据从一个一致状态切换到另外一个一致状态- 隔离性:
一个事务的执行不受其他事务的干扰- 持久性:
一个事务一旦提交,则会永久的改变数据库的数据.
事务的创建
隐式事务
事务没有明显的开启和结束的标记
比如insert、update、delete语句
delete from 表 where id =1;
显式事务:
事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0;
- 开启事务
set autocommit=0;
start transaction;可选的 编写事务中的sql语句(select insert update delete)
语句1;
语句2;
…结束事务
commit;提交事务
rollback;回滚事务
savepoint 节点名;设置保存点事务的隔离级别:
事物 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
mysql中默认 第三个隔离级别 repeatable read
oracle中默认第二个隔离级别 read committed
- 查看隔离级别
select @@tx_isolation;- 设置隔离级别
set session|global transaction isolation level 隔离级别;
案例
演示事务的使用步骤
1
2
3
4
5
6
7
8
9
10
11
12#开启事务
SET autocommit=0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 1000 WHERE username='张无忌';
UPDATE account SET balance = 1000 WHERE username='赵敏';
#结束事务
ROLLBACK;
#commit;
SELECT * FROM account;演示事务对于delete和truncate的处理的区别
1
2
3
4
5SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;演示savepoint 的使用
1
2
3
4
5
6
7
8SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滚到保存点
SELECT * FROM account;
视图
含义:虚拟表,和普通表一样使用
mysql5.1版本出现的新特性,是通过表动态生成的数据
比如:舞蹈班和普通班级的对比
区别 | 创建语法的关键字 | 是否实际占用物理空间 | 使用 |
---|---|---|---|
视图 | create view | 只是保存了sql逻辑 | 增删改查,只是一般不能增删改 |
表 | create table | 保存了数据 | 增删改查 |
创建视图
语法:
create view 视图名
as
查询语句;
- 例子
1
2
3
4
5
6
7
8
9
10创建
CREATE VIEW myv3
AS
SELECT * FROM myv2 ORDER BY ag LIMIT 1;
使用
SELECT d.*,m.ag
FROM myv3 m
JOIN departments d
ON m.`department_id`=d.`department_id`;
视图的修改
- 方式一:
1
2
3create or replace view 视图名
as
查询语句;
- 例子
1
2
3
4
5
6
7SELECT * FROM myv3
CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
- 方式二
1
2
3
4语法:
alter view 视图名
as
查询语句;
- 例子
1
2
3ALTER VIEW myv3
AS
SELECT * FROM employees;
删除视图
语法:drop view 视图名,视图名,…;
DROP VIEW emp_v1,emp_v2,myv3;
查看视图
DESC myv3;
SHOW CREATE VIEW myv3;
视图的更新
1 | CREATE OR REPLACE VIEW myv1 |
- 注意
具备以下特点的视图不允许更新
- 包含以下关键字的sql语句:
分组函数、distinct、group by、having、union或者union all - 常量视图
- select中包含子查询
- join
- from一个不能更新的视图
- where子句的子查询引用了from子句中的表
变量
系统变量
变量由系统定义,不是用户定义,属于服务器层面
- 查看所有系统变量
show global | session variables; - 查看满足条件的部分系统变量
show global | session variables like ‘%char%’; - 查看指定的系统变量的值
select @@global | session 系统变量名; - 为某个系统变量赋值
- 方式一
set gobal | session 系统变量名 = 值 - 方式二
set @@global | session 系统变量名=值;
- 方式一
全局变量
全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
作用域:针对于所有会话(连接)有效,但不能跨重启
- 查看所有全局变量
SHOW GLOBAL VARIABLES; - 查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE ‘%char%’; - 查看指定的系统变量的值
SELECT @@global.autocommit; - 为某个系统变量赋值
- SET @@global.autocommit=0;
- SET GLOBAL autocommit=0;
会话变量
作用域:针对于当前会话(连接)有效
- 查看所有会话变量
SHOW SESSION VARIABLES; - 查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE ‘%char%’; - 查看指定的会话变量的值
- SELECT @@autocommit;
- SELECT @@session.tx_isolation;
- 为某个会话变量赋值
- SET @@session.tx_isolation=’read-uncommitted’;
- SET SESSION tx_isolation=’read-committed’;
自定义变量
变量由用户自定义,而不是系统提供的
使用步骤:
1、声明
2、赋值
3、使用(查看、比较、运算等)
用户变量
作用域:针对于当前会话(连接)有效,作用域同于会话变量
赋值操作符:=或:=
- 声明并初始化
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
- 赋值(更新变量的值)
- 方式一:
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值; - 方式二:
SELECT 字段 INTO @变量名
FROM 表; - 使用(查看变量的值)
SELECT @变量名;局部变量
作用域:仅仅在定义它的begin end块中有效
应用在 begin end中的第一句话
- 声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 【DEFAULT 值】;
- 赋值(更新变量的值)
- 方式一:
SET 局部变量名=值;
SET 局部变量名:=值;
SELECT 局部变量名:=值; - 方式二:
SELECT 字段 INTO 具备变量名
FROM 表; - 使用(查看变量的值)
SELECT 局部变量名;
案例
案例1:声明两个变量,求和并打印
1
2
3
4
5
6
7
8
9
10
11
12#用户变量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;
#局部变量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 1;
DECLARE SUM INT;
SET SUM=m+n;
SELECT SUM;用户变量和局部变量的对比
名字 | 作用域 | 定义位置 | 语法 |
---|---|---|---|
用户变量 | 当前会话 | 会话的任何地方 | 加@符号,不用指定类型 |
局部变量 | 定义它的BEGIN END中 | BEGIN END的第一句话 | 一般不用加@,需要指定类型 |
存储过程
存储过程和函数:类似于java中的方法
好处:
1、提高代码的重用性
2、简化操作
存储过程
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
创建存储过程
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
- 注意
- 参数列表包含三部分
参数模式 参数名 参数类型
eg: in stuname varchar(20)
参数模式:
in: 该参数可以作为输入,也可以作为该参数需要调用方传入值
out:作为输出,返回值
inout: 既可以作为输入也可以作为输出 ,也就是该参数既需要传入值,又可以返回值 - 如果存储过程体仅仅只有一句话,begin end可以省略
- 存储过程体中的每条sql语句的结尾要求必须加分号。
- 存储过程的结尾可以使用 delimiter 重新设置
语法:
delimiter 结束标记
调用存储过程
CALL 存储过程名(实参列表);
空参列表
1
2
3
4
5
6
7
8
9
10
11
12
13SELECT * FROM admin;
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(username,`password`)
VALUES('john1','0000'),('lily','0000'),
('rose','0000'),('jack','0000'),
('tom','0000');
END $
#调用
CALL myp1();创建带in模式参数的存储过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15创建存储过程实现,用户是否登录成功
DELIMITER $
CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;#声明并初始化
SELECT COUNT(*) INTO result#赋值
FROM admin
WHERE admin.username = username
AND admin.password = PASSWORD;
SELECT IF(result>0,'成功','失败');#使用
END $
#调用
CALL myp3('张飞','8888')创建out 模式参数的存储过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15根据输入的女神名,返回对应的男神名和魅力值
DELIMITER $
CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT)
BEGIN
SELECT boys.boyname ,boys.usercp INTO boyname,usercp
FROM boys
RIGHT JOIN
beauty b ON b.boyfriend_id = boys.id
WHERE b.name=beautyName ;
END $
#调用
CALL myp7('小昭',@name,@cp);
SELECT @name,@cp;创建带inout模式参数的存储过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14传入a和b两个值,最终a和b都翻倍并返回
DELIMITER $
CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
#调用
SET @m=10;
SET @n=20;
CALL myp8(@m,@n);
SELECT @m,@n;
删除存储过程
语法:drop procedure 存储过程名
DROP PROCEDURE p1;
DROP PROCEDURE p2,p3;
查看存储过程
DESC myp2;×
SHOW CREATE PROCEDURE myp2;
函数
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1 个返回,适合做处理数据后返回一个结果
创建函数
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
- 注意
- 参数列表包含两部分 参数名 参数类型
- 函数体:肯定会有return语句,如果没有会报错
- 函数体中仅有一句话,则可以省略begin end
- 使用 delimiter语句设置结束标记
调用函数
select 函数名(参数列表)
无参有返回
1
2
3
4
5
6
7
8
9
10
11
12
13#案例:返回公司的员工个数
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;#定义局部变量
SELECT COUNT(*) INTO c#赋值
FROM employees;
RETURN c;
END $
SELECT myf1()有参有返回
1
2
3
4
5
6
7
8
9
10
11
12
13#案例1:根据员工名,返回它的工资
DELIMITER $
CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @sal=0;#定义用户变量
SELECT salary INTO @sal #赋值
FROM employees
WHERE last_name = empName;
RETURN @sal;
END $
SELECT myf2('k_ing')
查看函数
show create function 函数名;
eg: show create function find_boys;
删除函数
drop function 函数名;
drop function find_boys;
- 例子
1
2
3
4
5
6
7
8
9
10创建函数,实现传入两个float,返回二者之和
DELIMITER $
CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
DECLARE SUM FLOAT DEFAULT 0;
SET SUM=num1+num2;
RETURN SUM;
END $
SELECT test_fun1(1,2)
流程控制结构
分支结构
if函数
1 | 语法:if(条件,值1,值2) |
应用在begin end中或外面
case结构
1 | 语法1:类似于switch |
1 | 语法2: |
可以应用在begin end中或者外面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #案例:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER $
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
RETURN ch;
END $
SELECT test_case(56)
if结构
1 | if 条件1 then 语句1; |
只能应用在begin end中
1
2
3
4
5
6
7
8
9
10
11
12
13
14 样例:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER $
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
IF score>90 THEN SET ch='A';
ELSEIF score>80 THEN SET ch='B';
ELSEIF score>60 THEN SET ch='C';
ELSE SET ch='D';
END IF;
RETURN ch;
END $
测试
SELECT test_if(87);
循环结构
分类:
while loop repeat
循环控制:
iterate 类似于 continue 继续,结束本次循环,继续下一次
leave 类似于 break 跳出,结束当前所在的循环
while
语法:
【标签:】while 循环条件 do
循环体;
end while【 标签】;
相当于
while(循环条件){
循环体;
}
没有添加循环控制语句
1
2
3
4
5
6
7
8
9
10
11
12
13#案例:批量插入,根据次数插入到admin表中多条记录
DROP PROCEDURE pro_while1;
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;
END WHILE;
END $
CALL pro_while1(100)添加leave语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin;
DROP PROCEDURE test_while1
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
CALL test_while1(100)添加iterate语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
END WHILE a;
END $
CALL test_while1(100)
loop
语法:
【标签:】loop
循环体;
end loop 【标签】;
1 | DELIMITER $ |
repeat
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
1 | DELIMITER $ |