数据库基础知识(Mysql)

32 阅读48分钟

一.sql、DB、DBMS

DB: DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS: DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)
SQL: 结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
     SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
     SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
     DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
DBMS -(执行)-> SQL -(操作)-> DB

二.表的概念

表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
一个表包括行和列:
	行:被称为数据/记录(data)
	列:被称为字段(column)
学号(int)	姓名(varchar)	年龄(int)
------------------------------------
110			张三				20
120			李四				21

三.字段的属性

字段名、数据类型、相关的约束。

四.SQL语句的分类

DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言)(Data Manipulation Language):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是       	Transaction)
DCL(数据控制语言): grant授权、revoke撤销权限等。

五.登录数据库

命令行窗口输入:-uroot -p你的密码
初始化数据:source 文件路径
(以sql结尾的文件称为sql脚本,其中包含着许多的sql语句)
sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化。

六.常用sql命令

		1) mysql> select database(); 查看当前使用的是哪个数据库

		2) mysql> select version(); 查看mysql的版本号。

		3) \c  命令,结束一条语句。

		4) exit 命令,退出mysql。
		
		5)show tables;(显示当前数据库中的所有的表)
		
		6)create {database|schema} [if not exists] 数据库名//创建数据库
		
		7)show databases [like wild]显示当前有的所有数据库
		
		8)use db_name 选择要使用的数据库名(该语句可以用来从一个数据库转移到另一个数据库,用create语句创建的数据库不会自动成为当前数据库,需要用use语句指定当前的数据库)
		
		9)drop database [if exists ]sqlname;删库
		
		10)show create database sqlname 查看数据库的定义
		
		11)对于数据库的修改:alter database db_name default character set charset_name
	

七.mysql数据表操作

7.1创建数据表

建表语句的语法格式: 
create table 表名(

字段名1 数据类型,

字段名2 数据类型,

字段名3 数据类型,

....

);

create [temporary] table [if not exists]table_name 
		[([column_definition],~~~|[index_definition])]
		[table_option][select_statement];
		创建数据表:temporary创建临时表,此表只能对创建它的用户可见,当断开与数据库的连接时,会自动删除临时表
				  index-definition:表索引项定义
				  table_option:用于描述表的选项
				  select_statement:可以在语句的末尾添加一个select语句,在一个表的基础上创建一个表
				  
1)show create table tablename 查看数据表的定义


关于MySQL当中字段的数据类型:

int 整数型(java中的int)

bigint 长整型(java中的long)

float 浮点型(java中的float double)

char 定长字符串(String)

Varchar 可变长字符串(StringBuffer/StringBuilder)

date 日期类型 (对应Java中的java.sql.Date类型)

BLOB 二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject ( 对应java中的Object)

CLOB 字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)

......

数据是定长的话,使用char,不定长的话,使用varchar

7.2表的复制

复制数据表:

crate [temporary] table [if not exists] table_name

语法:

create table 表名 as select语句;

将查询结果当做表创建出来。

7.3表的修改

修改数据表的名称:
	1)alter table 旧表名 rename 新表名
添加新的字段:
	2)alter table 表名 add 字段名 数据类型...;
修改字段:
	3)alter table 表名 change 原字段名 新字段名 数据类型...;(修改字段)
删除字段:
	5)alter table 表名 drop 字段名(删除字段)
在创建完表之后添加主键约束:	
	6)alter table 表名 add constraint 主键名 primary key 表名(主键字段)
在创建完表之后进行外键约束:	
	7)alter table 表名 add constraint 外键名 foreign key(外键字段)references 关联表名(关联字段)
 查看表的结构	
	8)desc table_name
	  如:desc t_student;
        +-------+--------------+------+-----+---------+-------+
        | Field | Type         | Null | Key | Default | Extra |
        +-------+--------------+------+-----+---------+-------+
        | no    | int(11)      | YES  | PRI | NULL    |       |
        | sname | varchar(255) | YES  |     | NULL    |       |
        | age   | int(11)      | YES  |     | NULL    |       |
        | email | varchar(255) | YES  |     | NULL    |       |
        +-------+--------------+------+-----+---------+-------+
删除数据表:
  	9)drop [temporary] table [id exists]tbl_name~~~可以一次删除多个表
复制数据表:	
	10)create table new_tbl_name like old_tbl_name

7.4将查询结果插入到一张表中

insert into 表名(表要存在) select * from 表名;
select * into table_name(不存在) from ----

7.5mysql表记录操作

> 插入新的记录:insert  [][][low_priority|delayed|high_priority] [ignore] [into] tbl_name
               [(col_name,~~~)] values({expr|default},……) | set col_name=(expr|default)
#如下:
    1)insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)

    要求:字段的数量和值的数量相同,并且数据类型要对应相同。

    2)insert into tab_name

    set 字段名1="value",字段名2="value";

    3)对于图片的储存:

    使用路径:LOAD_FILE('D:\images\picture.jpg')

> 

7.4.1update数据

update 表名 set 字段名1=1,字段名2=2... where 条件;

> 更新表记录:update [low_priprity] [ignore]  tbl_name set  clo_name1=expr1

更新多个表的数据:
update[low_priority][ignore] table_references set col_name=expr1[,col_name2=expr2[,...]]
[where where_definition]

不同约束条件的修改:
update table_name set 字段名 = case
		when 条件一                    	                            
			then 结果一                            
		else   结果二                          
		end

没有条件时更新表中的所有数据

7.4.2delete数据

带条件的记录删除:
delete [low_priority][quick(快速删除)][ignore] from 表名 where 条件;[order by....(ASC||DESC)][limit row_count]

#删除表记录:delete [low_priority] [quick] [ignore] from tbl-name

没有条件的时候全部删除

7.5约束

什么是约束:

在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。

常见的约束:

非空约束(not null):约束的字段不能为NULL

唯一约束(unique):约束的字段不能重复

主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)

