* 建库、建表、添加数据

CREATE DATABASE chapter06;

USE chapter06;

CREATE TABLE account(

id INT primary key auto_increment,

name VARCHAR(40),

money FLOAT

);

INSERT INTO account(name,money) VALUES('a',1000);

INSERT INTO account (name, money) VALUES ('b', 1000);

#### 【例6-1】

START TRANSACTION;

UPDATE account SET money=money-100 WHERE NAME='a';

UPDATE account SET money=money+100 WHERE NAME='b';

COMMIT;

* 查询

SELECT * FROM account;

-----------------------------------------------------------------------------------------------

##### 6.1.2事务的提交

* 使用UPDATE语句实现由b账户向a账户转100元钱的转账功能,

START TRANSACTION;

UPDATE account SET money=money+100 WHERE name='a';

UPDATE account SET money=money-100 WHERE name='b';

* 查询

SELECT * FROM account;

* 使用commit语句来提交事务

START TRANSACTION;

UPDATE account SET money=money+100 WHERE name='a';

UPDATE account SET money=money-100 WHERE name='b';

COMMIT;

------------------------------------------------------------------------------------------------

##### 6.1.3事务的回滚

* 使用UPDATE语句实现由b账户向a账户转100元钱的转账功能,

START TRANSACTION;

UPDATE account SET money=money+100 WHERE name='a';

UPDATE account SET money=money-100 WHERE name='b';

* 事务回滚

ROLLBACK;

------------------------------------------------------------------------------------------------

##### 6.1.4事务的隔离级别

(1)设置B账户中事务的隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

#查询事务隔离级别

SELECT @@tx_isolation;

(2)演示脏读

START TRANSACTION;

UPDATE account SET money=money-100 WHERE name='a';

UPDATE account SET money=money+100 WHERE name='b';

* 查询

SELECT * FROM account;

(3)设置b账户中事务的隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

(4)验证是否出现脏读

START TRANSACTION;

START TRANSACTION;

UPDATE account SET money=money-100 WHERE name='a';

UPDATE account SET money=money+100 WHERE name='b';

* 查询

SELECT * FROM account;

------------------------------------------------------------------------------------------------

##### 6.2存储过程的创建

* 建表

USE chapter06;

CREATE TABLE student(

id INT(3) PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(20) NOT NULL,

grade FLOAT,

gender CHAR(2)

);

* 添加数据

INSERT INTO student(name,grade,gender)

VALUES('tom',60,'男'),

('jack',70,'男'),

('rose',90,'女'),

('lucy',100,'女');

#### 【例6-2】

CREATE PROCEDURE Proc()

BEGIN

SELECT * FROM student;

END;

#### 【例6-3】

DECLARE s_grade FLOAT;

DECLARE s_gender CHAR(2);

SELECT grade, gender INTO s_grade, s_gender

FROM student WHERE name = 'rose';

#### 【例6-4】

//方法一:使用sqlstate_value

DECLARE command_not_allowed CONDITION FOR SQLSTATE'42000';

//方法二:使用mysql_error_code

DECLARE command_not_allowed CONDITION FOR 1148;

#### 【例6-5】

//方法一:捕获sqlstate_value

DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'SET @info='NO_SUCH_TABLE';

//方法二:捕获mysql_error_code

DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';

//方法三:先定义条件,然后调用

DECLARE no_such_table CONDITION FOR 1146;

DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='ERROR';

//方法四:使用SQLWARNING

DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';

//方法五:使用NOT FOUND

DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';

//方法六:使用SQLEXCEPTION

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';

#### 【例6-6】

mysql> CREATE TABLE test.t(s1 int,primary key(s1));

Query OK, 0 rows affected (0.44 sec)

mysql> DELIMITER //

mysql> CREATE PROCEDURE demo()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;

-> SET @x=1;

-> INSERT INTO test.t VALUES(1);

-> SET @x=2;

-> INSERT INTO test.t VALUES(1);

-> SET @x=3;

-> END; //

