MySQL初识

MySQL初识

知识点

数据库是所有软件体系中最核心的内容

数据库的分类

关系型数据库 SQL

MySQL、Oracle

通过表与表之间、行与列之间的关系进行存储

例如 : 学生信息表与学生选课表之间的联系

非关系型数据库 **NoSQL ** Not Only SQL

Redis、MongDB

通过对象存储、通过对象之间的属性去决定

例如 : 存一个人对象到数据库中

MySQL

MySQL是一个 关系型数据库管理系统

Oracle旗下的产品,之前是MySQL AB 公司的

MySQL 是最好的 RDBMS (关系数据库管理系统) 之一

MySQL命令行

连接数据库

mysql -uroot -p1024+

image-20201218122201238

修改密码

密码存在 mysql数据库里面的 user 表里面

image-20201218123530817

image-20201218123425403

修改密码语句
update mysql.user set authentication_string=password('新密码') where user='root' and Host='localhost';
// 刷新权限
flush privileges;
查看所有的数据库
show databases;

image-20201218165031567

查看数据库中所有的表
show tables;

image-20201218165148542

查看某个表的详细信息

相当于查看表的设计结构

describe func; -- 函数表举例

image-20201218165343877

查看一个表的结构

以表格的形式显示一个表的各个字段的结构信息

desc user;

image-20201220090213981

创建数据库
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 旧的字段名 新的字段名 字段类型

modifychange

运用时的区别

运用场景 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 表名

deletetruncate 的区别

truncate 命令操作数据库时

  1. 重新设置自增列 例如:主键id 同时计数器归零
  2. 不会影响事务

delete 命令操作数据库时

  1. 不会设置自增列 保留删除前的最后一条的 增量的值
    • 例如 : 自增id 增加到了5 -> 使用 delete 语句删除了所有数据(删库)
    • 再次增加一条记录后 id 继续叠加到 6
  2. 重启数据库,断电重开机现象
    • 不同引擎,会出现不同的现象
      • InnoDB
        • 自增列会变成从 1 开始
        • InnoDB 操作时的数据存在内存当中,断电即失
      • MyISAM
        • 自增列会继续从上一次删库的自增值继续
        • 存在文件中不会丢失

DQL语言

查询数据的重要语言 data query language

字符串拼接显示查询 Concat 函数

-- 字符串拼接显示查询  Concat
select CONCAT('所在学院 :',address) as 拼接信息 from store;

image-20201220162727981

数据重复问题 用 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;

image-20201228141538655

inner join 与 join 是相同的

左连接实例

表结构图

person 表

image-20201228154538107

orderC表

image-20201228155422468

查询所有人订购的数量

select a.lastname as 名字, b.orderCount as 订购数量 from person as a inner join orderc as b on a.id = b.id_p;

左连接 右连接 内连接的理解

左连接 left join

左连接的数据是以左表的数据为主要数据,如若右表里面没有与其对应并关联的数据,那么也会列出左表的数据,而在第二个表的所查列的数值会显示为空,证明该列的值,没有被左表用到

如图左表的所有数据

image-20201230125041490

连表查询的数据

image-20201230125151431

显然左表有佳奇 的数据,没有与之右表关联的列数据,但是同样列了出来,然而右表显示的即是为空

右连接 与左连接的思想相反

右表的数据

image-20201230125624279

包含了两个 personID是2 的列值

左表的数据

image-20201230125706106

左表的数据并没有id为2的这个人

联表查询的数据

image-20201230125809689

显然右表数据所对应的左表数据没有数值,但是列出了信息,并显示为NULL

内连接 inner join

内连接显示的是并集,必须左表有数据,右表也有数据才可以列出

连接查询

image-20201230130235680

自连接 (本身联表查询)

如一个二级或者三级菜单的数据库设计

image-20201230134913550

通过本身的父子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;

image-20201230154924281

分页和排序

分页limit 排序order by

排序

基本语法

  • desc : 降序排序
  • asc : 升序排序
select * from tableName where tableCell = '列名' order by tableCell desc (asc) 

实例

学生表按成绩降序排序

select * from student order by score desc;

image-20210101122521350

学生表按成绩升序排序

select * from student order by score asc;

image-20210101122646567

分页

运用 limit

用法:limit (起始值,页面大小 )

从 0 开始 查询 5 条数据 并按分数降序排序

select * from student order by score desc limit 0,5;

image-20210101123843579

分页的实现方法本身是结合前端的公式计算,从而产生的结果,后端仅仅只是执行了limit语句的查询并没有做过多计算

分页公式

  1. 页面大小 pageSize

    该数值由分页前端的需求所指定 :指显示在本页的数据一共想要显示多少条

  2. 当前页 page

    该数值由分页前端的需求所指定 :指当前所显示的是第几页

  3. 数据总数 count

    该数值由后端计算给出 :指数据的总条数

  4. 总页数 pageNum

    • 该数值由分页前端的需求和后端计算给出 :指数据经过处理之后所形成的总页数
    • count / pageSize = pageNum
  5. 起始值 start

    • 该数值由分页前端的需求和后端计算给出 :指每一次从数据库查询时,limit的起始条数
    • (page - 1) * pageSize = start

Mysql函数

常用函数

并不常用 哈哈哈哈

数学运算

  1. abs

    绝对值

    select abs(-8);
    -- 8
    

    image-20210101132438825

  2. ceiling

    向上取整

    select ceiling(9.87);
    -- 10
    

    image-20210101132556833

  3. floor

    向下取整

    select floor(9.87);
    -- 9
    

    image-20210101132711026

  4. rand

    返回 0 ~ 1之间的随机数

    select rand();
    

    image-20210101132825477

  5. sign

    判断一个数的符号 0 返回0,整数返回1,负数返回-1

    select sign(10); -- 1
    select sign(0); -- 0
    select sign(-10) -- -1
    

    image-20210101134039028

日期函数

  1. current_date()

    获取当前日期

    同理于 :CURDATE()

  2. NOW()

    获取当前时间

  3. LOCALTIME()

    获取本地时`间

  4. 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 表

image-20210102141722036

count(1)

image-20210102141839027

count(username)

image-20210102141916476

摘自csdn的总结

image-20210102142033521

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加密查询即可进行加密模式的登录验证

posted @ 2020-12-30 19:47  触碰A阳光  阅读(118)  评论(0编辑  收藏  举报