MySQL复习

文章目录

  • 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,默认值为男,如果不指定该列的值,就会自动填入默认值

MySQL复习_第1张图片

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语言:数据库操作语言

  1. 添加
  2. 修改
  3. 删除

2.3、添加

MySQL复习_第2张图片

  • 注意事项
  1. 字段和字段之间使用英文逗号隔开
  2. 字段是可以省略的,但是后面的值必须要一一对应
  3. 可以同时插入多条数据,VALUES后面的值,需要使用,隔开即可

2.4、修改

MySQL复习_第3张图片

操作符 含义 范围 结果
= 等于 5=6 false
<> 或 != 不等于 5<>6 true
<
>
<=
>=
between … and … 在某个范围里面 [2,5]
and 我和你&& 5> 1 and 1>2 false
or 我或你 || 5>1 or 1>2 true

注意

在这里插入图片描述

  1. colnum_name是数据库的列,尽量带上``
  2. 条件,筛选的的条件,如果没有指定,则会修改所有的列
  3. value是一个具体的值,也可以是一个变量
  4. 多个设置的的属性之间,使用英文逗号隔开

2.5、删除

MySQL复习_第4张图片

这个之前不知道:Truncate作用:清空表中的数据,表的结构和索引约束不会变

delete 和 truncate 区别

  • 相同点:都能删除数据,都不会删除表的结构
  • 不同:
    • Truncate 重新设置 自增列 ,计数器会归零
    • Truncate 不会影响事务

了解即可:Delete删除后,重启数据库的现象

  • InnoDB:自增列会从1开始(存在内存当中的,断点既失)
  • MyISAM:继续从上一个自增量开始(存在文件中的,不会丢失)

3、DQL查询数据

3.1、DQL

(Data Query LANGUAGE):数据查询语言

  • 所有的查询操作都用它 Select
  • 简单的查询,复杂的查询它都能做
  • 数据库中最核心的语言,最重要的语句
  • 使用频率最高的语句

3.2、查询指定的字段

MySQL复习_第5张图片

3.3、去重distinct

作用:取出select查询出来的结果中重复的数据,只显示一条
MySQL复习_第6张图片

3.4、数据库的列(表达式)

MySQL复习_第7张图片
数据库中的表达式:文本值、列、null、函数、计算表达式、系统变量…

3.5、Where条件子句

作用检索数据中符合条件的值

搜索的条件由一个或多个表达式组成,结果是布尔值
MySQL复习_第8张图片
MySQL复习_第9张图片

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…其中的某一个值中,结果为真

MySQL复习_第10张图片
MySQL复习_第11张图片

3.7、联表查询

MySQL复习_第12张图片
MySQL复习_第13张图片

举个例子

MySQL复习_第14张图片
MySQL复习_第15张图片

-- 左连接
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;

MySQL复习_第16张图片

3.8、自连接

自己的表和自己的表连接,核心:一张表拆为两张一样的表

MySQL复习_第17张图片

MySQL复习_第18张图片

也就是说相当于我们用一张表存下了一个上下级关系,如果要查上级的话,where pid = 1,就可以查出来了,如果查对应的下级的话,根据上级的categoryid = pid去查找下级即可

3.9、分页和排序

排序

MySQL复习_第19张图片

分页

MySQL复习_第20张图片

3.10、子查询和嵌套查询


本质:在where语句中嵌套一个子查询

MySQL复习_第21张图片
MySQL复习_第22张图片

链表查询和子查询都可以使用,看你怎么搞了

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原则,原子性、一致性、隔离性、持久性 ;(脏读、幻读)

  • 原子性:是指一个事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

  • 一致性:事务前后数据的完整性必须保持一致

  • 隔离性:事务的隔离性是多个用户并发访问的时候,数据库为每一个用户开启的事务,不能被其他事务的数据所干扰,多个并发事务之间要相互隔离

  • 持久性:指一个事务一旦被提交,它对数据库中数据就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响(事务一旦提交就不可逆了)

脏读、不可重复读和幻读

  • 脏读:指一个事务读取了另外一个事务未提交的数据
    MySQL复习_第23张图片
  • 不可重复读:在一个事务中读取表中的某一行数据,多次读取结果不同(这个不一定是错的,知识某些场合不对)
    MySQL复习_第24张图片
  • 幻读:指的是一个事务读取到了别的事务插入的数据,导致前后数据不一致

4.2、事务常用命令

命令 作用
set autocommit = 0; 关闭事务自动提交
set autocommit = 1; 开启事务自动提交(默认开启)
start transaction 标记一个事务的开始,从这个之后的sql都在同一个事务下
commit 手动提交
rollback 回滚到原来的样子
savepoint 保存点名 设置一个事务的保存点,这个可以和rollback联合使用,当事务失败的时候,rollback to savepoint 保存点名 即可
RELEASE SAVEPOINT ·保存点名· 删除保存点

MySQL复习_第25张图片

案例

MySQL复习_第26张图片

5、索引

       MySQL官方对索引的定义为:索引(index)是帮助MySql高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构

5.1、索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个

  • 主键索引(PRIMAY KEY)
    • 唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引(UNION KEY)
    • 避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引
  • 常规索引(KEY/INDEX)
    • 默认的,index。key关键字来设置
  • 全文索引(FULLTEXT)
    • 在特点的数据库引擎下才有,MyISAM
    • 快速定位数据

5.2、索引原则

  • 索引不是越多越好
  • 不要对进程变动数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

索引的数据结构
Hash类型的索引
Btree:InnoDB的默认数据结构

6、三大范式

为什么需要数据规范化

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效的信息

6.1、第一范式


要求数据库表的每一列都是不可分割的原子数据项

MySQL复习_第27张图片

6.2、第二范式


满足第一范式,每张表只描述一件事情

MySQL复习_第28张图片

6.3、第三范式


满足第一、第二范式,第三范式需要确保数据表中的每一列数据和主键直接相关,而不能间接相关

MySQL复习_第29张图片


规范性 和 性能的问题
    关联查询的表不得超过三张

  • 考虑商业化的需求和目标(成本、用户体验),数据库的性能更加重要
  • 在规范性能的问题的时候,需要适当考虑一下规范性
  • 故意给某些表增加一些冗余的字段(从多表查询变为单表查询)
  • 故意增加一些计算列(从大数据量降低为小数据量的查询;增加索引)

你可能感兴趣的:(分享,mysql,数据库,java)