表的内连、外连、索引、事务、视图及用户管理

表的内外连接

1.内连接(inner join)

内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选。

显示SMITH的名字和部门

(1)标准的内连接的方法

select ename,dname
from emp inner join dept
on emp.deptno = dept.deptno
and ename = ‘smith’;
这里写图片描述

(2)用前面的方法

select ename,dname
from emp,dept
where emp.deptno = dept.deptno
and ename = ‘smith’;
这里写图片描述

2.外连接

(1)左外连接:联合查询中,左侧的表完全显示

select 字段
from 表名1 left join 表名2 on 连接条件

例子:
首先建立两个表stu和exam。
create table stu(
id int,
name varchar(20)
);

create table exam(
id int,
grade int
);

插入数据:
insert into stu values(1,’hello’),(2,’kitty’),(3,’test’),(4,’kate’);
insert into exam values(1,20),(2,60),(3,90),(10,100);

查询所有学生的成绩,如果这个学生没有成绩,也要讲学生的个人信息显示出来
select stu.id,name,grade
from stu left join exam
on stu.id = exam.id;
这里写图片描述

(2)右外连接:联合查询中,右侧的表完全显示

select 字段
from 表名1 right join 表名2 on 连接条件

select grade,exam.id
from stu right join exam
on stu.id = exam.id;
这里写图片描述

索引

提高查找速率,查询速率可以提高到成百上前倍。但是也有代价,查询速度的提高使以插入、更新、删除的速度为代价的,增加了大量的IO。
常见的所索引有:主键索引(primary key)、唯一索引(unique)、普通索引(index)、全文索引。

索引的基本原理

MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构。

数据库查询是数据库的主要功能之一,最基本的查询算法是顺序查找,时间复杂度是O(N),在数据量大的时候效率低。优化的查找算法如二分查找、二叉树查找,虽然查询效率都高了,但是各自对检索的数据都有要求:二分查找要求被检索数据有序,而二叉树查找只能应用于二叉树上,但是数据本身的组织结构不可能完全满足各种数据结构。

所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构。这些数据结构都是以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构及时索引。

MyISAM索引

MyISAM引擎使用B+Tree作为索引结构,叶结点的data域存放的是数据记录的地址。原理图如下:
这里写图片描述

InnoDB索引

与MyISAM索引最大的区别在于InnoDB的数据文件本身就是索引文件

MyISAM索引文件和数据文件是分离的,索引文件保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引是数据表的主键,因此InnoDB表数据文件本身就是主索引。
这里写图片描述

总结:

* 索引占用磁盘空间
* 索引是以空间换时间
* 当我们添加一一条记录,除了添加到表中,还要维护二叉树,速度有影响,但是不大。
* 当我们增加一个索引,不能够解决所有的查询问题,需要给字段建立索引。

创建索引

创建主键索引

方式一:在创建表时,直接在字段名后指定primary key。
create table 表名(id int primary key,name varchar(20));

方式二:在创建表的最后,指定某列或某几列为主键索引。
create table 表名(id int, name varchar(20),primary key);

方式三:创建表以后再添加主键。
create table 表名(id int, name varchar(20));
alter table 表名 add primary key(id);

主键索引的特点:

* 一个表中,最多有一个主键索引,当然可以是复合主键。
* 主键索引的效率高,主键不可以重复。
* 创建主键索引的列,它的值不能为Null,也不能重复。
* 主键索引的列基本上是int.

创建唯一索引

方式一:在表定义时,在某列后直接指定unique唯一属性。
create table 表名(id int primary key, name varchar(20) unique);

方式二:创建表时,在表的后面指定某列或某几列为unique。
create table 表名(id int primary key, nam varchar(20), unique(name));

方式三:创建以后再添加唯一键。
create table 表名(id int primary key, name varchar(20));
alter table add unique(name);

唯一索引的特点:

* 一个表中可以有多个唯一索引。
* 查询效率高。
* 如果在某一列上建立一个唯一索引,必须保证这列不能有重复数据。
* 如果一个唯一索引上指定not null,等价于主键索引。

创建普通索引

方式一:在表的定义最后,指定某列为索引
create table 表名(id int primary key, name varchar(20), index(name));

方式二:创建表完以后指定某列为普通索引
create table 表名(id int primary key, name varchar(20));
alter table add index(name);

方式三:创建一个索引名为idx_name的索引
create table 表名(id int primary key, name varchar(20));
create index idx_name on 表名(name);

普通索引的特点:

* 一个表中可以有多个普通索引。
* 如果某列需要创建索引,但是该列存在重复数据,此时只能创建普通索引。

全文索引

当文章字段或有大量文字的字段进行检索时,会用到全文索引。要求表的存储引擎是MyISAM,默认的全文搜索支持英文,不支持中文。

