MySQL入门
MySQL入门
一、初识MySQL
1.1百度百科
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
1.2数据库概念
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
1.3基本命令行操作
1 | mysql -u root -p --连接数据库 |
1.4、数据库语言
DDL:定义
DML:操作
DQL:查询
DCL:控制
二、操作数据库
2.1基本语句
1 | -- 创建一个表 |
2.2数据库引擎
- 默认使用INNODB,5.7以上版本
- MYISAM早些版本
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 不支持 | 支持 |
表空间大小 | 较小 | 较大,约为MYISAM两倍 |
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
三、mysql数据管理
3.1外键
1 | CREATE TABLE `grade`( |
1 | ALTER TABLE `student` |
以上都是物理外键,数据库级别的外键,为了避免数据库或多,一般不使用。
外键在应用级别实现。
四、MySQL函数
官方文档:https://dev.mysql.com/doc/refman/5.7/en/sql-function-reference.html
1、常用函数
1 | -- 数学运算 |
2、聚合函数
1 | -- 查询一个表有多少记录 |
五、DML操纵数据语言
Data Manipulation Language, DML数据操纵语言,用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句
- insert
- updat
- delete
1、添加
1 | -- 插入语句(添加) |
2、修改
1 | -- 修改指定的信息 |
操作符 | 含义 |
---|---|
= | 等于 |
<>或!= | 不等于 |
> | 大于 |
< | 小于 |
<= | 大于等于 |
>= | 小于等于 |
between…and.. | 闭合区间 |
and | && |
or | || |
3、删除
1 | -- 删除所有数据 |
清空表的两种操作的区别:
- 相同点:都能删除数据且不会删除表结构
- 不同点:
- TRUNCATE 重新设置自增列,计数器会归零
- TRUNCATE 不会影响事务
六、DQL查询数据语言
1、DQL
Data QueryLanguage 数据查询语言
select基本语法
1
2
3
4
5
6
7
8SELECT [ALL|DISTINCT] <目标列表达式> [AS 列名]
[,<目标列表达式> [AS 列名] ...] FROM <表名> [,<表名>…]
[left | right | inner join table_name2]-- 联合查询
[WHERE...]-- 指定结果需满足的条件
[GROUP BY...]-- 指定结果按照哪几个字段来分组
[HAVING...] -- 过滤分组的记录必须满足的次要条件
[ORDER BY...]-- 指定查询记录按一个或者多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];-- 指定查询的记录从哪条到哪条
2、指定查询字段
1 | -- 查询全部的学生 |
3、去重distinct
- 作用:去除一些重复的数据
1 | -- 查询一下有哪些同学参加了考试,成绩(因为有的人参加了多门考试) |
- 使用数据库的列(表达式)
1 | -- 给每个人的成绩加1 |
4、where条件子句
检索数据中符合条件的值
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与 |
or || | a or b a||b | 逻辑或 |
not ! | not a ! a | 逻辑非 |
尽量使用英文字母
1 | -- 查询90-100的成绩(AND) |
5、模糊查询
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为null,结果为真 |
IS NOT NULL | a is not null | 如果操作符不为null,结果为真 |
BETWEEN AND | a between b and c | 若a在b和c之间,结果为真 |
LIKE | a like b | SQL匹配,如果a匹配b,结果为真 |
IN | a in(a1,a2,a3…) | 假设a在a1,或者a2….其中的某一个值中,结果为真 |
1 | -- 查询姓王的同学 |
6、联表查询
1 | -- 查询参加了考试的同学的(学号,姓名,科目编号,分数) |
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回匹配的值 |
left join | 返回左表中的所有值,即使右表中没有匹配 |
right join | 返回右表中的所有值,即使左表中没有匹配 |
7、自连接
自己的表和自己的表连,核心:一张表拆为两张一样的表
例如下表category
categoryid pid categoryName 7 5 ps技术 6 3 web开发 2 1 信息技术 3 2 办公技术 4 3 数据库 5 1 美术设计 3 1 软件开发 -- 查询父子信息 SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目' FROM `category` AS a, `category` AS b WHERE a.`categoryid` = b.`pid`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 结果如下
| 父栏目 | 子栏目 |
| -------- | -------- |
| 软件开发 | 数据库 |
| 软件开发 | web开发 |
| 美术设计 | ps技术 |
| 信息技术 | 办公技术 |
### 8、分页和排序
- 排序
```sql
-- 排序:升序 ASC , 降序 DESC
-- 把学生成绩按照降序排
ORDER BY StudentResult DESC
-- 把学生成绩按照升序排
ORDER BY StudentResult ASC分页
1 | -- 分页, 语法:limit 起始位置,数据行数 |
9、嵌套查询
Where(计算的值)
在where语句里面嵌套一个子查询语句
- 使用子查询进行基于集合的查询
1 | -- 查询与张三同学在同一个系的同学 |
- 使用子查询进行比较查询
1 | -- 查询选修了语文课程且课程成绩高于此课程平均成绩的的学生学号和该门课成绩 |
七、事务
1、概述
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
2、事务原则:ACID原则
参考博客:https://blog.csdn.net/dengjili/article/details/82468576
Atomicity原子性
原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。
Consistency一致性
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
Isolation隔离性
事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。
Durability耐久性
如果服务器宕机,事务若没有提交,就恢复到之前的状态;若提交,就持久化到数据库了。
隔离导致的问题
脏读
指一个事务读取了另外一个事务未提交的数据。
不可重复读
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
(一般是行影响,如下图所示:多了一行)
3、具体操作
1 | -- mysql是默认开启事务的自动提交的 |
4、模拟转账的事务
建立一个account表
1
2
3
4
5
6CREATE TABLE `account` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`money` decimal(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;插入一些数据
id name money 1 A 1000.00 2 B 500.00 开始事务
1
2
3
4
5
6
7
8
9
10
11
12-- 模拟转账的事务
SET autocommit = 0 -- 关闭自动提交
START TRANSACTION -- 开启一个事务
UPDATE account SET money=money-500 WHERE `name` ='A' -- A减500
UPDATE account SET money=money+500 WHERE `name` ='B' -- B加500
COMMIT; -- 提交事务,一旦提交就持久化了
ROLLBACK; -- 恢复默认值
SET autocommit = 1 -- 开启自动提交结果
id name money 1 A 500.00 2 B 1000.00 过程模拟
这个过程包含两个步骤
A:1000 - 500 = 500
B: 500 + 500 = 1000原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作,并且在提交过后就被持久化到数据库里面了,不可被回滚。
八、索引
1、概念
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
2、分类
主键索引(PRIMARY KEY)
唯一标识,主键不可重复
唯一索引(UNIQUE KEY)
避免重复的列,可以重复,多个列都可以标识为唯一索引
常规索引(KEY/INDEX)
默认的,index/key来设置
全文索引(FULLTEXT)
快速定位数据
3、基本语法
1 | -- 显示所有的索引信息 |
4、使用
建表app_user:
1 | CREATE TABLE `app_user` ( |
批量插入数据:100w
1 | DROP FUNCTION IF EXISTS mock_data; |
索引效率测试
无索引
1 | SELECT * FROM app_user WHERE name = '用户9999'; -- 查看耗时 |
1 | -- CREATE INDEX 索引名 ON 表(`字段`) |
索引在数据非常多的时候,可以极大的提高查找速度
5、索引原则
- 不要对经常变动的数据加索引
- 不要对小数据加索引
- 索引一般加在经常查询的大量数据的字段上
6、 索引底层原理
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
6.1、为什么需要索引
索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检索。在数据库中,高效的查找算法是非常重要的,因为数据库中存储了大量数据,一个高效的索引能节省巨大的时间。比如下面这个数据表,如果 Mysql 没有实现索引算法,那么查找 id=7 这个数据,那么只能采取暴力顺序遍历查找,找到 id=7 这个数据需要比较 7 次,如果这个表存储的是 1000W 个数据,查找 id=1000W 这个数据那就要比较 1000W 次,这种速度是不能接受的。
6.2、Mysql 索引底层数据结构选型(B+树)
- B树的特点可以总结为如下:
- 关键字集合分布在整颗树中。
- 任何一个关键字出现且只出现在一个节点中。
- 搜索有可能在非叶子节点结束。
- 其搜索性能等价于在关键字集合内做一次二分查找。
- B树在插入删除新的数据记录会破坏B-Tree的性质,因为在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。
- 作为B树的加强版,B+树与B树的差异在于
- 有n棵子树的节点含有n个关键字(也有认为是n-1个关键字)。
- 所有的关键字全部存储在叶子节点上,且叶子节点本身根据关键字自小而大顺序连接。
- 非叶子节点可以看成索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字。
- B+树的特性如下:
- 所有关键字都存储在叶子节上,且链表中的关键字恰好是有序的。
- 不可能非叶子节点命中返回。
- 非叶子节点相当于叶子节点的索引,叶子节点相当于是存储(关键字)数据的数据层。
- 更适合文件索引系统。
九、权限管理和备份
1、权限管理
2、mysql备份
直接拷贝物理文件
可视化操作导出
使用命令行
1
2
3
4
5#导出
mysqldump -h 主机名 -u 用户名 -p 密码 数据库 表名 >位置
#导入
mysql -u 用户名 -p 密码
source 位置
十、规范数据库设计
1、作用
- 节省内存空间
- 保证数据库完整性
2、过程
- 分析需求,收集信息
- 概要设计:设计关系图E-R图
3、三大范式
3.1、第一范式(1NF)
要求数据库表的每一列都是不可分割的原子数据项
3.2、第二范式(2NF)
在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
3.3、第三范式(3NF)
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
3.4、规范性和性能的问题
关联查询不得超过三张表
十一、JDBC
1、数据库驱动
2、JDBC
2.1、概念
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
2.1、概念
3、使用
- 加载驱动
- 连接数据库
- 获取执行sql的对象
- 返回的结果集
- 释放连接
1 | //1.加载mysql数据库驱动 |
SQL注入
1 | " ' or '1=1 " |
sql存在漏洞,会被拼接
- 使用preparedstatement对象防止sql注入