文章目录
- 1、操作数据库
- 1.1、操作数据库
- 1.2、数据库的数据类型
- 1.3、数据库的字段属性
- 1.4、创建数据表
- 1.5、MyISAM和InnoDB
- 1.6、修改删除表
- 2、MySQL数据管理
- 2.1、外键
- 2.2、DML语言(全部记住)
- 2.3、添加
- 2.4、修改
- 2.5、删除
- 3、DQL查询数据
- 3.1、DQL
- 3.2、查询指定的字段
- 3.3、去重distinct
- 3.4、数据库的列(表达式)
- 3.5、Where条件子句
- 3.6、模糊查询
- 3.7、联表查询
- 3.8、自连接
- 3.9、分页和排序
- 3.10、子查询和嵌套查询
- 3.11、MySQL常用函数
- 4、MySql的事务
- 4.1、什么是事务
- 4.2、事务常用命令
- 5、索引
- 5.1、索引的分类
- 5.2、索引原则
- 6、三大范式
- 6.1、第一范式
- 6.2、第二范式
- 6.3、第三范式
1、操作数据库
操作数据库中的表 > 操作数据库中表 > 操作数据库中的表的数据
1.1、操作数据库
操作 | 命令 |
---|---|
创建数据库 | create database [if not exists] 数据库名称; |
删除数据库 | drop database [if exists] 数据库名称; |
使用数据库 | use 数据库名称; |
查看数据库 | show databases; |
1.2、数据库的数据类型
数值
类型 | 大小 |
---|---|
tinyint | 十分小的数据 1个字节 |
smallint | 较小的数据 2个字节 |
mediumint | 中等大小的数据 3个字节 |
int | 标准的整数 4个字节 |
bigint | 较大的数据 8个字节 |
float | 浮点数 4个字节 |
double | 浮点型 8个字节 |
decimal | 字符串形式的浮点数 |
字符串
类型 | 大小 |
---|---|
char | 字符串固定大小 0-255 |
varchar | 可变字符串 0-65535 (对应java 里面的 String) |
tinytext | 微型文本 2^8 - 1 |
text | 文本串 2^16 - 1 保存大文本 |
时间日期
java.util.Data
类型 | 大小 |
---|---|
data | YYYY-MM-DD , 日期格式 |
time | HH::mm:ss,时间格式 |
datatime | YYYY-MM-DD HH::mm:ss 最常用的 |
timestamp | 1970.1.1 到现在的毫秒数 |
year | 年份表示 |
null
- 没有值,未知
- ==注意,不要使用null进行运算,结果为null
1.3、数据库的字段属性
Unsigned:
- 无符号的整数
- 声明了该列不能声明为负数
zerofill:
- 0填充的
- **不足的位数,使用0来填充,int(3) **
autoincrement:
- 通常了解为自增,自动在上一条记录的基础上+1(默认)
- 通常用来设置唯一的主键 必须是整数类型
- 可以自定义设计主键自增的起始值和步长
非空 not null:
- 假设设置为 not null, 如果不给他赋值,就会报错!
- null,如果不填写值,默认就是null!
默认:
- 设置默认的值!
- sex,默认值为男,如果不指定该列的值,就会自动填入默认值
1.4、创建数据表
create table if not EXISTS `student`(
`id` int(4) not null auto_increment COMMENT '学号',
`name` varchar(30) not null DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(30) not null DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) not null DEFAULT '女' COMMENT '性别',
`birthday` datetime DEFAULT null COMMENT '出生日期',
`address` varchar(100) DEFAULT null COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT null COMMENT '邮箱',
PRIMARY key (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
show create database lianxi; -- 查看创建数据库的语句
show create table student; -- 查看创建数据库表的语句
desc student; -- 查看表的具体的结构
1.5、MyISAM和InnoDB
关于数据库引擎
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁 | 不支持 | 支持 |
外键 | 不支持 | 支持 |
全文索引 | 不支持 | 支持 |
表空间的大小 | 较小 | 较大,约为myisam的2倍 |
常规使用操作:
- MYISAM 节约空间,速度较快
- INNODN 安全性高,事务的处理,多表多用户操作
1.6、修改删除表
alter table student rename student1; -- 修改表名
alter table student1 add age int(11); -- 增加列属性
alter table student1 MODIFY age varchar(11); -- 修改表的字段(修改约束)
alter table student1 change age age1 int(1); -- 字段重命名
alter table student1 drop age1; -- 删除表的字段
drop table if exists student1; -- 删除表
2、MySQL数据管理
2.1、外键
-- 班级表
create table if not EXISTS `grade`(
`gradeid` int(10) not null auto_increment COMMENT '年纪id',
`gradename` varchar(50) not null COMMENT '年纪名称',
PRIMARY key (`gradeid`)
)ENGINE=INNODB DEFAULT charset=utf8;
-- 学生表(建表的时候同时创建外键)
create table if not EXISTS `student`(
`id` int(4) not null auto_increment COMMENT '学号',
`name` varchar(30) not null DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(30) not null DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) not null DEFAULT '女' COMMENT '性别',
`birthday` datetime DEFAULT null COMMENT '出生日期',
`address` varchar(100) DEFAULT null COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT null COMMENT '邮箱',
`gradeid` int(10) not null COMMENT '学生的年级',
PRIMARY key (`id`),
key `FK_gradeid` (`gradeid`),
constraint `FK_gradeid` FOREIGN key (`gradeid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 创建表的时候没有添加外键
alter table `student`
add constraint `FK_gradeid` foreign key(`gradeid`) references `grade` (`gradeid`)
反正就按照这个记住,在学生这里的gradeid和grade中的grade有外键关系,那么我们创建student的时候,gradeid必须要在grade中有,然后删除grade中的时候,如果有student用的这个gradeid的话,就不能删除
以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,了解即可)
最佳实践:
- 数据库就是单纯的表,只用来存储数据,只有行(数据)和列(字段)
- 我们想使用多张表的数据,想使用外键(程序去实现)
2.2、DML语言(全部记住)
数据库意义:数据存储、数据管理
DML语言:数据库操作语言
- 添加
- 修改
- 删除
2.3、添加
- 注意事项
- 字段和字段之间使用英文逗号隔开
- 字段是可以省略的,但是后面的值必须要一一对应
- 可以同时插入多条数据,VALUES后面的值,需要使用,隔开即可
2.4、修改
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<> 或 != | 不等于 | 5<>6 | true |
< | |||
> | |||
<= | |||
>= | |||
between … and … | 在某个范围里面 | [2,5] | |
and | 我和你&& | 5> 1 and 1>2 | false |
or | 我或你 || | 5>1 or 1>2 | true |
注意:
- colnum_name是数据库的列,尽量带上``
- 条件,筛选的的条件,如果没有指定,则会修改所有的列
- value是一个具体的值,也可以是一个变量
- 多个设置的的属性之间,使用英文逗号隔开
2.5、删除
这个之前不知道:
Truncate作用:清空表中的数据,表的结构和索引约束不会变
delete 和 truncate 区别
- 相同点:都能删除数据,都不会删除表的结构
- 不同:
- Truncate 重新设置 自增列 ,计数器会归零
- Truncate 不会影响事务
了解即可:Delete删除后,重启数据库的现象
- InnoDB:自增列会从1开始(存在内存当中的,断点既失)
- MyISAM:继续从上一个自增量开始(存在文件中的,不会丢失)
3、DQL查询数据
3.1、DQL
(Data Query LANGUAGE):数据查询语言
- 所有的查询操作都用它 Select
- 简单的查询,复杂的查询它都能做
- 数据库中最核心的语言,最重要的语句
- 使用频率最高的语句
3.2、查询指定的字段
3.3、去重distinct
作用:取出select查询出来的结果中重复的数据,只显示一条
3.4、数据库的列(表达式)
数据库中的表达式:文本值、列、null、函数、计算表达式、系统变量…
3.5、Where条件子句
作用:检索数据中符合条件的值
搜索的条件由一个或多个表达式组成,结果是布尔值
3.6、模糊查询
运算符 | 语法 | 描述 |
---|---|---|
is null | a is null | 如果操作符为null,结果为真 |
is not null | a is not null | 如果操作符不为mull,结果为真 |
between | a between b and c | 若a在b之间,则结果为真 |
like | a like b | SQL匹配,如果a匹配b,则结果为真 |
in | a in (a1, a2…) | 假设a在a1,或a2…其中的某一个值中,结果为真 |
3.7、联表查询
举个例子
-- 左连接
select a.id, a.name from tablea as a left JOIN tableb as b on a.id = b.id;
-- 右连接
select b.id, b.name from tablea as a right JOIN tableb as b on a.id = b.id;
-- 内连接
select a.id, a.name from tablea a INNER JOIN tableb b on a.id = b.id;
-- 特殊左连接
select a.id, a.name from tablea as a left JOIN tableb b on a.id = b.id where b.id is null;
-- 特殊右连接
select b.id, b.name from tablea a right JOIN tableb b on a.id = b.id where a.id is null;
-- 全连接
select a.id, a.name from tablea a left join tableb b on a.id = b.id union
select b.id, b.name from tablea a right join tableb b on a.id = b.id;
-- 显示两个表独有的数据
select a.id, a.name from tablea as a left JOIN tableb b on a.id = b.id where b.id is null union
select b.id, b.name from tablea a right JOIN tableb b on a.id = b.id where a.id is null;
3.8、自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表
也就是说相当于我们用一张表存下了一个上下级关系,如果要查上级的话,where pid = 1,就可以查出来了,如果查对应的下级的话,根据上级的categoryid = pid去查找下级即可
3.9、分页和排序
排序
分页
3.10、子查询和嵌套查询
本质:在where语句中嵌套一个子查询
链表查询和子查询都可以使用,看你怎么搞了
3.11、MySQL常用函数
函数名称 | 作用 |
---|---|
ABS | 绝对值 |
SQRT | 求二次方根 |
MOD | 求余 |
LENGTH | 计算字符串长度,返回字符串字节长度 |
LOWER | 将字符串中的字母变成小写 |
UPPER | 将字符串中的字母变成大写 |
SUBSTRING | 截取字符串,返回从指定位置开始的指定长度的字符串 |
REVERSE | 字符串反转 |
CURDATE / CURRENT_DATE | 返回当前系统的日期值 |
CURTIME / CURRENT_TIME | 返回当前系统的时间值 |
NOW / SYSDATE | 返回当前系统的日期和时间值 |
MONTH | 获取指定日期中的月份 |
YEAR | 获取年份 |
MAX | 查询指定列最大值 |
MIN | 查询指定列最小值 |
COUNT | 统计查询结果的行数 |
SUM | 求和 |
AVG | 求平均值,返回指定列数据的平均值 |
4、MySql的事务
4.1、什么是事务
要么都成功,要么都失败,将一组SQL放在一个批次中去执行
事务原则:ACID原则,原子性、一致性、隔离性、持久性 ;(脏读、幻读)
-
原子性:是指一个事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
-
一致性:事务前后数据的完整性必须保持一致
-
隔离性:事务的隔离性是多个用户并发访问的时候,数据库为每一个用户开启的事务,不能被其他事务的数据所干扰,多个并发事务之间要相互隔离
-
持久性:指一个事务一旦被提交,它对数据库中数据就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响(事务一旦提交就不可逆了)
脏读、不可重复读和幻读
- 脏读:指一个事务读取了另外一个事务未提交的数据
- 不可重复读:在一个事务中读取表中的某一行数据,多次读取结果不同(这个不一定是错的,知识某些场合不对)
- 幻读:指的是一个事务读取到了别的事务插入的数据,导致前后数据不一致
4.2、事务常用命令
命令 | 作用 |
---|---|
set autocommit = 0; | 关闭事务自动提交 |
set autocommit = 1; | 开启事务自动提交(默认开启) |
start transaction | 标记一个事务的开始,从这个之后的sql都在同一个事务下 |
commit | 手动提交 |
rollback | 回滚到原来的样子 |
savepoint 保存点名 | 设置一个事务的保存点,这个可以和rollback联合使用,当事务失败的时候,rollback to savepoint 保存点名 即可 |
RELEASE SAVEPOINT ·保存点名· | 删除保存点 |
案例
5、索引
MySQL官方对索引的定义为:索引(index)是帮助MySql高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构
5.1、索引的分类
在一个表中,主键索引只能有一个,唯一索引可以有多个
- 主键索引(PRIMAY KEY)
- 唯一的标识,主键不可重复,只能有一个列作为主键
- 唯一索引(UNION KEY)
- 避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引
- 常规索引(KEY/INDEX)
- 默认的,index。key关键字来设置
- 全文索引(FULLTEXT)
- 在特点的数据库引擎下才有,MyISAM
- 快速定位数据
5.2、索引原则
- 索引不是越多越好
- 不要对进程变动数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
索引的数据结构
Hash类型的索引
Btree:InnoDB的默认数据结构
6、三大范式
为什么需要数据规范化
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效的信息
6.1、第一范式
要求数据库表的每一列都是不可分割的原子数据项
6.2、第二范式
满足第一范式,每张表只描述一件事情
6.3、第三范式
满足第一、第二范式,第三范式需要确保数据表中的每一列数据和主键直接相关,而不能间接相关
规范性 和 性能的问题
关联查询的表不得超过三张
- 考虑商业化的需求和目标(成本、用户体验),数据库的性能更加重要
- 在规范性能的问题的时候,需要适当考虑一下规范性
- 故意给某些表增加一些冗余的字段(从多表查询变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询;增加索引)