文章目录
1、初识 MySQL
- JavaEE:企业级 Java 开发 Web
- 前端——数据库——后端
- 前端:页面的展示,以及数据传输
- 数据库:存数据,例如:存入 txt、Excel、word等等
- 后端:连接点,连接数据库以及前端,控制前端,实现视图跳转等,给前端传输数据
1.1 为什么学数据库
- 如今岗位需求需要
- 大数据时代
- 存取用户数据
- 数据库是所有软件体系中最为核心的存在
1.2 什么是数据库
- 数据库(DB,DataBase)
- 数据仓库,安装在操作系统上,例如:window,linux,等等
- 可以存储大量数据,500万以上就要优化
- 存储数据,管理数据
1.3 数据库的分类
1.3.1 关系型数据库(SQL)
- 通过表和表之间,行和列之间的关系进行数据的存储
- 例如:
- MySQL
- Oracle
- Sql Server
- DB2
- SQL lite
- 等等
1.3.2 非关系型数据库(Not Only SQL,NoSQL)
- 以对象存储,通过对象自身的属性来决定
- 例如:
- Redis
- MongDB
1.3.3 数据库管理系统(DBMS)(重要)
- 数据库的管理软件,科学有效的管理我们的数据,维护和获取数据
- 例如 MySQL,就是数据库管理系统
1.3.4 数据库语言
- DDL 数据库 (定义) 语言
- DML 数据库 (操作) 语言
- DQL 数据库 (查询) 语言
- DCL 数据库 (控制) 语言
1.4 MySQL 简介
https://www.mysql.com/
-
MySQL 是最好的 RDBMS(关系数据库管理系统) 应用软件之一。
-
优点:
- 开源
- 体积小、速度快
- 使用成本低
- 招人成本低
-
适用于中小型网站,大型网站(集群)
1.5 MySQL 安转
-
进入官网下载MySQL安装包(这里是压缩包的安转方式):https://downloads.mysql.com/archives/community/
-
压缩到某个文件夹下
-
配置 PATH,加一个你的 mysql安转文件下的 bin文件夹的地址
-
在 mysql 文件夹下新建一个 my.ini 文件,写入:
[mysqld] basedir=D:\JAVA\MySQL\mysql-5.7.34\ datadir=D:\JAVA\MySQL\mysql-5.7.34\data\ port=3306 skip-grant-tables
-
管理员模式下启动 cmd,将目录切换至 mysql 下的 bin 目录
-
输入mysqld -install,安转 mysql
-
输入mysqld --initialize-insecure --user=mysql,初始化数据文件
-
输入net start mysql,启动 mysql 服务
-
输入mysql -u root -p,进入 mysql(注意:不要设置密码,-p后面不要加空格)
-
进入 mysql 后,输入以下代码,修改密码
update mysql.user set authentication_string=password('root') where user='root' and Host = 'localhost';
-
再输入flush privileges;,刷新权限
-
在 my.ini 文件,删除 skip-grant-tables 这段语句
-
exit 退出 mysql
-
重启 mysql 服务
1.6 SQLyog 安装
- 下载 SQLyog 压缩包
- 安装
- SQL 简单使用
- 创建新连接
- 设置连接名(随便写),主机地址(localhost),用户密码(是MySQL的),端口(默认的都是3306)
- 连接
- 新建数据库
- 新建表
- 其中的操作都在历史记录中可以查询(SQL代码)
1.7 SQL 常用代码
1.7.1 进入mysql
-
启动 mysql 服务
net start mysql
-
从 cmd 进入 mysql
mysql -u用户名 -p密码
-
退出 mysql
exit
1.7.2 mysql 基本语句
-
更改 mysql 用户密码
update mysql.user set authentication_string=password('新密码') where user='root' and Host='localhost'
-
查看所有数据库
show databases;
-
创建数据库
create database 数据库名;
-
切换数据库
use 数据库名;
-
查看数据库中的所有
show tables;
-
查看表中的所有信息
desribe 表名;
1.7.3 注释
-
单行注释
-- 这里是单行注释
-
多行注释
/* 这里是多行注释 这里是多行注释 */
2、操作数据库
-
创建数据库
- 反引号(``),使用的表名或字段是一个特殊字符,就需要使用反引号。
CREATE DATABASE `person`; -- 增加条件判断,判断 person 如果不存在:IF NOT EXISTS CREATE DATABASE IF NOT EXISTS `person`;
-
使用数据库
USE `person`;
-
删除数据库
DROP DATABASE `person`; -- 增加条件判断,如果 person 存在:IF EXISTS DROP DATABASE IF EXISTS `person`;
-
查看所有数据库
SHOW DATABASES;
2.1 数据库的数据类型
-
数值
数据类型 字节数 tinyint 十分小的数据 1个字节 smalint 较小的数据 2个字节 mediumint 中等大小的数据 3个字节 int 标准整数 4个字节 *常用 bigint 较大的数据 8个字节 float 单精度浮点数 4个字节 double 双精度浮点数 8个字节 拥有精度问题 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 *最常用的时间格式 timestatmp 1970.1.1到现在的毫秒数 时间戳,较为常用 year 年份 -
null
- 不要使用 NULL 进行运算,结果都为 NULL
2.3数据库的字段属性(重点)
2.3.1 长度
- 有些属性是有范围的,
- 例如:字符串,需要定义长度,不然会报错
- 而 int 类型的长度是与零填充有关的,例如你的长度定义为3,1、10、100的零填充就为001、010、100
2.3.2 默认值(DEFAULT)
- 设置属性默认值,数据只要被创建,这个属性默认就是设定的这个值。
- 例如:性别设置默认值为男,只要新建的属性,默认的性别都是男
2.3.3 非空(NOT NULL)
- NULL、NOT NULL
- 设置属性不能为空,如果为空就会报错,默认为 NULL
2.3.4 Unsigned
- 无符号整数
- 声明了这个,属性就不能定义为负数
2.3.5 自增(AUTO_INCREMENT)
- 默认自增为+1
- 只要定义了属性,设置了自增的属性都会自增
2.3.6 Zerofill
- 零填充
- 例如,数据类型为 3,长度为 3 的 id 属性,当 id 为 1 时,将零填充,id 则为 001(3——>003)
2.3.7 拓展
-
阿里程序员规范手册中表明,每一个表都必须存在一下五个字段:
-
id:主键
-
`version`:乐观锁
-
is_delete:伪删除
-
gmt_create:创建时间
-
gmt_update:修改时间
-
2.4 创建数据库表
-
格式
-
以下可以选择写不写:
- IF NOT EXISTS:是否存在
- 属性
- 索引
- 注释(建议都写注释)
- 表类型
- 字符集设置
CREATE TABLE IF NOT EXISTS `表名`( '字段名' 数据类型 属性 索引 注释, '字段名' 数据类型 属性 索引 注释, ... '字段名' 数据类型 属性 索引 注释, PRIMARY KEY('字段名') )ENGINE=表类型 DEFAULT CAHRSET=字符集设置 注释
-
练习:
- 创建一个 school 数据库
- 创建一个学生表
- 学号 int,姓名 varchar(20),登录密码 varchar(20),性别 varchar(2),出生日期 datatime,家庭住址,email
CREATE DATABASE `school`; USE `school`; CREATE TABLE IF NOT EXISTS `student` ( `id` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学号', `name` VARCHAR(20) 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(30) DEFAULT NULL COMMENT '家庭住址', `email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8
注意:UNSIGNED(无符号整数)必须放在NOT NULL的前面,否则会报错!(亲测)
常用命令
-
查看数据库的创建语句
SHOW CREATE DATABASE `数据库名`;
-
查看表的定义语句
use `数据库名`; SHOW CREATE TABLE `表名`;
-
显示表的结构
DESC '表名';
2.5 数据表类型
2.5.1 INNODB 与 MYISAM 的区别
- INNODB:默认使用
- MYISAM:早些年使用
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约左边的两倍 |
- MYISAM:节约空间,速度较快
- INNODB:安全性搞,事务处理得快,多表多用户操作
2.5.2 数据表在物理空间存在的位置
- 所有的数据库文件都是存放在MySQL根目录下的 data 文件下,一个数据库对应一个文件夹(文件的存储)
- MySQL 引擎在物理存储上的区别:
- INNODB:在数据库表中,只有一个 *.frm 文件,以及上一级目录下的 ibdata1 文件
- MYISAM:
- *.frm:表结构定义文件
- *.MYD:数据文件(data)
- *.MYI:索引文件(index)
2.5.3 设置数据库表的字符集编码
-
方式一:通过建表的时候设置
- 不设置的话,是不支持中文的
CHARSET=utf8
-
方式二:修改在 MySQL 根目录下的 my.ini 配置文件(不推荐)
- 增添默认的编码
character-set-server=utf8
2.6 修改删除表
2.6.1 修改
-
重命名表名
ALTER TABLE `旧表名` RENAME AS `新表名`;
-
在表中增添字段
- 属性、索引、注释,可写可不写
ALTER TABLE `表名` ADD `字段名` 类型 属性 索引 注释;
-
修改字段数据类型
- modify:仅可以修改字段的类型和约束,不可以修改名字
ALTER TABLE `表名` MODIFY `字段名` 数据类型;
-
重命名表的字段
- chage:可以修改字段名,也可以修改字段的类型
ALTER TABLE `表名` CHANGE `旧字段名` `新字段名` 类型;
modify 与 change 的区别
- modify:只能修改表中字段的类型和约束,不可以修改字段的名字
- change:可以修改表中字段的名字与类型
2.6.2 删除
-
删除表(最好是增加条件判断,如果表存在再删除)
DROP TABLE IF EXISTS `表名`
-
删除表中的字段
ALTER TABLE `表名` DROP `字段`
2.6.3 注意
-
所有的创建和删除操作,都尽量加上判断,以免报错
-
所有的名字最好使用 反引号 包裹(``)
-
所有的标点符号都是用英文的
3、MySQL 数据管理
3.1 外键
3.1.1 方式一:创建表的时候,增加约束
- 年级表
CREATE TABLE `grade` (
`grade_id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '年级',
`name` VARCHAR(20) NOT NULL COMMENT '几年级',
PRIMARY KEY(`grade_id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
- 学生表,定义外键,增加约束
CREATE TABLE `student` (
`id` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '登录密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`grade_id` INT(5) UNSIGNED NOT NULL COMMENT '学生年级',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(30) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
KEY `FK_grade` (`grade_id`),
CONSTRAINT `FK_grade` FOREIGN KEY (`grade_id`) REFERENCES `grade`(`grade_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
3.1.2 方式二:创建表的时候没有定义外键
- 年级表
CREATE TABLE `grade` (
`grade_id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '年级',
`name` VARCHAR(20) NOT NULL COMMENT '几年级',
PRIMARY