视图+存储过程+函数的一些小案例

CREATE TABLE admin(                    -- 创建表admin1
  id INT PRIMARY KEY AUTO_INCREMENT,   -- id(字段名) int型 pk主键,auto_increment自增
  username VARCHAR(20),                -- username(字段名)(varchar类型长度为20)
  PASSWORD VARCHAR(20)                 -- password
)

CREATE VIEW  vi1  -- 创建视图
AS
SELECT * FROM admin   

SELECT * FROM vi1;  -- 查询创建的视图

DESC vi1;   -- 查看视图结构

SHOW CREATE VIEW vi1    -- 查看试图详细定义




     SHOW VARIABLES LIKE 'autocommit';       -- 事物的四个特性acid,手动开启,手动提交或回滚       显示当前状态
     SET autocommit=0                        -- 设置成不自动提交,0为不自动提交,1为自动提交
     DELETE FROM admin WHERE admin.`id`=1    -- 删除id=1的数据
     ROLLBACK;                               -- 回滚不提交此sql语句,commit执行提交执行此sql语句
     
     SET autocommit =0;                      -- 设置手动提交
     START TRANSACTION;                      -- 手动开启事物
     DELETE FROM admin WHERE  admin.`id`=4;  -- 删除admin表中admin.id=4的语句
     SAVEPOINT a;                            -- 设置撤销点,撤销点前的不回滚
     DELETE FROM admin WHERE admin.`id`=5;   -- 删除admin表中admin.id=5的语句
     ROLLBACK TO a;                          -- 回滚到a节点,a节点以上不回滚
     SELECT * FROM admin;                    -- 查询admin表 
     
    DELIMITER  $$;                           -- 开始
    CREATE PROCEDURE mypro_10()              -- 创建存储过程mypro_10()
    BEGIN                                    -- 开始sql语句
           SELECT * FROM admin;              -- 查询admin表
    END $$;                                  -- 结束sql语句
    
    DROP PROCEDURE IF EXISTS `mypro_12`       -- 删除存储过程名为my_pro7

     DROP PROCEDURE IF EXISTS `mypro_10`         
     DELIMITER $$;                           -- 开始
     CREATE PROCEDURE mypro_7()              -- 创建mypro_1()存储过程
     BEGIN                                   -- Begin---->end 中写sql语句   
            SELECT * FROM admin;              -- 查询admin表
     END      $$;                            -- 结束
     
     CALL mypro_7();                         -- 调用mypro_1();存储过程
     
     
     
     DELIMITER $$;                           -- 有参数的存储过程
     CREATE PROCEDURE mypro_11(IN num INT)   -- 传入(in)一个num 为Int型的数值,传出(out),ji
     BEGIN                                   
     SELECT * FROM admin WHERE admin.`id`=num; -- 查询admin表中admin.id=传入的值
     END  $$;
     SET @num=0;                             -- 因为传入的值为是int型所以将num设置成0字符串型设置成''
     CALL mypro_11(5);                        -- 传入5进去     
     
     DELIMITER $$;                          
     CREATE PROCEDURE mypro_13(OUT num1 INT)   -- 传出(out)
     BEGIN
          SELECT COUNT(1) INTO num1 FROM admin; -- 将admi的总条数得到的值赋值给num1
     END     $$;       
     SET @num1=0;                             -- 设置传入的值为int因为(out num1 int)是int的值
     CALL mypro_13(@num1);                    -- 调用mypro_13(@num1) 存储过程(传入@num)@num的值被赋值成查询的总条数
     SELECT @num1;                           -- 查询@num1的参数
     
         
      INSERT INTO admin (username,PASSWORD) VALUES("1111","1111"); 
      INSERT INTO admin (username,PASSWORD) VALUES("1111","1111"); 
      INSERT INTO admin (username,PASSWORD) VALUES("1111","1111");  -- 插入三条username相同的语句,下一步存储过程一入一出,查询username相同的个数 
                                                             
     DELIMITER $$;
     CREATE PROCEDURE mypro_12(IN num VARCHAR(20) ,OUT num1 INT) -- 一入一出的存储过程参数int型可不给长度。
     BEGIN 
     SELECT COUNT(1)  INTO num1 FROM admin WHERE admin.username=num;  -- into把查询到的值赋值给num
     END  $$;
     SET @num='';
     SET @num1=0;
     CALL mypro_12('1111',@num1);
     SELECT @num1;
     
     
     DELIMITER $$;                                    
     CREATE PROCEDURE mypro_14(INOUT num INT)                  -- inout 输入输出
     BEGIN 
     SELECT COUNT(1) INTO num FROM admin WHERE admin.`id`>num;  -- 查询admin.id>10的总数据并把得到的数据赋值给num既传入又传出
     END $$;
     SET @num=10;
     CALL mypro_14(@num);
     SELECT @num;                                               -- 查询@num的值
            
                
      DELIMITER $$;                                             
      CREATE FUNCTION myfun_1()                                 -- 创建函数
    RETURNS INT
      BEGIN                       
      DECLARE c INT DEFAULT 0;                                  -- 函数内定义c值为0
         SELECT COUNT(1) INTO c FROM admin WHERE admin.`id`;    -- 查询所有的admin.id
         RETURN c;                                              -- 返回c值
      END $$;
      SELECT  myfun_1();                                        -- 调用函数
      
      
      
  DELIMITER $$;                                                 -- 函数为存储过程的out类型
  CREATE FUNCTION  myfun_3(username1 VARCHAR(20))               -- 函数只能返回一行
    RETURNS VARCHAR(20)
  BEGIN
     SET @sal='';   
     SELECT admin.`id` INTO @sal FROM admin
      WHERE `username`=username1 LIMIT 1;                        -- 只显示一行
  RETURN @sal;
  END $$;
  
  SELECT myfun_2('dd');
  
  
  SHOW CREATE FUNCTION myfun_2                                   -- 显示函数
  DROP FUNCTION myfun_2                                          -- 删除函数
  
  
  DELIMITER $$;
  CREATE FUNCTION myfun_add(a FLOAT,b FLOAT)
  RETURNS FLOAT                                                  -- 定义返回的类型为double
  BEGIN
            DECLARE sum_1 FLOAT;                                 -- 定义局部变量sum_1和fan一样
            SET sum_1=a+b;
            RETURN sum_1;
  END $$;
  
  SELECT myfun_add(1,2)                                          -- 返回1+2的值为3  存储过程和函数的区别,存储过程能存多条,函数只能存一条
  
  
  DROP FUNCTION IF EXISTS fun_my5;
                  
  DELIMITER $$;
  CREATE FUNCTION myfun_4(num FLOAT)
  RETURNS VARCHAR(20)                     -- varchar(20) varchar记得定型,int不用定型
  BEGIN
        DECLARE degree VARCHAR(20) DEFAULT 'D';
        IF num>=8 THEN SET degree='A';
        ELSEIF num>13 THEN SET degree='B';
        ELSEIF num>16 THEN SET degree='C';
        ELSE SET degree='D';
        END IF;
        RETURN degree;
  END   $$;
  
  SELECT myfun_4(15);            -- A
  
  DROP FUNCTION IF EXISTS fun_myf5;
  DELIMITER $$;
  CREATE FUNCTION fun_myf5(score FLOAT) RETURNS VARCHAR(10)
  BEGIN
      DECLARE degree VARCHAR(20) DEFAULT 'D';
      IF score>=90 THEN SET degree='A';
      ELSEIF score >80 THEN SET degree='B';
      ELSEIF score >60 THEN SET degree='C';
      ELSE SET degree='D';
      END IF;
      RETURN degree;
  END  $$;
  SELECT fun_myf5(90);
  
  DROP FUNCTION IF EXISTS fun_myf5;