外键约束(foreign key):...(简称FK)

检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。

(1)非空约束
create table t_user(

id int,

username varchar(255) not null**在创建表时添加约束**),

password varchar(255)

);

insert into t_user(id,password) values(1,'123'); //编译错误,约束username字段不能为空!

ERROR 1364 (HY000): Field 'username' doesn't have a default value

 insert into t_user(id,username,password) values(1,'lisi','123');
(2)唯一性约束

唯一性约束修饰的字段具有唯一性不能重复。但可以为null。

drop table if exists t_user;

create table t_user(

id int,

usercode varchar(255),

username varchar(255),

unique(usercode,username) //多个字段联合起来添加一个约束unique 【表级约束】

​ );

ps:not null约束只有列级约束,没有表级约束。

(3)主键约束
drop table if exists t_user;

create table t_user(

id int primary key, //列级约束

username varchar(255),

email varchar(255)

   );

主键约束,不能为null也不能重复!

主键约束 :primary key

主键字段 : id字段添加primary key之后,id叫做主键字段

主键值 :id字段中的每一个值都是主键值。

 create table t_user(

id int primary key, //列级约束

username varchar(255),

email varchar(255)

 );	
主键的分类

1)根据主键字段的字段数量来分:

单一主键 and 复合主键

2)根据主键的性质来划分:

自然主键 and 业务主键

一个表的主键约束只能有一个

mysql提供主键自增

(5)外键约束

关于外键约束的相关术语:

外键约束:foreign key

外键字段:添加有外键约束的字段

外键值:外键字段中的每一个值。

A表中的字段引用B表中的字段,则A是子表,B是父表

删除数据的时候,先删除子表,再删除父表。

添加数据的时候,先添加父表,再添加子表。

创建表的时候,先创建父表,再创建子表。

删除表的时候,先删除子表,再删除父表。

外键值可以为null

7.6mysql常量

1.字符串常量:用单引号进行字符串

八.sql语句

8.1查询语句

select * from 表名(能够显示表中所有数据的信息,但一般不常用)

select 字段名1,字段名2,字段名3,.... from 表名;(字段可以参与数学运算)

给查询结果的列重命名:select ename,sal * 12 as yearsal from emp;

select ename,sal * 12as可以省略) '年薪' from emp;

*条件查询:(3select  字段,字段... (1from  表名  (2where  条件;*

*· select ename from emp where sal = 5000;*

*·select ename,sal from emp where sal between 1100 and 3000;* 

*// between...and...是闭区间 [1100 ~ 3000]*

在数据库当中NULL不是一个值,代表什么也没有,为空。

空不是一个值,不能用等号衡量。必须使用 is null或者is not null

select ename,sal,comm from emp where comm is null;

select ename,job from emp where sal in(800, 5000); 
/ in后面的值不是区间,是具体的值。

ISLOWER(Sdept)将查询出来的结果用小写字母表示
例如:
SELECT Sname,‘Year of Birth: ',2000-Sage,ISLOWER(Sdept)
FROM Student;

Where字句是不能出现聚集函数的,因为where是对每一个元组进行过滤,而不是对每一个集合进行过滤 

8.2模糊查询like

​ 找出名字当中含有O的?(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)

		%代表任意多个字符,_代表任意1个字符。
		like not like
select ename from emp where ename like '%O%';

新建一张表:Create table name<Id int ,Name varchar<255>>;

(插入信息)Insert nametable<id,name> values<1,'john'>

8.3排序

		select 字段名 from 表名 (4order by 字段;(默认是升序)

​		select 字段名 from 表名 order by 字段 asc;

​		select 字段名 from 表名 order by 字段 desc;(降序)

​		select ename,sal from emp order by sal desc , ename asc;

注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

8.4分组函数

对某一组数据进行操作(在where操作之后):(又名多行处理函数)自动忽略null

count 计数 count(*)计数总记录的条数 count(comm):表示统计comm字段中不为null的数据总量

sum 求和

avg 平均值

max 最大值

min 最小值

8.5单行处理函数

ifnull(可能为null的数据被当作什么处理):属于单行处理函数

8.6groupby和having

groupby:按照某个字段或者某些字段进行分组

having:having是对分组之后的数据进行再次过滤

规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

也就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

8.7执行顺序

select               5

..

from            1    

..

where            2

..

group by        3

..

having               4

..

order by        6

...
limit {[offset,]row_count | row_count OFFSET offset}    7

## 查询

8.8结果集的去重

distinct 关键字去除重复记录(只能出现在所有字段的最前面)

8.9连接查询

内连接:

​ 1)等值连接

​ 2)非等值连接

​ 3)自连接

外连接:

​ 1)左外连接

​ 2)右外连接

​ 全连接(很少用)

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。

内连接:

select 字段名 from emp e (inner) join  dept d on e.deptno=d.deptno(连接条件);

select   e.ename,e.sal,s.grade  
from emp e inner join salgrade s 
on  e.sal between s.losal and s.hisal;

自连接:最大的特点是:一张表看做两张表。自己连接自己。

select 字段名 from emp e1 join emp e2 on 条件

外连接

内连接:

假设AB表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。

AB两张表没有主副之分,两张表是平等的。

外连接:

假设AB表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中

的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

外连接的分类?

左外连接(左连接):表示左边的这张表是主表。

右外连接(右连接):表示右边的这张表是主表。

左连接有右连接的写法,右连接也会有对应的左连接的写法。

select 
	a.ename '员工', b.ename '领导'
from
	emp a
left outer join
	emp b
on
	a.mgr = b.empno;
//左外连接
select 
	a.ename '员工', b.ename '领导'
from
	emp b
right outer join
	emp a
on
	a.mgr = b.empno;
//右外连接

外连接最重要的特点是:主表的数据无条件的全部查询出来。

三张表之间的连接:

select
	e.ename,d.dname,s.grade
from 
	emp e
left join 
	dept d
on 
	e.deptno=d.deptno