1.创建全文索引

create table articles(
id int not null primary key auto_increment,
title varchar(20),
body text,
FULLTEXT(title, body)
)engine=MyISAM;

查找带有database的关键字
select * from articles
where body like ‘%database%’;
这里写图片描述
explain用来分析sql语句。
explain select * from articles
where body like ‘%database%’;
这里写图片描述
KEY一列为空,表示没有用到全文索引。

2.使用全文索引

select * from articles
where match(title,body) against (‘database’);
这里写图片描述
全文索引会将最符合的一列展示最前边。

explain select * from articles
where match(title,body) against (‘database’);
这里写图片描述

3.查询索引

show keys from 表名
show index from 表名
desc 表名

4.删除全文索引

方法一:删除主键
alter table 表名 drop primary;

方法二:其他索引的删除
alter table 表名 drop index 索引名;

方法三:
drop index 索引名 on 表名;
drop index empno on emp;

创建索引的原则

1.比较频繁查询的字段应该创建索引。
2.唯一性太差的字段不适合单独创建索引。(性别)
3.更新非常频繁的字段不适合创建索引。
4.字段根本不会出现在where子句中,该字段不适合创建索引。

事务

事务是指访问并可能更新数据库中各种数据项的一个程序执行单元,即针对数据库中形形色色的数据,进行的一些存取操作。事务由事务开始和事务结束之间执行的全体操作组成。

创建一个表account。

事务的基本使用

1.开启一个事务

start transaction;

2.设置一个保存点

savepoint 保存点名

3.进行各种操作

insert into account values(1,’test’,100.01);

4.回滚,可以回到保存点

rollback to 保存点名;

5.提交事务

commit;

注意:
1.一个事务被提交了,则不可以回退。表示事务已经结束。
2.开启事务,其他用户不可见,除非提交后,其他用户才能看见。
3.如果没有设置保存点,也可以回退,回退的地方是事务的开始。
4.只有InnDB支持事务,MyISAM不支持事务。

事务的隔离级别

隔离级别 脏读 不可重复读 幻读 加锁读
读未提交(read uncommitted) 不加锁
读已提交(read committed) 不加锁
可重复读(repeatable read) 不加锁
可串行化(serializable) 加锁

设置事务的隔离级别

set session transaction isolation level read uncommitted;
说明:默认的是可重复读,自动避免了脏读、不可重复读、幻读。

1.脏读

在一个事务1还未提交,另一个事务2还可以看到事务1对数据库的更改。

2.不可重复读

在一个事务1提交时,对数据库做的修改或删除操作,未提交的事务2还可以看到。

3.幻读

在一个事务1提交时,对数据库做的增加操作,未提交的事务2可以看到。

事务的ACID特性

1.原子性(atomicity)

事务是一个不可分割的工作单位,一个事务中的操作要么全发生,要么都不发生。

2.一致性(consistency)

事务必须使数据库从一个一致性状态变到另一个一致性状态。

3.隔离性(isolation)

多个用户并发访问数据库时,数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰,多个事务间互相隔离。
使得各个事务间不可能发生脏读、不可重复读、幻读。

4.持久性(durability)

事务一旦提交,事务对数据库中的修改就是永久性的,不可以回滚。

视图

视图是一个虚拟表,在数据可中并不存在,其内容由查询定义,同真实表一样,视图包含一系列带有名称的列和行数据。视图的变化会影响到基表,基表的数据变化也会影响到视图。

创建视图

create view 视图名
as select语句

create view ename_dname_v
as
select ename,dname
from emp,dept
where emp.deptno = dept.deptno;

说明:
1.视图的修改会影响到基表数据。
2.基表数据会影响视图展示。

删除视图

drop view 视图名

视图和真实数据表的区别:

* 表占用磁盘空间,是一个系统具体的文件。视图不占用磁盘空间。
* 视图不能添加索引。
* 使用视图可以简化查询(多表查询)
* 视图可以提高安全性。

MySQL用户管理

如果我们直接使用root用户,会存在安全隐患,就需要使用MySQL的用户管理。

创建用户

create user ‘用户名’@’登录主机/ip’ identified by ‘密码’;

删除用户

drop user ‘用户名’;

修改用户密码

修改自己的密码
set password=password(‘新的密码’);
root用户帮你修改
set password for ‘用户名’@’登录主机/ip’ = password(‘**‘);

给用户授权

grant权限列表 on 库.对象名 to ‘用户名’@’登录位置’ [identified by ‘密码’];

回收权限

revoke 权限列表 on 库.对象名 from ‘用户名’@’登录位置’;

猜你喜欢

转载自blog.csdn.net/zwe7616175/article/details/80637555