MYSQL全语法速查(含示例)

文章目录

  • 1.从简单的查询开始
    • 查找所有记录(SELECT *)
    • 查找记录中的所有登录名(SELECT)
    • 查找登录名为admin的密码(WHERE)
    • 查找电话号码非空的记录(IS NOT NULL)
    • 查找所在城市为北京或者用户名字是李四的记录(OR)
    • 查找所在城市为北京并且用户名字是张三的记录(AND)
    • 查找用户名字是李四或者王五的记录(IN)
    • 查找注册时间在2022年到2023年之间的记录(BETWEEN)
    • 查找姓张的用户记录(LIKE)
    • 查找所有记录并根据积分排序(ORDER BY)
    • 查找所有记录并根据积分降序排序(DESC)
    • 查找前两条记录(LIMIT)
    • 查找第两条记录(LIMIT a,b)
  • 2.表的连接
    • 查找用户所在城市、积分、是否是VIP(JOIN)
    • 查找ID对应的直接上级(如果有)的姓(自连接)
    • 查找ID(返回所有ID)对应的直接上级的姓(LEFT JOIN)
    • 查找ID对应的工作时间(USING)
    • 查找各员工的身份(UNION)
  • 3.增加、修改和删除
    • 添加一个测试用户(INSERT INTO)
    • 获取上一个插入数据的ID(LAST_INSERT_ID)
    • 创建employees的表复制(CREATE TABLE)
    • 更新表中ID为6的员工信息(UPDATE)
    • 删除员工ID为6的记录(DELETE)
  • 4.复杂查询
    • 聚合函数(MAX MIN AVG SUM COUNT)
    • 查找部门总工资(GROUP BY)
    • 查找总工资大于20000的部门(HAVING)
    • 查找部门工资并且汇总(WITH ROLLUP)
    • 查询工作时间为3年的员工薪水(IN)
    • 查找比所有姓张的员工工资高的工资(ALL)
    • 查找各部门大于部门平均工资的员工ID(相关子查询)
    • 查询工作时间为3年的员工薪水(EXISTS)
    • 查询ID不为1的员工工资、姓、以及平均工资(SELECT和FROM中的子查询)
    • 调整商品价格(ROUND TRUNCATE CEILING FLOOR ABS RAND)
    • 字符串处理(LENGTH UPPER LOWER LTRIM TRIM LEFT SUBSTRING LOCATE REPLACE CONCAT)
    • 日期处理(NOW CURRENT_DATE CURRENT_TIME YEAR EXTRACT)
    • 日期计算(DATE_FORMAT DATE_ADD DATE_SUB DATEDIFF TIME_TO_SEC)
    • 查找各ID员工和上级,标出无上级的员工(IFNULL)
    • 查找各ID员工和上级,标出无上级的员工部门(COALESCE)
    • 查找各ID员工工资水平(IF)
    • 查找各ID员工工资水平(CASE)
  • 5.视图、存储过程、触发器和事务
    • 创建视图(CREATE VIEW)
    • 删除或更改视图(DELETE REPLACE)
    • 对视图进行操作时不允许记录消失(WITH CHECK OPTION)
    • 创建并调用查询员工信息的存储过程(CREATE PROCEDURE、CALL)
    • 删除(如果存在)查询员工信息的存储过程(DROP PROCEDURE)
    • 查找指定部门的员工信息(带参存储过程)
    • 查找指定部门的员工信息(存储过程默认参数)
    • 更新ID为5的员工工作时间(存储过程参数验证)
    • 查找指定ID的员工工资(存储过程输出参数)
    • 将员工工资换算为美元(函数 FUNCTION)
    • 计算公司所发月工资(触发器TRIGGER)
    • 删除计算月工资的触发器(DROP TRIGGER)
    • 创建员工工龄记录事件(事件EVENT)
    • 查看、删除和更改事件
    • 加入新员工后更新月总工资(事务TRANSACTION)

1.从简单的查询开始

查找所有记录(SELECT *)

login表

userNamepassword
admin123456
user123
SELECT * FROM login;

在这里插入图片描述

查找记录中的所有登录名(SELECT)

login表

userNamepassword
admin123456
user123
SELECT userName FROM login;

在这里插入图片描述

查找登录名为admin的密码(WHERE)

