MySQL语法规范

 数据库的操作


/*
	查询所有数据库
	标准语法:
			SHOW DATABASES;
*/
-- 查询所有数据库
SHOW DATABASES;


/*
	查询某个数据库的创建语句
	标准语法:
			SHOW CREATE DATABASE 数据库名称;
*/
-- 查询mysql数据库的创建语句
SHOW CREATE DATABASE mysql;


/*
	创建数据库
	标准语法
			CREATE DATABASE 数据库名称;
*/
-- 创建db1数据库
CREATE DATABASE db1;


/*
	创建数据库,判断、如果不存在则创建
	标准语法:
			CREATE DATABASE IF NOT EXISTS 数据库名称;
*/
-- 创建数据库db2(判断,如果不存在则创建)
CREATE DATABASE IF NOT EXISTS db2;


/*
	创建数据库、并指定字符集
	标准语法:
			CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;
*/
-- 创建数据库db3、并指定字符集utf8
CREATE DATABASE db3 CHARACTER SET utf8;

-- 查看db3数据库的字符集
SHOW CREATE DATABASE db3;

-- 练习:创建db4数据库、如果不存在则创建、指定字符集为gbk
CREATE DATABASE IF NOT EXISTS db4 CHARACTER  SET gbk;

-- 查看db4数据库的字符集
SHOW CREATE DATABASE db4;


/*
	修改数据库的字符集
	标准语法:
			ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称
*/
-- 修改数据库db4的字符集为utf8
ALTER DATABASE db4 CHARACTER SET utf8;

-- 查看db4数据库的字符集
SHOW CREATE DATABASE db4;


/*
	删除数据库
	标准语法:
			DROP DATABASE 数据库名称;
*/
-- 删除db1数据库
DROP DATABASE db1;


/*
	删除数据库,判断、如果存在则删除
	标准语法:
			DROP DATABASE IF EXISTS 数据库名称;
*/
-- 删除数据库db2,如果存在
DROP DATABASE IF EXISTS db2;


/*
	使用数据库
	标准语法:
			USE 数据库名称;
*/
-- 使用db4数据库
USE db4;


/*
	查询当前使用的数据库
	标准语法:
			SELECT DATABASE();
*/
-- 查询当前正在使用的数据库
SELECT DATABASE();



 数据表的操作


-- 使用mysql数据库
USE mysql;


/*
	查询所有数据表
	标准用法:SHOW TABLES;
*/
-- 查询库中所有的表
SHOW TABLES;


/*
	查询表结构
	标准用法:
			DESC 表名;
*/
-- 查询user表结构
DESC USER;


/*
	查询数据表的字符集
	标准用法:
			SHOW TABLE STATUS FROM 数据库名称 LIKE ‘ 表名 ’;
*/
-- 查看mysql数据库中user表字符集
SHOW TABLE STATUS FROM mysql LIKE 'user';


/*
	创建数据表
	标准语法:
			CREATE TABLE 表名(
					列名 数据类型 约束,
					列名 数据类型 约束,
					...
					列名 数据类型 约束
			);
*/
-- 创建一个product 商品表(商品编号、商品名称、商品价格、商品库存、上架时间)
CREATE TABLE product(
		id  INT,
		NAME  VARCHAR (20),
		price  DOUBLE,
		stock  INT,
		insert_time  DATE
);

-- 查看product表结构
DESC  product;


/*
	修改表名
	标准语法:
			ALTER TABLE 旧表名 RENAME TO 新表名;
*/
-- 修改product 表名为product2
ALTER TABLE product RENAME TO product2;


/*
	修改表的字符集
	标准语法:
			ALTER TABLE 表名 CHARACTER SET 字符集名称;
*/
-- 查看db3数据库中product2数据表字符集
SHOW TABLE STATUS FROM mysql LIKE 'product2';

-- 修改product2数据表字符集为gbk
ALTER TABLE product2 CHARACTER SET gbk;


/*
	给表添加列
	标准语法:
			ALTER TABLE 表名 ADD 列名 数据类型;
*/
-- 给product2表添加一列color
ALTER TABLE product2 ADD color VARCHAR(200);

