mysql复习
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
什么是视图
视图是两张有外键约束的表显示所有的列有些是重复的把需要的字段显示出来
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=1name='张三'money=23.01}
CONCAT('插入后{id=',new.id,''name=',new.name,''money=',new.money,'}')