写点什么

真实!MySQL 数据库:喂,先别跑好吗?程序员:不跑你养我啊?

发布于: 2021 年 05 月 03 日
真实!MySQL数据库:喂,先别跑好吗?程序员:不跑你养我啊?

今日分享开始啦,请大家多多指教~


MySQL:先别跑好吗?

程序员:不跑你养我啊?

MySQL:你听我给你解释啊。

程序员:你先管好你自己吧。


这是我之前看过的一个非常有趣的对话,这也是真实写照。今天分享的是 MySQL 数据库,打好基础非常重要,话不多说,正文开始啦~

一,数据库

1.1 DBMS

Database Management System:数据库管理系统

DBMA:数据库管理员

常见的数据库管理系统:

  • MySQL:Oracle 公司的中小型数据库,从 6 版本开始收费

  • Oracle:Oracle 公司的大型数据库,收费的

  • DB2:IBM 公司的大型数据库

  • SQLServer:Mircosoft 公司的大型数据库

  • SQLite:移动端的嵌入式的小型数据库

Java 中主要使用的是 MySQL 和 Oracle

1.2 数据库的结构

  • 一个 DBMS 中可以维护管理多个数据库

  • 一个数据库由若干张表组成

  • 一张表包含若干条记录

  • 一条记录包含若干字段信息

1.数据库中的表相当于代码中的实体类

例如:要研究医生这个类,就应该创建一张医生表

2.数据库表中的一列(字段)相当于实体类中的属性

例如:汽车有品牌属性,那么在汽车表中就应该有品牌字段

3.根据类创建出的对象就相当于数据库表中的一行(一条记录)

例如:当我们获取宠物对象时,我们就可以从该对象上获取它所具备的所有属性;同样的,当我们查询到一条宠物记录时我们就可以从表中明确该宠物的所有字段信息。

1.3 SQL 语言

结构化查询语言:Structured Query Language

分类:

  • DDL:数据定义语言(Data Definition Language)

对数据库、表进行创建、修改、删除等操作

关键字:create、alter、drop 等

  • DML:数据操作语言(Data Manipulation Language)

对表中记录、字段进行增、删、改等操作

关键字:insert、delete、update 等

  • DQL:数据查询语言(Data Query Language)

对数据库、表、记录、字段进行查询的

关键字:select、from、where、in、and、or、between、having、group by、order by、limit 等

  • DCL:数据控制语言(Data Control Language)

对数据库的安全级别和访问权限进行管理的

关键字:revoke、grant、commit、roll back 等

1.4 mysql 软件

注:

  1. 安装的目录必须是纯英文路径的

  2. 删除步骤

  • 在控制面板中卸载软件

  • 删除 mysql 安装路径下的 mysql 文件夹

  • 删除 C 盘下 ProgramData 下的 mysql 文件夹

登录 mysql

方式一:

  • 打开 cmd

  • 输入 mysql -uroot -p 密码

方法二:

  • 打开 cmd

  • 输入 mysql -uroot -p

  • 再输入密码

方式三:

  • 找到安装 mysql 后的 Command Line Client

  • 输入密码

二,SQL

C (create) R (read) U (update) D(delete)

2.1 库的操作

建库:create database 库名;

判断数据库是否存在,不存在才创建:create database if not exists 库名;

创建数据库并指明编码格式:create database 库名 character set 编码格式;

查询数据库的创建语句以及编码格式:show create database 库名;

查看已有的数据库:show databases;

删库:drop database 库名;

判断数据库是否存在,存在才删除:drop database if exists 库名;

修改数据库的编码格式:alter database 库名 character set 编码格式;

指定使用的数据库:use 库名;

2.2 表的操作

建表:create table 表名 (字段名 字段类型 [约束], 字段名 字段类型 [约束], 字段名 字段类型 [约束], ...);

判断表是否存在,不存在才创建:create table if not exists 表名 (字段名 字段类型 [约束], 字段名 字段类型 [约束], 字段名 字段类型 [约束], ...);

