文章目录
MySQL
1 初识MySQL
JavaEE:企业级Java开发 Web
前端(页面:展示,数据!)
后台(连接点:连接数据库JDBC,连接前端(控制,控制视图跳转,给前端传递数据))
数据库(存数据,txt,excel,word)
只会写代码,学好数据库,基本混饭吃!
操作系统,数据结构与算法,当一个不错的程序猿!
离散数学,数字电路,体系结构,编译原理,实战经验,高级程序猿!
1.1 为什么学习数据库
- 岗位需求
- 现在的世界是一个大数据时代,得数据者得天下
- 被迫需求:存数据 去IOE
- 数据库是所有软件体系中最核心的存在 DBA
1.2 什么是数据库
数据库(DB,DataBase)
概念:数据仓库,软件,安装在操作系统(window、linux、mac…)之上的!SQL,可以存储大量的数据(500万)
作用:存储数据,管理数据 excel
1.3 数据库分类
- 关系型数据库:行、列(SQL)
MySQL、Oracle、SqlServer、DB2、SQLlite
通过表和表之间,行和列之间的关系进行数据的存储:学院信息表、考勤表…
- 非关系型数据库:{key: value}(NoSQL(Not Only))
Redis、MongDB
非关系型数据库,通过对象存储,通过对象的自身的属性来决定
- DBMS(数据库管理系统)
数据库的管理软件,能够科学有效的管理我们的数据,维护和获取数据
MySQL,数据库管理系统!
1.4 MySQL简介
MySQL是一个关系型数据库管理系统
前世:由瑞典MySQL AB公司
今生:属于Oracle旗下产品
MySQL是最好的RDBMS(Relational Database Management System, 关系型数据库管理系统)应用软件之一,开源的数据库软件!
体积小、速度快,总体拥有成本低,招人成本低,所有人必须会,中小型网站或者大型网站,集群!
官网:https://www.mysql.com/
版本里5.7稳定,8.0
- 安装建议:
- 尽量不要使用exe,注册表
- 尽可能使用压缩包安装
1.5 安装MySQL
-
进入https://dev.mysql.com/downloads/file/?id=500439,点击Windows (x86, 64-bit), ZIP Archive下载,无需注册
-
解压
-
把这个解压包放到自己的电脑环境目录下
-
添加环境变量:将bin文件目录添加到系统path中D:\Environment\mysql-5.7.33-winx64\bin
-
新建配置MySQL配置文件:在MySQL文件夹下新建my.ini文件,将以下除注释外内容放入到ini文件中
[mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=D:\\Environment\\mysql-5.7.33-winx64 # 切记此处一定要用双斜杠\\,单斜杠我这里会出错,不过看别人的教程,有的是单斜杠。自己尝试吧 # 设置mysql数据库的数据的存放目录 datadir=D:\\Environment\\mysql-5.7.33-winx64\\Data # 此处同上 # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8
-
启动管理员模式下的CMD,运行所有的命令:在windows系统 -> 命令提示符中右键选择以管理员方式运行
-
在命令提示符中输入
cd /d D:\Environment\mysql-5.7.33-winx64\bin
进入bin目录 -
若已安装mysql可输入
sc delete mysql
清空服务重新安装 -
进入bin目录后输入
mysqld -install
(安装mysql),安装成功显示Service succeefully installed -
输入
mysqld --initialize --console
初始化数据文件,密码为@localhost:后的,初始化成功会在MySQL目录下出现data目录 -
输入
net start mysql
启动MySQL,显示mysql 服务正在启动 .mysql 服务已经启动成功 -
用命令
mysql -u root -p
进入mysql管理界面 -
初始化密码:
alter user user() identified by "123456";
后显示 Query OK, 0 rows affected (0.00 sec) -
若想修改密码可输入:
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
-
刷新权限:
flush privileges;
-
推出mysql:
exit
之后重启mysql即正常使用:net stop mysql
net start mysql
-
再次输入
mysql -u root -p
和密码或者直接输入mysql -u root -p123456
进入mysql
1.6 安装SQLyog
官网:https://sqlyog.en.softonic.com/
带密匙:https://blog.youkuaiyun.com/wudinaniya/article/details/78735567
- 新建一个数据库school
- 新建一张表stdent:每一个sqlyog的执行,本质就是对应了一个sql,可以在软件中的历史记录中查看
- 查看表:右键student点击打开表,填写信息
1.7 连接数据库
命令行连接
mysql -u root -p123456 --连接数据库
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; --修改用户密码
flush privileges; --刷新权限
--所有的语句都是用;结尾
show databases; --查看所有的数据库
use school; --切换数据库
show tables; --查看数据库中所有的表
ctrl + C --强行终止
describe student; --显示数据库中所有表的信息
create database westos; --创建一个数据库
exit; --退出连接
DROP TABLE `school`.`student`; --删除表
--单行注释(SQL本来的注释)
/*SQL的多行注释*/
数据库 xxx 语言 CRUD 增删改查
DDL:数据库定义语言
DML:数据库操作管理语言
DQL:数据库查询语言
DCL:数据库控制语言
2 操作数据库(了解)
操作数据库 → 操作数据库中的表 → 操作数据库中表的数据
MySQL关键字不区分大小写
2.1 操作数据库
- 创建数据库
CREATE DATABASE [IF NOT EXISTS] westos;
- 删除数据库
DROP DATABASE [IF EXISTS] westos;
- 使用数据库
USE `school`; --tab 键的上面,如果你的表名或者字段名是一个特殊字符,就需要带``
- 查看所有的数据库
SHOW DATABASES;
对比:SQLyog的可视化操作
学习思路:对照SQLyog可视化历史记录查看sql;固定的语法或关键字必须要强行记住
2.2 数据库的数据类型
-
数值
tinyint 十分小的数据 1个字节 smallint 较小的数据 2个字节 mediumint 中等大小的数据 3个字节 int(常用) 标准的整数 4个字节 big 较大的数据 8个字节(对应long) 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 时间格式 timestamp 1970.1.1到现在的毫秒数! 时间戳 year 年份表示 -
null
没有值,未知;注意不要使用NULL进行运算,结果为NULL
2.3 数据库的字段属性(重点)
Unsigned | 无符号的整数 | 不能声明为负数 |
---|---|---|
Zerofill | 零填充 | 不足的位数,使用0前置填充 |
自增 | 自动在上一条记录的基础上加1,通常用来设计唯一的主键,必须是整数类型,可以自定义设计自增的起始值和步长 | |
非空 | not NUll | 必须有值,不赋值就会报错!若不点默认值为null |
默认 | 设置默认的值 |
- 拓展
/* 每一个表,都必须存在以下五个字段!未来做项目用的,表示一个记录存在的意义
id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
*/
2.4 创建数据库(重点)
-- 注意点:使用英文(),表的名称 和 字段 尽量使用 `` 括起来
-- 自增:auto_increment
-- 字符串使用单引号或双引号括起来
-- 所有的语句后面加,(英文的)最后一个字段不用加
-- 主键:primary key,一般一个表只有一个主键
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pws` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`adress` 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 | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持(表锁) | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小(内存) | 较小 | 较大(约为MyISAM2倍) |
常规使用操作 | 节约空间,速度较快 | 安全性高,支持事务的处理,多表多用户操作 |
-
在物理空间存在的位置
所有的数据库文件都存在Data目录文件下,一个文件夹就对应一个数据库。本质还是文件的存储! D:\Environment\mysql-5.7.33-winx64\Data
-
MySQL引擎在物理文件上的区别
- InnoDB在数据库表中只有一个 *.frm文件,以及上级目录下的 ibdata1 文件
- MyISAM对应的文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
-
设置数据库表的字符集编码
CHARSET=utf8
如果不设置的话,会是MySQL默认的字符集编码Latin1~(不支持中文!)
也可以在my.ini配置默认的编码
character-set-server=utf8
2.6 修改删除表
- 修改
-- 修改表: ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE test RENAME AS teacher
-- 增加表的字段: ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher ADD age INT(11)
-- 修改表的字段(重命名,修改约束!)
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher MODIFY age VARCHAR(11) -- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
ALTER TABLE teacher CHANGE age age1 INT(11) -- 字段重命名
-- 删除表的字段: ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher DROP age1
- 删除
-- 删除表(如果表存在在删除)
DROP TABLE IF EXISTS teacher
所有的创建和删除操作尽量加上判断,以免报错
- 注意点:
- 用 `` 包裹字段名
- 注释用 – 和 /**/
- sql 关键字大小写不敏感,建议写小写
- 所有的符号全部用英文
3 MySQL数据管理
3.1 外键(了解)
学生的 grade列 引用 年纪表的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
-- 学生表的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 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 `表` ADD CONSTRAINT `约束名` FOREIGN KEY(`作为外键的字段`) REFERENCES `哪个表`(`哪个字段`)
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade` (`gradeid`)
以上的操作都是物理外键,数据库级别的外键,不建议使用!(避免数据库过多造成困扰,有可能导致死锁、性能下降)
- 最佳实践
- 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
- 当我们想使用多张表的数据,想使用外键(通过程序去实现)
3.2 DML语言(背)
数据库意义:数据存储,数据管理
DML语言:数据操作语言
-
Insert
-
update
-
delete
3.3 添加Insert
-- 插入语句(添加)
-- 插入多个字段:insert into 表名(`字段名1`, `字段名2`, `字段名3`)values('值1', '值2', '值3', ...)
-- 插入多行:insert into 表明(`字段名1`) values ('值1'), ('值2'), (...)
INSERT INTO `grade` (`gradename`) VALUES('大四')
-- 由于主键自增,我们可以省略(如果不写表的字段,他就会一一匹配)
INSERT INTO `grade` (`gradename`) VALUES('大三')
-- 一般写插入语句,我们一定要数据和字段一一对应!
-- 插入多个字段
INSERT INTO `grade` (`gradename`) VALUES ('大二'), ('大一')
INSERT INTO `student` (`name`) VALUES ('张三')
INSERT INTO `student` (`name`, `pwd`, `sex`) VALUES ('张三', 'aaaa', '男'), ('张三', 'aaaa', '男')
INSERT INTO `student` VALUES (6, '李四', 'aaaa', '男', '2000-01-01', 1, '西安', 'email')
- 注意事项
- 字段和字段之间使用英文逗号隔开
- 字段是可以省略的,但是后面的值必须要一一对应
- 可以同时插入多条语句,values后面的值需要使用逗号隔开
VALUES (``), (``), (``)
3.4 修改update
update 修改谁 (条件)set 原来的值 = 新值
-- 语法:
UPDATE `表名` SET `列名`='值', [`列名`='值', ...] WHERE id = [];
-- 修改学员名字
UPDATE `student` SET `name`='狂神' WHERE id = 1;
UPDATE `student` SET `name`='狂神' WHERE id <= 3;
-- 不指定条件的情况下,会改动所有的表
UPDATE `student` SET `name`='长江七号'
-- 修改多个属性
UPDATE `student` SET `name`='狂神', `email`='24736743@qq.com' WHERE id = 1;
条件: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`='长江七号' WHERE `name` = '狂神' AND `sex` = '男'
-
注意
- 列名是数据库的列,尽量带上 ``
- 条件,筛选的条件,如果没有指定,则会修改所有的列
- value,是一个具体的值,也可以是一个变量
- 多个设置的属性国之间,使用英文逗号隔开
UPDATE `student` SET `name`='狂神', `birthday` = CURRENT_TIME WHERE id = 1;
3.5 删除
- delete命令
语法:delete from 表名 [where 条件]
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`
-- 删除数据
DELETE FROM `student` WHERE id = 1;
- truncate命令
作用:完全清空一个数据库表,表的结构和索引约束不会变
-- 清空student表
TRUNCATE TABLE `student`
-
delete 和 truncate
-
相同点:都能删除数据,都不会删除表结构
-
不同:
-
truncate:重新设置自增列,计数器会归零,不会影响事务
-
delete:计数器不会归零
-
delete删除的问题
:重启数据库现象InnoDB自增列会从1开始(存在内存中的,断电即失),MyISAM继续从上一个自增量开始(存在文件中的,不会丢失)
-
-- 测试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`
-