-- 查看product2表结构
DESC  product2;

/*
	修改表中列的数据类型
	标准语法:
			ALTER TABLE 表名 MODIFY 列名 数据类型;
*/
-- 将color数据类型修改为int
ALTER TABLE product2 MODIFY color INT;

-- 删除color属性
ALTER TABLE product2 drop color;

-- 查看product2表结构
DESC  product2;


/*
	修改表中列的名称和数据类型
	标准语法:
			ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型
*/
-- 将color修改为address
ALTER TABLE product CHANGE color address VARCHAR(200);

新增表数据


USE db1;

CREATE TABLE product(
		id INT,
		NAME  VARCHAR (20),
		price  DOUBLE,
		stock  INT,
		insert_time  DATE
);

/*
	给指定列添加数据
	标准语法:
			INSERT INTO 表名 (列名1,列名2,...) VALUES (值1,值2,....);
*/
-- 向product表添加一条数据
INSERT INTO product (id,NAME,price,stock,insert_time) VALUES (1,'玩具',100,5,'2021-02-01');

-- 向product表添加指定列数据


/*
	给全部列添加数据
	标准语法:
			INSERT INTO 表名 VALUES (值1,值2,....);
*/
INSERT INTO product VALUES (1,'玩具',100,5,'2021-02-01'),(2,'食品',20,100,'2021-01-01');

修改和删除表数据


/*
	修改表数据
	标准语法:
			UPDATE 表名 SET 列名1=值1,列名2=值2,... where 条件;
*/
-- 修改手机的价格为3500
UPDATE product SET price=3500 WHERE NAME='变形金刚';


-- 修改电脑的价格为1800、库存为36
UPDATE product SET price=1800,stock=36 WHERE NAME='笔记本';



/*
	删除表数据
	标准语法:
			DELETE FROM 表名 WHERE 条件;
*/
--  删除product表中的玩具信息
DELETE FROM product WHERE NAME='玩具';

-- 删除product表中库存为10的商品信息
DELETE FROM product WHERE stock=10;

-- 删除profuct数据表
DROP TABLE product;



外键约束


-- 创建db2数据库
CREATE DATABASE db2;

-- 使用db2数据库
USE db2;

/*
	外键约束
	标准语法:
		CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
*/
-- 建表时添加外键约束
-- 创建user用户表
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,    -- id
	NAME VARCHAR(20) NOT NULL             -- 姓名
);
-- 添加用户数据
INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四');


-- 创建orderlist订单表
CREATE TABLE orderlist(
	id INT PRIMARY KEY AUTO_INCREMENT,    -- id
	number VARCHAR(20) NOT NULL,          -- 订单编号
	uid INT,			      -- 外键列
	CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加订单数据
INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),
(NULL,'hm003',2),(NULL,'hm004',2);


-- 添加一个订单,但是没有真实用户。添加失败
INSERT INTO orderlist VALUES (NULL,'hm005',3);

-- 删除李四用户。删除失败
DELETE FROM USER WHERE NAME='李四';


/*
	删除外键约束
	标准语法:
		ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
*/
-- 删除外键约束
ALTER TABLE orderlist DROP FOREIGN KEY ou_fk1;


/*
	建表后单独添加外键约束
	标准语法:
		ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名);
*/
-- 添加外键约束
ALTER TABLE orderlist ADD CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id);


 主键约束


--  创建学生表(编号、姓名、年龄)  编号设为主键
CREATE  TABLE  student(
	id  INT  PRIMARY  KEY,
	NAME  VARCHAR(100),
	age  INT
);

--  查询学生表的详细信息
DESC  student;

--  添加数据
INSERT  INTO  student  VALUES(1, '张三', 23);
INSERT  INTO  student  VALUES(2, '李四', 24);

--  删除主键
ALTER  TABLE  student  DROP  PRIMARY  KEY;

--  建表后单独添加主键约束
ALTER  TABLE  student  MODIFY  id  INT  PRIMARY  KEY;


 外键级联操作