left join 
	salgrade s
on 
	e.sal between s.losal and s.hisal;
//emp表先和dept表连接,然后和salgrade表连接

8.10子查询

select

..(select).

from    
select  t.*,s.grade from (select deptno,avg(sal) as avgsal from emp group by deptno) t join 
salgrade s on  t.avgsal between s.losal and s.hisal;
..(select).
where  
	select * from emp where sal > (select avg(sal) from emp);
..(select).

 //语句中嵌入select子句
 

8.11union

(可以将查询结果集相加)

将两张表整合在一起:

select ename from emp where 条件一
union 
select dname from dept where 条件二

//拼接的数据必须两两相对应。不能一张表是一个数据,另一张表是两个数据,这样无法拼接!

8.12limit

(取出结果集中的部分数据)

limit startindex length

startindex表示起始位置,从0开始,0表示第一条数据

length表示取几个

limit执行的顺序是最后一个

九.mysql函数

9.1数学函数

abs()绝对值函数

round()取整函数

sqrt()求平方根函数

rand()随机数函数

floor()取最大整数函数

PI() 返回圆周率的值

truncate(x,d)四舍五入函数 返回被舍去至小数点后d位的数字x

greatset(x1,x2,x3)返回参数中的最大值

least()返回参数中最小值函数

bin(x)返回参数x的二进制值

otc(x)返回参数x的八进制值

hex(x)返回参数x的十六进制值

9.2聚合函数

sum()求和函数

avg()平均值函数

count()数量函数

max()用来计算表中满足条件的数的最大值

min()用来计算表中满足条件的数的最小值

9.3字符串函数

char_length()

concat(str1,str2...)返回的是连接参数产生的字符串,如有一个值为null,则结果为null

repeat(str,count)返回一个由重复的字符串str组成的字符串

find_in_set(str,strlist)返回str在strlist中的位置值

locate(substr.str) 返回str中子字符串第一次出现的位置

instr(str,substr)返回字符串str中子字符串substr的第一个出现位置

left(str,len)返回字符串str最左侧len个字符

right(str,len)返回字符串str最右侧的len个字符

中间截取函数:

十.存储引擎

 CREATE TABLE  t_x (

   id int(11) DEFAULT NULL

   ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

show variables like 'storage_engine%'; //查询默认的存储引擎 
在创建一个表的时候可以指定表使用的存储引擎以及字符编码的方式。

10.1常见的存储引擎

10.1.1MyISAM

Engine: MyISAM

   Support: YES

   Comment: MyISAM storage engine

   Transactions: NO

 XA: NO

 Savepoints: NO

1)不支持事务

2)是mysql最常用的存储引擎,但是不是默认的,默认的是(InnoDB)

Mysql在V5.1之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB

3)MyISAM采用三个文件组织一个表:

xxx.frm(存储格式的文件)

xxx.MYD(存储表中数据的文件)

xxx.MYI(存储表中索引的文件)

索引文件和数据文件是分开的,B+tree中存储的是索引所在行的磁盘地址

R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍。 Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。

优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。

缺点:不支持事务的完整性和并发性。

10.1.2InnoDB

Engine: InnoDB

   Support: DEFAULT

   Comment: Supports transactions, row-level locking, and foreign keys

   Transactions: YES

   XA: YES

   Savepoints: YES

优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。

​ 支持自动增长列auto-increment;(须为主键)

​ 优点:良好的事务管理,崩溃修复能力和并发控制.InoDB支持级联删除和级联更新。

​ 缺点:读写效率稍差,占用的数据空间比较大。

​ 表的结构存储在xxx.frm文件中

​ 数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。

在表上定义主键PRIMARY KEY,InnoDB将主键索引用作聚簇索引。 如果表没有定义主键,InnoDB会选择第一个不为NULL的唯一索引列用作聚簇索引。 如果以上两个都没有,InnoDB 会使用一个6 字节长整型的隐式字段 ROWID字段构建聚簇索引。该ROWID字段会在插入新行时自动递增

10.1.3MEMORY

 Engine: MEMORY

    Support: YES

    Comment: Hash based, stored in memory, useful for temporary tables

    Transactions: NO

    XA: NO

    Savepoints: NO

缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。

优点:查询速度最快。

以前叫做HEPA引擎。

  • HASH 索引:只有Memory引擎支持 , 使用场景简单 。

十一.事务

事务是指满足ACID特性(指数据库管理系统在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具备的四个特性:原子性,一致性,隔离性,持久性)的一组操作,可以通过Commit提交一个事务,也可以使用Rollback进行回滚。

一个事务是一个完整的业务逻辑单元,不可再分。

事务的存在是为了保证数据的完整性,安全性。

11.1事务的特性

​ 原子性:事务是最小的工作单元,不可再分。

​ 回滚可以使用回滚日志来实现,回滚日志记录着事务所执行的修改操作,再回滚时反向执行这些修改操作即可。

​ 一致性:事务必须保证多条DML语句同时成功或者同时失败。

​ 隔离性:事务A和事务B之间具有隔离。

​ 持久性:最终数据必须持久化到硬盘中,事务才算成功结束。

​ 一旦事务提交,则其所做的修改会永远保存到数据库中,即使系统发生崩溃,事务执行的结果也不能丢失。

AUTOCOMMIT

mysql默认采用自动提交模式。也就是说,日过不显式使用START TRANSACTION 语句来开始一个事务,那么每个查询操作都会当作一个事务并自动提交。

11.2事务的隔离级别

1)读未提交(read uncommitted)

​ 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。

​ 读未提交(当前事务可以读到另外事务未提交的数据)存在脏读现象:表示读到了脏数据。

2)读已提交(read committed)

​ 对方事务提交之后的数据我方可以读取到。

​ 一个事务只能读取已经提交的事务所做的修改,换句话说,一个事务所做的修改在提交之前对其他事务是不可见的.

​ 读已提交存在的问题是:不可重复读。

