2021/7/12
修改表结构
修改表的名称:alter table oldname rename to newname
修改字段类型:alter table 表名 modify 字段名 字段类型
修改字段名:alter table 表名 change oldcol newcol coltype
添加一列:alter table tabname add newcolname newcoltype first | after xx
删除一列:alter table drop colname;
修改列位置:ALTER TABLE students MODIFY stunum VARCHAR(50) FIRST;
ALTER TABLE students MODIFY stunum VARCHAR(50) AFTER sid;
ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST|AFTER 字段名2
将‘’字段1‘’字段移到‘’字段2’字段 前面|后面:
删除表:drop table 表名
2021/7/14
视图
视图:是一个虚拟的表,
- 并不储存真正的数据
- 可以从一个表,或者多个表组合数据
- 减低数据库的难度
注意事项:
- 方便查询但不建议增删改查
- insert update delete 可以影响原表,不建议
- 多表来的数据,增删改会有限制
创建视图:
CREATE VIEW VIEW_stu
AS
SELECT Sname FROM student
删除视图
DROP VIEW IF EXISTS view_stu
基于的查询
SELECT * FROM view_stu
索引
索引:快速查找, 提高数据库性能
索引的储存分类:B树,哈希表
常见索引类型:
- 主键索引 唯一、not null
- 唯一索引 唯一
- 联合索引 多列
- 全文索引 模糊查询
- 普通索引
创建索引:
CREATE INDEX index_stu_born ON student(bornDate)
CREATE [FULLTEXT| UNIQUE] INDEX 索引名 ON 表名(字段列表)
ALTER TABLE student ADD INDEX(S-name)
全文索引:
CREATE FULLTEXT INDEX index_stu_class ON student(Class);
唯一索引:
CREATE UNIQUE INDEX index_stu_class ON student(Sno);
查看索引:
SHOW INDEX FROM student;
删除索引:
DROP INDEX index_stu_class ON student;
创建索引的原则:
- 选择唯一性的索引
- 经常需要排序,分组,联合(group by,order by)的列
- 频繁查找的列 select
- 经常作为查找条件的列 where
- 表连接的列
不适合创建索引:
- 数据量不大
- 列值不多
写sql注意事项
- where 条件后,把有索引的列写在前面
- 联合索引,只有索引列同时使用到时,才会使用索引
- 索引不是越多越好
2021年/7/16
事务
事务是什么:
是数据库最小的逻辑单位,作为一个整体向数据库提交,要么全部都执行,要么全部都不执行,例如:A转账给B,A钱减少,B钱增加
事务的三大特性
- 原子性:事务中包含的操作,要么全部成功,要么全部失败
- 一致性:事务执行前后,数据总量是一致的,守恒
- 隔离性:事务是独立的,互不影响,互不依赖
- 持久性:事务执行完,数据都要持久化到数据库里
开启事务
begin;
一系列操作
失败了,回滚
rollback;
成功时提交
commit
事务隔离级别
- 脏读:一个事务进行增删改查,但未提交事务,另一个事务可以读取到为提交的事务
- 不可重复读:事务A,前后读的数据不一致
- 幻读:某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻读。
- 串行读:Serializable是最高的隔离级别,性能很低,一般很少用。在这级别下,事务是串行顺序执行的,不仅避免了脏读、不可重复读,还避免了幻读。
四大等级:读未提交(READ UNCOMMITTED)、读提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE)。
- 读未提交会读到另一个事务的未提交的数据,产生脏读问题
- 读提交则解决了脏读的,出现了不可重复读
- 可重复读解决了之前不可重复读和脏读的问题,但是由带来了幻读的问题,幻读一般是针对inser操作
- 串行化:解决所有问题,但效率太低了
2021/7/17
存储过程
是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
无参存储过程
-- 判断如果存在则删除,可以根据实际情况选择使用
drop procedure if exists `存储过程名称`;
-- 创建存储过程
delimiter $$
create procedure 存储过程名称()
begin
//具体sql语句
end $$
-- 调用存储过程
call 存储过程名称();
有参存储过程
drop procedure if exists `test4`;
-- 创建存储过程
delimiter $$
create procedure test4(in numadd int, out numa int, inout numb int)
begin
set numa = numadd + 1;
set numb = numb + numadd;
end $$
-- 调用存储过程
set @a = 0;
set @b = 10;
call test4(1,@a,@b);
select @a, @b;