对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器、存储过程、权限管理、主从分离等,权当抛砖引玉,高手请略过。

一、触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的sql语句,数据表为引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。可以从四个方面理解触发器:

---监视地点 table
---监视事件 insert/update/delete
---触发时间 after/before
---触发事件 insert/update/delete

创建语法:

create trigger 触发器名称
after/before
insert/update/delete
on 表名
for each row
begin
sql1;
..
sqlN;
end

首先声明结束符

delimiter $ ---默认是;号结尾,但是sql语句以分号结尾后执行触发器会报语法错误,所以要提前声明结束符为分号以外的

---创建测试需要的两张表

CREATE TABLE `goods` (

`gid` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`num` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8$

CREATE TABLE `orders` (

`oid` int(11) DEFAULT NULL,
`gid` int(11) DEFAULT NULL,
`much` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8$
插入测试数据

INSERT INTO goods VALUES(1,'BMW',20),(2,'mini',18),(3,'ford',50)$

---创建触发器t2,监视订单表,当订单表增加订单时,商品表就得减少相应的商品数量;

delimiter $
create trigger t2
after
insert --不允许同一张表同一时刻有两个相同的动作 
on orders
for each row
begin
update goods set num=num-new.much where gid =new.gid;-- new.much就是新增的订单表row的值;
end$

---调用

INSERT INTO orders VALUES(123,1,2)$

再次select * from goods$查看对比前后数据

-- 创建触发器 t3,监视订单表,当订单被删掉时,商品表增加对应数量;

create trigger t3
after
delete
on orders
for each row
begin
update goods set num=num+old.much where gid =old.gid;
end$

-- 创建触发器 t5,监视订单表,在订单增加前判断是否大于库存,如果大于库存量,就让其等于库存量 区别before和after

create trigger t5
before
insert
on orders

for each row
begin

declare rnum int;

select num into rnum from goods where gid=new.gid;

if new.much>rnum then
set new.much =rnum;
end if;

update goods set num=num-new.much where gid =new.gid;
end$

---删除触发器

DROP TRIGGER [schema_name.]trigger_name

舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。

一般都是直接删除触发器名的

6.for each row具体介绍
行级触发器
语句级触发器

7.存储过程
相当于一个没有返回值的"函数"
create procedure procedureName()
begin
--sql 语句
end$

8.引入变量与控制结构
--在存储过程中 用declare声明变量
--格式 declare 变量名 变量类型[default默认值]

create procedure p3()
begin
declare age int default 18;
set age =age +20;
select concat('20年后',age);
end$

create procedure p4()
begin
declare age int default 18;
if age >=18 then
select '已成年';
else
select '未成年';
end if;
end $

9.存储过程的参数传递

给存储过程传参
语法 [in/out/inout] 参数名 参数类型
create procedure p5(width int,height int)
begin
select concat('你的面积是',width * height) as area;
if width >height then
select '你挺胖';
elseif width <height then
select '你挺瘦';
else
select '你挺方';
end if;
end$

10.过程中使用循环结构
--求1-100之和
create procedure p6()
begin
declare sum int default 0;
declare num int default 0;

while num <=100 do --while num <100 do set num :=num+1;
set sum =sum +num;
set num=num+1;
end while;
select sum;
end$

--in型参数 input type
create procedure p7(in n int)
begin
declare sum int default 0;
declare num int default 0;

while num <n do
set num=num+1;
set sum =sum +num;

end while;
select sum;
end$

11.何为输出型参数
delimiter $
create procedure p8(in n int,out total int)
begin

declare num int default 0;
set total :=0;
while num <n do
set num :=num+1;
set total :=total+num;
end while;

end$

create procedure p9(inout age int)
begin
set age :=age+20;
end$

set @nowage=12$

call p9(@nowage)$

select @nowage$

12.case 结构的运用
create procedure pten()
begin
declare pos int default 0;

set pos :=floor(5*rand());
case pos
when 1 then select 'still flying';
when 2 then select 'fall in sea';
when 3 then select 'in the island';
else select 'unkonw param';
end case;
end$

13.repeat循环结构

create procedure p11()
begin
declare i int default 0;
repeat
select i;
set i :=i+1;
until i>10 end repeat;
end$

create procedure p12()
begin
declare i int default 0;
declare sum int default 0;
repeat
set i :=i+1;
set sum :=sum+i;

until i>=100 end repeat;
select sum;
end$

14.游标的概念
--cursor 游标 游动的标志
--1条sql对应N条结果集的资源 取出资源的接口/句柄 就是游标
--沿着游标 可以一次取出1行

--declare 声明:declare 游标名 cursor for select statement
--open 打开;open 游标名
--fetch 取值;fetch 游标名 into var1,var2...
--close 关闭;close 游标名;

create procedure p13()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20);

declare getgoods cursor for select gid, num,name from goods;
open getgoods;

fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;

fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;

fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;

fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
close getgoods;
end$

--02000

15 游标循环
--way1
create procedure p14()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20);

declare cnt int default 0;
declare i int default 0;

declare getgoods cursor for select gid, num,name from goods;
select count(*) into cnt from goods;
open getgoods;

repeat
set i :=i+1;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until i>=cnt end repeat;
close getgoods;
end$

call p14()$ call p14$
16.declare 处理条件

--越界值

create procedure p15()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20);

declare rhave int default 1;

declare getgoods cursor for select gid, num,name from goods;
declare continue handler for NOT FOUND set rhave :=0;

open getgoods;

repeat

fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until rhave=0 end repeat;
close getgoods;
end$

17.对比continue与exit的区别

create procedure p16()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20);