login表

userNamepassword
admin123456
user123
SELECT password FROM login WHERE userName = "admin";

在这里插入图片描述

查找电话号码非空的记录(IS NOT NULL)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
SELECT * FROM userinfo WHERE Phone IS NOT NULL;

在这里插入图片描述

查找所在城市为北京或者用户名字是李四的记录(OR)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
SELECT * FROM userinfo WHERE City = "北京" OR Name = "李四";

在这里插入图片描述

查找所在城市为北京并且用户名字是张三的记录(AND)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
张二北京2222023-11-24 20:47:16
SELECT * FROM userinfo WHERE City = "北京" AND Name = "张三";

在这里插入图片描述

查找用户名字是李四或者王五的记录(IN)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
张二北京2222023-11-24 20:47:16
SELECT * FROM userinfo WHERE Name IN ("李四", "王五");

在这里插入图片描述

查找注册时间在2022年到2023年之间的记录(BETWEEN)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
张二北京2222023-11-24 20:47:16
SELECT * FROM userinfo WHERE Time BETWEEN "2022-01-01 00:00:00" AND "2023-12-31 23:59:59";

在这里插入图片描述

查找姓张的用户记录(LIKE)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
张二北京2222023-11-24 20:47:16
SELECT * FROM userinfo WHERE Name LIKE "张%";

在这里插入图片描述

查找所有记录并根据积分排序(ORDER BY)

pointinfo表

UserNamePointVip
张三101
李四23000
王五1001
张二5010
SELECT * FROM pointinfo ORDER BY Point;

在这里插入图片描述

查找所有记录并根据积分降序排序(DESC)

pointinfo表

UserNamePointVip
张三101
李四23000
王五1001
张二5010
SELECT * FROM pointinfo ORDER BY Point DESC;

在这里插入图片描述

查找前两条记录(LIMIT)

pointinfo表

UserNamePointVip
张三101
李四23000
王五1001
张二5010
SELECT * FROM pointinfo LIMIT 2;

在这里插入图片描述

查找第两条记录(LIMIT a,b)

pointinfo表

UserNamePointVip
张三101
李四23000
王五1001
张二5010
SELECT * FROM pointinfo LIMIT 1,1;

在这里插入图片描述

2.表的连接

查找用户所在城市、积分、是否是VIP(JOIN)

userinfo 表

NameCityPhoneTime
张三北京1234567892023-11-19 21:13:21
李四上海2022-03-26 11:30:02
王五深圳1111111112020-01-22 09:50:13
张二北京2222023-11-24 20:47:16

pointinfo表

UserNamePointVip
张三101
李四23000
王五1001
张二5010
SELECT
	Name, 
	City,
	Point,
	Vip 
FROM
	userinfo
	JOIN pointinfo ON userinfo.NAME = pointinfo.UserName;

在这里插入图片描述

查找ID对应的直接上级(如果有)的姓(自连接)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	t1.ID,
	t2.FirstName AS SuperiorFirstName 
FROM
	employees t1
	JOIN employees t2 ON t1.Superior = t2.ID;

在这里插入图片描述

查找ID(返回所有ID)对应的直接上级的姓(LEFT JOIN)

哪边要保留全表就往哪个方向连接
employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	t1.ID,
	t2.FirstName AS SuperiorFirstName 
FROM
	employees t1
	LEFT JOIN employees t2 ON t1.Superior = t2.ID;

在这里插入图片描述

查找ID对应的工作时间(USING)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

worktimeinfo表

IDWorkTime
13
23
310
43
510
SELECT
	employees.ID,
	worktimeinfo.WorkTime
FROM
	employees
	JOIN worktimeinfo USING(ID);

在这里插入图片描述

查找各员工的身份(UNION)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	ID,
	FirstName,
	LastName,
	"主管" AS Identity 
FROM
	employees 
WHERE
	Superior IS NULL 
	UNION
SELECT
	ID,
	FirstName,
	LastName,
	"普通员工" AS Identity 
FROM
	employees 
WHERE
	Superior IS NOT NULL;

在这里插入图片描述

3.增加、修改和删除

添加一个测试用户(INSERT INTO)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
INSERT INTO employees ( FirstName, LastName, Department, Salary )
VALUES
	( "赵", "一", "测试部门", 3000 );