3)可重复读(repeatable read)

​ 解决了:不可重复读的问题。

​ 问题:读取到的数据是幻象。

4)序列化读/串行化读

​ 强制所有事务串行执行.读个事务不会干扰.不会出现并发一致性问题.

​ 需要加锁,效率低,需要事务排队。

​ 解决了所有的问题。

commit:提交

rollback:回滚

start transaction:关闭自动提交机制

mysql可以远程登录:mysql -h主机号 -uroot -pyourpassword

十二.索引和视图

索引相当于一本书的目录,通过目录可以快速的找到对应的资源。

查询一张表是的方法:

​ 全表扫描:

​ 根据索引检索:

创建索引对象:

create index 索引名称 on 表名(字段名);
删除索引:
drop index 索引对象 on 表名;
	
查看索引:
show index from table_name
1). alter table tb_name add primary key(column_list); 
 
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
 
2). alter table tb_name add unique index_name(column_list);
 
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
 
3). alter table tb_name add index index_name(column_list); 
 
添加普通索引, 索引值可以出现多次。
 
4). alter table tb_name add fulltext index_name(column_list);
 
该语句指定了索引为FULLTEXT, 用于全文索引

什么时候添加索引:

​ 1)数据量庞大

​ 2)该字段很少DML操作

​ 3)该字段经常出现在where子句中

主键具有unique约束的字段会被自动添加索引

根据主键索引的效率较高,尽量根据主键进行索引

索引的结构

Btree索引

最常见的索引

BTree又叫多路平衡搜索树,一颗 m 叉的 BTree 特性如下: 树中每个节点最多包含m个孩子。 除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子。 若根节点不是叶子节点,则至少有两个孩子。 所有的叶子节点都在同一层。 每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1] <= n <= m-1

2、B+TREE 结构 B+Tree为 BTree 的变种, B+Tree 与 BTree 的区别为: n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。 B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。 所有的非叶子节点都可以看作是key的索引部分。

12.1索引的分类

​ 单一索引:给单个字段添加索引

​ 复合索引:给多个字段联合起来添加一个索引

​ 主键索引:主键上会自动添加索引

​ 唯一索引:有unique约束的字段会自动添加索引

​ ......

模糊查询的时候,第一个通配符使用的是%,这个时候索引是是失效的。

12.2视图

站在不同的角度去看到数据。(同一张表的数据,通过不同的角度去看待)

视图(VIEW)也被称作虚表,即虚拟的表

子模式:外模式

常见的规则:

​ 视图可以嵌套,即可以使用基于其它视图的查询构造新视图(但应该尽量避免,会降低性能)

​ 在MySQL中,ORDER BY可以用在视图中,但如果使用该视图的SELECT语句中也含有ORDER BY,那么该视图中的ORDER BY会被覆盖;

​ 视图不能索引,也不能有关联的触发器和默认值;

​ 视图可以和表一起使用

视图的特点:

​ 是从一个或者几个基本表(视图)中导出的表

​ 只存放视图的定义,不存放视图对应的数据

​ 基表中的数据发生变化,从视图中查询出的数据也会随之改变。

优点:简化了复杂的查询

​ 限制对特定用户的数据访问

​ 提供额外的安全层

​ 启用计算列

​ 实现向后兼容

创建视图:

首先需要查看创建视图的权限:

select select_priv,Create_view_priv from mysql.user where user='用户名';
RDBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
CREATE VIEW vst 
AS 
SELECT sno,sname,IDno 
FROM student
WHERE sdept='IS' and ssex='男'
WITH CHECK OPTION;
WITH CHECK OPTION:
	对视图进行UPDATEINSERTDELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
	表示更新视图时要保证在该视图的权限范围之内
	
删除视图:
drop view myview;
如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 
DROP VIEW sf_S1 CASCADE;

需要明确指定视图的所有列名:
   (1) 某个目标列是聚集函数 或 列表达式
   (2) 多表连接时选出了几个同名列作为视图的字段
   (3) 需要在视图中为某个列启用新的更合适的名字
注意:只有DQL语句才能以试图对象的方式创建出来。

查看视图的结构:desc 视图名  
查看视图的信息:show table status like '视图名';
查看视图的详细定义: show create view 视图名;

对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据,不是直接操作的原表)

12.2.1视图的操作

修改视图:
	create or replace [algorithm={undefined|merge|temptable}];
	view 视图;
	as select 语句
	[with[cascade|local]check option];
	
	alter view[{algorithm={merge,temptable|undefined}}]view view_name [(column_list)] 
	as select_statement
	[with[cascaded|local]check option]
视图数据的修改:
	update view_name set ----- where条件
	
DB2对视图更新的限制:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERTUPDATE操作,但允许执行DELETE操作。
(3) 若视图的字段来自集函数,则此视图不允许更新。
(4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。
(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
(6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。

不能更改视图的情况:

​ 1)视图中包含count(),sum(),max(),min()

​ 2)视图中包含union,union all,

​ 3)常量视图

​ 4)视图中的select中包含子查询

​ 5)由不可更新的视图导出的视图

​ 6)创建视图时,algorithm为temptable类型

可以对视图进行CRUD操作。

视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图。

DBA命令

在数据库当中的数据导出

在windows的DOS命令窗口中执行: (导出整个库)

mysqldump 数据库名>D:\文件名.sql -uroot -p999

在windows的dos命令窗口中执行:(导出数据库中指定的表)

mysqldump 数据库名 表名>D:\文件名.sql -uroot -p999

导入数据

create database bjpowernode;

use bjpowernode;

source D:\bjpowernode.sql

数据库设计三范式:

1.任何一张表都应该有主键
2.建立在第一范式的基础上,所有的非主键字段完全依赖主键,不能产生部分依赖
3.建立在第二范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖
 多对多?三张表,关系表两个外键。
 一对多?两张表,多的表加外键。
  一对一设计:主键共享。
  一对一设计:外键唯一。