declare rhave int default 1;

declare getgoods cursor for select gid, num,name from goods;
declare exit handler for NOT FOUND set rhave :=0;

open getgoods;

repeat

fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until rhave=0 end repeat;
close getgoods;
end$

18.游标循环读取的正确逻辑
--declare getgoods cursor for select gid, num,name from goods; 不一定取出数据
create procedure p17()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20);

declare rhave int default 1;

declare getgoods cursor for select gid, num,name from goods;
declare exit handler for NOT FOUND set rhave :=0;

open getgoods;
fetch getgoods into row_gid,row_num,row_name;

repeat
select row_num,row_name;
fetch getgoods into row_gid,row_num,row_name;

until rhave=0 end repeat;
close getgoods;
end$

19.mysql权限检查原理
[用户]<------>[服务器]
分为两个阶段
1:你有木有权限连接上来
2:你有没有权限执行操作(CURD)
对于1:服务器如何判断用户有没有权限连接上来
依据3个参数
你从哪来?host
你是谁?user
你的密码是多少?password

用户的这3个信息存储在mysql库下的user表内

--修改host域 使得ip可以连接
mysql>update user set password=password('root') where user='';
mysql>flush privileges;

20.全局授权与收回(从user全局表上)
[user]<------->[db]<------>[table-prv]
--新增一个用户
grant [权限1,权限2,权限3....] on *.* to user@'host' identified by 'password';
常用权限有all,select,create,drop,insert,delete,update...

grant all on *.* to leo@'192.168.1.%' identified by '123456';

--收回权限
revoke all on *.* from leo@'192.168.1.%';
--左边第一个*所有库
--左边第二个*所有表
flush privileges;

21.库及表级别授权与收回(db级别)

--针对某个库做授权

grant all on trdb.* to leo@'192.168.1.%';

--收回权限
revoke all on trdb.* from leo@'192.168.1.%';

--针对表级别做授权
grant select,insert,update on trdb.goods to leo@'192.168.1.%';

--mysql的权限控制可以精确到列看手册

sql编程小结的更多相关文章

  1. sqL编程篇(三) 游标与存储过程

    sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...

  2. SQL编程篇 (二) 定义与流程控制

    分类: sql编程:标准的sql 编程 * 纯sql 在标准的编程中又分为 sqlserver-->T-sql oracle-->pl-sql(扩展) 变量:在使用变量之前先定义 声明变量 ...

  3. 数据库之SQL编程

    定义局部变量 declare @num int 途径一: 途径二: set 和select赋值方式的区别 唯一区别,如果从数据库表中获取数据,只能用 select ) select @name =st ...

  4. SQL Server(六)——索引、视图和SQL编程

    1.索引 添加索引,设计界面,在任何一列前右键--索引/键--点击进入添加某一列为索引 2.视图 视图就是我们查询出来的虚拟表 创建视图:create view 视图名 as SQL查询语句,分组,排 ...

  5. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  6. SQL编程之高级查询(子查询)以及注意事项

    SQL编程之高级查询(子查询)以及注意事项   1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...

  7. SQL Server数据库(SQL Sever语言 函数以及SQL编程)

    1.数学函数:操作一个数据,返回一个结果 --去上限: ceiling ☆select ceiling(price) from car --去下限:floor ☆select floor(price) ...

  8. 自从学了SQL编程,哪里不会点哪里!!!

    在学习SQL编程前,先给大家分享几个段子吧,咱先乐呵乐呵! <桃花庵--程序员版> 写字楼里写字间,写字间中程序员:程序人员写程序,又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠:酒醉酒 ...

  9. Oracle数据库编程:PL/SQL编程基础

    2.PL/SQL编程基础: PL/SQL块:        declare        定义部分        begin        执行部分        exception        异 ...

随机推荐

  1. Sublime Text 3 常用插件以及安装方法(vue 插件)

    使用Package Control组件安装 也可以安装package control组件,然后直接在线安装: 按Ctrl+` 调出console 粘贴以下代码到底部命令行并回车: { import u ...

  2. “Ceph浅析”系列之二——Ceph概况

    本文将对Ceph的基本情况进行概要介绍,以期读者能够在不涉及技术细节的情况下对Ceph建立一个初步印象. 1. 什么是Ceph? Ceph的官方网站Ceph.com上用如下这句话简明扼要地定义了Cep ...

  3. Android新旧版本Notification

    Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...

  4. Swift微博项目--Swift中通过类名字符串创建类以及动态加载控制器的实现

    Swift中用类名字符串创建类(用到了命名空间) OC中可以直接通过类名的字符串转换成对应的类来操作,但是Swift中必须用到命名空间,也就是说Swift中通过字符串获取类的方式为NSClassFro ...

  5. ES6新特性:Javascript中Set和WeakSet类型的数据结构

    ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, ...

  6. DOCTYPE是什么鬼?文档模式又是什么鬼?

    !DOCTYPE !DOCTYPE是什么: 在所有 HTML 文档中规定 DOCTYPE 是非常重要的,这样浏览器就能了解预期的文档类型, 告诉浏览器要通过哪一种规范(文档类型定义 DTD)解析文档( ...

  7. Oracle数据库安装及配置(一)

    http://blog.csdn.net/phacker2010/article/details/7190126 1.安装 Oracle 版本:Oracle Database 10g Release ...

  8. java项目的划分方式:模块优先还是层优先?

    I've seen and had lots of discussion about "package by layer" vs "package by feature& ...

  9. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  10. 【BZOJ-1179】Atm Tarjan + SPFA

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2407  Solved: 993[Submit][Status ...