在这里插入图片描述

获取上一个插入数据的ID(LAST_INSERT_ID)

在执行了上面的INSERT语句后使用,需要设置主键和自动递增
在这里插入图片描述

SELECT LAST_INSERT_ID();

在这里插入图片描述

创建employees的表复制(CREATE TABLE)

CREATE TABLE employees_backup AS 
SELECT * FROM employees;

在这里插入图片描述
在这里插入图片描述

更新表中ID为6的员工信息(UPDATE)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
6测试部门3000
UPDATE employees 
SET Department = "部门1",
	Superior = 3 
WHERE
	ID = 6;

在这里插入图片描述

删除员工ID为6的记录(DELETE)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
63部门13000
DELETE FROM employees WHERE ID = 6;

在这里插入图片描述

4.复杂查询

聚合函数(MAX MIN AVG SUM COUNT)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	MAX( Salary ),
	MIN( Salary ),
	AVG( Salary ),
	SUM( Salary ),
	COUNT( Salary ) 
FROM
	employees;

在这里插入图片描述

查找部门总工资(GROUP BY)

一般情况下GROUP BY的字段就是SELECT里面选择的非聚合函数的字段
employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	Department,
	SUM( Salary ) 
FROM
	employees 
GROUP BY
	Department;

在这里插入图片描述

查找总工资大于20000的部门(HAVING)

HAVING就是GROUP BY后的WHERE(条件)
employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	Department,
	SUM( Salary ) AS total_salary 
FROM
	employees 
GROUP BY
	Department 
HAVING
	total_salary > 20000;

在这里插入图片描述

查找部门工资并且汇总(WITH ROLLUP)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	Department,
	SUM( Salary ) 
FROM
	employees 
GROUP BY
	Department WITH ROLLUP;

在这里插入图片描述

查询工作时间为3年的员工薪水(IN)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

worktimeinfo表

IDWorkTime
13
23
310
43
510
SELECT
	Salary 
FROM
	employees 
WHERE
	ID IN ( SELECT ID FROM worktimeinfo WHERE WorkTime = 3 );

在这里插入图片描述

查找比所有姓张的员工工资高的工资(ALL)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	Salary 
FROM
	employees 
WHERE
	Salary > ALL ( SELECT Salary FROM employees WHERE FirstName LIKE "张%" );

在这里插入图片描述

查找各部门大于部门平均工资的员工ID(相关子查询)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	t1.ID 
FROM
	employees t1 
WHERE
	t1.Salary > ( 
		SELECT 
			AVG( Salary ) 
		FROM 
			employees t2 
		GROUP BY Department 
		HAVING t1.Department = t2.Department 
);

在这里插入图片描述

查询工作时间为3年的员工薪水(EXISTS)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

worktimeinfo表

IDWorkTime
13
23
310
43
510
SELECT
	Salary 
FROM
	employees 
WHERE
	EXISTS ( SELECT ID FROM worktimeinfo WHERE worktimeinfo.ID = employees.ID AND WorkTime = 3 );

在这里插入图片描述

查询ID不为1的员工工资、姓、以及平均工资(SELECT和FROM中的子查询)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	FirstName,
	Salary,
	( SELECT AVG( Salary ) FROM employees ) AS Average 
FROM
	( SELECT FirstName, Salary FROM employees WHERE ID <> 1 ) AS select_table;

在这里插入图片描述

调整商品价格(ROUND TRUNCATE CEILING FLOOR ABS RAND)

productprice 表

IDNamePrice
1炒饭10.36
SELECT
	ID,
	NAME,
	Price,
	ROUND( Price ) AS "四舍五入",
	ROUND( Price, 1 ) AS "四舍五入保留一位小数",
	TRUNCATE ( Price, 1 ) AS "截断保留一位小数",
	CEILING( Price ) AS "大于该数的最小整数",
	FLOOR( Price ) AS "小于该数的最大整数",
	ABS( Price ) AS "绝对值",
	RAND( ) AS "0-1随机浮点数" 
FROM
	productprice 
WHERE
	ID = 1;

在这里插入图片描述

字符串处理(LENGTH UPPER LOWER LTRIM TRIM LEFT SUBSTRING LOCATE REPLACE CONCAT)