Query OK, 0 rows affected (0.09 sec)

mysql> DELIMITER ;

mysql> CALL demo();

Query OK, 0 rows affected (0.08 sec)

mysql> SELECT @x ;

+------+

| @x |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

#### 【例6-7】

CASE val

WHEN 1 THEN SELECT 'val is 1';

WHEN 2 THEN SELECT 'val is 2';

ELSE SELECT 'val is not 1or 2';

END CASE;

#### 【例6-8】

DECLARE id INT DEFAULT 0;

add_loop:LOOP

SET id=id+1;

IF id>=10 THEN LEAVE add_loop;

END IF;

END LOOP add_loop;

#### 【例6-9】

CREATE PROCEDURE doiterate()

BEGIN

DECLARE p1 INT DEFAULT 0;

my_loop:LOOP

SET p1=p1+1;

IF p1<10 THEN ITERATE my_loop;

ELSEIF p1>20 THEN LEAVE my_loop;

END IF;

SELECT 'p1 is between 10 and 20';

END LOOP my_loop;

END

#### 【例6-10】

DECLARE id INT DEFAULT 0;

REPEAT

SET id=id+1;

UNTIL id>=10;

END REPEAT;

#### 【例6-11】

DECLARE i INT DEFAULT 0;

WHILE i <10 DO

SET i=i+1;

END WHILE;

#### 【例6-12】

1、定义存储过程:

DELIMITER //

CREATE PROCEDURE CountProc1(IN s_gender VARCHAR(50),OUT num INT)

BEGIN

SELECT COUNT(*) INTO num FROM student WHERE gender = s_gender;

END //

DELIMITER ;

2、调用存储过程:

CALL CountProc1("女",@num);

3、查看返回结果:

SELECT @num;

#### 【例6-13】

SHOW PROCEDURE STATUS LIKE'C%'\G

#### 【例6-14】

SHOW CREATE PROCEDURE chapter06.CountProc1\G

#### 【例6-15】

ALTER PROCEDURE CountProc1

MODIFIES SQL DATA

SQL SECURITY INVOKER;

* 从information_schema.Routines表中查看存储过程的信息

SELECT * FROM information_schema.Routines

WHERE ROUTINE_NAME='CountProc1' AND ROUTINE_TYPE='PROCEDURE

#### 【例6-16】

DROP PROCEDURE CountProc1;

------------------------------------------------------------------------------------------------

6.4综合案例—存储过程应用

* 建表

CREATE TABLE stu(id INT,name VARCHAR(50),class VARCHAR(50));

INSERT INTO stu VALUE (1,'Lucy','class1'),(2,'Tom','class1'),(3,'Rose','class2');

* 创建存储过程

CREATE PROCEDURE addcount(out count INT)

BEGIN

DECLARE itmp INT;

DECLARE cur_id CURSOR FOR SELECT id FROM stu;

DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_id;

SELECT count(*) INTO count FROM stu;

SET @sum=0;

OPEN cur_id;

REPEAT

FETCH cur_id INTO itmp;

IF itmp<10

THEN SET @sum= @sum+itmp;

END IF;

UNTIL 0 END REPEAT;

CLOSE cur_id;

END ;

