数据库学习——04—Mysql高级(视图、事务、索引)

1、视图
对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦。
解决办法:定义视图

2、视图是什么
通俗的讲,视图就是一条SELECT语句执行后返回的结果集。
视图是对若干张基本表的引用,一张虚表(相当于一张虚拟表),查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);
方便操作,特别是查询操作减少复杂的SQL语句,增强可读性

# 下面写的是sql的语句


# 视图知识点
# 通俗的讲,视图是一条select语句执行后的返回的结果集

# 视图的作用
'''
1、提高了重用性,就像一个函数,方便调用        复杂查询语句时候创建视图,简化代码
2、对数据库重构,却不能影响程序的运行          数据表的改变,却不影响程序
3、提高了安全性,对不同用户可以交付不同的权限
4、让数据更清晰

'''
'''
# 定义视图
create view 视图名称 as select语句;
#举例:create view v_pro_city as select p.id,p.`province`,c.`city` from provinces as p inner join cities as c on p.`provinceid` = c.provinceid having p.`province`='黑龙江省';

# 当改变原始数据库中的信息时候,视图也会跟着改变,这是它的特性。
# 包含以下内容的,视图不能修改
select子句中包含distinct
select子句中包含组函数
select语句中包含group by 子句
select语句中包含order by 子句
select语句中包含unionunion all等集合运算符
where子句中包含相关子查询
from子句中包含多个表
如果视图中有计算列,则不能更新
如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作


# 查看视图
show tables;

# 使用视图
select * from 视图名字;

# 删除视图
drop view 视图名称;        # 注意这里的view和删除table不一样

'''

1、事务
事务广泛的运用于订单系统、银行系统等多种场景

事务命令:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎


'''
事务:它是一个操作序列,这些操作要么都执行成功,要么都不执行,是一个不可分割的工作单位。   广泛应用于银行转账和订单信息

事务四大特性:(重要)
1、原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
2、一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。
3、隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。在当前客户端修改数据,在其他客户端也在修改数据,会发生阻塞的情况,只有当第一个客户端提交了之后才执行。
4、持久性(durability):一旦事务提交,则其所做的修改会永久保存到数据库。


# 开启事务
start transactionselect * from a where name ='juran';
select * from b where name ='lg';
update a set money = money - 200 where id=1;
update b set money = money + 200 where id=1;
commit;

# 事务命令
开启事务:begin;或者是start transaction#开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
提交事务:commit#将缓存中的数据变更维护到物理表中
回滚事务:rollback#放弃缓存中变更的数据

'''

'''
# 模拟银行转账
create table money (id int unsigned not null primary key auto_increment,num int unsigned not null);
desc money;
insert into money values(1,100),(2,200),(3,0);                    # 创建三个对象
select * from money;
begin;
update money set num =num-100 where id=1;
select * from money;
update money set num =num+100 where id=2;
select * from money;
update money set num =num+100 where id=3;
select * from money;

commit;

'''

注意:修改数据的命令会自动的触发事务,包括insert、update、delete
而在SQL语句中有手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起会滚到之前的数据

2、索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度

索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。


'''
索引的目的:提高查询效率,类比于查字典

索引是一个特殊的文件,也需要占用空间
1、主键自动建立索引
2、频繁作为查询条件的字段应该建立索引;
3、查询中与其他的表关联的字段,外键关系建立索引;
4、在高并发的情况下创建复合索引
5、查询中排序的字段,排序字段若通过索引去访问将大大提高排序顺序(建立索引的顺序和排序的顺序保持一致)

不适合建立索引的情况:
1、频繁更新的字段不是和建立索引
2where 条件里面用不到的字段不创建索引
3、表的记录太少,表中数据高于300万条数据的,考虑建立索引
4、数据重复且平均的表字段,比如性别,国籍


查询效率提高后,插入和修改数据就会变得困难一点
# Index_type 类型主要有两种BTREE和哈希
mysql> show index from students;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| students |          0 | PRIMARY  |            1 | id          | A         |           8 |     NULL |   NULL |      | BTREE      |         |               | YES     |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
1 row in set (0.07 sec)

mysql> select * from students;
+----+------+------+--------+--------+--------+------------+-----------+
| id | name | age  | high   | gender | cls_id | birth      | is_delete |
+----+------+------+--------+--------+--------+------------+-----------+
|  1 ||   23 | 175.88 ||      1 | NULL       |         0 |
|  3 | 2    |   18 | 188.00 ||      1 | 1997-01-01 |         0 |
|  4 | 3    |    4 | 178.00 ||      1 | 1997-01-01 |         0 |
|  5 | 4    |   20 | 168.00 ||      1 | 1997-01-01 |         0 |
|  6 | 5    |   19 | 178.00 ||      1 | 1997-01-01 |         1 |
|  7 | 小乔 |   18 |   NULL ||   NULL | 1997-01-01 |         0 |
|  8 | 周瑜 |   21 |   NULL ||   NULL | 1997-01-01 |         0 |
|  9 | 空格 |   22 |   NULL ||   NULL | 1997-01-01 |         0 |
+----+------+------+--------+--------+--------+------------+-----------+
8 rows in set (0.00 sec)
************************************************************************************

查看索引
show index from 表名;

创建索引
create [unique] index 索引名称 on 表名(字段名称(长度))

删除索引
drop index 索引名称 on 表名;


Key_name
--------
PRIMARY       主键索引无法删除


设置查询索引所用的时间
mysql> set profiling =1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from test1 where title = 'jr-1111';
+---------+
| title   |
+---------+
| jr-1111 |
+---------+
1 row in set (0.01 sec)

mysql> show profiles;
+----------+------------+---------------------------------------------+
| Query_ID | Duration   | Query                                       |
+----------+------------+---------------------------------------------+
|        1 | 0.01391875 | select * from test1 where title = 'jr-1111' |
+----------+------------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)
###############################################################

'''

发布了50 篇原创文章 · 获赞 9 · 访问量 2091

猜你喜欢

转载自blog.csdn.net/weixin_42118531/article/details/103447901