/*
	添加外键约束,同时添加级联更新  标准语法:
	ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) 
	ON UPDATE CASCADE;
	
	添加外键约束,同时添加级联删除  标准语法:
	ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) 
	ON DELETE CASCADE;
	
	添加外键约束,同时添加级联更新和级联删除  标准语法:
	ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) 
	ON UPDATE CASCADE ON DELETE CASCADE;
*/
-- 删除外键约束
ALTER TABLE orderlist DROP FOREIGN KEY ou_fk1;

-- 添加外键约束,同时添加级联更新和级联删除
ALTER TABLE orderlist ADD CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
ON UPDATE CASCADE ON DELETE CASCADE;


-- 将李四这个用户的id修改为3,订单表中的uid也自动修改
UPDATE USER SET id=3 WHERE id=2;

-- 将李四这个用户删除,订单表中的该用户所属的订单也自动删除
DELETE FROM USER WHERE id=3;

 主键自增约束


--  删除数据表
DROP  TABLE  student;

--  创建学生表的详细信息
CREATE  TABLE  student(
	id  INT  PRIMARY  KEY  AUTO_INCREMENT,
	NAME  VARCHAR(30),
	age  INT
);

--  查询学生表的详细信息
DESC  student;

--  添加数据
INSERT  INTO  student  VALUES(NULL, '张三', 23), (NULL, '李四', 24);

--  删除自增约束
ALTER  TABLE  student  MODIFY  id  INT;

--  建表后单独添加自增约束
ALTER  TABLE  student  MODIFY  id  INT  AUTO_INCREMENT;


 唯一约束


--  创建学生表(编号、姓名、年龄)  编号设为主键自增,年龄设为唯一
CREATE  TABLE  student(
		id  INT  PRIMARY  KEY  AUTO_INCREMENT,
		NAME  VARCHAR(30),
		age  INT  UNIQUE
);

--  查询学生表的详细信息
DESC  student;

--  添加数据
INSERT  INTO  student  VALUES  (NULL, '张三', 23);
INSERT  INTO  student  VALUES  (NULL, '李四', 23);

--  删除唯一约束
ALTER  TABLE  student  DROP  INDEX  age;

--  建表后单独添加唯一约束
ALTER  TABLE  student  MODIFY  age  INT  UNIQUE;

 非空约束


--  创建学生表(编号、姓名、年龄)  编号设为主键自增,年龄设为唯一
CREATE  TABLE  student(
		id  INT  PRIMARY  KEY  AUTO_INCREMENT,
		NAME  VARCHAR(30)  NOT  NULL,
		age  INT  UNIQUE
);

--  查询学生表的详细信息
DESC  student;

--  添加数据
INSERT  INTO  student  VALUES  (NULL, '张三', 23);

--  删除非空约束
ALTER  TABLE  student  MODIFY  NAME  VARCHAR(30);

--  建表后单独添加非空约束
ALTER  TABLE  student  MODIFY  NAME  VARCHAR(30)  NOT  NULL;


 多表查询 —— 内连接查询


/*
		显示内连接
		标准语法:
				SELECT  列名  FROM  表名1  [INNER]  JOIN  表名2  ON  关联条件;
*/
--  查询用户信息和对应的订单信息
SELECT  *  FROM  USER    INNER  JOIN  orderlist  ON  orderlist.uid = USER.id;


--  查询用户信息和对应的订单信息,起别名
SELECT  *  FROM  USER  u  INNER  JOIN  orderlist  o  ON  o.uid = u.id;

/*
	隐式内连接
	标准语法:
		SELECT 列名 FROM 表名1,表名2 WHERE 关联条件;
*/
--  查询用户姓名,年龄和订单编号
SELECT 
		u.name,
		u.age,
		o.number
FROM 
		USER u,
		orderlist o
WHERE
		u.id = o.uid;


  多表查询 —— 外连接查询


/*
		左外连接
		标准语法:
				SELECT  列名  FROM  表名1  LEFT  [OUTER]  JOIN  表名2  ON  条件;
*/
--  查询所有用户信息,以及用户对应的订单信息
SELECT  
		u.*, 
		o.number  
FROM  
		USER  u  
LEFT  OUTER  JOIN  
		orderlist  o  