mysql 多表操作实例_第五章 多表操作相关推荐

  1. MySQL必知必会——第十五章联结表

    联结表 本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句. 联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表. 在能够有效地使用联结前,必须了解关系 ...

  2. 华为怎么分屏操作技巧_第五人格魔术师怎么操作 求生者魔术师操作技巧

    第五人格求生者魔术师的使用方法是什么?在游戏中魔术师带着他的道具魔棒能很好的牵制监管者也能很好的救助同伴,但是很多小伙伴不知道魔术师到底要怎么用,下面小编就整理了关于求生者中魔术师在游戏中的时机操作技 ...

  3. 华为怎么分屏操作技巧_第五人格邮差怎么操作 邮差操作技巧介绍

    第五人求生者邮差的信件效果需要玩家们熟练掌握才能更顺利的赢得比赛,所以邮差除了天赋技能需要熟知外,还有就是每个信件的作用都是什么,下面小编就整理了关于求生者中邮差操作技巧的内容介绍,感兴趣的小伙伴一起 ...

  4. 华为怎么分屏操作技巧_第五人格囚徒怎么操作 求生者囚徒操作技巧介绍

    第五人格求生者中囚徒善于用电是小伙伴们都知道的事,但是很多小伙伴还不知道囚徒在游戏中到底要怎么操作,想要用好囚徒就同时需要用好点,下面小编就整理了关于第五人格中囚徒的具体操作技巧了,希望对小伙伴们有所 ...

  5. 华为怎么分屏操作技巧_第五人格前锋怎么操作 前锋操作技巧介绍

    格中前锋的主要技能就是利用橄榄球冲刺来撞击监管者,该技能能能够顺利就出同伴同时还能让监管者眩晕树苗,那么要怎么在游戏中操作好该角色呢?想必很多新手小伙伴对其还比较疑惑,下面小编就整理了关于求生者前锋的 ...

  6. ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区 1 ArcCatalog使用 1.1 GIS数据 地理信息系统, ...

  7. 微型计算机滑动平均值滤波器方程,wx05_微型计算机控制技术_第五章.ppt

    wx05_微型计算机控制技术_第五章,微型计算机控制技术,微型计算机接口技术,微型计算机技术,微型计算机及接口技术,微型计算机技术及应用,微型计算机与接口技术,微型计算机控制系统,微型计算机技术指标, ...

  8. java程序设计基础_陈国君版第五版_第五章习题

    java程序设计基础_陈国君版第五版_第五章习题 import java.util.Scanner; public class Main5_1 {public static void main(Str ...

  9. java程序设计基础_陈国君版第五版_第五章例题

    java程序设计基础_陈国君版第五版_第五章例题 public class Main5_1 {public static void main(String[] args){int i;int[] a; ...

最新文章

  1. 简单删除我的电脑里的wps云文档图标
  2. 《从paxos到zookeeper》学习笔记(一)
  3. hdu 4521(线段树优化dp)
  4. 存储过程中执行动态Sql语句
  5. 什么是mysql事物定义_Mysql事务原理
  6. 若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?
  7. 朋友圈有趣的灵魂都去哪了?这几个优质公号给你答案
  8. 贵气烫金剪纸牛年新年春节海报PSD分层素材模板
  9. 宝塔Linux 8888 进不去
  10. 语言 泰克示波器程序_示波器再升级,EMI测试不求人
  11. //{{AFX_MSG、//{{AFX_VIRTUAL、//{{AFX_MSG_MAP、//{{AFX_DATA_INIT用途
  12. 2014年6月份第4周51Aspx源码发布详情
  13. H264视频通过RTMP直播 .
  14. Android O/P/Q 版本移植iperf网络性能测试工具
  15. HANA XS 匿名访问
  16. mysql sniffer 源码_MySQL 抓包工具 - MySQL Sniffer 使用小结 (含带general_log日志)
  17. 离线地图开发-含源代码(免费)
  18. Visual Studio 好用的插件
  19. 实现翻页或查询后保持复选框勾选状态
  20. 怎么让一天有36小时

热门文章

  1. gensim实现LDA(Latent Dirichlet Allocation)算法提取主题词(topic)
  2. 适合中国程序员的保命教材——《程序员羊皮卷》书评(7)
  3. 天秤座,上帝的失误,最悲伤的星座
  4. 通过drawable实现不一样的ProgressBar
  5. Educational Codeforces Round 113 (Rated for Div. 2) D. Inconvenient Pairs 思维
  6. python实现借助360加固保代码实现批量、断点再续等功能
  7. 【算法】考前整理复习
  8. 【Linux-ARM】电脑 WiFi 上网,开发板与电脑直连
  9. 详解互联网APP架构1.0
  10. php xhprof extension,php xhprof使用