【数据库】之MYSQL基本语法

发布于:2023-01-06 ⋅ 阅读:(295) ⋅ 点赞:(0)

实验2-用户权限及角色

 1.创建一个数据库用户myuser_201911074,密码为123
 CREATE USER myuser_201911074 IDENTIFIED WITH mysql_native_password BY '123';
 2.将数据库mydb_201911074上所有权限授予题1创建的用户
 GRANT ALL ON mydb_201911074 TO myuser_201911074;
 3.查询题1创建的用户拥有哪些权限
 SHOW GRANTS FOR myuser_201911074;
 4.撤销题1创建的用户拥有的权限
 REVOKE ALL ON mydb_201911074 FROM myuser_201911074;
 5.创建一个角色role_201911074
 CREATE  ROLE role_201911074;
 6.将数据库mydb_201911074上所有权限授予题5创建的角色
 GRANT ALL ON mydb_201911074 TO role_201911074;
 7.将角色role_201911074 授予题2创建的用户
 GRANT ALL ON role_20191074 TO myuser_201911074;
 8. 修改题1创建的用户,将所有角色设置为默认角色
 ALTER USER myuser_201911074 DEFAULT ROLE role_201911074;
 9.修改题1创建的用户的口令为pwd123,
 ALTER USER myuser_201911074 IDENTIFIED WITH mysql_native_password BY 'pwd123';
 10.以题1创建的用户访问数据库,并创建表( CREATE TABLE test(id INT); )
 CREATE TABLE test(id INT);
 11.删除题5创建的角色
 DROP ROLE role_201911074;
 12.删除题1创建的用户
 DROP USER myuser_201911074;

实验3-数据库和表

 创建数据库mydb_201911074,并切换到该数据库
 CREATE DATABASE mydb_201911074;
 USE mydb_201911074;
 创建一个员工表emp_201911074,包含员工编号(empid),员工姓名(empname),员工性别(empgender)
 USE mysql;
 CREATE TABLE emp_201911074(empid INT,empname VARCHAR(20),empgender VARCHAR(1));
 创建一个表空间mytbs_201911074,对应磁盘文件mytbs_201911074.ibd
 CREATE TABLESPACE mytbs_201911074 ADD DATAFILE'mytbs_201911074.ibd';
 显示表格emp_201911074
 DESC emp_201911074;
 修改表emp_201911074,将其存储在表空间mytbs_201911074
 ALTER TABLE emp_201911074 TABLESPACE=mytbs_201911074;
 修改表emp_201911074,将其表空间修改为file_per_table
 ALTER TABLE emp_201911074 TABLESPACE=innodb_file_per_table;
 修改表emp_201911074,增加列empage,放在empname后面
 ALTER TABLE emp_201911074 ADD COLUMN empage INT AFTER empname;
 修改表emp_201911074,将empname放在第一列
 ALTER TABLE emp_201911074 MODIFY empname VARCHAR(20) FIRST;
 修改表emp_201911074,将empname的类型修改为varchar(100)
 ALTER TABLE emp_201911074 MODIFY empname VARCHAR(100);
 修改表emp_201911074,删除列empage
 ALTER TABLE emp_201911074 DROP COLUMN empage;
 删除表emp_201911074,删除表空间mytbs_201911074,删除数据库database
 DROP TABLE emp_201911074;
 DROP TABLESPACE mytbs_201911074;
 DROP DATABASE mydb_201911074;