SELECT
	LENGTH( "test" ) AS "字符数",
	UPPER( "test" ) AS "大写",
	LOWER( "TEST" ) AS "小写",
	LTRIM( "     test   " ) AS "左边去掉空格",
	TRIM( "   test    " ) AS "去掉空格",
	LEFT ( "test", 2 ) AS "前2个字符",
	SUBSTRING( "test", 2, 2 ) AS "位置2长度2的子字符串",
	LOCATE( "st", "test" ) AS "匹配字符串的位置",
	REPLACE ( "test", "st", "xt" ) AS "字符串替换",
	CONCAT( "FirstName", " ", "LastName" ) AS "字符串拼接";

在这里插入图片描述

日期处理(NOW CURRENT_DATE CURRENT_TIME YEAR EXTRACT)

SELECT
	NOW( ) AS "当前日期时间",
	CURRENT_DATE ( ) AS "当前年份",
	CURRENT_TIME ( ) AS "当前时间",
	YEAR ( NOW( ) ) AS "获取年份",
	EXTRACT( MONTH FROM NOW( ) ) AS "从当前格式中提取月份";

在这里插入图片描述

日期计算(DATE_FORMAT DATE_ADD DATE_SUB DATEDIFF TIME_TO_SEC)

SELECT
	NOW( ) AS "当前时间",
	DATE_FORMAT( NOW( ), "%Y %m %d" ) AS "格式化日期",
	DATE_ADD( NOW( ), INTERVAL 1 HOUR ) AS "增加一小时",
	DATE_SUB( NOW( ), INTERVAL 1 HOUR ) AS "减少一小时",
	DATEDIFF( "2023-12-1", "2023-12-3" ) AS "日期间隔",
	TIME_TO_SEC( "22:25" ) - TIME_TO_SEC( "22:00" ) AS "时间间隔(s)";

在这里插入图片描述

查找各ID员工和上级,标出无上级的员工(IFNULL)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT ID, IFNULL(Superior, "无上级") AS "上级ID" FROM employees;

在这里插入图片描述

查找各ID员工和上级,标出无上级的员工部门(COALESCE)

从前往后返回非空的查找值
employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT ID, COALESCE(Superior, Department, "无上级") AS "上级ID或部门" FROM employees;

在这里插入图片描述

查找各ID员工工资水平(IF)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT ID, IF(Salary >= 7000, "高工资", "普通工资") AS "工资级别", Salary FROM employees;

在这里插入图片描述

查找各ID员工工资水平(CASE)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000
SELECT
	ID,
CASE
	WHEN Salary >= 8000 THEN "高工资" 
	WHEN Salary >= 5000 AND Salary < 8000 THEN "中工资" 
	WHEN Salary < 5000 THEN "普通工资" 
END 
	AS "工资级别",
	Salary 
FROM
	employees;

在这里插入图片描述

5.视图、存储过程、触发器和事务

创建视图(CREATE VIEW)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

worktimeinfo表

IDWorkTime
13
23
310
43
510
CREATE VIEW work_time_info AS 
SELECT
	employees.ID,
	employees.FirstName,
	worktimeinfo.WorkTime
FROM
	employees
	JOIN worktimeinfo USING(ID);

在这里插入图片描述

删除或更改视图(DELETE REPLACE)

CREATE OR REPLACE VIEW work_time_info AS 
SELECT
	employees.ID,
	employees.FirstName,
	worktimeinfo.WorkTime
FROM
	employees
	JOIN worktimeinfo USING(ID);
DROP VIEW work_time_info;

对视图进行操作时不允许记录消失(WITH CHECK OPTION)

避免因为修改后记录不符合某一条件而被从视图中移除的情况,可以在创建视图时添加WITH CHECK OPTION

CREATE VIEW work_time_info AS 
SELECT
	employees.ID,
	employees.FirstName,
	worktimeinfo.WorkTime
FROM
	employees
	JOIN worktimeinfo USING(ID)
WITH CHECK OPTION;

创建并调用查询员工信息的存储过程(CREATE PROCEDURE、CALL)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

DELIMITER:修改分隔符(通常使用$$,可以改成其他的),目的是把CREATE到END的整个语句视为一体,最后把分隔符再改回分号

DELIMITER $$
CREATE PROCEDURE get_employee()
BEGIN
	SELECT * FROM employees;
