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