# 一.sql、DB、DBMS

DB: DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS: DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)
SQL: 结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
     SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
     SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
     DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
DBMS -(执行)-> SQL -(操作)-> DB

二.表的概念

表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
一个表包括行和列:
	行:被称为数据/记录(data)
	列:被称为字段(column)
学号(int)	姓名(varchar)	年龄(int)
------------------------------------
110			张三				20
120			李四				21

三.字段的属性

字段名、数据类型、相关的约束。

四.SQL语句的分类

DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言)(Data Manipulation Language):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是       	Transaction)
DCL(数据控制语言): grant授权、revoke撤销权限等。

五.登录数据库

命令行窗口输入:-uroot -p你的密码
初始化数据:source 文件路径
(以sql结尾的文件称为sql脚本,其中包含着许多的sql语句)
sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化。

六.常用sql命令

		1) mysql> select database(); 查看当前使用的是哪个数据库

		2) mysql> select version(); 查看mysql的版本号。

		3) \c  命令,结束一条语句。

		4) exit 命令,退出mysql。
		
		5)show tables;(显示当前数据库中的所有的表)
		
		6)create {database|schema} [if not exists] 数据库名//创建数据库
		
		7)show databases [like wild]显示当前有的所有数据库
		
		8)use db_name 选择要使用的数据库名(该语句可以用来从一个数据库转移到另一个数据库,用create语句创建的数据库不会自动成为当前数据库,需要用use语句指定当前的数据库)
		
		9)drop database [if exists ]sqlname;删库
		
		10)show create database sqlname 查看数据库的定义
		
		11)对于数据库的修改:alter database db_name default character set charset_name
	

七.mysql数据表操作

7.1创建数据表

建表语句的语法格式: 
create table 表名(

字段名1 数据类型,

字段名2 数据类型,

字段名3 数据类型,

....

);

create [temporary] table [if not exists]table_name 
		[([column_definition],~~~|[index_definition])]
		[table_option][select_statement];
		创建数据表:temporary创建临时表,此表只能对创建它的用户可见,当断开与数据库的连接时,会自动删除临时表
				  index-definition:表索引项定义
				  table_option:用于描述表的选项
				  select_statement:可以在语句的末尾添加一个select语句,在一个表的基础上创建一个表
				  
1)show create table tablename 查看数据表的定义


关于MySQL当中字段的数据类型:

int 整数型(java中的int)

bigint 长整型(java中的long)

float 浮点型(java中的float double)

char 定长字符串(String)

Varchar 可变长字符串(StringBuffer/StringBuilder)

date 日期类型 (对应Java中的java.sql.Date类型)

BLOB 二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject ( 对应java中的Object)

CLOB 字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)

......

数据是定长的话,使用char,不定长的话,使用varchar

7.2表的复制

复制数据表:

crate [temporary] table [if not exists] table_name

语法:

create table 表名 as select语句;

将查询结果当做表创建出来。

7.3表的修改

修改数据表的名称:
	1)alter table 旧表名 rename 新表名
添加新的字段:
	2)alter table 表名 add 字段名 数据类型...;
修改字段:
	3)alter table 表名 change 原字段名 新字段名 数据类型...;(修改字段)
删除字段:
	5)alter table 表名 drop 字段名(删除字段)
在创建完表之后添加主键约束:	
	6)alter table 表名 add constraint 主键名 primary key 表名(主键字段)
在创建完表之后进行外键约束:	
	7)alter table 表名 add constraint 外键名 foreign key(外键字段)references 关联表名(关联字段)
 查看表的结构	
	8)desc table_name
	  如:desc t_student;
        +-------+--------------+------+-----+---------+-------+
        | Field | Type         | Null | Key | Default | Extra |
        +-------+--------------+------+-----+---------+-------+
        | no    | int(11)      | YES  | PRI | NULL    |       |
        | sname | varchar(255) | YES  |     | NULL    |       |
        | age   | int(11)      | YES  |     | NULL    |       |
        | email | varchar(255) | YES  |     | NULL    |       |
        +-------+--------------+------+-----+---------+-------+
删除数据表:
  	9)drop [temporary] table [id exists]tbl_name~~~可以一次删除多个表
复制数据表:	
	10)create table new_tbl_name like old_tbl_name

7.4将查询结果插入到一张表中

insert into 表名(表要存在) select * from 表名;
select * into table_name(不存在) from ----

7.5mysql表记录操作

> 插入新的记录:insert  [][][low_priority|delayed|high_priority] [ignore] [into] tbl_name
               [(col_name,~~~)] values({expr|default},……) | set col_name=(expr|default)
#如下:
    1)insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)

    要求:字段的数量和值的数量相同,并且数据类型要对应相同。

    2)insert into tab_name

    set 字段名1="value",字段名2="value";

    3)对于图片的储存:

    使用路径:LOAD_FILE('D:\images\picture.jpg')

> 

7.4.1update数据

update 表名 set 字段名1=1,字段名2=2... where 条件;

> 更新表记录:update [low_priprity] [ignore]  tbl_name set  clo_name1=expr1

更新多个表的数据:
update[low_priority][ignore] table_references set col_name=expr1[,col_name2=expr2[,...]]
[where where_definition]

不同约束条件的修改:
update table_name set 字段名 = case
		when 条件一                    	                            
			then 结果一                            
		else   结果二                          
		end

没有条件时更新表中的所有数据

7.4.2delete数据

带条件的记录删除:
delete [low_priority][quick(快速删除)][ignore] from 表名 where 条件;[order by....(ASC||DESC)][limit row_count]

#删除表记录:delete [low_priority] [quick] [ignore] from tbl-name

没有条件的时候全部删除

7.5约束

什么是约束:

在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。

常见的约束:

非空约束(not null):约束的字段不能为NULL

唯一约束(unique):约束的字段不能重复

主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)

外键约束(foreign key):...(简称FK)

