# 数据库基础
## 数据库基本操作
### 创建数据库
> creat DATABASE xxxxxx
### 删除数据库
> drop DATABASE xxxxxx
### 选择数据库
> use xxxxxx
### 创建表
> CREATE TABLE table_name (column_name column_type);
### 删除表
> DROP TABLE table_name ;
## 视图
视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。
对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,
多表视图一般用于查询,不会改变基本表的数据。
> ```
> --创建视图--
> create or replace view v_student as select * from student;
> --从视图中检索数据--
> select * from v_student;
> --删除视图--
> drop view v_student;
> ```
>
> 视图的作用:
>
> > ①简化了操作,把经常使用的数据定义为视图。
> >
> > 我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很方便。
> >
> > ②安全性,用户只能查询和修改能看到的数据。
> >
> > 因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图不可以随意的更改和删除,可以保证数据的安全性。
> >
> > ③逻辑上的独立性,屏蔽了真实表的结构带来的影响。
> >
> > 视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
>
> 视图的缺点:
>
> > ①性能差
> > 数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
> >
> > ②修改限制
> > 当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
>
> 综合视图的优缺点,在定义数据库对象时,不能不加选择地来定义视图,应该权衡视图的优点和缺点,合理地定义视图。
## 函数
### Sql内建函数
> Sql中有许多已经定义好,可以直接使用的函数。
>
> 详见SQL基础
### 自定义函数
> 语法:
>
> ```
> CREATE FUNCTION F_GONGHAO(@XINGMING NVARCHAR(5))
> RETURNS INT
> AS
> BEGIN
> DECLARE @GONGHAO INT
> SET @GONGHAO =(SELECT Y.工号 FROM[T_员工信息] AS Y WHERE Y.姓名 =@XINGMING )
> RETURN @GONGHAO
> END
> ```
自定义函数分为 标量函数/内联表值函数/多语句表值函数
> 共同点:
>
> > 创建定义相同
>
> 不同点:
>
> > 标量函数返回的是一个数据类型值,内联表值函数返回的是一个table,而多语句返回的是一个table的变量
> >
> > 标量函数和多语句函数都是要有begin……end,内联表值函数就没有;
> >
> > 标量函数要写成在dbo,function_name;
## 事务
### 一般来说,事务必须满足4个条件(ACID):
> - **原子性(**A**tomicity):**一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
> - **一致性(**C**onsistency):**在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
> - **隔离性(**I**solation):**数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
> - **持久性(**D**urability):**事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
### 事务控制
> - BEGIN 或 START TRANSACTION 显式地开启一个事务;
> - COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
> - ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
> - SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
> - RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
> - ROLLBACK TO identifier 把事务回滚到标记点;
> - SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
### 事务处理
> 1、用 BEGIN, ROLLBACK, COMMIT来实现
>
> - **BEGIN** 开始一个事务
> - **SAVEPOINT** 创建一个保存点
> - **ROLLBACK** 事务回滚
> - **COMMIT** 事务确认
>
> 2、直接用 SET 来改变 MySQL 的自动提交模式:
>
> - **SET AUTOCOMMIT=0** 禁止自动提交
>
> - **SET AUTOCOMMIT=1** 开启自动提交
>
> > *在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。*