触发器
内容
CREATE DATABASE dbtest17;
USE dbtest17;
CREATE TABLE test_trigger (
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30)
);
CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);
SELECT * FROM test_trigger;
SELECT * FROM test_trigger_log;
DELIMITER
CREATE TRIGGER before_insert_test_tri
BEFORE INSERT ON test_trigger
FOR EACH ROW
BEGIN
INSERT INTO test_trigger_log(t_log)
VALUES('before insert...');
END
DELIMITER ;
INSERT INTO test_trigger(t_note)
VALUES ('Tom...');
SELECT * FROM test_trigger;
SELECT * FROM test_trigger_log;
DELIMITER
CREATE TRIGGER after_insert_test_tri
AFTER INSERT ON test_trigger
FOR EACH ROW
BEGIN
INSERT INTO test_trigger_log(t_log)
VALUES ('after_insert...');
END
DELIMITER ;
INSERT INTO test_trigger(t_note)
VALUES('Jerry...');
SELECT * FROM test_trigger;
SELECT * FROM test_trigger_log;
CREATE TABLE employees
AS SELECT * FROM atguigudb.employees;
CREATE TABLE departments
AS SELECT * FROM atguigudb.departments;
DESC employees;
DELIMITER
CREATE TRIGGER salary_check_trigger
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
DECLARE mgr_sal DOUBLE;
SELECT salary INTO mgr_sal FROM employees
WHERE employee_id = NEW.manager_id;
IF NEW.salary > mgr_sal
THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资高于领导薪资错误';
END IF;
END
DELIMITER ;
INSERT INTO employees(employee_id,last_name,email,hire_date,job_id,salary,manager_id)
VALUES(300,'Tom','tom@126.com',CURDATE(),'AD_VP',8000,103);
INSERT INTO employees(employee_id,last_name,email,hire_date,job_id,salary,manager_id)
VALUES(300,'Tom','tom1@126.com',CURDATE(),'AD_VP',10000,103);
SELECT * FROM employees;
SHOW TRIGGERS;
SHOW CREATE TRIGGER salary_check_trigger;
SELECT * FROM information_schema.TRIGGERS;
DROP TRIGGER IF EXISTS after_insert_test_tri;
练习
CREATE TABLE emps
AS
SELECT employee_id,last_name,salary
FROM atguigudb.employees;
CREATE TABLE emps_back
AS
SELECT *
FROM emps
WHERE 1 = 2;
SELECT * FROM emps_back;
DELIMITER
CREATE TRIGGER emps_insert_trigger
AFTER INSERT ON emps
FOR EACH ROW
BEGIN
INSERT INTO emps_back(employee_id,last_name,salary)
VALUES(new.employee_id,new.last_name,new.salary);
END
DELIMITER ;
INSERT INTO emps
VALUES(300,'Tom',5600);
SELECT * FROM emps_back;
CREATE TABLE emps_back1
AS
SELECT * FROM emps
WHERE 1 = 2;
SELECT * FROM emps_back1;
DELIMITER
CREATE TRIGGER emps_del_trigger
BEFORE DELETE ON emps
FOR EACH ROW
BEGIN
INSERT INTO emps_back1(employee_id,last_name,salary)
VALUES(old.employee_id,old.last_name,old.salary);
END
DELIMITER ;
DELETE FROM emps
WHERE employee_id = 100;
SELECT * FROM emps_back1;
DELETE FROM emps;
SELECT * FROM emps_back1;
MySQL8.0的其他新特性
内容
CREATE DATABASE dbtest18;
USE dbtest18;
CREATE TABLE sales(
id INT PRIMARY KEY AUTO_INCREMENT,
city VARCHAR(15),
county VARCHAR(15),
sales_value DECIMAL
);
INSERT INTO sales(city,county,sales_value)
VALUES
('北京','海淀',10.00),
('北京','朝阳',20.00),
('上海','黄埔',30.00),
('上海','长宁',10.00);
SELECT * FROM sales;
CREATE TEMPORARY TABLE a
SELECT SUM(sales_value) AS sales_value
FROM sales;
SELECT * FROM a;
CREATE TEMPORARY TABLE b
SELECT city,SUM(sales_value) AS sales_value
FROM sales
GROUP BY city;
SELECT * FROM b;
SELECT s.city AS 城市,s.county AS 区,s.sales_value AS 区销售额,
b.sales_value AS 市销售额,s.sales_value/b.sales_value AS 市比率,
a.sales_value AS 总销售额,s.sales_value/a.sales_value AS 总比率
FROM sales s
JOIN b ON (s.city=b.city)
JOIN a
ORDER BY s.city,s.county;
SELECT city AS 城市,county AS 区,sales_value AS 区销售额,
SUM(sales_value) OVER(PARTITION BY city) AS 市销售额,
sales_value/SUM(sales_value) OVER(PARTITION BY city) AS 市比率,
SUM(sales_value) OVER() AS 总销售额,
sales_value/SUM(sales_value) OVER() AS 总比率
FROM sales
ORDER BY city,county;
CREATE TABLE employees
AS
SELECT * FROM atguigudb.employees;
SELECT * FROM employees;
CREATE TABLE goods(
id INT PRIMARY KEY AUTO_INCREMENT,
category_id INT,
category VARCHAR(15),
NAME VARCHAR(30),
price DECIMAL(10,2),
stock INT,
upper_time DATETIME
);
INSERT INTO goods(category_id,category,NAME,price,stock,upper_time)
VALUES
(1, '女装/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '连衣裙', 79.90, 2500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '卫衣', 89.90, 1500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '牛仔裤', 89.90, 3500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '呢绒外套', 399.90, 1200, '2020-11-10 00:00:00'),
(2, '户外运动', '自行车', 399.90, 1000, '2020-11-10 00:00:00'),
(2, '户外运动', '山地自行车', 1399.90, 2500, '2020-11-10 00:00:00'),
(2, '户外运动', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'),
(2, '户外运动', '骑行装备', 399.90, 3500, '2020-11-10 00:00:00'),
(2, '户外运动', '运动外套', 799.90, 500, '2020-11-10 00:00:00'),
(2, '户外运动', '滑板', 499.90, 1200, '2020-11-10 00:00:00');
SELECT * FROM goods;
SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS
row_num,id, category_id, category, NAME, price, stock
FROM goods;
SELECT *
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS
row_num,id, category_id, category, NAME, price, stock
FROM goods) t
WHERE row_num <= 3;
SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,id,
category_id, category, NAME, price, stock
FROM goods;
SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS
row_num,id, category_id, category, NAME, price, stock
FROM goods;
SELECT RANK() OVER w AS r,
PERCENT_RANK() OVER w AS pr,
id, category_id, category, NAME, price, stock
FROM goods
WHERE category_id = 1 WINDOW w AS (PARTITION BY category_id ORDER BY price
DESC);
SELECT RANK() OVER (PARTITION BY category_id ORDER BY price DESC ) AS r,
PERCENT_RANK() OVER (PARTITION BY category_id ORDER BY price DESC ) AS pr,
id, category_id, category, NAME, price, stock
FROM goods
WHERE category_id = 1 ;
SELECT CUME_DIST() OVER(PARTITION BY category_id ORDER BY price ASC) AS cd,
id, category, NAME, price
FROM goods;
SELECT id, category, NAME, price, pre_price, price - pre_price AS diff_price
FROM (
SELECT id, category, NAME, price,LAG(price,1) OVER w AS pre_price
FROM goods
WINDOW w AS (PARTITION BY category_id ORDER BY price)) t;
SELECT id, category, NAME, behind_price, price,behind_price - price AS
diff_price
FROM(
SELECT id, category, NAME, price,LEAD(price, 1) OVER w AS behind_price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price)) t;
SELECT id, category, NAME, price, stock,FIRST_VALUE(price) OVER w AS first_price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);
SELECT id, category, NAME, price,NTH_VALUE(price,2) OVER w AS second_price,
NTH_VALUE(price,3) OVER w AS third_price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);
SELECT NTILE(3) OVER w AS nt,id, category, NAME, price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);
CREATE TABLE departments
AS
SELECT * FROM atguigudb.departments;
SELECT * FROM departments
WHERE department_id IN (
SELECT DISTINCT department_id
FROM employees
);
WITH cte_emp
AS (SELECT DISTINCT department_id FROM employees)
SELECT * FROM departments d JOIN cte_emp e ON d.department_id = e.department_id;
SELECT * FROM employees;
WITH RECURSIVE cte
AS
(
SELECT employee_id,last_name,manager_id,1 AS n FROM employees WHERE employee_id = 100
UNION ALL
SELECT a.employee_id,a.last_name,a.manager_id,n+1 FROM employees AS a JOIN cte
ON (a.manager_id = cte.employee_id)
)
SELECT employee_id,last_name FROM cte WHERE n >= 3;
练习
CREATE DATABASE test18_mysql8;
USE test18_mysql8;
CREATE TABLE students(
id INT PRIMARY KEY AUTO_INCREMENT,
student VARCHAR(15),
points TINYINT
);
INSERT INTO students(student,points)
VALUES
('张三',89),
('李四',77),
('王五',88),
('赵六',90),
('孙七',90),
('周八',88);
SELECT * FROM students;
SELECT
RANK() OVER (ORDER BY points DESC) AS '排序1',
DENSE_RANK() OVER (ORDER BY points DESC) AS '排序2',
ROW_NUMBER() OVER (ORDER BY points DESC) AS '排序3',
id,student,points
FROM students;
SELECT
RANK() OVER w AS '排序1',
DENSE_RANK() OVER w AS '排序2',
ROW_NUMBER() OVER w AS '排序3',
id,student,points
FROM students WINDOW w AS (ORDER BY points DESC);