END$$
DELIMITER ;

调用

CALL get_employee();

在这里插入图片描述

删除(如果存在)查询员工信息的存储过程(DROP PROCEDURE)

DROP PROCEDURE IF EXISTS get_employee;

查找指定部门的员工信息(带参存储过程)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

带参的存储过程:CHAR(3)表示有三个字符的字符串,名字为DepartmentName

DELIMITER $$
CREATE PROCEDURE get_employee_from_Department(DepartmentName CHAR(3))
BEGIN
	SELECT * FROM employees WHERE Department = DepartmentName;
END$$
DELIMITER ;
CALL get_employee_from_Department("部门1");

在这里插入图片描述

查找指定部门的员工信息(存储过程默认参数)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

带参的存储过程:CHAR(3)表示有三个字符的字符串,名字为DepartmentName

DELIMITER $$
CREATE PROCEDURE get_employee_from_Department(DepartmentName CHAR(3))
BEGIN
	IF DepartmentName IS NULL 
	THEN SET DepartmentName = "部门2";
	END IF;
	SELECT * FROM employees WHERE Department = DepartmentName;
END$$
DELIMITER ;

即使有默认参数,在调用的时候也需要传入空值,否则会报错.

CALL get_employee_from_Department(NULL);

更新ID为5的员工工作时间(存储过程参数验证)

worktimeinfo表

IDWorkTime
13
23
310
43
510

带参的存储过程:CHAR(3)表示有三个字符的字符串,名字为DepartmentName

DELIMITER $$
CREATE PROCEDURE update_work_time(time INT)
BEGIN
	IF time <= 0 
	THEN SIGNAL SQLSTATE "22003"
	SET MESSAGE_TEXT = "错误的工作时间";
	END IF;
	UPDATE worktimeinfo SET WorkTime = time WHERE ID = 5;
END$$
DELIMITER ;

SQLSTATE各种数字代表的具体意义可自行搜索,在这里22003表示数值异常

CALL update_work_time(-2);

在这里插入图片描述

查找指定ID的员工工资(存储过程输出参数)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

参数中的OUT表示这是输出参数,需要传入变量

DELIMITER $$
CREATE PROCEDURE get_salary_from_employee(ID INT, OUT find_salary INT)
BEGIN
	SELECT Salary INTO find_salary FROM employees t1 WHERE t1.ID = ID;
END$$
DELIMITER ;

注意此处变量find_salary 需要加前缀@

SET @find_salary = 0;
CALL get_salary_from_employee(3, @find_salary);
SELECT @find_salary AS "工资";

在这里插入图片描述

将员工工资换算为美元(函数 FUNCTION)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

READS SQL DATA表示函数选项:函数体中包含SELECT查询语句,但不包含更新语句
DECLARE:在函数中定义一个变量.DEFAULT是默认值

CREATE FUNCTION dollar_salary(ID INT)
RETURNS DECIMAL(10, 2)
READS SQL DATA
BEGIN
	DECLARE dollar DECIMAL(10, 2) DEFAULT 0;
	DECLARE iSalary INT;
	
	SELECT Salary INTO iSalary FROM employees t1 WHERE t1.ID = ID;
	SET dollar = iSalary / 7;
	
	RETURN dollar;
END

创建完函数就可以当成函数来用了

SELECT ID, Salary, dollar_salary(ID) AS "美元工资" FROM employees;

在这里插入图片描述

计算公司所发月工资(触发器TRIGGER)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

salaryinfo表

TotalSalary
37500

NEW指更新后行的数据,OLD指更新前行的数据,可以用来取其中的字段

DELIMITER $$
CREATE TRIGGER totalSalary_after_update
	AFTER UPDATE ON employees
	FOR EACH ROW
BEGIN
	UPDATE salaryinfo SET TotalSalary = TotalSalary + NEW.Salary - OLD.Salary;
END$$
DELIMITER ;
UPDATE employees SET Salary = 8000 WHERE ID = 1;

在这里插入图片描述
我们再把数据改回来

UPDATE employees SET Salary = 5000 WHERE ID = 1;

在这里插入图片描述
创建好的触发器是无法直接看到的,我们可以使用命令查看,大概是这样

SHOW TRIGGERS;

