什么是视图?
视图是两张有外键约束的表,显示所有的列,有些是重复的,把需要的字段显示出来
SELECT * FROM account a,orderlist o WHERE a.id=o.aid;
--创建视图account_orderlist
CREATE VIEW account_orderlist(account_id,account_name,orderlist_number) AS
SELECT
a.id,
a.name,
o.number
FROM
account a,
orderlist o
WHERE
a.id=o.aid;
--查看视图
SELECT * FROM account_orderlist;
查询结果后面没有null
--修改视图 (修改视图中的列的值)
SELECT * FROM account_orderlist;
UPDATE account_orderlist SET account_name="" WHERE account_id=2;
--修改视图(修改视图中的列名)
SELECT * FROM account_orderlist;
修改视图中的列名用ALTER
ALTER VIEW account_orderlist (account_id,account_name,number) AS
SELECT
FROM
WHERE
;
--删除视图
删除用DROP 视图用VIEW 视图名称
DROP VIEW IF EXISTS account_orderlist;
DROP VIEW account_orderlist IF EXISTS; X
选中sql语句,点击运行,视图被删除,对原表account,orderlist数据没有影响。
--存储过程查单词,记个框架,符号怎么放,其他的就是基础语法。
怎么删?类似于视图怎么删?用 PROCEDURE mysql.proc 为什么存储过程用mysql.proc??????
DELIMITER$
CREATE PROCEDURE stu_group()
BEGIN
SQL语句
END$
DELIMITER;
存储过程与变量
DELIMITER$
CREATE PROCEDURE acc_order()
BEGIN
--定义一个字符串类型的变量,并赋值默认值
DECLARE name VARCHAR(20);
--为变量赋值
SET name='存储过程';
--使用变量
SELECT name;
END$
DELIMITER;
--调用存储过程
CALL acc_order();
name
存储过程
男女同学的总分数
SELECT SUM(score) getSum INTO women FROM student WHERE gender='女';
DECLARE men ,women int;
--查询student表中男生的总分数,并赋值给变量men
SELECT SUM(score) INTO men FROM student WHERE gender='男';
--查询student表中女生的总分数,并赋值给变量women
SELECT SUM(score) INTO women FROM student WHERE gender='女';
--使用变量men,women
SELECT men,women;
日志表怎么写?为什么写?
id operation operation_id operation_time operation_params
int INSERT 1 (account表) 系统时间 做的事情:记录
CREATE TABLE account_log(
id INT PRIMARY KEY AUTO_INCREMENT,
operation_id INT,
operation_time DATETIME,
operation_params VARCHAR(255)
);
注意:
DATETIME格式为:yyyy-MM-dd HH:mm:ss SSS
注意:DOUBLE,LONG,FLOAT,,,可以直接写,bigint ??????
触发器怎么写?
先写个结束分割符
DELIMITER$
DELIMITER;
在结束分割符里面写创建一个触发器,叫什么名字 触发器名字一般取表名_触发器类型
CREATE TRIGGER account_insert
做了什么操作
INSERT
做的这个操作属于之前有数据变动还是之后,对原表的影响
AFTER INSERT
做了之前/之后,对哪张表
ON account
表中数据一行一行展示:无论添加,删除,更新
FOR EACH ROW
开始
结束$ 这里是$
BEGIN
END$
为什么要用$结束???
重写一遍?
结束分割符
DELIMITER$ 与上面的SQL语句划线
创建触发器,取一个名字,取名: 表名_触发器类型 不能用表名.触发器类型 mysql.proc 表示mysql数据库中的proc表
CREATE TRIGGER account_update 没有括号
做了什么操作
???? UPDATE
对哪张表
ON account
表的哪一行影响
FOR EACH ROW
开始,结束
BEGIN
开始和结束之间,触发器做的事情
触发器做的功能; 分号结束
END$
DELIMITER;
AFTER INSERT
BEFORE DELETE
UPDATE ????用什么
结束分割符之间
创建触发器
触发器做的操作
对哪张表,
对表的哪一行
开始和结束之间
触发器的功能; 也就是 operation_params?
触发器怎么写?
account表
对account表进行触发器操作,会有一个日志记录表
account_log日志表
CREATE TABLE account_log(
id INT PRIMARY KEY AUTO_INCREMENT,
做了什么操作
operation VARCHAR(20),
对象是谁
operation_id INT,
时间
operation_time DATETIME,
内容记录
operation_params VARCHAR(200)
);
运行结果:略
现在来写个触发器
流程是:
先写个结束分割符
DELIMITER$
CREATE TRIGGER account_insert
AFTER INSERT
ON account
FOR EACH ROW
DELIMITER;
在结束分隔符里面,创建一个触发器,取名字,
注意,取名字有要求,对哪个表,进行什么触发器名字; 不能用account.insert 例如mysql.proc 是数据库里面的proc表
把下面写的语句装进上面的语句中
CREATE TRIGGER account_insert 注意:没有括号
创建完触发器的名字,接下来就说明进行了什么触发器操作,对哪张表,表的哪一行
AFTER INSERT
注意:为什么 INSERT 用AFTER ? 插入之后对表有影响,表多了一行数据而已。
ON account
FOR EACH ROW
交代完了创建触发器,对哪张表,对表的每行,
接下来是写触发器执行的功能,写个开始,结束的分隔符,为什么用$
BEGIN
插入日志表中的数据规定格式,NULL,'INSERT',时间,
INSERT INTO account_log(
account表中的id为自增,填null,数据库设置会自增
类似于 timestamp: not null, 填null,系统会自增
--explicit_defaults_for_timestamp=1
下面写
)
END$
注意:
创建完account表,DESC account; 查看表的结构,对着表的结构写
NULL:
'INSERT':触发器的类型
时间:类型为DATETIME : NOW()
对象: new.id 新的id,新插入的数据的id
做的事情:用concat()函数,拼接字符串
INSERT INTO account VALUES(NULL,'INSERT',NOW(),new.id,CONCAT(怎么写?) );
account_log表字段:
id,operation触发器类型,操作时间,操作account表哪个id,operation_params
CONCAT('11','22','33');
112233
CONCAT_WS(',','11','22'); CONCAT WITH SEPARATOR
11,22
CONCAT('','','','')
CONCAT('插入后{id=','name=','money=','}');
CONCAT('插入后{id=',new.id,'name=',new.name,'money=',new.money'}')
new.id:int
new.name:varchar
new.money:double
是变量值
和字符串做拼接的话,变成一个字符串
插入后{id=1,name='张三',money=23.01}
CONCAT('插入后{id=',new.id,'name=',new.name,'money=',new.money,'}')
打印出来的:
插入后{id=