##union合并查询结果
select ename,job from emp where job = ‘Man’
select ename,job from emp where job=‘Sal’;
union
select ename,job from emp where job in (‘Man’,‘Sal’);
union的效率要高一些,对于表链接来说,没连接一次新表,则匹配的次数满足笛卡尔积,成倍翻,但是union减少匹配的次数,在减少匹配次数还可以完成两个结果集的拼接
union 在使用的时候要求列和列的数据类型得一致
limit
limit 将查询结果一部分查询出来,可以使用分页查询
分页作用是提高用户的体验,可以一页一页的翻着看
select ename from emp order by desc limit 0,5
mysql中limit在order by之后取出
limit (pageNo-1)*pageSize ,pageSize
Dql
select…
form…
where …
group by…
having…
order by…
limit …
执行顺序
from
where
group by
having
select
order by
limit
str_to_date
函数可以把字符串varchar转换为date类型数据
%Y %m %d %h %i %s
truncate语句,直接删除内存空间,不支持回滚,快速,是否真的要删除,并且警告无法修复
constraint约束
创建表,字段加一些约束,保证数据的完整性,有效性
非空 not null
唯一约束 unique
主键约束 primarykey
外键约束 foreignkey
检查约束
source
执行sql文件,
外键foreignkey
foreign key(con) references t_class(classno)
子表的外键引用父表的某个字段,被引用这个字段必须是主键?
不一定是主键,但至少具有unique约束
存储引擎
存储引擎实际上是一个表存储/组织数据的方式
不同的存储引擎,表存储数据的方式不同,在建表的时候可以在最后小括号的右边使用,ENGINE指定存储引擎 默认是InnoDB
CHARSET指定表的字符编码方式
engine =InnoDB default charset=utf-8
怎么查看mysql支持什么引擎
show engines \G
索引相当于一本书的目录,,缩小扫描范围,提高查询效率
InnoDB支持事务,是mysql默认的引擎,支持数据库奔溃后的自动修复机制,非常安全,在表空间中,被用于存储表的内容。
MyISam不持支事务,安全性低
MEMORY存储引擎,数据存储在内存中,(查询快,不能包含text和Blog)
MEMory存储引擎之前被叫heap引擎
查询效率高,不安全,关机后数据消失,因为数据和索引都放在内存中
事务
重点中的重点
什么是事务?
事务其实就是一个完整的业务逻辑。
什么是完整的业务逻辑呢?
转账:A向B转账1000,A账户减少1000,B账户增加1000,这就是一个完整的业务逻辑,是一个最小的工作单元,要么同时成功,要么同时失败,不可再分,事务只根增删改有关,其他语句和事务没什么关系
一个业务逻辑需要执行多条sql语句,如果只有一条DML语句,事务没有必要存在,因此,完成一件事需要多条DML语句共同联合语句搞定
一个事务其实是多条DML语句同时成功,或者同时失败
事务是如何做到同事成功和同时失败呢?
InnoDB存储引擎,提供一组用来记录事务性活动的日志文件
每一条DML的操作都会被记录到“事务性活动的日志文件”
提交事务,清空事务活动的日志文件,并将数据全部持久化到数据库表中,并且是一种完全成功
回滚事务,将之前的DML操作全部撤销,清空日志文件,回滚事务标志着事务的结束,是失败的结束。
提交事务:commit语句
回滚事务:rollback语句
事务英文单吃:transaction
mysql默认情况下是默认是自动提交事务
怎么将mysql的自动提交机制关闭呢.?
先执行:start transaction;
commit提交事务,持久化到数据库
事务的4个特征ACID
A原子性
事务是最小的工作单元,不可再分
C一致性
所有事务要求,在所有事务中,所有操作都必须同时成功,或者同时失败,以保证数据的一致性
I隔离性
A事务和B事务之间有一定的隔离
教室A和教室B之间有一道墙,这道墙就是隔离性
D持久性
事务始终结束的是一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘中!
事务的隔离级别:
4个级别
读未提交 read uncommitted
事务A可以读取到事务B未提交的数据
这种隔离级别存在问题:脏读(Dirty Read),这种隔离级别是理论上的,大多数数据库隔离级别二档起步
读已提交 read committed
事务A只能只读到事务B提交后的数据
解决了脏读的现象,这种隔离级别存在不可重复读取数据
什么是不可重读?
当事务开启的时候,第一次读取数据是3条,当前事务还没有结束,可能第二次读到的数据4条,这种隔离级别是比较真实的数据,每次读到的数据绝对真实。Oracle数据库默认的事务隔离级别就是read committed
可重复读 repeatable read
什么是可重复读?
事务A开启之后,不管多久,每次从事务A中读到的数据都是一致的,即使事务B将数据修改了,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读,解决了不可重复读取数据的问题,可能会出现幻读,不够真实!
序列化/串行化 serializable
这是最高的隔离级别,效率低,解决所有问题
这种隔离级别表示事务队列,不能并发
每一次读到的数据都是最真实的,并且效率是最低的
索引
索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一个表的一个字段可以添加一个索引,索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。缩小扫描范围,避免全表扫描,在mysql中主键,以及unique字段上都会自动添加索引
什么时候才会给字段添加索引?
1.数据庞大,每一个硬件环境都不同
2.该字段经常出现在where后面,一条件形式存在,这个字段总被扫描
3.该字段很少的DML(insert,update,delete)操作,因为DML后的索引需要重新排序
索引如何创建,删除
create index emp_ename_index on emp(ename);
drop index emp_ename_index on emp;
explain select * from emp where ename="**",查看是否使用索引
索引是各种数据库进行优化的重要手段。优化的时候优先考虑的要素就是索引
单一索引,单个字段添加索引
复核索引 多个字段添加索引
主键索引 主键添加索引
唯一性索引 具有unique约束的字段上添加索引
视图
什么是视图;
view:站在不同的角度看待同一份数据
如何创建视图对象
creat view emp_view as select * from emp;
drop view emp_view;
什么是视图?
我们可以面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被炒作(视图特点:通过对视图的操作,会影响到原表数据)
视图是简化sql语句的,即引用
视图对象是一个文件,在数据库中也是以文件的形式存在,视图不是在内存中,是存储在硬盘上的,不会消失,方便,简化开发,利于维护
数据库设计的三范式
什么是数据库设计的范式?
数据库表的设计依据,教你如何进行数据库的设计
数据库设计的范式共有?
第一范式:要求任何一个表必须有主键,每一个字段原子性不可再分。
第二范式:建立一个在第一范式基础上,要求所有非主键完全依赖主主键,不能产生部分依赖
第三范式:建在在第二范式的基础上,要求所有非主键字段都直接依赖于主键,不要产生传递依赖
设计数据库表的时候,按照以上范式进行,可以避免表中数据的冗余,空间的浪费
多对多三张表,关系表,两个外键
一对多,两张表,多的表加外键
数据库设计三范式是理论上的
实践和理论有偏差
最终目的满足客户要求,有的时候会拿冗余换执行速度
因为sql当中,表和表之间的连接次数越来越多,效率越低(笛卡尔积)