事务是逻辑上的一组操作,要么都执行,要么都不执行
一个线程中的事务读到了另外一个线程事务中未提交的update数据.
一个线程中的事务读到了另外一个线程事务中已经提交的update的数据.
一个线程中的事务读到了另外一个线程事务中已经提交的insert的数据.
注意点:
MySQL默认的隔离级别:repeatable read
ORACLE默认的隔离级别:read committed
mysql 5
select @@session.tx_isolation;//查询当前会话事务隔离级别
select @@global.tx_isolation;//查询全局会话事务隔离级别
mysql 8
select @@session.transaction_isolation;//查询当前会话事务隔离级别
select@@global.transaction_isolation;//查询全局会话事务隔离级别
select @@transaction_isolation;//查询事务隔离级别
set session transaction isolation level 隔离登记;
隔离级别 | 脏读 | 不可重复读 | 幻影读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
create [algorithm = {undefined | merge | temptable}]
View 视图名
AS
select 查询语句
--删除视图
drop View 视图名;
algorithm
表示视图选择的算法。undefined
表示自动选择算法merge
表示将使用视图的语句与视图定义合并起来,使得视图的某一个部分取代语句对应的部分。temptable
表示将视图结果存入临时表,然后使用临时表执行语句with check option
表示更新视图时要保证在该视图的权限范围内。create trigger 触发器名
after/before insert/update/delete on 表名
for each row
begin
sql语句;
end;
sql语句操作;
-- 删除触发器
drop trigger 触发器名;
示例:
create trigger tg4
after update on tbl_order
for each row
begin
update goods set num = num + old.much-new.much where id= old.gid/new.gid;
end;
-- 会发现商品1的数量又变为8了
update tbl_order set much = 4 where oid= 4;
CREATE TABLE table_name [col_name data type]
[unique|fulltext] [index|key] [index_name](col_name[length])[asc|desc]
#查看:
show indexes from `表名`;
#或
show keys from `表名`;
#删除
alter table `表名` drop index 索引名;
###普通索引
(1)直接创建索引
CREATE INDEX index_name ON table_name(col_name);
(2)修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name(col_name);
(3)创建表的时候同时创建索引
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL ,
`content` varchar(255) NULL ,
`time` varchar(20) NULL,
PRIMARY KEY (`id`),
INDEX index_name (title(255))
);
(4)删除索引
DROP INDEX index_name ON table_name;
或者
alter table `表名` drop index 索引名;
###复合索引(组合索引)
复合索引:复合索引是在多个字段上创建的索引。复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。
(1)创建一个复合索引
create index index_name on table_name(col_name1,col_name2,...);
唯一索引:唯一索引和普通索引类似,主要的区别在于,唯一索引限制列的值必须唯一,但允许存在空值(只允许存在一条空值)。
(1)创建唯一索引
# 创建单个索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);
# 创建多个索引
CREATE UNIQUE INDEX index_name on table_name(col_name,...);
(2)创建表的时候直接指定索引
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL ,
`content` varchar(255) NULL ,
`time` varchar(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
UNIQUE index_name_unique(title)
)
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:
(1)主键索引(创建表时添加)
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL ,
`content` varchar(255) NULL ,
`time` varchar(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
创建表的适合添加全文索引
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL ,
`content` text NOT NULL ,
`time` varchar(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
)
(2)直接创建索引
CREATE FULLTEXT INDEX index_fulltext_content ON table_name(col_name)
存储过程是一组可编程的函数,是为了完成特定的SQL语句集,用户可通过存储过程的名字并给参数赋值来调用执行。
create procedure 过程名(in/out/inout 参数名 参数类型)
begin
sql语句 --> 一段业务逻辑
可用sql语法
end;
create procedure demo_inout_parameter(inout p_inout int)
begin
select p_inout;
set p_inout=2;
select p_inout;
end;
-- 调用存储过程
set @p_inout=1;
call demo_inout_parameter(@p_inout);
select @p_inout;
drop procedure 存储过程名
IN:参数值可在存储过程改变(set),用select 变量名 来查看参数值。该参数值无法被返回。
OUT:参数值可在存储过程改变,并可返回
INOUT:调用时指定,并且可被改变和返回
-- 如果有这个函数,就删除
drop function if exists 函数名;
-- 创建一个无参的函数
create function hello ()
-- 设置函数的返回类型
returns 参数类型,如:varchar (255)
begin-- 函数头
-- 中间的是函数体
return '一个简单的mysql函数'; -- 函数的返回值
end; -- 函数结尾
--调用函数
select hello(); -- select 函数名
本质上没区别,函数只能通过return语句返回单个值或表对象
存储过程不允许使用return,但可通过out参数返回多个值
函数可嵌入SQL中使用,可以在select中调用;存储过程不行
函数只能是in类型,存储过程可以in/out/inout类型
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。
**列不能再分 ** 要求属性具有原子性,不可再分解;
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。即:一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
满足范式一下,非主属性完全依赖于码,消除部分依赖。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.每一列数据都和主键直接相关,而不能间接相关。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。
满足范式二下,消除传递依赖