检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。

(1)非空约束
create table t_user(

id int,

username varchar(255) not null**在创建表时添加约束**),

password varchar(255)

);

insert into t_user(id,password) values(1,'123'); //编译错误,约束username字段不能为空!

ERROR 1364 (HY000): Field 'username' doesn't have a default value

 insert into t_user(id,username,password) values(1,'lisi','123');
(2)唯一性约束

唯一性约束修饰的字段具有唯一性不能重复。但可以为null。

drop table if exists t_user;

create table t_user(

id int,

usercode varchar(255),

username varchar(255),

unique(usercode,username) //多个字段联合起来添加一个约束unique 【表级约束】

​ );

ps:not null约束只有列级约束,没有表级约束。

(3)主键约束
drop table if exists t_user;

create table t_user(

id int primary key, //列级约束

username varchar(255),

email varchar(255)

   );

主键约束,不能为null也不能重复!

主键约束 :primary key

主键字段 : id字段添加primary key之后,id叫做主键字段

主键值 :id字段中的每一个值都是主键值。

 create table t_user(

id int primary key, //列级约束

username varchar(255),

email varchar(255)

 );	
主键的分类

1)根据主键字段的字段数量来分:

单一主键 and 复合主键

2)根据主键的性质来划分:

自然主键 and 业务主键

一个表的主键约束只能有一个

mysql提供主键自增

(5)外键约束

关于外键约束的相关术语:

外键约束:foreign key

外键字段:添加有外键约束的字段

外键值:外键字段中的每一个值。

A表中的字段引用B表中的字段,则A是子表,B是父表

删除数据的时候,先删除子表,再删除父表。

添加数据的时候,先添加父表,再添加子表。

创建表的时候,先创建父表,再创建子表。

删除表的时候,先删除子表,再删除父表。

外键值可以为null

7.6mysql常量

1.字符串常量:用单引号进行字符串

八.sql语句

8.1查询语句

select * from 表名(能够显示表中所有数据的信息,但一般不常用)

select 字段名1,字段名2,字段名3,.... from 表名;(字段可以参与数学运算)

给查询结果的列重命名:select ename,sal * 12 as yearsal from emp;

select ename,sal * 12as可以省略) '年薪' from emp;

*条件查询:(3select  字段,字段... (1from  表名  (2where  条件;*

*· select ename from emp where sal = 5000;*

*·select ename,sal from emp where sal between 1100 and 3000;* 

*// between...and...是闭区间 [1100 ~ 3000]*

在数据库当中NULL不是一个值,代表什么也没有,为空。

空不是一个值,不能用等号衡量。必须使用 is null或者is not null

select ename,sal,comm from emp where comm is null;

select ename,job from emp where sal in(800, 5000); 
/ in后面的值不是区间,是具体的值。

ISLOWER(Sdept)将查询出来的结果用小写字母表示
例如:
SELECT Sname,‘Year of Birth: ',2000-Sage,ISLOWER(Sdept)
FROM Student;

Where字句是不能出现聚集函数的,因为where是对每一个元组进行过滤,而不是对每一个集合进行过滤 

8.2模糊查询like

​ 找出名字当中含有O的?(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)

		%代表任意多个字符,_代表任意1个字符。
		like not like
select ename from emp where ename like '%O%';

新建一张表:Create table name<Id int ,Name varchar<255>>;

(插入信息)Insert nametable<id,name> values<1,'john'>

8.3排序

		select 字段名 from 表名 (4order by 字段;(默认是升序)

​		select 字段名 from 表名 order by 字段 asc;

​		select 字段名 from 表名 order by 字段 desc;(降序)

​		select ename,sal from emp order by sal desc , ename asc;

注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

8.4分组函数

对某一组数据进行操作(在where操作之后):(又名多行处理函数)自动忽略null

count 计数 count(*)计数总记录的条数 count(comm):表示统计comm字段中不为null的数据总量

sum 求和

avg 平均值

max 最大值

min 最小值

8.5单行处理函数

ifnull(可能为null的数据被当作什么处理):属于单行处理函数

8.6groupby和having

groupby:按照某个字段或者某些字段进行分组

having:having是对分组之后的数据进行再次过滤

规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

也就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

8.7执行顺序

select               5

..

from            1    

..

where            2

..

group by        3

..

having               4

..

order by        6

...
limit {[offset,]row_count | row_count OFFSET offset}    7

## 查询

8.8结果集的去重

distinct 关键字去除重复记录(只能出现在所有字段的最前面)

8.9连接查询

内连接:

​ 1)等值连接

​ 2)非等值连接

​ 3)自连接

外连接:

​ 1)左外连接

​ 2)右外连接

​ 全连接(很少用)

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。

内连接:

select 字段名 from emp e (inner) join  dept d on e.deptno=d.deptno(连接条件);

select   e.ename,e.sal,s.grade  
from emp e inner join salgrade s 
on  e.sal between s.losal and s.hisal;

自连接:最大的特点是:一张表看做两张表。自己连接自己。

select 字段名 from emp e1 join emp e2 on 条件

外连接

内连接:

假设AB表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。

AB两张表没有主副之分,两张表是平等的。

外连接:

假设AB表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中

的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

外连接的分类?

左外连接(左连接):表示左边的这张表是主表。

右外连接(右连接):表示右边的这张表是主表。

左连接有右连接的写法,右连接也会有对应的左连接的写法。

select 
	a.ename '员工', b.ename '领导'
from
	emp a
left outer join
	emp b
on
	a.mgr = b.empno;
//左外连接
select 
	a.ename '员工', b.ename '领导'
from
	emp b
right outer join
	emp a
on
	a.mgr = b.empno;
//右外连接

外连接最重要的特点是:主表的数据无条件的全部查询出来。

三张表之间的连接:

select
	e.ename,d.dname,s.grade
from 
	emp e
left join 
	dept d
on 
	e.deptno=d.deptno
left join 
	salgrade s