实验4-表数据操作

 1.创建一个员工表emp_201911074,包含员工编号(empid),员工姓名(empname),员工性别(empgender),
 员工入职日期(startdate),员工工资(salary),要求empid自增,同时设为主键PRIMARY KEY
 CREATE TABLE emp_201911074(empid INT AUTO_INCREMENT PRIMARY KEY,empname VARCHAR(20),
 empgender VARCHAR(10),startdate DATETIME,salary NUMERIC(10,2));
 2.将下表数据插入题1创建的表中
 empid   empname empgender   startdate   salary
 1         李飞    男         1999-07-01    8000
 2        赵美琪    女         2000-10-01    6000
 3        齐凌凌    女         1992-08-10    12000
 4         朱凯    男           2005-06-01  4500
 INSERT INTO emp_201911074 VALUES(1,'李飞','男','1999-07-01',8000),
 (2,'赵美琪','女','2000-10-01',6000),
 (3,'齐凌凌','女','1992-08-10',12000),
 (4,'朱凯','男','2005-06-01',4500);
 3.修改题1创建的表,增加一列员工年龄empage,放在empname后
 ALTER TABLE emp_201911074 ADD COLUMN empage INT AFTER empname;
 4.修改题1创建表的数据,将 齐凌凌 的年龄设为50
 UPDATE emp_201911074 SET empage=50 WHERE empname='齐凌凌';
 5.修改题1创建表的数据,将 李飞 的年龄设为45
 UPDATE emp_201911074 SET empage=45 WHERE empname='李飞';
 6.修改题1创建表的数据,将 赵美琪 的年龄设为40
 UPDATE emp_201911074 SET empage=40 WHERE empname='赵美琪';
 7.修改题1创建表的数据,将 朱凯 的年龄设为35
 UPDATE emp_201911074 SET empage=35 WHERE empname='朱凯';
 8.修改题1创建表的数据,将工资较低的两名员工工资上调500,要求使用order by和limit语句
 UPDATE emp_201911074 SET salary=salary+500 ORDER BY salary LIMIT 2;
 9.修改题1创建表的数据,将年龄较大的两名员工工资上调800,要求使用order by和limit语句
 UPDATE emp_201911074 SET salary=salary+800 ORDER BY empage DESC LIMIT 2;
 10.修改题1创建表的数据,将性别“男”修改成“male”,“女”修改成“female”
 UPDATE emp_201911074 SET  empgender='male' WHERE empgender='男';
 UPDATE emp_201911074 SET  empgender='female' WHERE empgender='女';
 11.修改题1创建表的数据,按年龄上调所有人工资,每1岁增加10元,例如某员工50岁,那么工资就增加50*10一共500元
 UPDATE emp_201911074 SET salary=salary+empage*10;
 12.从题1创建的表中删除年龄大于50且工资大于10000的员工
 DELETE FROM emp_201911074 WHERE empage>50 AND salary>10000;

实验5-表约束

 1. 创建院系表dept_201911074,包含院系编号dno,院系名dname,其中dno为主键,且院系名不能为空
 CREATE TABLE dept_201911074(dno INT PRIMARY KEY,dname VARCHAR(20) NOT NULL);
 2. 在院系表中插入两行数据
 dno dname
 1   计算机
 2   外语
 INSERT INTO dept_201911074 VALUES(1,'计算机'),(2,'外语');
 3. 创建教师表teacher_201911074,包含教师编号tno 主键,教师姓名tname 非空,教工身份证号 tid 唯一,教师性别tgender,教工年龄 tage,所属院系编号 deptid
 CREATE TABLE teacher_201911074(tno INT PRIMARY KEY,tname VARCHAR(20) NOT NULL,tid VARCHAR(18) UNIQUE,tgender VARCHAR(4),tage INT,deptid INT);
 4. 在表teacher_201911074的列deptid上增加外键约束,引用dept_201911074 表的dno列
 ALTER TABLE teacher_201911074 ADD FOREIGN KEY (deptid) REFERENCES dept_201911074(dno);
 5. 在教师表teacher_201911074 插入如下数据
 tno tname         tid            tgender tage   deptid
 101 张潇      210204198008111234  男       40      1
 102 李大明     211220197809101235  女      42       2
 INSERT INTO teacher_201911074 VALUES(101,'张潇','210204198008111234','男',40,1),
 (102,'李大明','211220197809101235','女',42,2);
 6. 查询教师表teacher_201911074 上的约束
 SHOW CREATE TABLE teacher_201911074;
 7. 删除教师表teacher_201911074 上的外键约束
 ALTER TABLE teacher_201911074 DROP FOREIGN KEY teacher_201911074_ibfk_1;
 8.在教师表teacher_201911074 上增加外键约束,当院系表dept_201911074 修改主键列值时级联更新教师表teacher_201911074,当院系表dept_201911074删除数据时将教师表teacher_201911074中对应教师的所属院系编号置成null。
 ALTER TABLE teacher_201911074 ADD FOREIGN KEY (deptid) REFERENCES dept_201911074(dno)
 ON UPDATE CASCADE
 ON DELETE SET NULL;

