1 视图的概念及作用
概念
- 视图是一种数据库对象: 把一个select的查询结果作为一张虚拟表
- 数据库只对视图进行定义,视图的数据存储在原表中
- 视图是一张虚拟表,不存储数据,只关联一个select语句
作用
- 对select语句的封装
- 提高数据库的检索效率,减少io操作
- 防止未经许可的用户访问一些较为敏感的数据
- 降低数据库的复杂程度(针对于多表查询而言的)
2 索引的概念,作用,使用,和分类
概念
- 索引是一种可以提高数据库查询效率的数据库对象
作用
- 快速定位数据,减少磁盘的io操作
使用
- 索引不是让程序员使用的而是让数据库在根据索引列查询时,提高检索效率
- 索引由程序员定义,由数据库系统使用和维护
- 当表记录更改时,索引会自动更新
分类
- 唯一性索引
- 不需要程序员创建,数据库自动创建
- 存在唯一约束和主键约束的时候,数据库会自动创建索引
- 自定义索引
- 由程序员通过create index 创建的索引
建议使用索引的情况
- 列的取值比较广泛时
- 把经常出现在where后面作为查询条件的列 尽量定义为索引
- 数据量较大时,查询的结果<=4%时
- 不能有大量的空值
- 表记录不经常更改
mysql oracle SqlServer的区别
- SqlServer只能在Windows系统上使用,而mysql和oracle可以在其他操作系统上使用而且支持数据库在不同操作系统之间的移植
- mysql是开源免费的 ,SqlServer和oracle是收费的
- 占用内存: mysql占用内存小,SqlServer中等 ,oracle占用内存中等
- Oracle支持大并发量,大访问量,Sql Service还行,而MySql的话压力没这么大,因此现在的MySql的话最好是要使用集群或者缓存来搭配使用
- Oracle支持多用户不同权限来进行操作,而MySql只要有登录权限就可操作全部数据库
- 安装所用的空间差别也是很大的,Mysql安装完后才几百M而Oracle有几G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
- 做分页的话,MySql使用Limit,Sql Service使用top,Oracle使用row
- Oracle没有自动增长类型,Mysql和Sql Service一般使用自动增长类型
数据库三大范式
- 第一范式:每个列都不可以再拆分。
- 第二范式: 在第一范式的基础上,非主键列要完全依赖于主键列,消除部分依赖
- 第三范式: 在第二范式的基础上,非主键列只能依赖于主键列,不能依赖于其他的非主键列
mysql有关权限的表都有哪几个
- user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
- db权限表:记录各个帐号在各个数据库上的操作权限。
- table_priv权限表:记录数据表级的操作权限。
- columns_priv权限表:记录数据列级的操作权限。
- host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响
怎么优化SQL查询语句吗
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
- 用索引可以提高查询
- SELECT子句中避免使用*号,尽量全部大写SQL
- 应尽量避免在 where 子句中对字段进行 is null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,使用 IS NOT NULL
- where 子句中使用 or 来连接条件,也会导致引擎放弃使用索引而进行全表扫描
- in 和 not in 也要慎用,否则会导致全表扫描
SQL的生命周期?
-
应用服务器与数据库服务器建立一个连接
-
数据库进程拿到请求sql
-
解析并生成执行计划,执行
-
读取数据到内存并进行逻辑处理
-
通过步骤一的连接,发送结果到客户端
-
关掉连接,释放资源
事务
概念
- 逻辑上操作一组数据,组成这组数据的全部单元,要么全部成功要么全部失败
- 事务是对数据库中一系列操作进行统一的回滚或者提交的操作,主要用来保证数据的完整性和一致性。
- 事务是一个/多个dml语句组成一个执行单元
四大特性(ACID)
- 原子性(Atomicity): 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
- 一致性(Consistency):事务无论成功还是失败 前后总数据必须一致:数据库的完整约束性不被破坏
- 隔离性(Isolation): 多个并发事务之间要相互隔离
- 持久性(Durability): 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
事务的并发,事务的隔离级别
事务的并发
- 1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
- 2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
- 3、幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。
事务的隔离级别
- 读未提交Read Uncommitted:另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据脏读
- 读已提交Read Committed:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
- 可重复读Repeated Read:在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
- 串行化Serializable:最高的隔离级别,在这个隔离级别下,不会产生任何异常。并发的事务,就像事务是在一个个按照顺序执行一样
char、varchar、varchar2的区别
- 都是用于存储字符串的sql数据类型
- 不同之处:
- char(n)是固定 长度 固定n个单位(字符/字节 mysql是字符 oracle是字节)
- varchar(n)/varchar2(n) 是可变长度 最多n个单位
- char(n)最多4000个单位 varchar(n)/varchar2(n)最多8000个单位
- char和varchar是sql标准 varchar2是oracle的方言