1、初识MySQL
后台:(连接点:连接数据库JDBC,连接前端,控制,控制视图跳转,给前端传递数据)
数据库(存数据 txt,excel word)
只会写代码,只是码农。学好数据库要了解操作系统、数据结构与算法!
1.1、为什么学习数据库
1、大数据时代,得数据者得天下。
2、存数据(被迫需求)
3、数据库是所有软件体系中最核心的存在 DBA
1.2、什么是数据库
数据库(DB、DataBase)
概念:数据仓库,软件,安装在操作系统之上 SQL 可以存储大量数据 500万以上数据需要优化
作用:存储数据,管理数据
1.3 数据库分类
关系型数据库:SQL
- MySQL 、Oracle、 Sql Server、 DB2、 SQLlite
- 通过表和表之间,行和列之间的关系进行数据的存储。
非关系型数据库:NO SQL
- Redis 、MongDB
- 非关系型数据库,对象存储,通过对象的自身的属性来决定
DBMS(数据库管理系统)
- 数据库管理软件,科学有效的管理我们的数据。维护和获取数据
- MySQL
1.4 MySQL
MySQL是一个关系型数据库管理系统
1.5 安装MySQL
教程:参考docker
1.6 安装SQLyog
SQLyog 旗舰版序列号
注册名:kuangshen
注册码:8d8120df-a5c3-4989-8f47-5afc79c56e7c
本地可以连接mysql,远程连接报错1045解决方案
1.Linux本地登录
./mysql -uroot -p密码
2.进入成功以后找到表user:
use mysql;
3.给mysql添加权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '远程登录密码' WITH GRANT OPTION; # 远程登录密码 设定远程登录的密码
'%' 表示所有ip都可以远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'ip' IDENTIFIED BY '远程登录密码' WITH GRANT OPTION;
'ip'表示某个ip可以远程访问
4.退出且重启mysql服务器
\q
service mysql restart
默认的数据库不要动
每一个SQLyog的执行操作,本质就是对应一个sql语句执行,可以在SQLyog中“历史记录”查看
创建数据库
CREATE DATABASE `school`CHARACTER SET utf8 COLLATE utf8_general_ci;
创建表
CREATE TABLE `school`.`student` ( `id` INT(10) NOT NULL COMMENT '学员ID', `name` VARCHAR(100) COMMENT '学院姓名', `age` INT(2) COMMENT '学员年龄', PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
查看表
# 填写数据
INSERT INTO `school`.`student` (`id`, `name`, `age`) VALUES ('2', 'tomsolw', '19');
# 删除数据
DELETE FROM `school`.`student` WHERE `id` = '2';
1.7 连接数据库
命令行连接数据库
mysql -uroot -p123456 -- 连接本地MySQL
# 修改密码命令
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
#刷新权限
flush privileges;
-----------------------------------------------------------
-- * 所有语句都用;结尾
show databases; -- 查看所有数据库
use school -- 切换数据库 use 数据库名
show tables; -- 查看数据库中所有的表
describe student; -- 显示数据库中所有表的信息
create database westos; -- 创建数据库westos
exit; --退出连接
-- -- SQL单行注释
/* */ -- SQL多行注释
数据库XXX语言 CRUD 增删改查!
DDL 定义语言
DML 操作语言
DQL 查询语言
DCL 控制语言
2、操作数据库
操作数据库 -> 操作数据库中的表 -> 操作数据库中表的数据
MySQL关键字不区分大小写
2.1、操作数据库
1、创建数据库
CREATE DATABASE [IF NOT EXISTS] westos -- [] 为可选项
2、删除数据库
DROP DATABASE IF EXISTS westos
3、使用数据库
`` -- ~键位,如果你的表名或者字段名是一个特殊字符,就需要用 `` use `school`
4、查看数据库
show database -- 查看所有数据库
对比SQLyog 的操作
- 对照sqlyog可视化历史记录查看操作
- 固定语法或关键字必须要强行记住
2.2 数据库的列类型
数值
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- int 标准的整数 4个字节 (常用)
- bigint 较大的数据 8个字节
- float 浮点数 4个字节
- double 浮点数 8个字节
- decimal 字符串形式的浮点数 金融计算时一般使用
字符串
- char 字符串固定大小的 0-255
- varchar 可变字符串 0-65535 (常用)
- 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 修改时间
2.4 创建数据库表
-- 目标:创建一个shool数据库-- 创建学生表(列,字段) 使用sql创建-- 学号int 登录密码 varchar(20) 姓名,性别varchar(2) 出生日期datatime 家庭住址 邮箱-- 注意点,使用英文() 表的名称和字段 尽量使用 `` 括起来-- 字符串使用单引号括起来-- 所有的语句后面加,(英文的)最后一个字段不用加,-- PRIMARY KEY 主键 一般一个表只有一个唯一的主键!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 -- 查看创建数据库的语句CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8 */SHOW CREATE TABLE student -- 查看创建表的语句CREATE TABLE `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=utf8DESC student -- 显示表的结构
2.5 数据表的类型
-- 关于数据库引擎INNODB -- 默认使用MYISAM -- 早期版本使用
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大 约为MYISAM 2倍 |
常规使用操作:
- MYISAM 节约控件,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有的数据库文件都存在data文件夹下 一个文件夹对应一个数据库
本质文件存储
MySQL引擎在物理文件上的区别
- innoDB 在数据库表中只有 *.frm文件,以及上级目录下的idbata1文件
- MYISAM对应文件.frm -表结构定义文件,.myd 数据文件(data) .myi 索引文件(index)
设置数据库表的字符集编码
CHARSET=utf8
不设置mysql会使用默认的字符集编码 (不支持中文)
2.6 修改删除表
修改
ALTER TABLE student RENAME AS students -- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名ALTER TABLE student ADD age INT(11) -- 增加表字段 ALTER TABLE 表名 ADD 字段名 列属性ALTER TABLE student MODIFY age VARCHAR(11) -- 修改表字段 (修改约束)ALTER TABLE student CHANGE age age1 INT(1) -- 修改表字段重命名 ALTER TABLE student DROP age -- 删除表字段
删除
DROP TABLE IF EXISTS student -- 删除表(如果表存在再删除)
所有的创建和删除操作都尽量加上判断,以免报错
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 `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 '邮箱', `gradeid` INT(10) NOT 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 `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 '邮箱', `gradeid` INT(10) NOT 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语言:数据操作语言
- inset
- update
- delete
3.3 、添加
insert
-- 插入语句(添加)-- insert into 表名([字段1,字段2,字段3,……]) values ('值1'),('值1'),('值1'),……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 ('李四','abcdef','男'),('王五','kkkkkk','男')
注意事项:
- 字段和字段之间用英文符合
- 字段是可以省略的,但值必须一一对应,不能少
- 可以同时插入多条数据,VALUES值需要使用英文逗号隔开
VALUES(值1),(值2)
3.4、修改
update 依据(条件) set原值=新值
-- 修改学员名字UPDATE `student` SET `name`= 'XXX' WHERE id = 1-- 不指定条件的情况下,会改动所有表UPDATE `student` SET `name`= 'XXX'-- 修改多个属性UPDATE `student` SET `name`= 'XXX',`email`='XXX@qq.com' WHERE id = 1
条件:where 子句 运算符 id等于某个值,大于某个值在某个区间……
操作符会返回布尔值
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 1=2 | false |
<> 或 != | 不等于 | 5 != 6 | true |
> | 大于 | ||
< | 小于 | ||
>= | 大于等于 | ||
<= | 小于等于 | ||
BETWEEN …… AND…… | 区间 | 2 AND 5 | true |
AND | 条件和 | ||
OR | 或 |
注意事项:
- colnum_name(列)是数据库的列名,尽量带上``
- 条件,筛选条件,如果没有指定,则会修改所有的列
- value,是一个具体的值,也可以是一个变量
- 多个设置的属性之间,使用英文逗号隔开
UPDATE `student` SET `birthday`=CURRENT_TIME WHERE `name` = 'XXX' AND `sex` = '女'
3.5、删除
delete
语法:delete from 表名 [where 条件]
-- 删除数据DELETE FROM `student` WHERE id = 1-- 清空 student 表TRUNCATE `student`
delete 和 truncate 区别
- 相同点,都能删除数据,都不会删除表结构
- 不同:
- TRUNCATE 重新设置 自增列 计数器会归零
- TRUNCATE 不会影响事务