实验6-单表数据查询

基于如下员工表:

eid员工编号 ename员工姓名 age年龄 startdate入职日期 gender性别 salary工资 dname所属部门
101 王明 30 2012-07-10 4800 财务
102 李飞 30 2012-07-31 4800 财务
103 朱启亮 35 2008-10-01 6000 后勤
104 朱菲菲 36 2009-07-01 5800 后勤
105 李丽 2012-01-01 5000 财务
106 李晓 45 1998-07-01 9000 财务
 CREATE TABLE emp_201911074(eid INT PRIMARY KEY,ename VARCHAR(20),age INT,startdate DATETIME,gender VARCHAR(10),salary INT,dname VARCHAR(20));
 INSERT INTO emp_201911074 VALUES
 (101,'王明',30,'2012-07-10','男',4800,'财务'),
 (102,'李飞',30,'2012-07-31','男',4800,'财务'),
 (103,'朱启亮',35,'2008-10-01','男',6000,'后勤'),
 (104,'朱菲菲',36,'2009-07-01','女',5800,'后勤'),
 (105,'李丽',NULL,'2012-01-01','女',5000,'财务'),
 (106,'李晓',45,'1998-07-01','男',9000,'财务');
 ​
 1. 查询所有员工信息
 SELECT * FROM emp_201911074;
 2. 查询所有姓李的员工姓名、所属部门和工资
 SELECT ename,dname,salary FROM emp_201911074 WHERE ename LIKE '朱%';
 3. 查询工资介于5000~8000的员工信息
 SELECT * FROM emp_201911074 WHERE salary BETWEEN 5000 AND 8000;
 4. 查询财务部门的男员工信息
 SELECT * FROM emp_201911074 WHERE dname='财务' AND gender='男';
 5. 查询2000年前入职的员工信息
 SELECT * FROM emp_201911074 WHERE startdate<'2000-01-01';
 6. 查询后勤部门年龄低于40的女员工信息
 SELECT * FROM emp_201911074 WHERE dname='后勤' AND age<40 AND gender='女';
 7. 查询男员工中工资较高的两个员工信息
 SELECT * FROM emp_201911074 WHERE gender='男' ORDER BY  salary DESC LIMIT 2;
 8. 查询员工信息,按工资从高到低排序,分页显示,每页显示5行,写出显示第一页数据的语句
 SELECT * FROM emp_201911074 ORDER BY salary DESC LIMIT 0,5;
 9. 统计员工人数、最高工资、最低工资和平均工资
 SELECT COUNT(*),MAX(salary),MIN(salary),AVG(salary) FROM emp_201911074;
 10. 统计每个部门的员工人数、最高工资、最低工资和平均工资
 SELECT COUNT(*),MAX(salary),MIN(salary),AVG(salary) FROM emp_201911074 GROUP BY dname;
 11. 统计每个部门工资大于5000的员工人数、最高工资、最低工资和平均工资
 SELECT COUNT(*),MAX(salary),MIN(salary),AVG(salary) FROM emp_201911074 WHERE salary>5000 GROUP BY dname;
 12. 统计每个姓氏的人数(使用substr函数取姓名中的姓)
 SELECT SUBSTR(ename,1,1),COUNT(*) FROM emp_201911074 GROUP BY SUBSTR(ename,1,1);
 13. 按入职年份统计人数(使用year函数取入职日期中的年份)
 SELECT YEAR(startdate),COUNT(*) FROM emp_201911074 GROUP BY YEAR(startdate);
 14. 统计每个姓氏的人数,显示人数大于2人的姓氏和人数
 SELECT SUBSTR(ename,1,1),COUNT(*) FROM emp_201911074 GROUP BY SUBSTR(ename,1,1) HAVING COUNT(*)>2;

