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

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

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查询返回的值
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您提供一个简单的教务系统案例,包括数据库设计、表设计、数据操纵、视图、索引、存储过程存储函数、触发器、事件、事务、数据库用户及权限分配、恢复与备份。 1. 数据库设计 教务系统的数据库设计包括以下几个表: - 学生表(student):存储学生的姓名、学号、性别、出生日期、班级等信息。 - 教师表(teacher):存储教师的姓名、工号、性别、职称等信息。 - 课程表(course):存储课程的名称、课程编号、学分、教师编号等信息。 - 成绩表(score):存储学生的成绩信息,包括学生编号、课程编号、成绩等信息。 - 班级表(class):存储班级的名称、班级编号、专业等信息。 2. 表设计 根据上述设计,我们可以创建以下表: - 学生表 ``` CREATE TABLE student ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, gender ENUM('男', '女'), birthday DATE, class_id INT UNSIGNED NOT NULL, FOREIGN KEY (class_id) REFERENCES class(id) ); ``` - 教师表 ``` CREATE TABLE teacher ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, gender ENUM('男', '女'), title VARCHAR(20) ); ``` - 课程表 ``` CREATE TABLE course ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, credit FLOAT UNSIGNED, teacher_id INT UNSIGNED NOT NULL, FOREIGN KEY (teacher_id) REFERENCES teacher(id) ); ``` - 成绩表 ``` CREATE TABLE score ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, student_id INT UNSIGNED NOT NULL, course_id INT UNSIGNED NOT NULL, score FLOAT UNSIGNED, FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id) ); ``` - 班级表 ``` CREATE TABLE class ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, major VARCHAR(50) ); ``` 3. 数据操纵 插入数据: ``` INSERT INTO student (name, gender, birthday, class_id) VALUES ('张三', '男', '1999-01-01', 1); INSERT INTO teacher (name, gender, title) VALUES ('李四', '男', '教授'); INSERT INTO course (name, credit, teacher_id) VALUES ('数据库原理', 3.0, 1); INSERT INTO score (student_id, course_id, score) VALUES (1, 1, 90.0); INSERT INTO class (name, major) VALUES ('计算机科学与技术1班', '计算机科学与技术'); ``` 查询数据: ``` -- 查询学生 SELECT * FROM student; -- 查询教师 SELECT * FROM teacher; -- 查询课程 SELECT * FROM course; -- 查询成绩 SELECT * FROM score; -- 查询班级 SELECT * FROM class; ``` 更新数据: ``` -- 更新学生信息 UPDATE student SET name = '李四', gender = '女' WHERE id = 1; -- 更新教师信息 UPDATE teacher SET name = '王五' WHERE id = 1; -- 更新课程信息 UPDATE course SET credit = 4.0 WHERE id = 1; -- 更新成绩信息 UPDATE score SET score = 80.0 WHERE id = 1; -- 更新班级信息 UPDATE class SET name = '计算机科学与技术2班' WHERE id = 1; ``` 删除数据: ``` -- 删除学生 DELETE FROM student WHERE id = 1; -- 删除教师 DELETE FROM teacher WHERE id = 1; -- 删除课程 DELETE FROM course WHERE id = 1; -- 删除成绩 DELETE FROM score WHERE id = 1; -- 删除班级 DELETE FROM class WHERE id = 1; ``` 4. 视图 创建视图: ``` CREATE VIEW student_view AS SELECT s.id, s.name, s.gender, s.birthday, c.name AS class_name FROM student s JOIN class c ON s.class_id = c.id; ``` 查询视图: ``` SELECT * FROM student_view; ``` 5. 索引 为表创建索引: ``` CREATE INDEX idx_student_name ON student (name); ``` 删除索引: ``` DROP INDEX idx_student_name ON student; ``` 6. 存储过程 创建存储过程: ``` DELIMITER // CREATE PROCEDURE get_student(IN student_id INT) BEGIN SELECT * FROM student WHERE id = student_id; END // DELIMITER ; ``` 调用存储过程: ``` CALL get_student(1); ``` 7. 存储函数 创建存储函数: ``` DELIMITER // CREATE FUNCTION get_student_name(IN student_id INT) RETURNS VARCHAR(20) BEGIN DECLARE student_name VARCHAR(20); SELECT name INTO student_name FROM student WHERE id = student_id; RETURN student_name; END // DELIMITER ; ``` 调用存储函数: ``` SELECT get_student_name(1); ``` 8. 触发器 创建触发器: ``` CREATE TRIGGER update_student_score AFTER UPDATE ON score FOR EACH ROW BEGIN UPDATE student SET score = NEW.score WHERE id = NEW.student_id; END; ``` 删除触发器: ``` DROP TRIGGER update_student_score; ``` 9. 事件 创建事件: ``` CREATE EVENT backup_database ON SCHEDULE EVERY 1 WEEK DO BEGIN -- 备份数据库 mysqldump -u root -p mydatabase > mydatabase_backup.sql; END; ``` 删除事件: ``` DROP EVENT backup_database; ``` 10. 事务 开启事务: ``` START TRANSACTION; ``` 提交事务: ``` COMMIT; ``` 回滚事务: ``` ROLLBACK; ``` 11. 数据库用户及权限分配 创建用户: ``` CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword'; ``` 授权: ``` GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'myuser'@'localhost'; ``` 撤销权限: ``` REVOKE SELECT, INSERT, UPDATE, DELETE ON mydatabase.* FROM 'myuser'@'localhost'; ``` 删除用户: ``` DROP USER 'myuser'@'localhost'; ``` 12. 恢复与备份 备份数据库: ``` mysqldump -u root -p mydatabase > mydatabase_backup.sql; ``` 恢复数据库: ``` mysql -u root -p mydatabase < mydatabase_backup.sql; ``` 以上是一个简单的教务系统案例,包括数据库设计、表设计、数据操纵、视图、索引、存储过程存储函数、触发器、事件、事务、数据库用户及权限分配、恢复与备份。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值