MySQL复习

这篇博客详细介绍了MySQL数据库的基本操作,包括列类型、数据引擎的区别、CRUD操作、事务的ACID特性以及不同隔离级别的作用。还讨论了索引、数据库范式和JDBC的使用,强调了在高并发场景下事务管理和隔离级别选择的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据秦疆老师课堂笔记自己整理

1.MySQL

MySQL中不区分大小写

操作数据库时,如果表明或者字段名是一个特殊字符,就要带'',例如USE 'school'

数据库的列类型

tiny int(1字节),smallint(2字节),mediumint(3字节),int(4字节),bigint(8字节),float(4字节),double(8字节),decimal(字符串形式浮点数)。char(0-255),varchar(0-65535),tinytext(2^8-1,微型文本),text(2^16-1,大文本),timestamp(时间戳,从1970.1.1到现在的ms数),不要使用NULL进行运算,结果一定为NULL!

数据引擎INNODB和MYISAM的区别

INNODB支持事务,数据行锁定,外键约束。但是不支持全文索引,并且表空间的大小约为MYISAM的两倍

在物理文件上,INNODB只有*.frm表结构定义文件和*.ibd,而MYISAM有*.frm、*.MYD(数据文件)和*.MYI(索引文件)

所有数据库文件都存在data目录下,数据的存储本质还是文件的存储!

 

所有的创建和删除表的操作尽量加上IF条件判断,否则会报错

CRUD DQL语言

增加:

INSERT INTO 'student' ('name', 'pwd', 'gender') VALUES ('晏楚', '123456', '1'), ('晏楚', '456789', '0')

修改:

UPDATE 'student' SET 'name'='晏楚2', 'pwd'=111111, 'gender'=1 WHERE id='1'

删除:

DELETE FROM 'student' WHERE 'id'='1'

查询:

SELECT ‘studentno’ as 'stno', 'studentname' FROM 'student' WHERE 'studentname' LIKE '晏%'

完整的SELECT SQL

 

delete和、truncate、drop的区别

delete和truncate只删除表数据不删除表结构

处理速度上来说 drop>truncate>delete

delete是dml(Data Manipulation Language)语言,可以有事务回滚,而truncate是ddl(Data Definition Language)语言,不能事务回滚

联表查询

使用JOIN ON判断交叉条件,使用WHERE判断表内条件

INNER JOIN只要两个表有一个表有匹配的记录就返回行
LEFT JOIN以左表为主,返回左表全部的记录,即使没有和右表匹配
RIGHT JOIN以右表为主,返回右表的全部记录,即使没有和左表匹配

分页和排序

-- 降序排序
ORDER BY 'studentid' DESC 
-- 升序排序
ORDER BY 'studentid' ASC
​
-- 参数分别为当前开始位置,该页显示个数
LIMIT 0,5

子查询

快于连表查询,由内而外

使用聚合函数就不能只查询一条记录

事务

MySQL是默认开启事务的

手动提交事务

SET autocommit= 0 -> START TRANSACTION -> INSERT INTO 'student' ... VALUES, DELETE FROM 'student' WHERE ..., UPDATE 'student' SET ...=..., SELECT 'studentid' from 'student' -> COMMIT -> (如果失败) ROOLBACK -> SET autocommit = 1

ACID(Automic, Consistency,Isulation, Duration)

原子性:事务要么都成功要么都失败,不可分割

一致性:事务前后不改变数据的总状态

隔离性:事务之间的操作不相互影响

持久性:一旦事务被提交就被持久化到数据库中,不可逆

  • 事务的隔离级别

事务高并发下会有以下问题:脏读(事务未提交而被另外一个线程使用了部分数据),不可重复读(一个线程读取另外一个线程修改前和修改后的数据,导致两次读取的数据结果不一致)、幻读(一个线程读取另外一个线程增加记录前后的数据,导致第二次多出来额外的数据)、丢失修改(两个线程同时对一行记录的int字段20执行-1操作,最后该字段是19而不是18)

基于上述事务并发出现的问题,事务有四种隔离级别分别是:

读取未提交(READ-UNCOMMITTED),读取提交(READ-COMMITTED),可重复读(REPETABLE-READ),可串行化(SERIALIZABLE)

各事务隔离级别能防止的问题

脏读可重复读幻读
READ-UNCOMMITTED×××
READ-COMMITTED××
REPETABLE-READ×
SERIALIZABLE

一般的搜索引擎的默认事务隔离级别都是可重复度(REPETABLE-READ),而INNODB引擎虽然隔离级别是REPETABLE-READ,但是它却由于某些锁(Next-key Lock)的机制而能防止高并发下的幻读问题而不损失任何性能,这就是它牛逼的地方。

索引

index是帮助MySQL高效获取数据的数据结构

只有在特定的搜索引擎下才有全文索引(FullText Index),例如MYISAM搜索引擎

对不需要经常改动的字段上可以添加索引,格式为

CREATE INDEX id_studentname on student('studentname');

数据库三大范式(Normal Form)

1NF:一张表的每一列都有不可再分的原子性

2NF:在1NF的基础上,每张表只能描述一件事情,该表的每个字段都和主键相关

3NF: 在1NF和2NF的基础上,该表的每个字段都和主键唯一相关,而不能间接相关

关于三大范式的应用

  • 一张表不得关联超过三张表

  • 出于商业化的考虑,建立数据库中适当考虑三大范式,但是也要追求高性能,例如在一张表中故意增加和该表主键不相关的字段,有的情况下这样可以节省另外一张表的创建,又比如CREATE INDEX 'id_studentname' ON 'student'('studentname'),故意增加字段列也即是索引这种数据结构来提高查询的速度。

JDBC

应用程序->数据库驱动->数据库(驱动有显卡、声卡、数据库驱动等)

应用程序通过数据库驱动来和数据库打交道!

在应用程序和数据库驱动之间加了一层JDBC,数据库驱动厂商遵守JDBC规范,而我们只需要掌握JDBC的功能API即可!

 

JDBC默认数据源工具类

  • 在db.properties中分别配置driver、url、username、password

  • JDBCUtils.class.getClassLoader().getResourceAsStream(db.properties)返回InputStream对象in

  • 加载驱动,直接使用Properties类的对象properties,properties.load(in),properties.getProperty("driver")返回String对象driver,Class.forName(driver)此处是加载驱动,不用返回对象

  • 驱动连接数据库,获取代表数据库的对象,properties.getProperty("url/username/password/driver"),DriverMannager.getConnection(url, username, password)返回Connection对象connection

  • 获取数据库执行sql的Statement对象statement,connection.createStatement()返回Statement对象statement

  • 正常写sql,例如String sql = "select 'studentno', 'studentname' from 'student' where 'studentname' = '晏楚'";

  • 执行sql并,sql.executequery(sql)返回ResultSet对象resultset

  • 对resultset进行遍历,并且把值都传递给POJO类中

    while(result.next())

    {

    System.out.println(resultset.getString("studentno"));

    System.out.println(resultset.getString("studentname"));

    }

  • 关闭三个使用的对象,connection.close();、statement.close()、resultset().close()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值