实验7-连接查询和子查询

基于部门表dept和员工表emp完成题目

部门表 dept

字段 类型 说明
dno int 部门编号,主键
dname varchar(30) 部门名称

员工表 emp

字段名 类型 说明
eno int 员工编号,主键
ename varchar(20) 姓名
eage int 年龄
egender varchar(10) 性别
salary int 工资
dno int 部门编号,外键,引用dept(dno)
 CREATE TABLE dept(
     dno INT PRIMARY KEY,
     dname VARCHAR(20)
 );
 CREATE TABLE emp(
     eno INT PRIMARY KEY,
     ename VARCHAR(20),
     eage INT,
     egender VARCHAR(20),
     salary INT,
     dno INT,
     FOREIGN KEY(eno) REFERENCES dept(dno)
 );
 INSERT INTO dept VALUES(1,'财务'),(2,'研发'),(3,'销售');
 ​
 INSERT INTO emp VALUES(101,'李敏', 30,'男',3000,1),(102,'赵一铭',32,'男',3500,1),(103,'李巧凤',40,'女',4000,1);  
 INSERT INTO emp VALUES(104,'朱阳爱',45,'男',5500,1),(105,'蔡敏敏',40,'女',4500,1),(106,'吴大刚',42,'男',4800,1);  
 INSERT INTO emp VALUES(107,'王晓红',36,'女',4000,1),(108,'滕格格',48,'男',6000,1),(109,'朱琳娜',55,'女',8000,1);  
 INSERT INTO emp VALUES(201,'郑琦',  40,'男',5000,2),(202,'牟琦',  50,'男',6000,2),(203,'杨薇',  52,'女',7000,2);  
 INSERT INTO emp VALUES(204,'张鸿鹄',26,'男',3000,2),(205,'李丽',  30,'女',3500,2),(206,'赵曼莎',35,'女',4200,2);  
 INSERT INTO emp VALUES(301,'赵鹏',  28,'男',3000,3),(302,'李丽芬',45,'女',5000,3),(303,'朱琳琳',50,'女',7000,3);
 1. 查询员工信息,要求输出 员工编号、姓名、性别、年龄以及所在部门名称
 SELECT eno,ename,egender,eage,dname FROM emp,dept WHERE dept.dno=emp.dno;
 2. 查询每个部门的信息,输出信息包括部门名称、员工人数、工资总额、最大工资、最小工资和平均工资
 SELECT dname,COUNT(eno),COUNT(salary),MAX(salary),MIN(salary),AVG(salary) FROM emp,dept WHERE dept.dno=emp.dno GROUP BY dname;
 3. 统计每个部门不同性别人数,输出信息包括部门名称、性别、人数
 SELECT dname,egender,COUNT(eno) FROM emp,dept WHERE dept.dno=emp.dno GROUP BY dname,egender;
 4. 查询每个部门的最小员工年龄,输出信息包括部门名称、最小年龄
 SELECT dname,MIN(eage) FROM emp,dept WHERE dept.dno=emp.dno GROUP BY dname;
 5. 查询每个部门每种性别的最小员工年龄,输出信息包括部门名称、最小年龄
 SELECT dname,MIN(eage) FROM emp,dept WHERE dept.dno=emp.dno GROUP BY dname,egender;
 6. 查询年龄大于所有员工平均年龄的员工信息,要求输出 员工编号、姓名、性别、年龄
 SELECT eno,ename,egender,eage FROM emp WHERE eage>(SELECT AVG(eage) FROM emp);
 7. 查询年龄最小的员工信息,要求输出 员工编号、姓名、性别、年龄
 SELECT eno,ename,egender,eage FROM emp WHERE eage=(SELECT MIN(eage)FROM emp);
 8. 查询年龄最小的员工信息,要求输出员工编号、姓名、性别、年龄以及所在部门名称
 SELECT eno,ename,egender,eage,dname FROM emp,dept WHERE dept.dno=emp.dno AND
 eage=(SELECT MIN(eage)FROM emp);
 9. 查询每个部门年龄最小的员工信息,要求输出 员工编号、姓名、性别、年龄和所属部门编号
 SELECT eno,ename,egender,eage,dno FROM emp e WHERE eage=(SELECT MIN(eage) FROM emp WHERE dno=e.dno);
 10. 查询每个部门年龄最小的员工信息,要求输出员工编号、姓名、性别、年龄以及所在部门名称
 SELECT eno,ename,egender,eage,dname FROM emp e,dept d WHERE e.dno=d.dno AND eage=(SELECT MIN(eage) FROM emp WHERE dno=e.dno);