查询所有表:show tables;

查看表结构:desc 表名;

删表:drop table 表名;

判断表是否存在,存在才删除:drop table if exists 表名;

复制表结构:create table 新表名 like 被复制的表名;

修改表名:alter table 旧表名 rename to 新表名;

修改表结构:

添加新字段:alter table 表名 add 新字段 字段类型 [约束];

删除字段:alter table 表名 drop 字段;

修改字段类型:alter table 表名 modify 字段 字段类型 [约束];

修改字段名:alter table 表名 change 旧字段名 新字段名 字段类型 [约束];

2.3 记录、字段的操作

查询表中的所有记录:

  • select * from 表名;

  • * 表示所有字段(列)

  • 等价于 select 字段 1,字段 2,字段 3,... from 表名;

添加记录:

向所有字段添加数据:insert into 表名 values (值 1,值 2,值 3,...);

向指定字段添加数据:insert into 表名 (字段 1,字段 2,字段 3,...) values (值 1,值 2,值 3,...);

批量添加(所有字段):insert into 表名 values (值 1,值 2,值 3,...), (值 1,值 2,值 3,...),...;

批量添加(指定字段):insert into 表名 (字段 1,字段 2,字段 3,...) values (值 1,值 2,值 3,...), (值 1,值 2,值 3,...),...;

删除记录:

删除所有记录:delete from 表名;

根据条件删除指定记录:delete from 表名 where 条件;

删除所有记录:truncate table 表名;

修改记录:

修改所有记录:update 表名 set 字段名 = 值,字段名 = 值,字段名 = 值...;

根据条件修改指定记录:update 表名 set 字段名 = 值,字段名 = 值,字段名 = 值,... where 条件;

注:

  1. 添加记录时,值的数量必须与列的数量一致

  2. 添加记录和修改记录时,值的类型必须与字段类型一致

  3. 除了数值类型,其他类型都必须用单/双引号括起来

  4. delete from 表名;删除表中所有记录,它的删除方式是逐行删除,表中有多少条记录,删除语句就会执行多少次;truncate table 表名;删除表中记录,它的删除方式是将整张表删除,然后构建一张与原来表结构相同的空表。

2.4 数据类型

2.4.1 数值类型

int:整数类型

double:小数类型

特殊的:salary double(n,m)

​ n:表示整数位和小数位一共最多有 n 位

​ m:表示小数位最多保留 m 位

​ 例如:salary double(6,2) 的最大值是 9999.99

2.4.2 日期和时间类型

datetime:时间戳,包含年月日时分秒,格式:yyyy-MM-dd HH:mm:ss

timestamp:时间戳,包含年月日时分秒,格式:yyyy-MM-dd HH:mm:ss

注:

  1. 如果某个字段的是类型是 timestamp,在我们给它赋值为 null 或者没有对它赋值时,系统会给它一个默认值,默认值是添加这条语句的时间或者是对它赋值为 null 时的时间。

  2. timestamp 类型字段值不可能是空值

2.4.3 字符串类型

​ varchar:

​ 例如:name varchar(20):表示姓名字段的值最大 20 个字符

2.5 查询

2.5.1 基础查询

查询所有:select * from 表名;

查询所有记录的指定字段:select 字段 1,字段 2,字段 3,... from 表名;

去重查询:select distinct 字段名 from 表名;

2.5.2 条件查询

在 where 关键字后加上条件,查询时会根据条件进行记录的筛选

1.逻辑运算符

  • &&、and

  • ||、or

2.关系运算符

  • " > "

  • " < "

  • " >= "

  • " <= "

  • " = "

  • " != “、” <> "

3.指定范围内

  • between … and …

例如:查询成绩在 80~100 之间的学生

select * from student where score between 80 and 100;

注:含头含尾

4.在指定列表中 in(值 1,值 2,值 3,…)

不在指定列表中 not in(值 1,值 2,值 3,…)