ON  
		o.uid = u.id;
		
/*
		右外连接
		标准语法:
				SELECT  列名  FROM  表名1  RIGHT  [OUTER]  JOIN  表名2  ON  条件;
*/
--  查询所有订单信息,以及用户对应的用户信息
SELECT  o.number, u.*  FROM  USER  u  RIGHT  OUTER  JOIN  orderlist  o  ON  o.uid = u.id;

SELECT  *  FROM  USER  WHERE  age = 23;


 多表查询 —— 子查询


/*
	结果是单行单列的
	标准语法:
		SELECT 列名 FROM 表名 WHERE 列名=(SELECT 列名 FROM 表名 [WHERE 条件]);
*/
-- 查询年龄最高的用户姓名
SELECT  NAME, age  FROM  USER  WHERE  age=(SELECT  MAX(age)  FROM  USER);

/*
	结果是多行单列的
	标准语法:
		SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]); 
*/
-- 查询张三和李四的订单信息
SELECT  id  FROM  USER  WHERE  NAME  IN  ('张三', '李四');
SELECT  *  FROM  orderlist  WHERE  uid  IN  (SELECT  id  FROM  USER  WHERE  NAME  IN  ('张三', '李四'));

/*
	结果是多行多列的
	标准语法:
		SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];
*/
-- 查询订单表中id大于4的订单信息和所属用户信息
SELECT  *  FROM  orderlist  WHERE  id  >  4;
SELECT
		u.name,
		o.number
FROM
		USER  u,
		(SELECT  *  FROM  orderlist  WHERE  id  >  4)  o
WHERE
		o.uid = u.id;


多表查询 —— 自关联查询


-- 创建员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 员工编号
	NAME VARCHAR(20),			-- 员工姓名
	mgr INT,				-- 上级编号
	salary DOUBLE				-- 员工工资
);
-- 添加数据
INSERT INTO employee VALUES (1001,'孙悟空',1005,9000.00),
(1002,'猪八戒',1005,8000.00),
(1003,'沙和尚',1005,8500.00),
(1004,'小白龙',1005,7900.00),
(1005,'唐僧',NULL,15000.00),
(1006,'武松',1009,7600.00),
(1007,'李逵',1009,7400.00),
(1008,'林冲',1009,8100.00),
(1009,'宋江',NULL,16000.00);


-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
/*
分析
	员工信息 employee表
	条件:employee.mgr = employee.id
	查询左表的全部数据,和左右两张表有交集部分数据,左外连接
*/
ALTER  TABLE  employee  RENAME  TO  emp;

SELECT  
		e1.id,
		e1.NAME,
		e2.NAME
FROM  
		emp  AS  e1
INNER  JOIN
		emp  AS  e2
ON
		e1.id   =  e2.mgr;


视图的创建和查询


/*
	创建视图
	标准语法
		CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;
*/
-- 创建city_country视图,保存城市和国家的信息(使用指定列名)
CREATE VIEW city_country (city_id,city_name,country_name) AS
SELECT
	c1.id,
	c1.name,
	c2.name
FROM
	city c1,
	country c2
WHERE
	c1.cid=c2.id;


	
/*
	查询视图
	标准语法
		SELECT * FROM 视图名称;
*/
-- 查询视图
SELECT * FROM city_country;


视图的修改和删除


/*
	修改视图数据
	标准语法
		UPDATE 视图名称 SET 列名=值 WHERE 条件;
	
	修改视图结构
	标准语法
		ALTER VIEW 视图名称 (列名列表) AS 查询语句; 
*/
-- 修改视图数据,将北京修改为深圳。(注意:修改视图数据后,源表中的数据也会随之修改)
SELECT * FROM city_country;
UPDATE city_country SET city_name='深圳' WHERE city_name='北京';


-- 将视图中的country_name修改为name
ALTER VIEW city_country (city_id,city_name,NAME) AS
SELECT
	c1.id,
	c1.name,
	c2.name
FROM
	city c1,
	country c2
WHERE
	c1.cid=c2.id;


