mysql 客户端 5.7 sqlyog
一、视图 (简化)
SELECT Select_priv,Create_view_priv FROM mysql.user WHERE USER='root'; --查询当前用户是否具有创建视图的权限
CREATE VIEW mpView AS SELECT * FROM t_city; ---创建视图
SELECT * FROM mpView; --使用视图
二、存储过程
1、无参数()
DELIMITER $$
CREATE PROCEDURE proc_search_user();
BEGIN
SELECT * FROM t_city;
END$$
-- 将结束标志符更改回分号
DELIMITER ;
CALL proc_search_user(); ------调用存储过程proc_search_user()
2、创建变量 declare [变量名] [类型] …
DELIMITER $$
CREATE PROCEDURE test02()
BEGIN
DECLARE counts INT DEFAULT 0;
DECLARE counts01 INT DEFAULT 0;
SELECT COUNT(*) INTO counts FROM t_city;
SELECT COUNT(*) INTO counts01 FROM t_city;
SELECT counts,counts01;
END$$
DELIMITER ;
CALL test02();
3、有参数(in \ out \ inout) — 默认in
DELIMITER $$
CREATE PROCEDURE test03(uid INT(10))
BEGIN
DECLARE counts VARCHAR(100) CHARACTER SET utf8 DEFAULT '' ; ------改变字符集utf8,否则有错误
SELECT NAME INTO counts FROM t_student WHERE id = uid ;
SELECT counts;
END$$
DELIMITER ;
###注意中文问题,使用CHARACTER SET utf8 改为uft-8编码
CALL test03(1);
IN OUT INOUT 默认in
DELIMITER $$
CREATE PROCEDURE test04(uid INT , OUT username VARCHAR(30) CHARACTER SET utf8 )
BEGIN
SELECT NAME INTO username FROM t_student WHERE id = uid;
END $$
DELIMITER ;
调用有参存储过程
SET @uname = '';
CALL test04(1,@uname);
SELECT @uname AS username;
判断语句
DELIMITER $$
CREATE PROCEDURE test05(id INT)
BEGIN
DECLARE username INT(10) ;
IF(id>10)
THEN
SET username = 1;
SELECT username;
ELSE
SET username = 2;
SELECT username;
END IF;
END$$
DELIMITER ;
CALL test05(19);
循环语句(有参数)
DELIMITER $$
CREATE PROCEDURE test06(id INT )
BEGIN
DECLARE counts INT(5);
SET counts = id;
WHILE(counts <= 10) DO
BEGIN
SELECT counts ;
SET counts = counts + 2;
INSERT INTO produce_while_test(id) VALUES(counts);
END ;
END WHILE ;
END $$
DELIMITER ;
CALL test06(2);
循环语句 (无参数)
DELIMITER $$
CREATE PROCEDURE test07()
BEGIN
DECLARE counts INT(5) DEFAULT 0;
WHILE(counts <= 10) DO
BEGIN
#SELECT counts ;
SET counts = counts + 2;
INSERT INTO produce_while_test(id) VALUES(counts);
END ;
END WHILE ;
END $$
DELIMITER ;
CALL test07();
repeat 语句
###### repeat...until...end repeat; -----若条件1满足,则(until ) 跳出循环(end repeat)
存储过程–游标
##创建游标变量 eg: declare username_cur cursor for select name from users where id%2=0;
-- 游标是保存查询结果的临时区域
-- 游标变量username_cur保存了查询的临时结果,实际上就是结果集
-- 当游标变量中保存的结果都查询一遍(遍历),到达结尾,将变量stopflag设置为1,用于循环中判断是否结束
DELIMITER $$
CREATE PROCEDURE test08()
BEGIN
DECLARE stopflag INT DEFAULT 0;
DECLARE username VARCHAR(32);
-- 创建一个游标变量,declare 变量名 cursor ...
DECLARE cur_id CURSOR FOR SELECT id FROM users WHERE id%2=0;
-- 游标是保存查询结果的临时区域
-- 游标变量username_cur保存了查询的临时结果,实际上就是结果集
-- 当游标变量中保存的结果都查询一遍(遍历),到达结尾,将变量stopflag设置为1,用于循环中判断是否结束
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1;
OPEN cur_id; -- 打卡游标
FETCH cur_id INTO username; -- 游标向前走一步,取出一条记录放到变量username中,为了第一次的取出记录
WHILE(stopflag=0) DO -- 如果游标还没有结尾,就继续
BEGIN
-- 在用户名前门拼接 '_cur' 字符串
UPDATE users SET id = 00000 WHERE id = username;
FETCH cur_id INTO username; -- ??目的是为了下次循环再继续将游标中的记录放到username中
END;
END WHILE; -- 结束循环
CLOSE cur_id; -- 关闭游标
END $$
DELIMITER ;
CALL test08();
自定义函数
DELIMITER $$
CREATE FUNCTION getname(userid INT) RETURNS VARCHAR(32)
READS SQL DATA -- 从数据库中读取数据,但不修改数据
BEGIN
DECLARE username VARCHAR(32) DEFAULT '';
SELECT NAME INTO username FROM users WHERE id=userid;
RETURN username;
END $$
DELIMITER ;
概括():
1.创建函数使用create FUNCTION 函数名(参数) RETURNS 返回类型;
2.函数体放在begin和end之间;
3.returns指定函数的返回值;
4.函数调用使用select getname()。
触发器 trigger
DELIMITER $$
CREATE TRIGGER tr_users_insert AFTER INSERT ON users
FOR EACH row
BEGIN
insert INTO oplog(userid,username,ACTION,optime)
values(NEW.id,NEW.name,'insert',NOW());
END $$
DELIMITER ;
1、创建触发器使用 : create TRIGGER 触发器名
2、什么时候触发 after INSERT ON users,除了after还有before,是在对表操作之前(before)或者之后(after)触发动作的。
3、对什么操作事件触发 AFTER INSERT ON users,操作事件包括insert,UPDATE,delete...
4、对什么表触发 AFTER INSERT ON users -- 插入user表之后触发
5、影响的范围 for EACH ROW -- 每行
流程控制
CASE (变量名)
WHEN .. THEN ..
WHEN .. THEN ..
WHEN .. THEN ..
ELSE ...操作
END CASE;
event 事件
CREATE EVENT my_event
ON SCHEDULE EVERY 5 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO produce_while_test(id) VALUES(5);
**对event的一些简单操作**
SHOW VARIABLES LIKE '%event_scheduler%'; -- 查询调度器状态
SET GLOBAL event_scheduler=ON; -- 修改事件调度器状态
ALTER EVENT my_event DISABLE; -- 修改开启event