mysql

本文介绍了MySQL数据库的基本操作,如创建和删除数据库、表,以及数据类型。讨论了表操作,包括增删改查(CRUD),并涉及键值约束和表设计遵循的实体关系图和三大范式。此外,还涵盖了多表查询、索引的创建和管理,以及事务处理的重要性及其隔离级别,强调了索引在提升查询效率中的作用。
摘要由CSDN通过智能技术生成

mysql数据库:

关系型数据库,C/S架构

库操作:

mysql -uusername;
mysql -ugyx;
//如果有密码 -p
show databases;
use mysql;
show tables;
//建数据库
create database if not exists 'dbname';
use dbname;
drop database if exists dbname;
select database();//返回当前正在被使用的数据库名称。

数据类型:(数据类型有很多,针对表的某一数据项选择合适的类型,减少数据占用,节省空间)
bit,int,bigint
decimal(m,d)
varchar(10),char(10),text
datetime,timestamp

表操作

create table if not exists stu(
sn int,
name varchar(10),
age int,
ch decimal(5,2),
en decimal(5,2),
birthday datetime
);
show create table stu;//查看实际建表语句
//上面的操作实际会被翻译成这样
CREATE TABLE `stu` (
  `sn` int(11) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `ch` decimal(5,2) DEFAULT NULL,
  `en` decimal(5,2) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//有default 默认为null,并且每个列名都用``倒引号修饰,在最后还有使用的engine存储引擎和charset字符编码
//查看表结构
describe tbname;  desc tbname;
alter table stu add sex varchar(1);
alter table stu modify sex bit;//修改modify,删除drop,添加add

//删除表
drop table stu;
//新增数据
insert into stu values(2023,'gyx',20,90,89,now(),'男');
datetime的格式是yyyy-mm-dd hh-MM-ss


//更新
update tbname set fields=val,fields=val;
修改在其后要加where筛选,否则就是where 1;对所有行数据的该项都进行了修改

delete from tbname where name ='小明';//删除某行数据

//查询(select 还有很多高级用法,这里这里只是简单显示一个表的全部内容)
select * from stu;//全列查询
select name,sex,ch from stu;
select name,ch+en as total from stu;
//列求和,起别名

//去重查询distinct
select distinct name from stu;
//order by desc--降序  默认asc--升序
select * from stu order by ch desc;

//分页查询limit  offset
select * from stu limit 2;
offset从第几条数据开始(偏移了几个数据)

//条件查询where
关系运算符:
> , < , = , <= , >= , != , <> 
select * from stu where sex<>'男';

空的判断:is null   is not null

区间:between 。。and。。
集合:in()
模糊:like '%明%'
select * from stu like '%明%';

or
and
not

CURD进阶:

键值约束

主键约束:不能为空null,且唯一,一张表只能有一个主键 primary key

create table tb1(
id int primary key,
name varchar(10)
);
create table tb1(
id int,
name varchar(10),
primary key pk(id)
);
//第二种方式也可创建组合主键
primary key pk(id,name)

表的设计(实体关系图,三大范式)

多表查询

将多张表的数据连接到一起
连接–采用笛卡尔积的方式
1.内连接:将两张表中符合连接条件的数据连接到一起,不符合的丢弃

table1 inner join table2 on condition
table1,table2 where condition

inner join 和where都可以实现
2.左连接:依据左表从右表中查找符合条件的数据进行连接,没有则连接null,左边的内容不为空,每一行字段存在

table_left left join right_table on condition

3.右连接:基于右表从左表查找符合条件的数据进行连接,没有则连接null (right join)

子查询:一条sql语句的过滤条件依赖于另一条SQL的查询结果
如果子语句的查询结果只有一条,则可以使用=进行判断
子查询结果很多,是个集合,此时要用in、exists
在这里插入图片描述
在这里插入图片描述
合并查询,在于将原本两个字段现在用一个字段查询,此时就可以用到索引,查询时使用索引可以极大提高查询效率。
下面来谈谈索引

索引

索引:数据库存储引擎为表中的数据所建立的一个目录
当我们看书时,寻找书中的某个内容,如果一页一页去找,那么效率非常低,,通常都是在前面几页的目录中去查找关键字,之后既可以快速定位页码,从而大大提高查询效率。这样的思想和索引的思想是一样的,不过具体实现,是利用特定的数据结构–B+树。
索引的使用:
创建:
1.当我们创建一个主键(primary key),唯一键(unique key),外键(foreign key),这时候数据库就会自动的针对指定字段创建索引
2.在创建表的时候,使用**index*关键字进行普通索引的声明

create table stu(
id int primary key,
name varchar(32),
index(name)
)

3.修改表结构,给指定的字段(列)添加索引。

alter table student add index idx_n(name);

4.针对指定的表创建索引

create index qq_idx on student(qq_mail);

查看:

show index from student;
show keys from student;

删除索引:

drop index dix_name on table;//根据索引名字删

再谈B+树:
我们都知道有个BST(Binary Search tree)二叉搜索树,也就二叉排序树(左 < 根 < 右 )
BST的问题在于,很容易出现树的高度非常高,每层存储的结点个数却并不多,这就导致存储海量数据时,如果要查询,需要递归很深才能找到,查询效率不高,最差情况会退化到O(n)
从而有了AVL树,平衡二叉搜索树,但是AVL树在插入删除时效率不高,又出现了红黑树–基本平衡,减少插入删除造成的不断左右旋。
那么为什么不用上面这些数据结构呢,因为数据库的存储是海量,数据量非常大,即使用了这些结构,树高依然很大,如果降低树高,就有了多叉树,B+树就是多叉树,B树也是;区别在于:
在这里插入图片描述
在这里插入图片描述

聚簇索引:索引数据和用户数据存放在一起
1.一张表只能有一个聚簇索引
2.聚簇索引与索引物理存储顺序保持一致,且有序存储。
3.在表中除了聚簇索引还有辅助索引,在聚簇索引类型中,辅助索引的叶子节点存放的并不是用户数据,而是聚簇索引的键值。
非聚簇索引:索引数据和用户数据分离存储

聚簇索引将数据行存储在一起,并按照索引键的顺序进行排序。因此,查询聚簇索引时,可以快速地找到符合条件的记录。
非聚簇索引则在另外的数据结构中保存索引信息,而不是直接存储数据行。一张表可以拥有多个非聚簇索引,每个索引都使用不同的排序方式,以支持不同类型的查询。

索引index创建原则:
1.选择适当的字段作为索引:通常选择经常用于查询和排序的字段作为索引。同时,应该避免过多地创建索引,因为索引会占用磁盘空间和系统资源。

2.对经常使用的查询语句创建索引:通过分析数据库中常用的查询语句,可以确定哪些查询需要创建索引以提高查询效率。建议先创建覆盖查询所需的索引,在实际监测中再根据需要进行调整。

3.考虑复合索引:如果需要同时查询多个字段,可以考虑创建复合索引。但也要避免创建过多的复合索引,因为复合索引的效率受到字段顺序、数据类型等因素的影响。

4.定期维护索引:随着数据量的增加和数据的变化,索引的效率会发生变化。因此,需要定期对索引进行维护,包括重新构建索引、删除无用索引、优化索引等操作。

事务

数据库的事务机制是保证数据完整性和一致性的重要手段。事务(Transaction)是指由一个或多个操作组成的逻辑处理单元,这些操作要么全部执行成功,要么全部回滚,即撤销对数据所做的任何修改。

常见的事务特征包括:

原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚。(要么不做,要么全做)

一致性(Consistency):事务执行前后,数据始终处于合法状态,不会破坏数据完整性和约束条件。

隔离性(Isolation):事务之间相互独立,每个事务都感觉不到其他事务的存在。(隔离性有多重,并发出现的问题也源于隔离性,同时开启多个事务时)

持久性(Durability):事务一旦提交,它对数据库的修改应该永久保存,即使发生系统崩溃或断电等异常情况也不会丢失。

数据库事务的隔离级别是为了控制并发读写操作之间的可见性和影响范围。
常见的四种事务隔离级别包括:

读未提交(READ UNCOMMITTED):在该隔离级别下,一个事务可以读取另一个未提交的事务所修改的数据。这样会导致脏读、不可重复读和幻读等问题。

读已提交(READ COMMITTED):在该隔离级别下,一个事务只能读取其他已经提交的事务所修改的数据。但是,在一个事务内可能会出现不可重复读或者幻读的情况。

可重复读(REPEATABLE READ):在该隔离级别下,一个事务开始时会创建一个快照来保证每个查询都看到同一版本的数据,即使其他事务对数据进行了修改。但是,仍然存在幻读的问题。

序列化(SERIALIZABLE):在该隔离级别下,所有事务串行执行,每个事务依次执行,避免了脏读、不可重复读和幻读等问题,但是可能会降低并发性能。

隔离级别依次增强,最后的序列化(串行化)其实此时就没有并发了,单执行流,但是性能很低。

在事务的并发处理中,可能会出现以下问题:

脏读(Dirty Read):一个事务读取了另一事务还未提交的数据,然后执行了回滚操作,导致数据被破坏。
(脏读是事务rollback回滚导致)
不可重复读(Non-repeatable Read):某个事务多次读取同一数据,在此期间另一个事务修改了该数据,导致前一个事务读取到的数据值不同。
(事务commit提交了)
幻读(Phantom Read):某个事务多次查询某一范围内的数据,在此期间其他事务插入或删除了该范围内的数据,导致前一个事务读取到的数据行数不同

死锁(Deadlock):两个或多个事务相互等待对方释放资源的情况,形成僵局,导致系统无法继续运行。

饥饿(Starvation):某个事务长时间无法获取所需资源,导致一直处于等待状态,无法完成操作。

MVCC是多版本并发控制(Multi-Version Concurrency Control)的缩写。它是一种数据库事务并发控制技术,用于解决并发读写操作之间的一致性问题。

在MVCC中,每个数据库事务都可以看到一个独立的数据版本。当一个事务对某个数据进行修改时,它会创建一个新的数据版本,并为该版本分配一个唯一的时间戳其他事务可以继续访问旧版本的数据,以保证可重复读和隔离性等级别。

查询的时候,只获取,事务版本低于自己版本,且不再自己的活跃事务数组记录中的这种数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值