DELIMITER $
CREATE FUNCTION fun_myf5(score FLOAT) RETURNS VARCHAR(10)
BEGIN	
	DECLARE degree VARCHAR(20) DEFAULT  'D';
	# if结构
	IF score>=90 THEN SET degree='A';
	ELSEIF score>80 THEN SET degree='B';
	ELSEIF score>60 THEN SET degree='C';
	ELSE SET degree='D';
	END IF;
	RETURN degree;
END $
DELIMITER ;

SELECT fun_myf5(87);
SELECT fun_myf5(57);             -- 存储过程和函数都可以使用分支结构

 SELECT                          -- if,while只能写在存储结构或函数中,case即可写在存储结构也可不写
  CASE 
   WHEN Salary>20000 THEN '高薪'
   WHEN Salary>10000 THEN '低能'
   ELSE '戴哥说:低能太多你们公司要完蛋了'
   END 
   FROM employees
   
   
DELIMITER $$;                                                          -- while循环
CREATE PROCEDURE mypro_15()
BEGIN 
         DECLARE i INT DEFAULT 0;      -- 默认为i的值为0
         WHILE i<5 DO                  -- whiie循环
         INSERT INTO admin (username,PASSWORD) VALUES(CONCAT('1234',i),CONCAT('1111',i));
         SET i = i+1;                 -- 循环一次加一次,不满足条件时不循环
         END WHILE;                    -- 结束循环 while--end while,case -- end , if--end if
END  $$;

CALL  mypro_15();               -- 存储过程用call 其他用select,但是存储过程有返回值的也需要用select查询返回的值