转到2021.1.9-2021.1.31的learning record 首页
2020-1-26-今日工作:
上午的时间还可以。中午的时间把握不行哈,明天下午增加学习时间。晚上也没学多少。也就上午的时间利用的好一点。
把昨天学习的“秒杀”项目进行了重新配置学习。还是挺需要重新学习的。看一遍视频记不住。“秒杀”项目进度慢是有原因的:在数据库连接池上卡住了。一些配置需要搜博客进行学习。代码需要一个一个的敲。
发现需要阿里云的Druid,数据库连接池,这样自己去学习Mysql,Mysql这个视频只学了一部分。做项目嘛,需要的技术肯定多一些啦。重复多看几遍肯定有好处啦。
今天一本新书到了,我估计我是看不完那本书,太厚了,以后少买。。。
晚安,困了。
2021-1-26
1.7 连接数据库
win+r–>cmd–>net start mysql 去启动服务
在这里需要先去启动sql【net start mysql 去启动服务】,再去连接。
net stop mysql 去停止服务,
net start mysql 去启动服务,
mysql -uroot -p123456 --连接数据库,密码是 123456
flush privileges; --刷新权限。平时不用。
-----所有的语句使用分号;结尾。
-- 在 win+r 命令行界面中去使用。
show databases; -- 查看所有的表 需要加上分号哦。语句以分号结尾。
use school;-- 使用数据库。切换一张表。切换数据库。输出Database changed
show tables; -- 查看显示该数据库所有的表。
describe student; -- 显示数据库中所有表的信息。
create database westos; --创建一个数据库
show databases; -- 查看所有的表 需要加上分号哦。语句以分号结尾。这里会出现一个 westos 的新数据库。
use westos;-- 使用数据库。切换一张表。切换数据库。输出Database changed。数据库变更。
show tables; -- 查看显示该数据库所有的表。输出为空。Empty set。
-- 刷新一下SQLyog的软件,发现会新建了一个 westos 的新数据库。
exit;--退出连接 输出Bye
CREATE DATABASE `school`CHARACTER SET utf8 COLLATE utf8_general_ci; -- 创建数据库
-- 这是sql的单行注释
/*
这是sql的多行注释
*/
DDL 数据库定义语言数据库XXX语言
DML 操作语言
DQL 查询语言
DCL 控制语言
数据库XXX语言:
程序员的等级:CRUD业务操作,CV程序员,API程序员
CREATE DATABASE
school
CHARACTER SET utf8 COLLATE utf8_general_ci;选择utf8 和utf8_general_ci
2 操作数据库
操作数据库,操作数据库中的表,操作数据库中的数据
2.1 操作数据库(了解)
- 关键字需要背
- 数据库貌似不区分大小写。
-- 创建数据库。CREATE DATABASE IF NOT EXISTS 数据库名字
CREATE DATABASE IF NOT EXISTS westos;
-- 删除数据库,删除后点击刷新按钮,发现 westos 数据库被删除了。
DROP DATABASE IF EXISTS westos;
-- ` 是tab键上面的特殊字符,当出现关键字和名字相同的时候使用。如果表名或者字段名是一个特殊字符,那么使用`表名`,把它变成一个字段名称。
-- use 是切换数据库。
USE `school`;
- 学习思路,通过sqlyog可视化历史记录查看。
- 固定的语法或对话要强制记住。
【7、列的数据类型讲解】
2.2 数据库的列类型
数据类型:
· tinyint:十分小的数据,1个字节
· smallint:较小的数据,2个字节
· mediumint:中等大小的数据,3个字节
· int:标准的整数,4个字节
· bigint:大数据,8个字节
· float:浮点数,4个字节。和int一样。
· double:双精度的浮点数。8个字节
· deciaml:字符串形式的浮点数,银行,金融计算的时候去使用**[ˈdesɪml]**。float可能造成精度丢失,转为字符串格式就可以保证不丢失精度啦。
因为在建表时,我价格字段就用的DECIMAL,之前用的float,
提问:为什么不用float?
回答:float,double等非标准类型,在数据库中保存的是近似值,而DECIMAL是以字符串的形式保存数值。打个比方,我存的是整数的时候,他就整数给我处理了,(举一反三??)我存0.00给我实际存个0,我存14.00实际给我存个14,是都可以存浮点数,但是涉及到钱,金额这方面还是给我精准着来。
DECIMAL(M,D)
a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。
b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。
也就是说,M就是总长度,D就是小数点后面的长度。比如:
DECIMAL(5,4)=>总长度不超过5位数字,并且小数点后头必须要4位数字:1.2345
DECIMAL(14,9)=>总长度不超过14位数字,整数5位,小数点后9位:12345.123456789
字符串:
· char:固定字符串大小,0-255。不常用
· varchar:可变字符串,2^16 - 1,【0-65535】,常用
· tinytext:较小的文本。微型文本。2^8-1的大小。
· **text:****文本串,**2^16 - 1 保存大文本。
时间类型:
· date:YYYY-MM-DD,日期格式
· time:HH:mm:ss,时间格式
· datetime:YYYY-MM-DD HH:mm:ss 最常用的时间格式
· timestamp:时间戳,1970.1.1至今的毫秒数。这一个是全球唯一的。也较为常用
· year 年份表示
· null:代表没有值,注意是不要使用null进行运算,用null计算结果没有意义。因为结果为null。
2.3 数据库的字段属性(重点)
【第8节课】【8、数据库的字段属性】
Unsigned:
· 无符号的整数,声明了该列不能为负数。限定该列的内容。
Zerofill:
· 0填充,不足的位数,使用0来填充。比如int是三位的,int(5)就是005。
自增:
· 自动在上一条记录的基础上+1
· ⭐通常用来设计唯一的主键,并且必须为整数类型。
· 可以在“高级”中更改每次自增的位数
非空:not null
· not null:对于列内容的条件限制。 如果不给他赋值就会报错
· null:如果不写值,就是null值
默认:
· 设置列的默认内容。如果字段是sex,“默认”为男,就是不写就是男
实际进行操作
CREATE DATABASE
school
CHARACTER SET utf8 COLLATE utf8_general_ci;选择utf8 和utf8_general_ci
点到表之后,右击选择 改变表,
拓展:每一个表都必须有的字段:== (听听就好) ==
/* 每一个表,都必须存在以下5个字段。这个是未来做项目用的,表示一个记录存在的意义。保证它的健壮性和安全性。
id :主键
version:乐观锁
is_delete:伪删除。管理员可以看被删除的东西。
gmt_create:创建时间
gmt_update:修改时间
*/
【9、创建数据库表】
问答时间
https://blog.csdn.net/yaruli/article/details/79187814 这里回答了一个问题
1):int类型,对吧,经常像保存个时间戳啊、id啊、数量啊、排序啊都会用到
提问:INT(11)是什么意思?最大保存十一位数么?
回答:不是楞个回事,听我给你摆,首先长度,也就是INT(M),M指示最大显示宽度,不是说限制你只能插入规定长度的数据,如果不信你试一下:INT(1),你可以插数字1,也可以插100,1000。那到底是撒子意思耶?MySQL手册上头说的清清楚楚:
M指示最大显示宽度,最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关
说白了就是你设定最大宽度,插入的数据不够大,就从填充0,给你填满,够大就随便你,不得管你。这下就很通透了撒,哈哈~(但是强烈建议合理分配,过大过小都不好)
2):VARCHAR和CHAR 类型,先VARCHAR,经常用的比如用户名之类可变长度,那就说用户名吧
提问:你说这个用户名,VARCHAR(20)是撒子意思噢?(当然自己把握,没说必须20),这是规定长度了吧?用没得限制哦?汉字英文都是一样的迈?
回答:对头,就是可变长度,你阔以叫渣渣辉,也阔以叫乌木喂喂威 恩耶吞温威 乌温穆扁 欧萨斯,20个字符以内都阔以
然后说CHAR,也就是固定长度了,比如密码,常见的MD5加密,就是CHAR(32)对吧,多了少了都不行。
他们俩的区别就是一个可变长度一个固定长度,长度的区别CHAR是0-255,VARCHAR最大长度不固定(64K?反正一般文本够用),存在像字符集不同会受影响之类的因素,感兴趣可以自己去查查,我……晓得撒(懒)。
大文本可以考虑TEXT,都是字符串类型的,最大到4G。
2.4 创建数据库表
表的名称和字段,尽量使用``括起来
---目标:创建一个schoo1数据库
--创建学生表(列,字段) 使用SQL创建
--学号int登录密码varchar (20)姓名,性别varchar (2) ,出生日期(datatime) ,家庭住址, emai1
---注意点,使用英文() ,表的名称和字段尽量使用``括起来
-- AUTO_INCREMENT 自增字符串使用单引号括起来!所有的语句后面加, (英文的逗号) ,最后一个不用加
--PRIMARY KEY主键,一般一个表只有一个唯一的主键!
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号', -- 自增(AUTO_INCREMENT) 注释(comment)
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) 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
-- 注意PRIMARY KEY (`id`)后需要跟()
背诵创建的格式:
CREATE TABLE IF NOT EXISTS `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
......
`字段名` 列类型 [属性] [索引] [注释],
主键
)[表的类型][字符集设置][注释]
ENGINE = INNODB DEFAULT CHARSET =utf8
--ENGINE = INNODB 数据库引擎
-- 查看创建数据库的语句
SHOW CREATE DATABASE `school`;
-- 查看创建表的语句。这个执行的话,好像就是自己写的语句。
SHOW CREATE TABLE `student`;
-- 查看表的结构
DESC `student`;
2.5 数据表的类型
这里是对ENGINE=INNODB DEFAULT CHARSET=utf8的解释:
MYISAM | INNODB | |
---|---|---|
事物支持 | 不支持 | 支持 |
数据行锁定 | 不支持 (它只支持表锁) | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为MYISAM2倍 |
什么是事务?事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。
程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元)
数据行锁定:加锁,跳过,不执行操作。
MYISAM:节约空间,速度较快
INNODB:安全性较高。【现在来说,安全性很重要啊】支持事物的处理,支持多表多用户操作。
在物理空间下的区别:所有的文件都在data目录下,一个文件夹就对应一个数据库。本质上还是文件的存储。
INNODB:在数据库中,只有一个*.frm文件,以及上级目录下的ibata1文件。INNODB是默认的存储类型。
MYISAM:3种类型的文件
- *.frm:表结构的定义文件
- *.MYD:数据文件(data)
- *.MYI:索引文件(index)
- 设置数据库表的字符集编码:CHARSET=utf8
1.不设置的话,会是mysql默认的字符集编码Latin1(不支持中文)
2.可以在my.ini中配置默认的编码。路径:D:\Program Files\mysql-5.7.19-winx64的my.ini。一般如果换电脑,所以还是设置CHARSET=utf8。
character-set-server=utf8
2.6 修改和删除表
--ALTER TABLE `旧名` RENAME AS `新名`
ALTER TABLE `student1` RENAME AS `student2` -- 修改表的名称
ALTER TABLE `student2` ADD age INT(11) -- 增加表的字段
ALTER TABLE `student2` MODIFY age VARCHAR(11)-- 修改表的字段之修改约束-- modify修改约束
ALTER TABLE `student2` CHANGE age age1 INT(11)-- 修改表的字段之重命名+虽然在这里可以修改约束,但是不建议好像-- change重命名:[旧名] [新名]
ALTER TABLE `student2` DROP age1 -- 删除表的字段age1
DROP TABLE IF EXISTS `student2` -- 删除表
所有的创建和删除操作都尽量加上判断 IF EXISTS,以免报错。
注意
-
字段名使用``包裹住。字段名指的是student,teacher等这种表的名字吧。
-
注释 – /**/
-
sql大小写不敏感,推荐写小写。
[视频12.数据库级别的外键]【12、数据库级别的外键】
3 MySQL数据管理
3.1 外键(物理)【知道有就行啦 了解即可】
· 以下是物理外键(数据库级别的外键),使用麻烦,不推荐使用,了解即可。通常使用逻辑外键。
学生表的 gradeid 字段 要去引用 年级表的 gradeid。增加外键。
下面的代码执行是有先后的顺序的。先执行1,再执行2。
-- 1 queries executed, 1 success, 0 errors, 0 warnings没有错误可以执行。
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 2
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号id',
`name` VARCHAR(30) NOT NULL DEFAULT'匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT'女' COMMENT'性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
-- 这里新加入的内容
-- 学生表的gradeid字段,要去引用年级表的gradeid
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
-- 注意PRIMARY KEY (`id`)后需要跟()
PRIMARY KEY (`id`),
-- 这里新加入的内容
-- 学生表的gradeid字段,要去引用年级表的gradeid
KEY `FK_gradeid` (`gradeid`),
-- 给这个外键添加约束(执行引用) references 引用
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET =utf8
版本2 狂神公众号的
-- 创建外键的方式一 : 创建子表同时创建外键
-- 年级表 (id\年级名称)
CREATE TABLE `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 `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)
方式2:创建表成功后,添加外键约束。
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeId` FOREIGN KEY(`gradeId`) REFERENCES `grade`(`gradeId`);
ALTER TABLE `表` ADD CONSTRAINT `FK_gradeId` FOREIGN KEY(`gradeId`) REFERENCES `grade`(`gradeId`);
**以上的操作都是物理外键,数据库级别的外键,不建议使用,避免数据库过多造成困扰。**不建议使用不建议使用不建议使用不建议使用不建议使用不建议使用不建议使用不建议使用不建议使用不建议使用不建议使用
-
最佳实践:数据库就是单纯的表,只用来存储数据,只有行数据和列字段。
-
我们可以用程序来实现外键。
⭐3.2 DML语言(全背)数据库管理语言
增删改:DML语言,查:DQL语言。
· 数据库管理语言的作用和意义:数据存储,数据管理
3.3 insert插入数据
· 语法: insert into 表名 (列名1) values (数据1)
· 省略(列名)的话,后面的values必须一一对应,不能少也不能跳
-- 完成插入一个数据
INSERT INTO `grade`(gradeId,gradeName) VALUES(1,'大一');
-- 不写列名就会一一对应,不对应就会报错
INSERT INTO `grade` VALUES(2,'大二');
-- 插入多个数据:(),() 这里设置了gradeid主键自增,所以可以不写id的值。
INSERT INTO `grade`(`gradeName`) VALUES('大三'),('大四');