on 
	e.sal between s.losal and s.hisal;
//emp表先和dept表连接,然后和salgrade表连接

8.10子查询

select

..(select).

from    
select  t.*,s.grade from (select deptno,avg(sal) as avgsal from emp group by deptno) t join 
salgrade s on  t.avgsal between s.losal and s.hisal;
..(select).
where  
	select * from emp where sal > (select avg(sal) from emp);
..(select).

 //语句中嵌入select子句
 

8.11union

(可以将查询结果集相加)

将两张表整合在一起:

select ename from emp where 条件一
union 
select dname from dept where 条件二

//拼接的数据必须两两相对应。不能一张表是一个数据,另一张表是两个数据,这样无法拼接!

8.12limit

(取出结果集中的部分数据)

limit startindex length

startindex表示起始位置,从0开始,0表示第一条数据

length表示取几个

limit执行的顺序是最后一个

九.mysql函数

9.1数学函数

abs()绝对值函数

round()取整函数

sqrt()求平方根函数

rand()随机数函数

floor()取最大整数函数

PI() 返回圆周率的值

truncate(x,d)四舍五入函数 返回被舍去至小数点后d位的数字x

greatset(x1,x2,x3)返回参数中的最大值

least()返回参数中最小值函数

bin(x)返回参数x的二进制值

otc(x)返回参数x的八进制值

hex(x)返回参数x的十六进制值

9.2聚合函数

sum()求和函数

avg()平均值函数

count()数量函数

max()用来计算表中满足条件的数的最大值

min()用来计算表中满足条件的数的最小值

9.3字符串函数

char_length()

concat(str1,str2...)返回的是连接参数产生的字符串,如有一个值为null,则结果为null

repeat(str,count)返回一个由重复的字符串str组成的字符串

find_in_set(str,strlist)返回str在strlist中的位置值

locate(substr.str) 返回str中子字符串第一次出现的位置

instr(str,substr)返回字符串str中子字符串substr的第一个出现位置

left(str,len)返回字符串str最左侧len个字符

right(str,len)返回字符串str最右侧的len个字符

中间截取函数:

十.存储引擎

 CREATE TABLE  t_x (

   id int(11) DEFAULT NULL

   ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

show variables like 'storage_engine%'; //查询默认的存储引擎 
在创建一个表的时候可以指定表使用的存储引擎以及字符编码的方式。

10.1常见的存储引擎

10.1.1MyISAM

Engine: MyISAM

   Support: YES

   Comment: MyISAM storage engine

   Transactions: NO

 XA: NO

 Savepoints: NO

1)不支持事务

2)是mysql最常用的存储引擎,但是不是默认的,默认的是(InnoDB)

Mysql在V5.1之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB

3)MyISAM采用三个文件组织一个表:

xxx.frm(存储格式的文件)

xxx.MYD(存储表中数据的文件)

xxx.MYI(存储表中索引的文件)

索引文件和数据文件是分开的,B+tree中存储的是索引所在行的磁盘地址

R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍。 Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。

优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。

缺点:不支持事务的完整性和并发性。

10.1.2InnoDB

Engine: InnoDB

   Support: DEFAULT

   Comment: Supports transactions, row-level locking, and foreign keys

   Transactions: YES

   XA: YES

   Savepoints: YES

优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。

​ 支持自动增长列auto-increment;(须为主键)

​ 优点:良好的事务管理,崩溃修复能力和并发控制.InoDB支持级联删除和级联更新。

​ 缺点:读写效率稍差,占用的数据空间比较大。

​ 表的结构存储在xxx.frm文件中

​ 数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。

在表上定义主键PRIMARY KEY,InnoDB将主键索引用作聚簇索引。 如果表没有定义主键,InnoDB会选择第一个不为NULL的唯一索引列用作聚簇索引。 如果以上两个都没有,InnoDB 会使用一个6 字节长整型的隐式字段 ROWID字段构建聚簇索引。该ROWID字段会在插入新行时自动递增

10.1.3MEMORY

 Engine: MEMORY

    Support: YES

    Comment: Hash based, stored in memory, useful for temporary tables

    Transactions: NO

    XA: NO

    Savepoints: NO

缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。

优点:查询速度最快。

以前叫做HEPA引擎。

  • HASH 索引:只有Memory引擎支持 , 使用场景简单 。

十一.事务

事务是指满足ACID特性(指数据库管理系统在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具备的四个特性:原子性,一致性,隔离性,持久性)的一组操作,可以通过Commit提交一个事务,也可以使用Rollback进行回滚。

一个事务是一个完整的业务逻辑单元,不可再分。

事务的存在是为了保证数据的完整性,安全性。

11.1事务的特性

​ 原子性:事务是最小的工作单元,不可再分。

​ 回滚可以使用回滚日志来实现,回滚日志记录着事务所执行的修改操作,再回滚时反向执行这些修改操作即可。

​ 一致性:事务必须保证多条DML语句同时成功或者同时失败。

​ 隔离性:事务A和事务B之间具有隔离。

​ 持久性:最终数据必须持久化到硬盘中,事务才算成功结束。

​ 一旦事务提交,则其所做的修改会永远保存到数据库中,即使系统发生崩溃,事务执行的结果也不能丢失。

AUTOCOMMIT

mysql默认采用自动提交模式。也就是说,日过不显式使用START TRANSACTION 语句来开始一个事务,那么每个查询操作都会当作一个事务并自动提交。

11.2事务的隔离级别

1)读未提交(read uncommitted)

​ 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。

​ 读未提交(当前事务可以读到另外事务未提交的数据)存在脏读现象:表示读到了脏数据。

2)读已提交(read committed)

​ 对方事务提交之后的数据我方可以读取到。

​ 一个事务只能读取已经提交的事务所做的修改,换句话说,一个事务所做的修改在提交之前对其他事务是不可见的.

​ 读已提交存在的问题是:不可重复读。

