MySQL Avanzado
vista
Las vistas se almacenan en la base de datos y se pueden reutilizar. Los datos no se almacenan en las vistas.
Definir vista
CREATE VIEW 视图名 AS SELECT 列 1,列 2... FROM 表(查询语句);
Usar vistas
SELECT * FROM 视图名
Eliminar vista
drop view 视图名
CREATE VIEW sel_news AS
SELECT
n.id,
n.title,
t.type_name
FROM
news n
LEFT JOIN TYPE t
ON n.typeid = t.typeid;
-- 使用视图
SELECT
*
FROM
sel_news;
-- 删除视图
DROP VIEW sel_news
procedimiento almacenado
Conocimiento de la base de datos: puede almacenar datos en unidades de cola, utilizar lenguaje SQL y operar datos.
El lenguaje Java también se puede utilizar en la base de datos para tener funciones de procesamiento lógico.
Ha sido escrito de antemano y almacenado en la base de datos. Puede llamarlo directamente cuando lo use.
Ventajas: el proceso de procesamiento de una determinada lógica se almacena directamente en la base de datos. Se ejecuta más rápido.
Desventajas: alta dependencia de la base de datos, mala portabilidad
Definición del procedimiento almacenado MySQL
>
>创建存储过程的语法格式
>
> create procedure 存储过程名([in 变量名 类型,out 参数 2,…])
> begin
>
> [declare 变量名 类型 [DEFAULT 值];]
>
> 存储过程语句块;
>
>
> end;
Análisis gramatical:
1. Los parámetros de los procedimientos almacenados se dividen en tres tipos: in, out e inout.
2.in representa el parámetro de entrada (en parámetro de forma predeterminada), lo que indica que el valor del parámetro debe ser especificado por el programa que llama.
3.out representa el parámetro de salida, lo que significa que después de que el procedimiento almacenado calcula el valor del parámetro, el resultado del cálculo del parámetro de salida se devuelve al programa que llama.
4. Inout representa tanto un parámetro de entrada como un parámetro de salida, lo que significa que el valor del parámetro puede ser especificado por el programa que llama y el resultado del cálculo del parámetro inout se puede devolver al programa que llama.
5. Las declaraciones del procedimiento almacenado deben incluirse entre el inicio y el final.
6.Declare se usa para declarar variables. Para asignar un valor predeterminado a una variable, use default. Para cambiar el valor de la variable en un bloque de declaración, use set variable=value;
p.ej:
-- ------------------------------------存储过程--------------------------------------------------------------
DELIMITER $$
-- 创建存储过程
CREATE
PROCEDURE demo1()
-- 存储过程体
BEGIN
-- declare 用来声明变量
DECLARE v_name VARCHAR(10) DEFAULT '';
SET v_name = 'jim';
SELECT v_name; -- 测试输出语句
END$$
DELIMITER ;
-- 调用存储过程
CALL demo1();
-- 查询新闻类型为1的有几条 演示入参和出参
DELIMITER $$
CREATE PROCEDURE type_count (IN p_typeid INT, OUT p_count INT) -- 存储过程体
BEGIN
SELECT
COUNT (*) INTO p_count
FROM
news
WHERE typeid = p_typeid;
SELECT
p_count;
END $$
DELIMITER;
-- 在一个存储过程中调用另一个存储过程
CALL type_count (1, @p_count)
-- 存储过程中逻辑判断 if else
DELIMITER $$
CREATE PROCEDURE demo2 (IN p_day INT, OUT p_name VARCHAR (10))
BEGIN
IF p_day = 0
THEN SET p_name = "星期天";
SELECT
p_name;
ELSEIF p_day = 1
THEN
SET p_name="星期一";
SELECT p_name;
ELSE SET p_name= "无效日期";
SELECT p_name;
END IF;
END $$
DELIMITER;
CALL demo2 (0,@p_name);
-- 使用存储过程插入信息
DELIMITER $$
CREATE PROCEDURE save_admin (
IN p_account VARCHAR (10),
IN p_password VARCHAR (50),
OUT p_result VARCHAR (10)
)BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count FROM admin WHERE account = p_account;
IF v_count=0 THEN
INSERT INTO admin (account,PASSWORD)VALUES(p_account,p_password);
SET p_result = '保存成功';
ELSE
SET p_result = '账号已存在';
SELECT p_result;
END IF;
END $$
-- 测试CALL
CALL save_admin ('001','123',@p_result)
DELIMITER $$
CREATE PROCEDURE saveUser (
IN p_account VARCHAR (20),
IN p_sex CHAR (1),
OUT res_mark INT)
BEGIN
DECLARE v_count INT DEFAULT 0;
SELECT COUNT(*) INTO v_count
FROM
admin
WHERE account = p_account;
IF v_count =0
THEN
INSERT INTO admin (account,sex)
VALUES
(p_account,p_sex);
SET res_mark = 0;
ELSE SET res_mark = 1;
END IF;
END $$
-- 测试CALL
CALL save_admin ('001','123',@res_mark)
función
Las funciones son similares a los procedimientos almacenados, pero las funciones se utilizan principalmente para consultas.
create function 函数名([参数列表]) returns 数据类型
begin DECLARE 变量;
sql 语句;
return 值;
end;
Aviso:
1. La lista de parámetros contiene dos partes: nombre del parámetro y tipo de parámetro
2. Cuerpo de la función: debe haber una declaración de devolución; de lo contrario, se informará un error
3. Solo hay una oración en el cuerpo de la función, por lo que puede omitirla start end
4. Utilice la instrucción delimitadora para establecer la marca de finalización. La función de configuración no puede tener parámetros SET GLOBAL log_bin_trust_function_creators=TRUE;función de eliminación
Nombre de la función DROP FUNCTION,
por ejemplo:
-- ------------------------------------------函数--------------------------------------------------------
-- 函数 不带参数的
DELIMITER $$
CREATE FUNCTION test() RETURNS INT
BEGIN DECLARE v_num INT DEFAULT 0;
SELECT
COUNT(*) INTO v_num
FROM
admin;
RETURN v_num;
END $$
DELIMITER
-- 测试
SELECT test ();
-- 带参数的
DELIMITER $$
CREATE
FUNCTION findType(p_type INT) RETURNS VARCHAR(10)
BEGIN
DECLARE v_type VARCHAR(10) DEFAULT '';
IF p_type = 0 THEN
SET v_type = '超级管理员';
ELSE
SET v_type = '管理员';
END IF;
RETURN v_type;
END$$
SELECT account,id,findType(TYPE) FROM admin
DELIMITER $$
CREATE
FUNCTION find_news_type(p_typeid INT) RETURNS VARCHAR(10)
BEGIN
DECLARE v_type VARCHAR(10) DEFAULT '';
SELECT type_name INTO v_type FROM TYPE WHERE typeid = p_typeid;
RETURN v_type;
END$$
SELECT id,title,find_news_type(typeid) FROM news
desencadenar
Similar a los procedimientos almacenados, funciones, relacionadas con tablas, un poco como eventos
Se activa automáticamente antes o después de agregar, modificar o eliminar una tabla
Los desencadenantes tienen las siguientes características:
1. Asociado a la mesa
Los desencadenadores se definen en una tabla específica, que se denomina tabla de desencadenadores.
2. Activar activadores automáticamente
Al realizar una operación INSERTAR, ACTUALIZAR o ELIMINAR en datos de una tabla, si el
Se define un disparador para una acción específica, que se ejecuta automáticamente y no se puede deshacer.
3. No se puede llamar directamente
A diferencia de los procedimientos almacenados, los desencadenadores no se pueden llamar directamente ni pueden pasar ni aceptar parámetros.
4. Como parte de una transacción
El disparador y la declaración que activa el disparador se tratan como una sola transacción, que se puede obtener del disparador.
Retroceder en cualquier lugar.
Reglas de sintaxis para definir desencadenadores:
CREATE TRIGGER 触发器名称 触发时机 触发事件
ON 表名称
FOR EACH ROW -- 行级触发
BEGIN
语句
END;
Análisis de sintaxis:
1. Nombre del disparador: Se utiliza para identificar el disparador y lo personaliza el usuario.
2. Tiempo de disparo: su valor es antes o después.
3. Evento desencadenante: sus valores son insertar, actualizar y eliminar
4. Nombre de la tabla: identifica el nombre de la tabla para crear el disparador, es decir, en qué tabla se crea el disparador.
5. Declaración: es el cuerpo del programa desencadenante. El programa desencadenante puede utilizar el inicio y el final como principio y fin, y contiene varias declaraciones en el medio, por
ejemplo:
-- 触发器
-- 在admin表中插入一条数据后自动更新admin_log表
DELIMITER $$
CREATE
TRIGGER save_adminLog AFTER
INSERT
ON admin
FOR EACH ROW BEGIN
INSERT INTO admin_log(id,account,oper_time) VALUES(new.id,new.account,NOW());
END$$
DELIMITER ;
INSERT INTO admin(account,PASSWORD)VALUES('s001','1231');
-- 当admin表和role表的主键分别都是admin_role表的外键约束时,
-- 想要删除admin表或role表中的数据,必须先删除admin_role表中的关联关系
DELIMITER $$
CREATE
TRIGGER delete_admin_role
BEFORE
DELETE
ON admin
FOR EACH ROW BEGIN
DELETE FROM admin_role WHERE adminid= old.id;
END$$
DELIMITER ;
DELETE FROM admin WHERE id=3