5.空和非空

  • 判断为空:is null

  • 判断非空:is not null

6.模糊查询

关键字:like

占位符:

  • _:单个任意字符

  • %:任意个任意字符

2.5.3 排序查询

关键字:order by

排序方法:

  • 升序:默认,asc

  • 降序:desc

// 降序排列员工的销售额,销售额相同时,根据工资升序排列

select * from emp order by sale desc,salary asc;

注:如果多个字段进行排序,只有第一字段的值相同时,才会执行第二字段的排序

格式:order by 字段 1 排序方式,字段 2 排序方式,…;

2.5.4 聚合函数

概念:将一列数据作为一个整体,然后进行纵向的计算

  • avg():计算平均值

  • sum():求和

  • max():求最大值

  • min():求最小值

  • count():求数量

注:

  • count() 的参数一般使用非空字段或者*

  • 聚合函数不计算 null 值

2.5.5 分组查询

关键字:group by

注:

  • 分组后查询的字段只能是:分组字段、聚合函数

  • where 和 having 的区别:

where 用在分组前进行条件筛选,如果不满足 where 的条件则不进入分组;having 用在分组后进行条件筛选,如果不满足 having 的条件则不被查询到

where 后不能跟聚合函数,having 后可以使用聚合函数进行分组后的条件筛选

2.5.6 分页查询

关键字:limit

语法:limit 开始索引,每页查询的记录数

注:索引从 0 开始

公式:开始索引 = (当前页码 - 1) * 每页查询的记录数

2.5.7 查询语句的结构

select:字段列表

from:表名

where:条件列表

group by:分组字段

having:分组后的条件

order by:排序字段 排序方式

limit:索引,记录数

2.5.8 起别名

可以为字段、表起别名

起别名的作用是能够区分多张表中的同名字段,并且简化了书写

格式:as 别名

注:as 可以省略

2.6 约束

概念:对表中数据进行限定

分类:

  • 非空约束:not null

  • 唯一约束:unique

  • 主键约束:primary key

  • 外键约束:foreign key

2.6.1 非空约束:not null

限定字段值不能为空

  • 创建表时,添加非空约束

create table 表名(字段名 字段类型 not null,字段名 字段类型 [约束],字段名 字段类 [约束]...);

  • 创建表后,添加非空约束

alter table 表名 modify 字段名 字段类型 not null;

注:已存在空值的字段不能被设置成非空

  • 删除非空约束(设置字段允许有空值)

alter table 表名 modify 字段名 字段类型;

2.6.2 唯一约束:unique

限定字段值不能有重复

  • 创建表时,添加唯一约束

create table 表名(字段名 字段类型 unique,字段名 字段类型 [约束],字段名 字段类 [约束]...);

  • 创建表后,添加唯一约束

alter table 表名 modify 字段名 字段类型 unique;

  • 删除唯一约束

alter table 表名 drop index 字段名;

注:

  1. 唯一约束的值可以是空值,并且允许存在多个 null 值

  2. 已经存在重复值的字段不能被设置成唯一的

  3. 一个字段可以同时被设置成非空且唯一的,并且非空和唯一的关键字的顺序是任意的

2.6.3 主键约束:primary key

一般主键不使用具有特殊含义的字段

特点:

  1. 非空且唯一

  2. 一张表中只能有一个主键字段

  3. 主键是表中记录的唯一标识

  • 创建表时,添加主键约束

create table 表名(字段名 字段类型 primary key,字段名 字段类型 [约束],字段名 字段类 [约束]...);

create table 表名(字段名 字段类型 [约束],字段名 字段类型 [约束],..., primary key(主键字段));

  • 创建表后,添加主键约束

alter table 表名 modify 字段名 字段类型 primary key;

  • 删除主键约束

alter table 表名 drop primary key;

注:删除主键约束后,主键仍有非空约束

主键自增长:

概念:如果某个字段是数值类型的主键字段,可以使用 auto_increment 来实现主键自增长

  • 创建表时,添加主键自增长

create table 表名(字段名 字段类型 primary key auto_increment,字段名 字段类型 [约束],字段名 字段类 [约束]...);

  • 创建表后,添加主键自增长

alter table 表名 modify 主键字段 字段类型 auto_increment;

  • 删除主键自增长

alter table 表名 modify 主键字段 字段类型;

  • 创建表后,添加主键约束的同时添加自增长

alter table 表名 modify 字段 字段类型 primary key auto_increment;

注:

  1. 能添加自增长功能的必须是主键字段

  2. 添加主键自增长的主键字段必须是数值类型的

  3. 第一条自增长的字段值是 1

  4. 从存在过的最大值开始 +1

  5. 如果存在过的最大值是小数,那么自增长的值是大于它的最小整数

2.6.4 外键约束:foreign key

外键让表与表之间产生了联系,保证了数据的完整性

注:从表外键的类型必须与主表主键的类型一致

  • 创建表时,添加外键约束

create table 表名(字段名 字段类型 [约束], 字段名 字段类型 [约束], ..., [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段));

  • 删除外键

alter table 表明 drop foreign key 外键名;

  • 创建表后,添加外键约束

alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段);

  • 创建表后,新建外键字段的同时,添加外键约束

alter table 表名 add 外键字段 字段类型, add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段);

级联操作:对主表中的记录进行更新和修改的同时,能直接影响从表中的记录

  • 创建从表时,添加级联操作

create table 表名(字段名 字段类型 [约束], 字段名 字段类型 [约束], ..., [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段) on delete cascade on update cascade);

  • 创建从表后,添加级联操作

alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段) on delete cascade on update cascade;

  • 创建从表后,新建外键字段,添加外键约束,并添加外键的级联操作

alter table 表名 add 外键字段 字段类型, add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段) on delete cascade on update cascade;

2.7 多表

2.7.1 表与表之间的关系

  • 一对一,例如:人和身份证、公司与注册地址、汽车与车牌号

  • 一对多(多对一),例如:部门和员工、商品和分类

  • 多对多,例如:学生和课程、商品和订单

2.7.2 多表建立连接

  • 一对一,在任意一方添加外键指向另一方的主键,外键要保证唯一

  • 一对多,在多的一方添加外键指向一的一方的主键

  • 多对多,需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为中间表的外键,分别指向两张主表的主键。为了保证中间表不会出现重复值,需要将这两个外键字段形成联合主键。

2.8 多表查询

2.8.1 交叉查询

语法:select 字段列表 from 表 1, 表 2;

交叉查询的结果是笛卡尔积,是多张表所有记录的组成情况

我们需要使用条件来去除无效的数据

2.8.2 内连接查询

在交叉查询的基础上使用 where 条件 去除无效的数据

语法:

  • 隐式内连接

select 字段列表 from 表 1, 表 2 where 条件;

  • 显式内连接

select 字段列表 from 表 1 inner join 表 2 on/where 条件;

注:inner 可以省略

内连接查询的结果是两表的交集

2.8.3 外连接

语法:

  • 左外连接

select 字段列表 from 表 1 left outer join 表 2 on 条件;

  • 右外连接

select 字段列表 from 表 1 right outer join 表 2 on 条件;

注:outer 可以省略

左外连接查询的结果是左表的全部和两表的交集

右外连接查询的结果是右表的全部和两表的交集

2.9 子查询

概念:将一条查询语句的结果作为另一条查询语句的表、记录、字段、条件


小结

数据库就是存储数据的仓库,可以实现数据的持久化存储,它的本质是文件系统。


今日份分享已结束,请大家多多包涵和指点!

用户头像

还未添加个人签名 2021.04.20 加入

Java工具与相关资料获取等WX: pfx950924(备注来源)

评论

发布
暂无评论
真实!MySQL数据库:喂,先别跑好吗?程序员:不跑你养我啊?