实验8-索引和视图

基于部门表dept和员工表emp完成题目

部门表 dept

字段 类型 说明
dno int 部门编号,主键
dname varchar(30) 部门名称

员工表 emp

字段名 类型 说明
eno int 员工编号,主键
ename varchar(20) 姓名
eage int 年龄
egender varchar(10) 性别
salary int 工资
dno int 部门编号,外键,引用dept(dno)
 CREATE TABLE dept(
     dno INT PRIMARY KEY,
     dname VARCHAR(20)
 );
 CREATE TABLE emp(
     eno INT PRIMARY KEY,
     ename VARCHAR(20),
     eage INT,
     egender VARCHAR(20),
     salary INT,
     dno INT,
     FOREIGN KEY(dno) REFERENCES dept(dno)
 );
 ​
 INSERT INTO dept VALUES(1,'财务'),(2,'研发'),(3,'销售');
 ​
 INSERT INTO emp VALUES(101,'李敏', 30,'男',3000,1),(102,'赵一铭',32,'男',3500,1),(103,'李巧凤',40,'女',4000,1);  
 INSERT INTO emp VALUES(104,'朱阳爱',45,'男',5500,1),(105,'蔡敏敏',40,'女',4500,1),(106,'吴大刚',42,'男',4800,1);  
 INSERT INTO emp VALUES(107,'王晓红',36,'女',4000,1),(108,'滕格格',48,'男',6000,1),(109,'朱琳娜',55,'女',8000,1);  
 INSERT INTO emp VALUES(201,'郑琦',  40,'男',5000,2),(202,'牟琦',  50,'男',6000,2),(203,'杨薇',  52,'女',7000,2);  
 INSERT INTO emp VALUES(204,'张鸿鹄',26,'男',3000,2),(205,'李丽',  30,'女',3500,2),(206,'赵曼莎',35,'女',4200,2);  
 INSERT INTO emp VALUES(301,'赵鹏',  28,'男',3000,3),(302,'李丽芬',45,'女',5000,3),(303,'朱琳琳',50,'女',7000,3);
 1. 查看部门表dept有哪些索引。
 SHOW INDEX FROM dept;
 2. 查看员工表emp有哪些索引。
 SHOW INDEX FROM emp;
 3. 在员工表emp的年龄列eage上增加一个索引emp_eage_idx(要求使用alter table语句进行增加)
 ALTER TABLE emp ADD INDEX emp_eage_idx(eage);
 4. 在员工表emp的姓名列ename上增加一个索引emp_ename_idx(要求使用create index语句进行增加)
 CREATE UNIQUE INDEX emp_ename_idx ON emp(ename);
 5.删除员工表emp上外键约束
 ALTER TABLE emp DROP FOREIGN KEY emp_ibfk_1;
 6.删除员工表emp的dno列上的索引
 ALTER TABLE emp DROP INDEX emp_ename_idx;
 7.创建视图v1,显示员工中年龄大于40的男员工姓名
 CREATE VIEW v1 AS SELECT ename FROM emp WHERE egender='男' AND eage>40;
 8.创建视图v2,显示员工中工资较高的前3名女员工信息
 CREATE VIEW v2 AS SELECT * FROM emp WHERE egender='女' ORDER BY salary DESC LIMIT 3;
 9.创建视图v3,显示工资最低的员工信息
 CREATE VIEW v3 AS SELECT * FROM emp WHERE salary=(SELECT MIN(salary) FROM emp);
 10.创建视图v4,显示男员工中年龄最小的员工信息
 CREATE VIEW v4 AS SELECT * FROM emp WHERE egender='男' and eage=(SELECT MIN(eage) FROM emp);
 11.创建视图v5,显示每个部门工资最高的员工姓名、工资和所在部门名
 CREATE VIEW v5 AS SELECT ename,salary,dname FROM emp e,dept d WHERE e.dno=d.dno 
 AND eage=(SELECT Max(salary) FROM emp WHERE dno=e.dno);
 12.删除视图v1、v2、v3、v4、v5
 DROP VIEW v1,v2,v3,v4,v5;

