Mysql基础01

232 阅读4分钟

上一篇ysql基础 ← | | → 下一篇DML&DQL

关系型数据库

以关系模型来组织数据的数据库。

行+列 ==> 表 *n ==> 数据库

简单理解:表就是二维表格

市面产品代表:Mysql、Oracle、PostgreSQL

图形化产品:Sqlyog、Navicat

数据类型

整数
类型空间大小对比java数据类型
tinyint1bytebyte
smallint2byteshort
mediumint3byte特殊
intinteger4byteint
bigint8bytelong
浮点数
类型空间大小对比java数据类型
float4bytefloat单精度
double8bytedouble双精度
decimal-以字符串的形式保存浮点数
时间类型

date(yyyy-mm-dd) 、time(hh:mm:ss) 、datetime(yyyy-mm-dd hh:mm:ss)

year timestamp(时间戳1970 1.1 至今毫秒值)

字符串类型

char、varchar

tinytext(小文本)、text(大文本)、mediumtext(中等文本)

字段属性(列属性)

image-20220305163919165.png

unsigned:(无符号整数,有无符号会影响整型数值范围)
zerofill: 不足的位数使用0填充 1->00000001+
age int(10) 不是说该字段范围有10位,表示长度为10,不足0填充
autoincrement: 自增
not null: 非空
default: 设置默认值 age int(10) default 10
comment:描述 age int(10) default 10 comment '年龄'

数据库相关操作

##创建数据库
CREATE DATABASE  IF NOT EXISTS reLearnMysql
##使用(切换)数据库
USE reLearnMysql
##删除数据库
DROP DATABASE IF EXISTS reLearnMysql
##查看所有数据库
SHOW DATABASES

操作数据库表

##创建数据库表
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
`stuno` INT(10) NOT NULL COMMENT '学号',
`stuname` VARCHAR(10) DEFAULT NULL COMMENT '姓名',
`birthday` DATETIME  COMMENT '生日',
`delete` INT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除字段',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间'
##PRIMARY KEY (`id`)主键、外键都可以在此约束
)ENGINE=INNODB CHARSET=utf8
##查看当前数据库表
show tables
##查看表创建语句
show create table `student`
##查看表结构
DESC `student`
##删除表
drop table if exists tablename

对于特殊的单词比如name建议使用 ``符号包含,防止和 mysql内部字段冲突,声明数据库引擎及字符集,防止脚本在他人电脑运行不兼容

myisam 及 innodb

myisaminnodb
事务支持ny
数据锁支持锁表 不够细粒,并发能力差锁行 细粒度高,并发能力相对较好
外键ny
全文索引yn
表空间大小大 2g

mysql5.6之后同样也支持全文索引,总结:使用innodb不用myisam

以存储形式角度对比

student表单使用的innodb teacher表单使用的myisam

image-20220305172127984.png innodb

frm:表结构文件。desc tablename

ibd: 数据文件,表记录都存于此文件(创建之初就很大)

myisam:

frm:表结构文件。desc tablename
myd: myisamdata 数据文件,表记录都存于此文件(很小)
myi: myisamindex,索引信息

操作表字段(alter)

alter table tablename rename as tablenewname  --修改tablename
alter table teacher add age int(11) --添加字段
--修改字段  属性给全
alter table teache modify age varchar(11)--  修改约束
alter table teacher change age age1 int2--修改字段名 并添加字段属性
--删除字段
alter table teacher drop age

外键(FOREIGN KEY)(FK)

说明:

开发中避免在数据库层面做逻辑相关业务,包括外键级联,逻辑删除,创建时间等等。应在代码层面解决。
原因:外键级联会使得数据库读写性能差、删除主表存在附表约束
但是外键也有好处,外键保证了数据一致性。

CREATE TABLE IF NOT EXISTS `grade`(
`id` INT(5) ZEROFILL NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '年级id',
`gradename` VARCHAR(20) NOT NULL COMMENT '年级'
)ENGINE=INNODB CHARSET=utf8

CREATE TABLE IF NOT EXISTS `teacher` (
`id` INT(5) ZEROFILL NOT NULL PRIMARY KEY  COMMENT '工号',
`name` VARCHAR(20) NOT NULL COMMENT '姓名',
`gradeid` INT(5) ZEROFILL NOT NULL COMMENT '年级id',
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`id`)
)ENGINE=INNODB CHARSET=utf8
或
ALTER TABLE teacher ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`id`)

执行插入语句

INSERT INTO `grade`( `id`,`gradename`) VALUES(1,'一年级'),(2,'二年级')
INSERT INTO `teacher`( `id`,`name`,`gradeid`) VALUES(001,'张老师',1),(002,'王老师',2)
INSERT INTO `teacher`( `id`,`name`) VALUES(003,'马老师')

思考:如果说删除附表(grade)那么主表的gradeid还有意义么?mysql有没有什么机制防止这样的情况发生

测试

删除附表数据
DELETE FROM `grade` WHERE `id` = 1

结果:报错。附表与主表绑定,删除附表数据会影响数据一致性。但是如果附表数据并没有和主表绑定删除还是没有影响的。

插入第三条数据,此数据没有和主表绑定
INSERT INTO `grade`( `id`,`gradename`) VALUES(3,'三年级')
可以删除
DELETE FROM `grade` WHERE `id` = 3