MySQL初识
MySQL初识
知识点
数据库是所有软件体系中最核心的内容
数据库的分类
关系型数据库 SQL
MySQL、Oracle
通过表与表之间、行与列之间的关系进行存储
例如 : 学生信息表与学生选课表之间的联系
非关系型数据库 **NoSQL ** Not Only SQL
Redis、MongDB
通过对象存储、通过对象之间的属性去决定
例如 : 存一个人对象到数据库中
MySQL
MySQL是一个 关系型数据库管理系统
Oracle旗下的产品,之前是MySQL AB 公司的
MySQL 是最好的 RDBMS (关系数据库管理系统) 之一
MySQL命令行
连接数据库
mysql -uroot -p1024+
修改密码
密码存在 mysql数据库里面的 user 表里面
修改密码语句
update mysql.user set authentication_string=password('新密码') where user='root' and Host='localhost';
// 刷新权限
flush privileges;
查看所有的数据库
show databases;
查看数据库中所有的表
show tables;
查看某个表的详细信息
相当于查看表的设计结构
describe func; -- 函数表举例
查看一个表的结构
以表格的形式显示一个表的各个字段的结构信息
desc user;
创建数据库
create database lee; -- 创建数据库
退出连接
exit; -- 退出
SQL的注释
-- 这是一个注释
/*
多行注释
*/
数据库的语言 CRUD
DDL
数据库定义语言 define
DML
数据库操作管理语言 manage
DQL
数据库查询语言 query
DCL
数据库控制语言 control
操作数据库
基本操作
创建数据库
CREATE DATABASE IF NOT EXISTS lee; -- 创建数据库 如果不存在这个数据库
删除数据库
DROP DATABASE IF NOT EXISTS lee2; -- 删除数据库
查看数据库
SHOW DATABASES; -- 显示所有的数据库
数据库列的类型
数值
由小到大的顺序排列的
字段类型 | 描述 | 占字节数 |
---|---|---|
tinyint | 十分小的数据 | 1 |
smallint | 比较小的数据 | 2 |
int (常用) | 标准的整数 | 4 |
bigint | 较大的数据 | 8 |
float | 浮点数 | 4 |
double | 浮点数 | 8 |
decimal 金融计算时 | 字符串形式的浮点数 |
字符串
字段类型 | 描述 | 占字节数 |
---|---|---|
char | 固定大小的字符串 | 0~255 |
varchar (来存取常用的 java的 String变量) | 可变字符出 | 0~65535 |
tinytext | 微型文本 | 2^8 - 1 |
text (保存大文本) | 大型文本 文章 | 2^16 - 1 |
时间日期
对应的 java.util.Date 类
字段类型 | 描述 |
---|---|
date | 日期格式 |
time | 时间格式 |
datatime | 最常用的时间表示字段 |
timestamp | 时间戳 代表 : 从 1970.1.1 到现在所经过的毫秒数 是最统一的时间 |
year | 年份表示 |
null
就是没有值和未知的意思
常规运算中不参与到其中
特殊字符的处理
如果在操作数据库时,关键字与操作的列名或者字段名相冲突,使用
select * from time -- time 是关键字 -- 可以写成 select * from `time`
数据库的字段属性
unsigned
无符号整数
声明该列不可以为负数
zerofill
0 填充效果
自增
- 自动在上一条的记录的基础上 + 1
- 一般在设计在主键上
- 必须作用于 int 类型
- 可以自己定义主键自增的初始值与步长
非空
null
不填写值,就默认填充该列为空
null
not null
不给其赋值时,就会报语法错误
每张表之中固定的5个字段
字段名称 | 字段含义 |
---|---|
id | 自增主键 |
version | 记录版本 乐观锁 |
is_delete | 伪删除 标识 |
gmt_create | 创建时间 |
gmt_update | 修改时间 |
运用于项目之中
创建表时的注意事项
使用判断重复创建
create table if not exists `user`
所有的列名必须 加上
``
主键自增的关键字
auto_increment
字段注释
comment
一个创建表单的案例
创建一个用户表
user
账号 username
密码 pwd
主键 id
create table `user` ( -- 主键列 int宽度为4的类型 非空 自动增加 列注释为 主键自增 id id int(4) not null auto_increment comment '主键自增 id', -- 用户名称列 可变字符长度 非空 默认值为 admin 列注释为 用户名称 username varchar(50) not null default 'admin' comment '用户名称', -- 密码列 可变字符长度 非空 默认值是 12456 列注释为 用户密码 pwd varchar(50) not null default '123456' comment '用户密码', -- 主键的设置 最好在建表的下面设置, 便于查看sql语句 primary key(`id`) ) -- 设置数据库引擎 engine = innodb -- 设置字符集 default charset=utf8
要设置字符集的编码
- mysql 默认的编码不支持中文编码
- 默认编码是 Latin1
建表的时候设置即可
charset=utf8
修改表
修改表的名字
修改用户表名字 (重命名)
alter table `user` rename as `leeUser`;
-- alter table 旧表名 rename as 新的名字
增加一个字段
添加一个状态列 status 向user表中
alter table `user` add status int(2)
-- alter table 表名 add 列名 字段类型(宽度)
修改表的字段
修改约束条件 (修改字段类型)
- 修改 user 表的 username 列 -> int(20)
modify
alter table user modify username int(20);
-- alter table 表名 modify 列名 字段类型(宽度) ……
重命名字段
- 修改 user 表的 pwd 列 -> password
change
alter table user change pwd password varchar(50);
-- alter table 表名 change 旧的字段名 新的字段名 字段类型
modify
与change
运用时的区别
运用场景 modify change 修改字段的类型 、长度 Y
N
重命名字段时 N
Y
删除表的字段
删除 user 表的 status 列
alter table user drop status;
-- alter table 表名 drop 列名
删除表
删除 test 表
drop table if exists test;
-- 如果表存在,在删除
所有的创建表的语句或删除修改语句,加上
if exists
数据管理
外键(了解)
- 通常为 java 里面的形式外键, 一般不做mysql 里面的物理外键
- 因为在 insert update 等数据维护操作时,还要考虑外键的约束,及其不方便
foreign key
DML语言
意义 : 数据存储、数据管理
数据操作语言
insert
update
delete
添加
向store表中插入一条数据
insert into `store` (`store`,`address`) values('qweq2','asdfgh2');
插入多个值时
insert into `store` (`store`,`address`)
values('qweq2','asdfgh2'),('qweq3','asdfgh3'),
修改
修改 store 表,id 为 2 的 address 列 设置为 黑龙江东方学院
update `store` set `address` = '黑龙江东方学院' where `id` = 2;
不指定条件时,全部都修改
update `store` set `address` = '黑龙江东方学院';
修改多个列
update `store` set `address` = '黑龙江东方学院', `store` = '你好世界' where `id` = 4;
运算符
= <> !=
between
在某个区间内查找
- 在闭合区间内的数值 between 2 and 3 --> 包含id 2,3
select * from store where id between 2 and 3 -- id 在 2~3范围内查找
删除
语法
delete
delete from 表名 where 条件
清空数据库
truncate
truncate 表名
delete
与truncate
的区别truncate 命令操作数据库时
- 重新设置自增列 例如:主键id 同时计数器归零
- 不会影响事务
delete 命令操作数据库时
- 不会设置自增列 保留删除前的最后一条的 增量的值
- 例如 : 自增id 增加到了5 -> 使用 delete 语句删除了所有数据(删库)
- 再次增加一条记录后 id 继续叠加到 6
- 重启数据库,断电重开机现象
- 不同引擎,会出现不同的现象
InnoDB
- 自增列会变成从 1 开始
- InnoDB 操作时的数据存在内存当中,断电即失
MyISAM
- 自增列会继续从上一次删库的自增值继续
- 存在文件中不会丢失
DQL语言
查询数据的重要语言 data query language
字符串拼接显示查询
Concat
函数-- 字符串拼接显示查询 Concat select CONCAT('所在学院 :',address) as 拼接信息 from store;
数据重复问题 用 distinct
select distinct `address` from store;
去除查询结果中重复的数据,只显示一条数据
SQL 语句的模糊查询
本质上是比较运算符
LIKE 模糊查询
like 关键字结合
% (代表后面是0~任意一个字符)
_ (代表后面接一个字符)
例子
查询姓李的所有的信息
select * from user where username like '李%';
查询姓李且名字只有三个字的人
select * from user where username like '李__';
查询名字中间是佳的同学
select * from user where username like '%佳%';
IN
范围查询
一个字段的内容的值 包含在某一个区间范围内 如 number(学号) 包含在 (1,2,3,4,5)内
select * from user where id In(1,2,3,4,5);
查询地址在北京,洛阳、河南的学生
select * from user where username in ('北京','洛阳','河南');
- IN查询为精确查询,不可以与模糊查询一起使用
null || not null
null 代表的是
NULL
' '
查询姓名为 null 或者 '' 的学生
select * from user where username = '' or username is null;
JOIN连接查询
共有7种连接查询
常见错误提示
ambiguous
模棱两可的,再多表连接查询时出现指代不明确字段的时候
-- 内连接
select a.username, b.count from user as a inner join store as b on a.id = b.uid;
inner join 与 join 是相同的
左连接实例
表结构图
person 表
orderC表
查询所有人订购的数量
select a.lastname as 名字, b.orderCount as 订购数量 from person as a inner join orderc as b on a.id = b.id_p;
左连接 右连接 内连接的理解
左连接
left join
左连接的数据是以左表的数据为主要数据,如若右表里面没有与其对应并关联的数据,那么也会列出左表的数据,而在第二个表的所查列的数值会显示为空,证明该列的值,没有被左表用到
如图左表的所有数据
连表查询的数据
显然左表有
佳奇
森
的数据,没有与之右表关联的列数据,但是同样列了出来,然而右表显示的即是为空
右连接 与左连接的思想相反
右表的数据
包含了两个 personID是2 的列值
左表的数据
左表的数据并没有id为2的这个人
联表查询的数据
显然右表数据所对应的左表数据没有数值,但是列出了信息,并显示为NULL
内连接
inner join
内连接显示的是并集,必须左表有数据,右表也有数据才可以列出
连接查询
自连接 (本身联表查询)
如一个二级或者三级菜单的数据库设计
通过本身的父子ID进行连接查询实现,父子二级(或多级)菜单的查询
自连接的查询技巧:将一个表看成两个表的拆分,进行join的连接查询
假设:本张菜单表,有顶级菜单表
menuID 菜单名称 1 视频类别 2 直播类别 3 游戏类别 4 文章类别 假设:本张菜单表,有二级菜单表
pID menuID menuName 1 5 动作视频 2 13 游戏主播 3 15 FPS游戏 4 17 创意文章 假设:本张菜单表,有三菜单表
pID menuID menuName 5 22 速度与激情 6 23 一个木头 6 24 吉他阿木 16 32 率土之滨 通过将一表的表示形式,转化成三张表(三级菜单时)的抽象思维进行多表join连接,对同一个列取一些相对的别名(如菜单名称)来进行查询
SQL
-- 自连接查询三级菜单表 select a.menuName as 父级菜单, a.menuID as 菜单ID, a.pID as 父级菜单ID, b.menuName as 二级菜单, b.menuID as 二级菜单ID, b.pID as 父级菜单ID, c.menuName as 三级菜单, c.menuID as 三级菜单ID, c.pID as 父级菜单ID from menu as a inner join menu as b on a.menuID = b.pID inner join menu as c on b.menuID = c.pID;
分页和排序
分页
limit
排序order by
排序
基本语法
- desc : 降序排序
- asc : 升序排序
select * from tableName where tableCell = '列名' order by tableCell desc (asc)
实例
学生表按成绩降序排序
select * from student order by score desc;
学生表按成绩升序排序
select * from student order by score asc;
分页
运用 limit
用法:limit (起始值,页面大小 )
从 0 开始 查询 5 条数据 并按分数降序排序
select * from student order by score desc limit 0,5;
分页的实现方法本身是结合前端的公式计算,从而产生的结果,后端仅仅只是执行了limit语句的查询并没有做过多计算
分页公式
页面大小
pageSize
该数值由分页前端的需求所指定 :指显示在本页的数据一共想要显示多少条
当前页
page
该数值由分页前端的需求所指定 :指当前所显示的是第几页
数据总数
count
该数值由后端计算给出 :指数据的总条数
总页数
pageNum
- 该数值由分页前端的需求和后端计算给出 :指数据经过处理之后所形成的总页数
count
/pageSize
=pageNum
起始值
start
- 该数值由分页前端的需求和后端计算给出 :指每一次从数据库查询时,limit的起始条数
- (
page
- 1) *pageSize
=start
Mysql函数
常用函数
并不常用 哈哈哈哈
数学运算
-
abs
绝对值
select abs(-8); -- 8
-
ceiling
向上取整
select ceiling(9.87); -- 10
-
floor
向下取整
select floor(9.87); -- 9
-
rand
返回 0 ~ 1之间的随机数
select rand();
-
sign
判断一个数的符号 0 返回0,整数返回1,负数返回-1
select sign(10); -- 1 select sign(0); -- 0 select sign(-10) -- -1
日期函数
-
current_date()
获取当前日期
同理于 :
CURDATE()
-
NOW()
获取当前时间
-
LOCALTIME()
获取本地时`间
-
SYSDATE()
获取系统时间
聚合函数(重点)
函数名 | 功能描述 |
---|---|
count | 统计表中数据总行数 |
max | 统计该列的最大值 |
min | 统计该列的最小值 |
avg | 计算本列的平均值 |
sum | 计算本列的加和 |
count 函数的查询注意事项
count的聚合查询有三种形式
count(*)、count(1)、count(列名)
三种查询的优化对比
count(1)
和count(*)
count(1)是啥意思
百科说的是啥呢,"其实就是计算一共有多少符合条件的行",啥意思呢。
1 这个东西,它表示的
不是
咱想的表里面存在的第一个字段,它表示的是表中,咱自己遐想
的一个字段,这个字段的名称
就是1
,所以说count(1)就是计算 1 这列一共有多少条,因为表的结构是平行的嘛,所以自然就代表着表中的总数据条数。同理:
count(2)
、count(300)
、count('xyz')
所查询的结果与count(1)
是相同
- 基本无差别
- count(*)会自动优化指定到哪一个字段。所以执行效率方面几乎无差别
count(1) 和 count(字段)
- count(1)统计的是表中所有的记录条数,包含字段为
NULL
的记录- count(字段)统计的是该字段中记录出现的额次数,如果本列中出现空值,那就跳过计数。也就是不统计字段值为NULL的记录
user 表
count(1)
count(username)
摘自
csdn
的总结
MysqlMD5加密算法
特点: 数字指纹认证
场景理解:比如写了一个文件叫做 readme.txt 同时对这个文件进行了MD5加密并且记录,随后将文件传输给其他人,但在中途这个文件被第三个人篡改,最后收到放拿到文件后,按照MD5加密算法进行解密,发现与记录在案的MD5数值不相同,进而发现文件被恶意篡改,配合相关认证机构,即可查证
加密运用函数
MD5
加密插入 一条用户注册信息
INSERT INTO testmd5(`name`,pwd) VALUES('zhang',MD5(123456));
登陆验证
select * from testmd5 where `name`='zhang' and pwd=MD5(123456);
同时运用MD5加密插入,和MD5加密查询即可进行加密模式的登录验证