实验9-内置函数

基于员工表emp完成测试题目

字段名 类型 说明
eno int 员工编号,主键
ename varchar(20) 姓名
eage int 年龄
startdate datetime 入职日期
egender varchar(10) 性别
salary int 工资
dname int 部门名称
 CREATE TABLE emp(
     eno INT PRIMARY KEY,
     ename VARCHAR(20),
     eage INT,
     startdate DATETIME,
     egender VARCHAR(20),
     salary INT,
     dname VARCHAR(20)
 );
 INSERT INTO emp VALUES
 (101,'王 明',30,'2012-07-10','男',4800,'财务'),
 (102,'李 飞',30,'2012-07-31','男',4800,'财务'),
 (103,'朱启亮',35,'2008-10-01','男',6000,'后勤'),
 (104,'朱菲菲',36,'2009-07-01','女',5800,'后勤'),
 (105,'李 丽',NULL,'2012-01-01','女',5000,'财务'),
 (106,'李 晓',45,'1998-07-01','男',9000,'财务');
 ​
 1.查询姓名长度超过10个字符的员工信息。
 SELECT * FROM emp WHERE CHAR_LENGTH(ename)<10;
 2.查询入职年份是2012年的员工信息。
 SELECT * FROM emp WHERE YEAR(startdate)=2012;
 3.将员工姓名中的空格去掉
 UPDATE emp SET ename=REPLACE(ename,' ','');
 4.查询员工编号是101的姓氏
 SELECT SUBSTR(ename,1,1)FROM emp WHERE eno=101;
 5.查询员工姓名、所属部门以及工龄
 SELECT ename,dname,FLOOR(DATEDIFF(NOW(),startdate)/365)FROM emp;
 6.修改员工表增加工龄列workage
 ALTER TABLE emp ADD COLUMN worage INT;
 7.计算每个员工工龄并更新到workage列
 UPDATE emp SET worage=FLOOR(DATEDIFF(NOW(),startdate)/365) WHERE eno=eno;
 8.查询入职月份是1~6月的员工信息
 SELECT * FROM emp WHERE MONTH(startdate) BETWEEN 1 AND 6;
 9.查询入职月份正好是本月的员工信息
 SELECT * FROM emp WHERE MONTH(startdate)=MONTH(NOW());
 10.查询入职日期恰好是当时月末的员工信息
 SELECT * FROM emp WHERE LAST_DAY(startdate)=DATE(startdate);