/*
	删除视图
	标准语法
		DROP VIEW [IF EXISTS] 视图名称;
*/
-- 删除city_country视图
DROP VIEW IF EXISTS city_country;

创建和调用存储过程


/*
	创建存储过程

	-- 修改分隔符为$
	DELIMITER $

	-- 标准语法
	CREATE PROCEDURE 存储过程名称(参数列表)
	BEGIN
		SQL 语句列表;
	END$

	-- 修改分隔符为分号
	DELIMITER ;
*/
-- 创建stu_group()存储过程,封装 分组查询总成绩,并按照总成绩升序排序的功能
DELIMITER $

CREATE PROCEDURE stu_group()
BEGIN
	SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC;
END$

DELIMITER ;
/*
	调用存储过程
	CALL 存储过程名称(实际参数);
*/
-- 调用stu_group()存储过程
CALL  stu_group();


查看和删除存储过程


/*
	查询数据库中所有的存储过程
	SELECT * FROM mysql.proc WHERE db='数据库名称';
*/
-- 查看db6数据库中所有的存储过程
SELECT  *  FROM  mysql.`proc`  WHERE  db='db6';


/*
	删除存储过程
	DROP PROCEDURE [IF EXISTS] 存储过程名称;
*/
DROP  PROCEDURE  IF  EXISTS  stu_group;


存储过程 —— 变量


/*
	定义变量
	DECLARE 变量名 数据类型 [DEFAULT 默认值];
*/
-- 定义一个int类型变量,并赋默认值为10
DELIMITER $
CREATE  PROCEDURE  pro_test1()
BEGIN
	-- 定义变量
	DECLARE  num  INT  DEFAULT  10;
	-- 使用变量
	SELECT  num;
END$
DELIMITER ;

-- 调用pro_test1存储过程
CALL  pro_test1();



/*
	变量赋值-方式一
	SET 变量名 = 变量值;
*/
-- 定义一个varchar类型变量并赋值
DELIMITER $

CREATE PROCEDURE pro_test2()
BEGIN
	-- 定义变量
	DECLARE NAME VARCHAR(10);
	-- 为变量赋值
	SET NAME = '存储过程';
	-- 使用变量
	SELECT NAME;
END$

DELIMITER ;

-- 调用pro_test2存储过程
CALL pro_test2();

--  查看存储过程
SELECT *  FROM  mysql.`proc`  WHERE  db='db6';

/*
	变量赋值-方式二
	SELECT 列名 INTO 变量名 FROM 表名 [WHERE 条件];
*/
-- 定义两个int变量,用于存储男女同学的总分数
DELIMITER $

CREATE PROCEDURE pro_test3()
BEGIN
	-- 定义两个变量
	DECLARE men,women INT;
	-- 查询男同学的总分数,为men赋值
	SELECT SUM(score) INTO men FROM student WHERE gender='男';
	-- 查询女同学的总分数,为women赋值
	SELECT SUM(score) INTO women FROM student WHERE gender='女';
	-- 使用变量
	SELECT men,women;
END$

DELIMITER ;

-- 调用pro_test3存储过程
CALL pro_test3();


存储过程 —— if 语句


/*
	if语句
	IF 判断条件1 THEN 执行的sql语句1;
	[ELSEIF 判断条件2 THEN 执行的sql语句2;]
	...
	[ELSE 执行的sql语句n;]
	END IF;
*/

/*
	定义一个int变量,用于存储班级总成绩
	定义一个varchar变量,用于存储分数描述
	根据总成绩判断:
		380分及以上   学习优秀
		320 ~ 380     学习不错
		320以下       学习一般
*/
DELIMITER $

CREATE PROCEDURE pro_test4()
BEGIN
	-- 定义变量
	DECLARE  total  INT;
	DECLARE  info  VARCHAR(10);
	-- 查询总成绩,为total赋值
	SELECT  SUM(score)  INTO  total  FROM  student;
	--  对总成绩判断
	IF  total  >  380  THEN
			SET  info='学习优秀';
		ELSEIF  total  >=320  AND  total  <=  380  THEN
			SET  info='学习不错';
		ELSE
			SET  info='学习一般';
		END  IF;
		--  查询总成绩和描述信息
		SELECT  total,info;