在这里插入图片描述
查找特定名称的触发器,information_schema是触发器所在的数据库的数据表triggers ,触发器都存储在里面,触发器使用特定命名方式可以方便地查找表或者操作对应的触发器

SELECT * FROM information_schema.triggers WHERE trigger_name LIKE "totalSalary%";

删除计算月工资的触发器(DROP TRIGGER)

DROP TRIGGER IF EXISTS totalSalary_after_update;

创建员工工龄记录事件(事件EVENT)

查看事件管理器是否打开,只有打开才能相应事件

SHOW VARIABLES LIKE "event%";

这里自动关闭了,把它打开

SET GLOBAL event_scheduler = ON;

在这里插入图片描述

worktimeinfo表

IDWorkTime
13
23
310
43
510

EVERY指多次执行,单次执行用AT

DELIMITER $$
CREATE EVENT yearly_update_worktimeinfo
ON SCHEDULE
	EVERY 1 YEAR STARTS "2023-01-01"
DO BEGIN
	UPDATE worktimeinfo SET WorkTIme = WorkTIme + 1;
END$$
DELIMITER ;

查看、删除和更改事件

SHOW EVENTS;
#或者筛选特定名字的事件
SHOW EVENTS LIKE "yearly%";

在这里插入图片描述
删除事件

DROP EVENT IF EXISTS yearly_update_worktimeinfo;

更改事件,使用ALTER代替CREATE即可

DELIMITER $$
ALTER EVENT yearly_update_worktimeinfo
ON SCHEDULE
	EVERY 1 YEAR STARTS "2023-01-01"
DO BEGIN
	UPDATE worktimeinfo SET WorkTIme = WorkTIme - 1;
END$$
DELIMITER ;

禁用或启用事件

ALTER EVENT yearly_update_worktimeinfo DISABLE;

在这里插入图片描述

ALTER EVENT yearly_update_worktimeinfo ENABLE;

在这里插入图片描述

加入新员工后更新月总工资(事务TRANSACTION)

employees表

IDFirstNameLastNameSuperiorDepartmentSalary
13部门15000
25部门23500
3部门110000
43部门17000
5部门212000

salaryinfo表

TotalSalary
37500

注意表结构,此时插入数据失败,salaryinfo表也不会更新

START TRANSACTION;
UPDATE salaryinfo SET TotalSalary = TotalSalary + 8000;
INSERT INTO employees (ID, FirstName, LastName, Salary) VALUES(2, "赵", "四", 8000);
COMMIT;

在这里插入图片描述
在这里插入图片描述

仍然是37500
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/223573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【节日专栏】Python海龟绘制圣诞树代码

圣诞节就要到了&#xff0c;有没有要送给朋友礼物的程序员呢&#xff1f; import turtledef tree(d, s):if d < 0:returnturtle.forward(s)tree(d - 1, s * 0.8)turtle.right(120)tree(d - 3, s * 0.5)turtle.right(120)tree(d - 3, s * 0.5)turtle.right(120)turtle.backw…

4.10 构建onnx结构模型-Softmax

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Softmax 结点进行分析 方式 方法一…

神通数据库备份

备份策略&#xff1a; 每月1、15日00:00全量物理备份 每周一凌晨02:00差异物理备份 其余每天凌晨03:00增量物理备份 使用的工具&#xff1a; 数据库维护工具 环境&#xff1a;windows11 step1&#xff1a;创建全量/差异/增量物理备份调度任务 其中&#xff1a; 备份模式&…

C语言之多维数组

所谓多维数组就是以多个数组为单位组成的数组&#xff0c;即元素本身是数组的数组。下面我们来学习多维数组的基本知识&#xff1a; 多维数组 上一节学习的数组都是int型或double型等单一类型&#xff0c;实际上数组本身也可以作为组成数组的元素。 以数组作为元素的数组时二…

HarmonyOS学习--创建和运行Hello World

创建和运行Hello World 打开DevEco Studio&#xff0c;在欢迎页单击Create Project&#xff0c;创建一个新工程。根据工程创建向导&#xff0c;选择创建Application应用或Atomic Service元服务。选择“Empty Ability”模板&#xff0c;然后单击Next。关于工程模板的介绍和支持…

C++ Core Guidelines解析 ( 好书推荐 )