实验10-过程函数

 1.编写一个函数func_add_201911074,完成两个数相加,函数带两个输入参数(相加的两个数),返回值返回两个数的和。
 DELIMITER $$
 DROP FUNCTION IF EXISTS func_add_201911074$$
 CREATE FUNCTION func_add_201911074(m INT,n INT) 
 RETURNS INT
 DETERMINISTIC
 BEGIN
 RETURN m+n;
 END $$
 DELIMITER ;
 ​
 SELECT func_add_201911074(1,2);
 2.编写一个函数func_jc_201911074,函数带1个输入参数n,返回值为1~n的累乘积。
 DELIMITER$$
 DROP FUNCTION IF EXISTS func_jc_201911074$$
 CREATE FUNCTION func_jc_201911074(n INT)
 RETURNS INT  
 DETERMINISTIC
 BEGIN
 DECLARE r INT DEFAULT 1;
 WHILE n>0 DO
 SET r=r*n;
 SET n=n-1;
 END WHILE;
 RETURN r;
 END$$
 DELIMITER ;
 ​
 SELECT func_jc_201911074(4);
 3.编写一个存储过程sp_add_201911074,完成两个数相加,过程带两个输入参数(相加的两个数),一个输出参数(两个数的和,输出参数定义时在参数名前添加关键字OUT)。
 DELIMITER$$
 DROP PROCEDURE IF EXISTS sp_add_201911074$$
 CREATE PROCEDURE sp_add_201911074(m INT,n INT,OUT r INT)
 BEGIN
 SET r=m+n;
 END$$
 DELIMITER ;
 CALL sp_add_201911074(4,5,@r);
 SELECT @r;

4.编写一个存储过程sp_split,完成文件全路径名的拆分,函数带一个输入参数(全路径文件名,比如“c:\doc\course\db\text.txt”),两个输出参数分别返回路径和文件名(“c:\doc\course\db”, “text.txt”)。

 

实验11-触发器

 1.假设表
     CREATE TABLE emp(id INT,NAME VARCHAR(20),salary INT,dname VARCHAR(20),startdate DATE);
     编写一个触发器emp_trig,当在表上执行insert时触发器被触发,插入员工数据时根据入职年份以及入职顺序自动生成员工编号id。
 INSERT INTO emp VALUES(NULL,'张三',5000,'财务','2020-10-01'),(2,'张三峰',6000,'财务','2020-6-01'),(23,'张四峰',8000,'财务','2001-6-20');
 触发器会根据入职日期取入职年份2020,如果是2020年入职的第一个员工,则员工编号为2020001
 DELIMITER $$
 DROP TRIGGER IF EXISTS emp_trig$$
 CREATE TRIGGER emp_trig
 BEFORE INSERT 
 ON emp FOR EACH ROW
 BEGIN
 DECLARE maxid INT;
 SELECT IFNULL(MAX(id),YEAR(new.startdate)*1000)+1 INTO maxid FROM emp WHERE YEAR(startdate)=YEAR(new.startdate);
 SET new.id=maxid;
 END$$
 DELIMITER ;
 ​
 SELECT * FROM emp;
 SHOW CREATE TRIGGER emp_trig;
 2.创建一个事件,每月月末最后一天的晚上23点59分59秒运行一次,清除日志表log中的三个月前的数据。
 CREATE TABLE applog(msgdate DATE,msg VARCHAR(100));
 INSERT INTO applog VALUES
 ('2019-06-01','this is test log message.'),
 ('2020-08-01','this is test log message.'),
 ('2020-09-01','this is test log message.'),
 ('2020-10-01','this is test log message.');
 ​
 DELIMITER$$
 DROP EVENT IF EXISTS clearlog$$
 CREATE EVENT clearlog 
 ON SCHEDULE EVERY 1 MONTH STARTS '2020-12-31 23:59:59' DO
 BEGIN
 DELETE FROM applog WHERE msgdate<ADDDATE(NOW(),INTERVAL -3 MONTH);
 END $$
 DELIMITER ;
 SELECT * FROM applog;
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到