MySQL数据库重点知识点总结归纳。10分钟了解MySQL

  1. 主键:
    对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。主键也不允许使用NULL。选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

  2. 联合主键
    关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。

  3. 外键
    在一个表中,通过非主键的另外一个字段,可以将数据和另一张表链接起来,这种列称为外键。
    通过定义外键约束,关系数据库可以保证无法插入无效的数据。
    由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。
    注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN …实现的。

  4. 索引
    索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。

//如果要经常根据score列进行查询,就可以对score列创建索引:
ALTER TABLE students  //ALTER 索引
ADD INDEX idx_score (score);

使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如

ALTER TABLE students
ADD INDEX idx_name_score (name, score);

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

  1. 唯一索引
    在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。
    但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
//通过UNIQUE关键字我们就添加了一个唯一索引。
  1. 查询
    SELECT * FROM <表名>
SELECT * FROM student;

使用SELECT * FROM students时,SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询,本例中是students表。

  1. 条件查询
    SELECT语句可以通过WHERE条件来设定查询条件,查询结果是满足查询条件的记录。例如,要指定条件“分数在80分或以上的学生”。
SELECT * FROM students WHERE score >= 80;  //条件1
SELECT * FROM students WHERE score >= 80 AND gender = 'M';  //条件2
SELECT * FROM students WHERE NOT class_id = 2;  //条件3
  1. 投影查询
    如果我们只希望返回某些列的数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM …,让结果集仅包含指定列。这种操作称为投影查询。
SELECT id, score, name FROM students;
SELECT id, score points, name FROM students;//给每一列更换名称
  1. 排序
    使用SELECT查询时,细心的读者可能注意到,查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序怎么办?可以加上ORDER BY子句。例如按照成绩从低到高进行排序:
SELECT id, name, gender, score FROM students ORDER BY score; //升序
SELECT id, name, gender, score FROM students ORDER BY score DESC; //降序
//如果有WHERE子句,则ORDER BY放到WHERE后面
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;

  1. 分页查询
    语法:limit 起始值,页面的大小
    这个查询可以通过LIMIT 子句实现。
    –第一页 limit 0,5
    –第二页 limit 5,5
    –第三页 limit 10,5
    –第N页 limit (N-1)*5,5

第N页 limit (n-1)*页面大小 页面大小

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 10,5;  //查询第三页的数据,页的大小为5

在这里插入图片描述

10.聚合查询
对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

SELECT COUNT(*) FROM students;

COUNT()表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT()。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:

SELECT COUNT(*) num FROM students;

聚合函数还有如下:SUM,AVG,MAX,MIN,这四个在查询为空时返回NULL,COUNT会返回0.

  1. 分组
    如果我们要统计一班的学生数量,我们知道,可以用
SELECT COUNT(*) num FROM students WHERE class_id = 1;

12. 多表查询

 SELECT * FROM students, classes;

结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。

连接查询

  • 先确定主表,仍然使用FROM <表1>的语法;
  • 再确定需要连接的表,使用INNER JOIN <表2>的语法;
  • 然后确定连接条件,使用ON <条件…>,这里的条件是s.class_id =
    c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
  • 可选:加上WHERE子句、ORDER BY等子句。
    下面是连接查询的一张图。
    在这里插入图片描述
    在这里插入图片描述

13. 关系数据库的增删改查
前面已经介绍了查询,下面主要介绍增删改(INSERT,DELETE,UPDATE)

14.INSERT
INSERT语句的基本语法是:INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
一次可以插入一条或者多条。VALUES多些几个就可以了

INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);
  1. UPDATE
    UPDATE语句的基本语法是:UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
UPDATE students SET name='大牛', score=66 WHERE id=1;

15. DELETE
如果要删除数据库表中的记录,我们可以使用DELETE语句。DELETE语句的基本语法是:DELETE FROM <表名> WHERE ...;

//删除id=1的记录
DELETE FROM students WHERE id=1;
-- 查询并观察结果:
SELECT * FROM students;

16. 事务
在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分.

-- //从id=1的账户给id=2的账户转账100元
-- //第一步:将id=1的A账户余额减去100
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- //第二步:将id=2的B账户余额加上100
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

这两条SQL语句必须全部执行,或者,由于某些原因,如果第一条语句成功,第二条语句失败,就必须全部撤销。
这种把**多条语句作为一个整体进行操作的功能,被称为数据库事务。**如果事务失败,不会对数据库数据有任何改动。

数据库事务具有ACID这4个特性:

  • A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么都执行,要么都不执行;
  • C:Consistent,一致性,事务完成后,所有数据的状态都是一致的。
  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;多个进程互不干扰;
  • D:Duration,持久性,事务一旦提交,为不可逆状态
BEGIN;
UPDATE accounts SET balance = balance - 200 WHERE id = 1;
UPDATE accounts SET balance = balance + 200 WHERE id = 2;
COMMIT; //ROLLBACK回滚
//COMMIT是指提交事务,即试图把事务内的所有SQL所做的修改永久保存。如果COMMIT语句执行失败了,整个事务也会失败。
//有些时候,我们希望主动让事务失败,这时,可以用ROLLBACK回滚事务,整个事务会失败:

17. 隔离级别
对于两个并发执行的事务,如果两个事务操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性。
SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:包括脏读、不可重复读、幻读等。
在这里插入图片

  • Read Uncommitted
    Read Uncommitted是隔离级别最低的一种事务级别。一个事务会读到另一个事务更新后但未提交的数据。这就是脏读(Dirty Read)。
    脏读:
    一个事务读取了另外一个事务没有提交的事务

  • Read Committed
    在Read Committed隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。
    不可重复读是指,在一个事务内,两次读取数据的间隙,有其他事务修改数据。

  • Repeatable Read
    在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。
    幻读是指,一个事务中,在两次查询的过程中,有其他事务进行了增加数据。

  • Serializable
    Serializable是最严格的隔离级别。所有事务按序执行,脏读、不可重复读、幻读都不会出现。但是效率会大大下降。

  1. 第一个JDBC程序
    JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。
    在这里插入图片描述
    在这里插入图片描述

  2. SQL注入
    在这里插入图片描述

  3. PrepareStatement对象
    防止对象注入,效率更高

  4. JDBC连接池
    在执行JDBC的增删改查的操作时,如果每一次操作都来一次打开连接,操作,关闭连接,那么创建和销毁JDBC连接的开销就太大了。为了避免频繁地创建和销毁JDBC连接,我们可以通过连接池(Connection Pool)复用已经创建好的连接。

JDBC连接池有一个标准的接口javax.sql.DataSource,注意这个类位于Java标准库中,但仅仅是接口。要使用JDBC连接池,我们必须选择一个JDBC连接池的实现。常用的JDBC连接池有:
HikariCP
C3P0
BoneCP
Druid

目前使用最广泛的是HikariCP。以HikariCP为例,要使用JDBC连接池,先添加HikariCP的依赖如下:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.7.1</version>
</dependency>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值