C Core Guidelines是Bjarne和 Herb Sutter发起编写的一个开源项目&#xff0c;汇聚了 C社区多年来积累的宝贵经验&#xff0c;是非常全面的编程最佳实践指导&#xff0c;包括代码风格、函数、类、错误处理、性能优化等&#xff0c;可以说是C社区的集大成者。用Effective Modern…

Python函数

1.函数 1.1 函数概述 函数定义和优势 不同形状正方形打印 # 2个 for i in range(0, 2):for j in range(0, 2):print("*", end"")print() # 3个 for i in range(0, 3):for j in range(0, 3):print("*", end"")print() # 4个 for i …

NET Core迁移前工作

前段时间迁移.NET Core做了大量的试水和评估&#xff0c;今天整理一下分享给大家。大致有以下几个部分&#xff1a; 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主要特性 4. .NET Standard和.NET Core 5. .NET Core Roadmap&版本选择 接下来&#…

记录一次vscode markdown的图片路径相关插件学习配置过程

插件及说明查找过程 csdn搜索markdown图片路径&#xff0c;找到关于这一款插件的回答。打开vscode拓展搜索Paste Image这款插件&#xff0c;看到下载量挺高的&#xff0c;应该不赖。 点击仓库,进入该插件开源的github仓库,查看README文件阅读说明. 淡然在Vscode 插件项目下的细…

minio的k8s的单机部署

minio的k8s的单机部署 apiVersion: apps/v1 kind: Deployment metadata:name: minionamespace: itshare spec:replicas: 1selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:containers:- name: minioimage: minio/minio:RELEASE.2022-10-15T19-57-03Z…

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构&#xff0c;开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来&#xff0c;人们开始在微服务中搜索和采用各种模式。大多数时候&#xff0c;新模式的产生是为了解决另一个模式中出现的常见问题。…

MySQL Server 层和引擎层是如何交互的

Server 层、引擎层、BufferPool、磁盘间的关系 大体来说&#xff0c; MySQL可以分为Server层和存储引擎层两部分。 1&#xff09;Server 层&#xff1a;Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖MySQL的大多数核心服务功能&#xff0c;以及所…

深信服行为管理AC设置禁止用户使用向日葵等远程软件

需求&#xff1a;在特定的时间内禁止内外网用户使用向日葵、todesk等远程软件&#xff1b;只禁止使用专业的远程软件&#xff0c;内网的ssh、telnet、RDP需要正常放行 AC版本&#xff1a;AC13.0.62.001 Build20221107 通过访问权限策略来控制 1、行为管理→访问权限策略→新…

基于springboot+vue篮球联盟管理系统源码

&#x1f345; 简介&#xff1a;500精品计算机源码学习 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 文末获取源码 目录 一、以下学习内容欢迎交流&#xff1a; 二、文档资料截图&#xff1a; 三、项目技术栈 四、项目运行图 背景&#xff1a; 篮球运…

「智慧城市」这一概念科学吗?还是炒作?

智慧城市是一个综合性的概念&#xff0c;它利用信息技术和创新概念&#xff0c;将城市的各个系统和服务集成起来&#xff0c;以提升城市运行效率、优化城市管理和服务&#xff0c;改善市民的生活质量。 具体来说&#xff0c;智慧城市涵盖了许多领域&#xff0c;包括城市规划、建…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述&#xff0c;考查时易针对有关概念或性能指标出选择题&#xff0c;也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念&#xff0c;是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…

uni-app中vue3表单校验失败

目录 1.问题 2.原因及解决方式 3.表单校验方式&#xff08;vue3&#xff09; 1.问题 在app中使用uni-forms表单&#xff0c;并添加校验规则&#xff0c;问题是即使输入内容&#xff0c;表单校验依然失败。 代码&#xff1a; <template><view><uni-forms r…

案例052:用于日语词汇学习的微信小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Nginx跨域配置

一 跨域概述 1.1 同源策略 同源策略是一个安全策略。同源&#xff0c;指的是协议&#xff0c;域名&#xff0c;端口相同。浏览器处于安全方面的考虑&#xff0c;只允许本域名下的接口交互&#xff0c;不同源的客户端脚本&#xff0c;在没有明确授权的情况下&#xff0c;不能读…