3)可重复读(repeatable read)

​ 解决了:不可重复读的问题。

​ 问题:读取到的数据是幻象。

4)序列化读/串行化读

​ 强制所有事务串行执行.读个事务不会干扰.不会出现并发一致性问题.

​ 需要加锁,效率低,需要事务排队。

​ 解决了所有的问题。

commit:提交

rollback:回滚

start transaction:关闭自动提交机制

mysql可以远程登录:mysql -h主机号 -uroot -pyourpassword

十二.索引和视图

索引相当于一本书的目录,通过目录可以快速的找到对应的资源。

查询一张表是的方法:

​ 全表扫描:

​ 根据索引检索:

创建索引对象:

create index 索引名称 on 表名(字段名);
删除索引:
drop index 索引对象 on 表名;
	
查看索引:
show index from table_name
1). alter table tb_name add primary key(column_list); 
 
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
 
2). alter table tb_name add unique index_name(column_list);
 
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
 
3). alter table tb_name add index index_name(column_list); 
 
添加普通索引, 索引值可以出现多次。
 
4). alter table tb_name add fulltext index_name(column_list);
 
该语句指定了索引为FULLTEXT, 用于全文索引

什么时候添加索引:

​ 1)数据量庞大

​ 2)该字段很少DML操作

​ 3)该字段经常出现在where子句中

主键具有unique约束的字段会被自动添加索引

根据主键索引的效率较高,尽量根据主键进行索引

索引的结构

Btree索引

最常见的索引

BTree又叫多路平衡搜索树,一颗 m 叉的 BTree 特性如下: 树中每个节点最多包含m个孩子。 除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子。 若根节点不是叶子节点,则至少有两个孩子。 所有的叶子节点都在同一层。 每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1] <= n <= m-1

2、B+TREE 结构 B+Tree为 BTree 的变种, B+Tree 与 BTree 的区别为: n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。 B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。 所有的非叶子节点都可以看作是key的索引部分。

12.1索引的分类

​ 单一索引:给单个字段添加索引

​ 复合索引:给多个字段联合起来添加一个索引

​ 主键索引:主键上会自动添加索引

​ 唯一索引:有unique约束的字段会自动添加索引

​ ......

模糊查询的时候,第一个通配符使用的是%,这个时候索引是是失效的。

12.2视图

站在不同的角度去看到数据。(同一张表的数据,通过不同的角度去看待)

视图(VIEW)也被称作虚表,即虚拟的表

子模式:外模式

常见的规则:

​ 视图可以嵌套,即可以使用基于其它视图的查询构造新视图(但应该尽量避免,会降低性能)

​ 在MySQL中,ORDER BY可以用在视图中,但如果使用该视图的SELECT语句中也含有ORDER BY,那么该视图中的ORDER BY会被覆盖;

​ 视图不能索引,也不能有关联的触发器和默认值;

​ 视图可以和表一起使用

视图的特点:

​ 是从一个或者几个基本表(视图)中导出的表

​ 只存放视图的定义,不存放视图对应的数据

​ 基表中的数据发生变化,从视图中查询出的数据也会随之改变。

优点:简化了复杂的查询

​ 限制对特定用户的数据访问

​ 提供额外的安全层

​ 启用计算列

​ 实现向后兼容

创建视图:

首先需要查看创建视图的权限:

select select_priv,Create_view_priv from mysql.user where user='用户名';
RDBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
CREATE VIEW vst 
AS 
SELECT sno,sname,IDno 
FROM student
WHERE sdept='IS' and ssex='男'
WITH CHECK OPTION;
WITH CHECK OPTION:
	对视图进行UPDATEINSERTDELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
	表示更新视图时要保证在该视图的权限范围之内
	
删除视图:
drop view myview;
如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 
DROP VIEW sf_S1 CASCADE;

需要明确指定视图的所有列名:
   (1) 某个目标列是聚集函数 或 列表达式
   (2) 多表连接时选出了几个同名列作为视图的字段
   (3) 需要在视图中为某个列启用新的更合适的名字
注意:只有DQL语句才能以试图对象的方式创建出来。

查看视图的结构:desc 视图名  
查看视图的信息:show table status like '视图名';
查看视图的详细定义: show create view 视图名;

对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据,不是直接操作的原表)

12.2.1视图的操作

修改视图:
	create or replace [algorithm={undefined|merge|temptable}];
	view 视图;
	as select 语句
	[with[cascade|local]check option];
	
	alter view[{algorithm={merge,temptable|undefined}}]view view_name [(column_list)] 
	as select_statement
	[with[cascaded|local]check option]
视图数据的修改:
	update view_name set ----- where条件
	
DB2对视图更新的限制:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERTUPDATE操作,但允许执行DELETE操作。
(3) 若视图的字段来自集函数,则此视图不允许更新。
(4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。
(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
(6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。

不能更改视图的情况:

​ 1)视图中包含count(),sum(),max(),min()

​ 2)视图中包含union,union all,

​ 3)常量视图

​ 4)视图中的select中包含子查询

​ 5)由不可更新的视图导出的视图

​ 6)创建视图时,algorithm为temptable类型

可以对视图进行CRUD操作。

视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图。

DBA命令

在数据库当中的数据导出

在windows的DOS命令窗口中执行: (导出整个库)

mysqldump 数据库名>D:\文件名.sql -uroot -p999

在windows的dos命令窗口中执行:(导出数据库中指定的表)

mysqldump 数据库名 表名>D:\文件名.sql -uroot -p999

导入数据

create database bjpowernode;

use bjpowernode;

source D:\bjpowernode.sql

数据库设计三范式:

1.任何一张表都应该有主键
2.建立在第一范式的基础上,所有的非主键字段完全依赖主键,不能产生部分依赖
3.建立在第二范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖
 多对多?三张表,关系表两个外键。
 一对多?两张表,多的表加外键。
  一对一设计:主键共享。
  一对一设计:外键唯一。