like:用来模糊查询
#查询姓'王'的学生信息 like%:代表一个或多个任意字符(通配符)
select * from 表名 where 字段 like '王%'
#_:只匹配一个通配符(字符)
select * from 表名 where 字段 like'小_';
#%5%:只要包含5关键字符即可
select *from 表名 where 字段 like '%5%';
注意:%在后,就是以这个属性结尾。%在前,就是以这个属性开头,两个%就是包含这个属性
|------mysql 没有检查约束
create database mydata3;
use mydata3;
create table bank ( username varchar(20), bmoney float ) --添加约束 作用:模拟一些故障(机器或人为) alter table bank add constraint ck_bank_bmoney check(bmoney>=1);
insert into bank values('张三',1000);
insert into bank values('李四',1);
select * from bank;
--转账:把“张三”转到“李四”账户,转块 update bank set bmoney=bmoney-1000 where username='张三'; update bank set bmoney=bmoney+1000 where username='李四'; |
转账问题,常见的一种事务问题如何解决?
它需要两条update语句来完成,这两条语句是一个整体
如果其中任意一条出现错误,则整个转账业务也取消,这两个账户中的余额恢复到原来的数据,从而确保转账前与转账后的余额不变。
解决方式:用sqlserver的方式
--解决方式 /* declare:定义变量 @@ERROR:跟踪sql语句如果sql语句有异常(问题),@@error自动计数 */ declare @sumError int begin begin transaction;--开启事务 --赋值 set @sumError=0; update bank set bmoney=bmoney-1000 where username='张三'; set @sumError=@sumError+@@ERROR; update bank set bmoney=bmoney+1000 where username='李四'; set @sumError=@sumError+@@ERROR; if(@sumError<>0) begin print 'sql语句执行有误!回滚中.....'; rollback transaction;--事务回滚(后悔药) end else begin print '执行无误,事务提交中...........'; commit transaction;--提交事务 end end; |
|-----在mysql中事务是自动提交的
SET autocommit=0; UPDATE info SET NAME='小明' WHERE id=3; UPDATE info SET NAME='大明' WHERE id=4; COMMIT; DELETE FROM info WHERE id=8; ROLLBACK; SET autocommit=1; |
|-----视图是一张虚拟数据表
#创建视图
create view 视图名称
as
查询语句
#查看视图
select * from 视图名称;
#对视图进行修改,添加,删除
update 视图名称 set 字段=指定条件
delete from 视图名称
|-----多表的情况,能否用视图进行封装?
DELIMITER $$
USE `mydata`$$
DROP VIEW IF EXISTS `vw_subject_01`$$
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vw_subject_01` AS SELECT `a`.`sid` AS `sid`, `a`.`sexam` AS `sexam`, `a`.`sdate` AS `sdate`, `b`.`SubjectName` AS `subjectname` FROM (`score` `a` JOIN `subject` `b`) WHERE (`a`.`subjectno` = `b`.`SubjectNo`)$$
DELIMITER ; |
注意:
|-----索引可以相对提高查询的性能,但不是绝对的!
----索引注意事项
n 查询时减少使用*返回全部列,不要返回不需要的列
n 索引应该尽量小,在字节数小的列上建立索引
n WHERE子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前
n 避免在ORDER BY子句中使用表达式
-------数据库的三范式:
1:保证每列的原子性 每列尽量不要再分割!
2:每张表只描述一件事情
3:如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
3.1:后面的主键列,指的不是当前数据表中的主键!
3.2:指的是其它数据表中的主键列
多表的情况,尽量不要设置主外键(不是说不设主键,主键要设,不设外键!!!)