END$
DELIMITER ;

-- 调用pro_test4存储过程
CALL  pro_test4();

存储过程 —— 参数传递


/*
	参数传递
	CREATE PROCEDURE 存储过程名称([IN|OUT|INOUT] 参数名 数据类型)
	BEGIN
		SQL 语句列表;
	END$
*/
/*
	输入总成绩变量,代表学生总成绩
	输出分数描述变量,代表学生总成绩的描述信息
	根据总成绩判断:
		380分及以上  学习优秀
		320 ~ 380    学习不错
		320以下      学习一般
*/
DELIMITER $

CREATE PROCEDURE pro_test5(IN  total  INT,OUT  info  VARCHAR(10))
BEGIN
	IF  total  >  380  THEN
			SET  info='学习优秀';
		ELSEIF  total  >=320  AND  total  <=  380  THEN
			SET  info='学习不错';
		ELSE
			SET  info='学习一般';
		END  IF;
END$
DELIMITER ;
-- 调用pro_test5存储过程
CALL  pro_test5((SELECT  SUM(score)  FROM  student),@info);

SELECT  @info;


存储过程 —— while循环


/*
	while循环
	初始化语句;
	WHILE 条件判断语句 DO
		循环体语句;
		条件控制语句;
	END WHILE;
*/
-- 计算1~100之间的偶数和
DELIMITER $

CREATE PROCEDURE pro_test6()
BEGIN
	-- 定义求和变量
	DECLARE result INT DEFAULT 0;
	-- 定义初始化变量
	DECLARE num INT DEFAULT 1;
	-- while循环
	WHILE num <= 100 DO
		IF num % 2 = 0 THEN
			SET result = result + num;
		END IF;
		
		SET num = num + 1;
	END WHILE;
	
	-- 查询求和结果
	SELECT result;
END$

DELIMITER ;


-- 调用pro_test6存储过程
CALL pro_test6();

存储函数


/*
	创建存储函数
	CREATE FUNCTION 函数名称([参数 数据类型])
	RETURNS 返回值类型
	BEGIN
		执行的sql语句;
		RETURN 结果;
	END$
*/
-- 定义存储函数,获取学生表中成绩大于95分的学生数量
DELIMITER $

CREATE FUNCTION fun_test1()
RETURNS INT
BEGIN
	-- 定义变量
	DECLARE s_count INT;
	-- 查询成绩大于95分的数量,为s_count赋值
	SELECT COUNT(*) INTO s_count FROM student WHERE score > 95;
	-- 返回统计结果
	RETURN s_count;
END$

DELIMITER ;


/*
	调用函数
	SELECT 函数名称(实际参数);
*/
-- 调用函数
SELECT fun_test1();


/*
	删除函数
	DROP FUNCTION 函数名称;
*/
-- 删除函数
DROP FUNCTION fun_test1;


repeat循环


/*
		repeat循环
		标准语法
				初始化语句;
				repeat
						循环体语句
						条件控制语句
						UNTIL  条件判断语句
				END REPEAT;
*/
-- 注意:repeat循环是条件满足则停止。while循环是条件满足则执行

-- 计算1~10之间的和
DELIMITER $

CREATE PROCEDURE pro_test9()
BEGIN
		-- 定义求和变量
		DECLARE result INT DEFAULT 0;
		-- 定义初始化变量
		DECLARE num INT DEFAULT 1;
		-- repeat循环
		REPEAT
				-- 累加
				SET result = result + num;
				-- 让num + 1
				SET num = num + 1;
				
				-- 停止循环
				UNTIL num > 10
		END REPEAT;
		
		-- 查询求和结果
		SELECT result;

END$

DELIMITER ;

-- 调用pro_test9存储过程
CALL pro_test9();

输出结果:

loop循环


/*
		loop循环
		标准语法
				初始化语句;
				[循环名称:] LOOP
					条件判断语句
						[LEAVE 循环名称;]
					循环体语句;
					条件控制语句;
		END LOOP 循环名称;
注意:loop可以实现简单的循环,但是退出循环需要使用其他的语句来定义。我们可以使用leave语句完成!
如果不加退出循环的语句,那么就变成了死循环。*/

