1 概览
MySQL数据操作: DML
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括
- 使用INSERT实现数据的插入
- UPDATE实现数据的更新
- 使用DELETE实现数据的删除
- 使用SELECT查询数据。
2 插入数据
#1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); 语法二: INSERT INTO 表名 VALUES (值1,值2,值3…值n); #2. 指定字段插入数据 语法: INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); #3. 插入多条记录 语法: INSERT INTO 表名 VALUES (值1,值2,值3…值n), (值1,值2,值3…值n), (值1,值2,值3…值n); #4. 插入查询结果 语法: INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;
3 更新数据
#语法: UPDATE 表名 SET 字段1=值1, 字段2=值2, WHERE CONDITION; #示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;
4 删除数据
#语法: DELETE FROM 表名 WHERE CONITION; #示例: DELETE FROM mysql.user WHERE password=’’;
5 查询数据
1.单表查询
单表查询(https://www.cnblogs.com/Eva-J/articles/9688313.html)
2.联表查询
多表查询(https://www.cnblogs.com/Eva-J/articles/9688383.html)
6 视图
#1、什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可 #2、为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 #3、如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; drop view teacher2course; #强调 1、在硬盘中,视图只有表结构文件,没有表数据文件 2、视图通常是用于插叙,尽量不要修改视图中的数据
7 触发器
在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器
为何要用触发器?
答: 触发器专门针对我们对某一张表数据增insert、删delete、改update的行为,这类行为一旦执行就会触发触发器的执行,即自动运行另外一段sql代码
#语法: delimiter // create trigger trigger名 after/before insert/delete/update on 表名 for each row begin sql代码。。。 END // delimiter ; # 解释: #after 事件执行之后触发 before 事件执行之前触发 #触发事件 insert delete update操作,触发触发器执行 #delimiter:分界符
CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR (32), priv CHAR (10), cmd CHAR (64), sub_time datetime, #提交时间 success enum ('yes', 'no') #0代表执行失败 ); CREATE TABLE errlog ( id INT PRIMARY KEY auto_increment, err_cmd CHAR (64), err_time datetime ); delimiter $$ create trigger tri_after_insert_cmd after insert on cmd for each row begin if NEW.success = 'no' then insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time); end if; end $$ delimiter ; #当使用update语句的时候,当修改原表数据的时候相对于修改数据后表的数据来说原表中修改的那条数据就是OLD对象, #而修改数据后表被修改的那条数据就是NEW对象 #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志 INSERT INTO cmd ( USER, priv, cmd, sub_time, success ) VALUES ('egon','0755','ls -l /etc',NOW(),'yes'), ('egon','0755','cat /etc/passwd',NOW(),'no'), ('egon','0755','useradd xxx',NOW(),'no'), ('egon','0755','ps aux',NOW(),'yes'); drop trigger tri_after_insert_cmd;
8 事务
开启一个事务可以包含一些sql语句,这些sql语句要么同时成功,要么一个都别想成功,称之为事务的原子性
开启事务之后,只要没有执行commit操作,都没有真正存储到硬盘,在commin提交事务之前,可以用 rollback 操作回滚数据。
# 语法: delimiter // create procedure p4( out status int ) BEGIN 1. 声明如果出现异常则执行{ set status = 1; rollback; } 开始事务 -- 由秦兵账户减去100 -- 方少伟账户加90 -- 张根账户加10 commit; 结束 set status = 2; END // delimiter ;
create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); try: update user set balance=900 where name='wsb'; #买支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #卖家拿到90元 except 异常: rollback; else: # 正确的话执行 commit;