Java(MySQL01)
参考视频:MySQL最新教程通俗易懂(狂神)
参考文档:https://gitee.com/zhayuyao/java-notes/blob/master/md%E6%96%87%E6%A1%A3/%E7%8B%82%E7%A5%9E%E8%AF%B4java/03.MySql/MySQL%E5%9F%BA%E7%A1%80.md#22%E5%88%86%E9%A1%B5%E5%92%8C%E6%8E%92%E5%BA%8F
1. 初识MySQL
- JavaEE:企业级java开发 主要Web
- 前端(页面:展示,数据!)
- 后台(连接点:连接数据库JDBC,链接前端(控制:控制视图跳转,和给前端传递数据))
- 数据库(存数据,Txt,Excel,Word…)
- 只会写代码,学好数据库,基本混饭吃!
- 学好操作系统,数据结构与算法!当一个不错的程序猿!
- (离散数学,数字电路,体系结构,编译原理)+实战经验 = 高级程序员(优秀的程序猿)
1.1 为什么要学习数据库
- 岗位需求
- 现在的世界,是大数据时代,得数据者得天下。
- 被迫需求:存数据
- 数据库是所有软件体系中最核心的存在 DBA
1.2 什么是数据库
- 数据库(DB,DataBase)
- 概念:数据仓库,软件,安装在操作系统(windows、linux、mac…)之上!SQL,可以存储大量的数据。500W!
- 作用:存储数据,管理数据
1.3 数据库分类
-
关系型数据库: (SQL)
- MySQL、Oracle、Sql Server、DB2、SQLLite
- 通过表和表之间,行和列之间的关系进行数据的存储
-
非关系型数据库: (NoSQL)Not Only SQL
- Redis、MongoDB
- 非关系型数据库,对象存储,通过对象的自身的属性来决定。
DBMS(数据库管理系统)
- 数据库的管理软件,科学有效地管理我们的数据。维护和获取数据。
- MySQL、数据库管理系统!
1.4 MySQL简介
-
MySQL是一个关系型数据库管理系统
-
前世:由瑞典MySQL AB 公司开发,
-
今生:属于 Oracle 旗下产品。
-
MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
-
开源的数据库软件。
-
体积小,速度快,总体拥有成本低,招人成本比较低,所有人必须会。
-
中小型网站甚至大型网站都用,集群!
-
官网:https://www.mysql.com/cn/
-
版本:
- 5.7 老版本比较稳定
- 8.x 新版本
1.5 安装MySQL
- 教程:https://gitee.com/zhayuyao/java-notes/blob/master/md%E6%96%87%E6%A1%A3/%E7%8B%82%E7%A5%9E%E8%AF%B4java/03.MySql/MySQL%E5%9F%BA%E7%A1%80.md
-
解压
-
把这个包放到自己电脑的环境目录下
-
配置环境变量:修改系统变量Path即可
-
新建mysql配置文件 .ini
[mysqld]
# 目录要换成自己的
basedir=H:\Environment\mysql-5.7.38\
datadir=H:\Environment\mysql-5.7.38\data\
port=3306
skip-grant-tables
-
启动管理员模式下的CMD,运行所有的命令。
-
安装mysql服务
-
初始化数据库文件
-
启动mysql,进去修改密码。
-
通过命令行进入mysql,
mysql -uroot -p123456
,-p后面不要加空格,修改密码(sql语句后面一定要加分号!) -
注释掉 ini 中的跳过密码
-
重启mysql。连接测试,如果连接成功就OK。
-
问题:
- 缺少组件.dll
- 命令输出有误
-
sc delete mysql,清空服务(不要轻易使用)
1.6 安装SQLyog
- 安装
- 注册
- 打开连接数据库
- 新建一个数据库 school
- 每一个sqlyog的执行操作,本质就是对应了一个sql,可以在软件的历史记录中查看。
- 新建一张表 student
字段:id,name,age,
- 查看表
- 自己尝试添加多条记录
1.7 连接数据库
- 命令行连接!
mysql -uroot -p123456 --连接数据库
update mysql.user set authentication_string=password('123456') where user='root' and host='localhost'; --修改用户密码
flush privileges; --刷新权限
--------------------------------------------------
--所有语句用;结尾
show databases; --查看所有的数据库
mysql> use school; --切换数据库 user 数据库名
Database changed
--
show tables; --查看数据库中所有的表
describe student; --显示数据库中所有的表的信息
create database westos; --创建一个数据库
exit; --退出连接
--单行注释(SQL的本来的注释)
/*(SQL的多行注释)
hello
*/
- 数据库 xxx 语言 CRUD增删改查! CV程序员 API程序员 CRUD程序员!(业务程序员!)
- DDL 定义
- DML 操作
- DQL 查询
- DCL 控制
2. 操作数据库
操作数据库 > 操作数据库中的表 > 操作数据库中的表的数据
2.1 操作数据库 (了解)
- 创建数据库
CREATE DATABASE IF NOT EXISTS westos;
- 删除数据库
DROP DATABASE IF EXISTS westos;
- 使用数据库
-- tab键的上面,如果你的表名或者字段名是一个特殊字符,就需要带``
USE `school`;
- 查看数据库
SHOW DATABASES; -- 查看所有的数据库
- 对比:SQLyog的可视化操作
- 学习思路:
- 对照 sqlyog 可视化历史记录查看sql
- 固定的语法或关键字必须要强行记住!
2.2 数据库表的列类型
- 数值
类型 | 描述 | 占用字节 | 备注 |
---|---|---|---|
tinyint | 十分小的数据 | 1个字节 | |
smallint | 较小的数据 | 2个字节 | |
mediumint | 中等大小的数据 | 3个字节 | |
int | 标准的整数 | 4个字节 | 常用的 int |
bigint | 较大的数据 | 8个字节 | |
float | 浮点数 | 4个字节 | |
double | 浮点数 | 8个字节 | 精度问题! |
decimal | 字符串形式的浮点数 | 金融计算的时候,一般是使用decimal |
- 字符串
类型 | 描述 | 占用字节 | 备注 |
---|---|---|---|
char | 字符串(固定大小的) | 0~255 | |
varchar | 可变字符串 | 0~65535 | 常用的变量 String |
tinytext | 微型文本 | 2^8-1 | |
text | 文本串 | 2^16-1 | 保存大文本 |
- 时间日期
java.util.Date
类型 | 描述 | 备注 |
---|---|---|
date | YYYY-MM-DD | 日期格式 |
time | HH:mm:ss | 时间格式 |
datetime | YYYY-MM-DD HH:mm:ss | 最常用的时间格式 |
timestamp | 时间戳:1970.1.1到现在的毫秒数! | 也较为常用 |
year | 年份表示 |
- null
- 没有值,未知
- 注意:不要使用NULL进行运算,结果必定是NULL
2.3 数据库表的字段属性(重点)
- Unsigned:
- 代表是无符号的整数
- 声明了该列不能为负数
- zerofill:
- 以0填充的
- 不足的位数,使用0填充,
- int(3),5 -> 005
- 自增:
- 通常理解为自增,自动在上一条记录的基础上+1(默认)
- 通常用来设置唯一的主键。而且必须是整数类型。类似index。
- 可以自定义设置主键自增的起始值和步长。
- 非空: NULL、not null
- 设置为 not null,如果不给它赋值,就会报错
- 设置为 NULL,如果不填,默认为null
- 默认:
- 设置默认的值!
- sex,默认值为 男,如果不指定该列的值,就会有默认的值。
- 拓展:
- 暂时不用:
/*每一个表,都必须存在以下五个字段!未来做项目用的,表示一个记录存在意义。
id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
*/
- int类型数据的长度设置实际上并非是设置数据的范围,而是最大显示宽度。
- https://blog.csdn.net/YAruli/article/details/79187814
2.4 创建数据库表(重点)
-- 目标:创建一个school数据库
-- 创建学生表(列,字段) 使用SQL创建
-- 学号int; 登录密码varchar(20); 姓名、性别varchar(2); 出生日期(datatime); 家庭住址; email;
-- 注意点:使用英文的(),表的名称 和 字段 尽量使用 `` 反单引号
-- AUTO INCREAMENT 自增
-- 字符串使用 ''单引号括起来!
-- 所有的语句后面加,(英文的),最后一个不加
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL 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
- 格式
CREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
... ...
`字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]
- 常用命令
SHOW CREATE DATABASE school; -- 查看创建数据库的语句
SHOW CREATE TABLE student; -- 查看student数据表的定义语句
DESC student; -- 显示表的结构
2.5 数据表的类型
-- 关于数据库引擎
/*
INNODB 默认使用的
MYISAM 早些年使用的
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为2倍 |
- 常规使用操作:
- MYISAM: 节约空间,速度较快。
- INNODB: 安全性高,事务的处理,多表多用户操作。
在物理空间存在的位置:
- 所有的数据库文件都存在data目录下。
- 本质还是文件的存储!
- MySQL引擎在物理文件上的区别:
- innoDB 在数据库表中只有一个
*.frm
文件,以及上级目录下的 ibdata1 文件。 - MYISAM 对应文件
*.frm
表结构的定义文件*.MYD
数据文件(data)*.MYI
索引文件(index)
- innoDB 在数据库表中只有一个
设置数据库表的字符集编码:
CHARSET=utf8
- 如果不设置,会有mysql默认的字符集编码(且不支持中文)。
- MySQL的默认编码是Latin1,不支持中文。
- 可以在my.ini中配置默认的编码(不建议)。
character-set-server=utf8
2.6 修改和删除表
- 修改
-- 修改表名: ALTER TABLE 旧表名 RENAME AS 新表名;
ALTER TABLE teacher RENAME AS teacher1;
-- 增加表的字段: ALTER TABLE 表名 ADD 字段名 列属性();
ALTER TABLE teacher1 ADD age INT(11);
-- 修改表的字段(重命名,修改约束!)
-- ALTER TABLE 表名 MODIFY 字段名 列属性();
ALTER TABLE teacher1 MODIFY age VARCHAR(11); -- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性();
ALTER TABLE teacher1 CHANGE age age1 INT(1); -- 字段重命名
-- 删除表的字段: ALTER TABLE 表名 DROP 字段名;
ALTER TABLE teacher1 DROP age1;
- 删除
-- 删除表(如果表存在,再删除)
DROP TABLE IF EXISTS teacher1;
-
所有的创建和删除操作尽量加上判断
IF EXISTS
,以免报错。 -
注意点:
- 字段名用反单引号
``
包裹。 - 注释用
--
或者/**/
。 - sql关键字大小写不敏感,建议小写。
- 所有的符号全部用英文。
- 字段名用反单引号
3. MySQL数据管理
3.1 外键(了解即可)
- 方式一
- 在创建表的时候,增加约束(麻烦,比较复杂)。
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;
-- 学生表的 gradeid 字段 要去引用年级表的gradeid
-- 定义外键key
-- 给这个外键添加约束(执行引用) references 引用
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL 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 '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`),
KEY `FK_gradeid`(`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
- 删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)。
- 方式二
- 创建表成功后,添加外键约束。
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;
-- 学生表的 gradeid 字段 要去引用年级表的gradeid
-- 定义外键key
-- 给这个外键添加约束(执行引用) references 引用
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL 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 '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
-- alter table 表 add constraint 约束名 foreign key(作为外键的列) references 哪个表(哪个字段)
- 以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,这里了解即可)
- 最佳实践:
- 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)。
- 我们想使用多张表的数据,想使用外键,应该通过程序去实现。
3.2 DML语言(全部记住)
- 数据库意义: 数据存储,数据管理
- DML 语言: 数据操作语言
- insert
- update
- delete
3.3 添加
- insert
-- 插入语句(添加)
-- insert into 表名([字段1,字段2,字段3]) values('值1'),('值2'),('值3');
INSERT INTO `grade`(`gradename`) VALUES('大四');
-- 由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
INSERT INTO `grade` VALUES('大三');
-- 一般写插入语句,我们一定要数据和字段一一对应!
-- 插入多个字段
INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一');
INSERT INTO `student`(`name`) VALUES('张三');
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES('张三','aaaaaa','男');
INSERT INTO `student`(`name`,`pwd`,`sex`)
VALUES('李四','aaaaaa','男'),('王五','aaaaaa','男');
- 语法:
insert into 表名([字段1,字段2,字段3]) values('值1'),('值2'),('值3');
- 注意事项:
- 字段和字段之间使用 英文逗号 隔开。
- 字段是可以省略的,但是后面的值必须要一一对应,不能少。
- 可以同时插入多条数据,VALUES后面的值,需要使用
,
隔开。VALUES(),(),...;
3.4 修改
- update
- 修改谁 (条件) set 原来的值 = 新值
-- 修改学员名字,带了条件
UPDATE `student` SET `name` = '狂神' WHERE id =1;
-- 不指定条件下,会改动所有的表!(跑路)
UPDATE `student` SET `name` = '长江7号';
-- 修改多个属性,逗号隔开
UPDATE `student` SET `name` = '狂神', `email` = '24736743@qq.com' WHERE id = 1;
-- 语法:
-- UPDATE 表名 set colnum_name = value,[colnum_name = value,...] where [条件];
- 条件:where子句 运算符 id等于某个值/大于某个值/在某个区间内修改…
- 操作符会返回 布尔值
操作符 | 含义 | 使用 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或 != | 不等于 | 5<>6 | true |
> | |||
< | |||
>= | |||
<= | |||
BETWEEN … AND … | 在某个范围内 | [2,5] | |
AND | 我和你,&& | 5>1 and 1>2 | false |
OR | 我或你,|| | 5>1 or 1>2 | true |
-- 通过多个条件定位数据
UPDATE `student` SET `name`='长江7号' WHERE `name`='狂神44' AND sex = '女';
- 语法:
update 表名 set colnum_name = value,[colnum_name = value,...] where [条件];
- 注意:
- colnum_name 是数据库的列,尽量带上
``
- 条件,筛选的条件,如果没有指定,则会修改所有的列
- value,可以是一个具体的值,也可以是一个变量
- 多个设置的属性之间,使用英文逗号隔开
- colnum_name 是数据库的列,尽量带上
UPDATE `student` SET `birthday`=CURRENT_TIME WHERE `name`='长江7号' AND sex = '女';
3.5 删除
- delete 命令:
- 语法:
delete from 表名 [where 条件];
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`;
-- 删除指定数据
DELETE FROM `student` WHERE id = 1;
- truncate 命令:
- 作用:完全清空一个数据库表,表的结构和索引约束不会变!
-- 清空student表
TRUNCATE `student`;
- delete和truncate的区别:
- 相同点:都能删除数据,且不会删除表结构
- 不同点:
- truncate 重新设置自增列,计数器会归零。
- truncate 不会影响事务。
-- 测试delete和truncate的区别
CREATE TABLE `test`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3');
DELETE FROM `test`; -- 不会影响自增
TRUNCATE TABLE `test`; -- 自增会归零
- 了解即可:delete删除的问题,重启数据库,有个现象:
- innoDB:自增列会从1开始(存储在内存中,断电即失)
- MyISAM:继续从上一个自增量开始(存储在文件中,不会丢失)