-- 计算1~10之间的和
DELIMITER $

CREATE PROCEDURE pro_test10()
BEGIN
	-- 定义求和变量
	DECLARE result INT DEFAULT 0;
	-- 定义初始化变量
	DECLARE num INT DEFAULT 1;
	-- loop循环
	l:LOOP
		-- 条件成立,停止循环
		IF num > 10 THEN
			LEAVE l;
		END IF;
	
		-- 累加
		SET result = result + num;
		-- 让num+1
		SET num = num + 1;
	END LOOP l;
	
	-- 查询求和结果
	SELECT result;
END$

DELIMITER ;

-- 调用pro_test10存储过程
CALL pro_test10();

输出结果: 

 游标的基本使用


/*
		游标
		标准语法
				1.创建游标:DECLARE 游标名称 CURSOR FOR 查询sql语句
				2.打开游标:OPEN 游标名称;
				3.使用游标:FETCH 游标名称 INTO 变量名1,变量名2, ......
				4.关闭游标:CLOSE 游标名称
*/
-- 创建stu_score表
CREATE TABLE stu_score(
		id INT PRIMARY KEY AUTO_INCREMENT,
		score INT
);

DELIMITER $
CREATE PROCEDURE pro_test11()
BEGIN
		-- 定义一个保存成绩的变量
		DECLARE s_score INT;
		
		-- 创建游标
		DECLARE stu_result CURSOR FOR SELECT score FROM student;
		
		-- 开启游标
		OPEN stu_result;
		
		-- 使用游标
		-- 遍历结果,拿到第1行数据
		FETCH stu_result INTO s_score;
		-- 将数据保存到stu_score表中
		INSERT INTO stu_score VALUES(NULL, s_score);
		
		-- 遍历结果,拿到第2行数据
		FETCH stu_result INTO s_score;
		-- 将数据保存到stu_score表中
		INSERT INTO stu_score VALUES(NULL, s_score);
		
		-- 遍历结果,拿到第3行数据
		FETCH stu_result INTO s_score;
		-- 将数据保存到stu_score表中
		INSERT INTO stu_score VALUES(NULL, s_score);
		
		-- 遍历结果,拿到第4行数据
		FETCH stu_result INTO s_score;
		-- 将数据保存到stu_score表中
		INSERT INTO stu_score VALUES(NULL, s_score);
		
		-- 关闭游标
		CLOSE stu_result;
		
END$
DELIMITER ;

-- 调用pro_test11的存储过程
CALL pro_test11();

-- 查询stu_score数据表
SELECT * FROM stu_score;

游标的优化


/*
		当游标结束后,会自动的触发一个事件,就代表游标已经结束了
		加标记的思想:
				1.定义一个标记变量,默认值为0(意味着有数据)
				2.当游标结束后,将游标变量的值修改为1(意味着没有数据了)
*/
DELIMITER $
CREATE PROCEDURE pro_test12()
BEGIN
		-- 定义一个保存成绩的变量
		DECLARE s_score INT;
		
		-- 定义一个标记变量,默认值为0
		DECLARE flag INT DEFAULT 0;
		
		-- 创建游标
		DECLARE stu_result CURSOR FOR SELECT score FROM student;
		
		-- 当游标结束后,将标记变量的值修改为1(意味没有数据了)
		DECLARE EXIT HANDLER FOR NOT FOUND SET flag = 1;
		
		-- 开启游标
		OPEN stu_result;
		
		-- 循环使用游标
		REPEAT
				-- 遍历结果,拿到
				FETCH stu_result INTO s_score;
				-- 将数据保存到stu_score表中
				INSERT INTO stu_score VALUES(NULL,s_score);
				
				-- 当flag的值是1的时候,就停止循环
				UNTIL flag = 1
		END REPEAT;
		
		-- 关闭游标
		CLOSE stu_result;
END$
DELIMITER ;

-- 调用stu_score表
CALL pro_test12();

-- 查询stu_score表
SELECT * FROM stu_score;
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值