mysql入门

​​​​​​​​​​在这里插入图片描述
开局一张图数据全靠编

学习数据库我的大概流程是 分为6部分 接下来 也就分为 6个小节记录理解一下

1.数据库的概述

什么是数据库?

数据库是一种存储和管理数据的仓库

关系数据库的理解及数据库的种类

关系数据库指的是 数据库中的数据由多张表组成 表中的数据一一对应.

数据库的种类
在这里插入图片描述
数据库的安装:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自此数据库的安装就完成了接下来解析mysql 数据库的学习

安装好了数据库之后 我们要做的就是 连接数据库了 一般在开发中我们会应用数据库的管理工具来进行简化流程 数据库的管理工具有很多 像navicat,dbeaver
在这里插入图片描述
在这里插入图片描述
都是比较好用得数据库管理工具 (ps oracle 数据库有自身的数据库管理工具)
在这里插入图片描述
但是 上面的这个更好用 是idea 提供的一门专门来管理数据库的工具 DataGrip
在idea 中自动集成了 我们不需要下载 直接用就是了 这个数据库入门对初学者有很大的帮助 他提供了 智能检查代码功能 和 智能提示功能 让你报错的几率大大减少。这里就来 学习mysql 了
首先 打开idea 切换到 idea 右上角的database 上面

在这里插入图片描述
点击+号键
在这里插入图片描述
选择mysql 连接方式
在这里插入图片描述
填入数据库的账号和密码 (就是你安装的时候设置的账号密码)
点击ok 就建立好了和数据的连接 数据库好了我们就要在管理工具里面建立
数据库来方便我们操作
数据库管理工具连接之后是没有数据库的 我们需要再里面新建一个数据库

在这里插入图片描述
比如 可以在控制台上 输入sql 语句 这个就等于cmd 黑窗口
在这里插入图片描述
创建一个名为db2的数据库
在这里插入图片描述
执行
db2 数据库就创建成功了

在db2 中创建一种user表
在这里插入图片描述
数据库中就有了一张简单的表了 。

二.约束及数据类型

在这里插入图片描述

表中的数据是由一个一个数据组合而成的 数据有类型 数据有约束 学习建表之前 应该先了解一下其数据类型及其约束 这样才会让我们对表有更清晰的认知
数据类型
就像所有语言一样 数据库也有属于它自身的数据类型
sql 语言数据类型主要分三种 分别是1.数值类型 2.常用字符串类型(ps 没写全)3.日期数据类型
数值类型
在这里插入图片描述
主要说下 tinyint 范围是-128到 127 这个相当于 java中的byte tinyint 在数据库中经常和singed一起使用 表示无符号的 无符号就是没有负号 不为负数 一般用在 分类上 男女分类 职位分类 等等 如果没有
tinyint 就只能用更大范围的数据类型了 总之使用tinyint 在特定场景下可以使我们节省内存 并且提高运行效率。
int 相当于java中的int类型
decimal (m,d) m 代表着小数加左边的整数的总的个数 d 代表着小数位数

decimal(5,2) 5代表代表着 小数加整数就是5位 2表示小数的位数。

常用字符类型
在这里插入图片描述
vachar 是最常用的字符串类型 vachar(数值)可以指定字符串的长度 非常好用 变长字符串
char 定长字符串 字符串长度是固定了的像 char(11)表示电话号码。
TEXT 这个好像常用 一般定义前端的纯文本 像 描述这个字段 就是用这个
BLOB 表示存放二进制数据 像视频 声音就用这个类型来定义。

日期时间类型
在这里插入图片描述
date 类型 年月日
time 时分秒
DATETIME 年月日 时分秒 常用(updateTime,createTime)
Timestamp 时间戳 从1970开始

约束
约束 是作用与表中字段的规则 由于限制存储在表中的数据.

目的:保证数据库数据的正确,有效性和完整性。

约束分为:
在这里插入图片描述
唯一约束 表示一列数据 中每个数据都是唯一的不重复 像身份证 primary key
主键约束 表示一行被约束的字段是唯一的并且不能为null 主键约束 一般在一张表设计的时候 主键是一定要存在的这个是三大范式中的一种 一般来说一张表没有主键就如同人没有身份证 那么这张表则毫无意义
默认约束 字段加上约束之后 有初始化值 像 默认为男 默认为0 (不知道有没有默认为null)
外键约束 用来绑定表与表之间的连接 维护数据的一致性和完整性 很重要
举个例子:
建个表 将这些约束都用上
在这里插入图片描述
上面 id 是主键约束 必须存在
usename 游戏名 必须唯一 唯一约束 你玩游戏的时候也是这样 名字不能一模一样
性别 玩游戏的男生比较多 默认为男
年龄 非null 年龄 每个人都有 小孩子都有。不能为null 也不能为负数
外键忘记设计了 外键一般是存在多表之间的 就搞个工会吧 工会和玩家之间的关系 一对多 外键约束可以搞起(搞了一会没搞出来)

三.基础语法

对mysql 操作 有一门专门的语言 那就是sql 学习mysql 就是学习sql 我们可以通过sql 对mysql 数据库进行增删改查的操作。
![在这里插入图片描述](https://img-blog.csdnimg.cn/95a067578f55462ea21309ca9f116700.pn

  • sql 的基础语法 可以分为 DDL DML DCL DQL
    在这里插入图片描述
    DDL 用于对数据库来或者表来进行操作 DDL为了方便记忆 我把他划分常用的几个 create show use drop

create database db1 创建一个数据库名称为db1的数据库
show 显示 数据库或者表
在这里插入图片描述

shows database 显示所有数据库
use 切换数据库或者表 或者说 你想用那个数据库或者表的时候就用use就行了
drop 删除命令 可以删除 数据库 或者数据库中的表
after 改变表的结构 加字段 加约束。
在这里插入图片描述
DML语句 :
什么是DML语句 DML是数据操作语言 用来对数据表的数据进行增删改

DML语句的基本用法

insert into 表中添加数据
update 修改表中的数据
delete 删除表中数据
案例走起:
创建一个没有数据的空表格

学生表
在这里插入图片描述
现在没数据的.
在这里插入图片描述
先来添加一条数据
在这里插入图片描述
在这里插入图片描述
添加多条数据 用values
在这里插入图片描述
结果:
在这里插入图片描述
修改某条数据
将张三的年龄改成20岁
在这里插入图片描述
在这里插入图片描述
修改一个字段中的所有数据 (开发中不建议这么做会被干掉)sql语句执行之前都会给警告 爆黄色警告
将性别全部改成1

在这里插入图片描述
delete
和上面一样要带上where条件 不带上条件将删除整个列
先删除一行
在这里插入图片描述
在这里插入图片描述
李四被干掉了

如果不带条件呢? 就变成删除表中所有的数据了 这个让我想起了删除表格 因该用 用
drop table student; 都是3个单词
在这里插入图片描述
DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。
意思就是只能删除一行或者多行。

(重点)DQL语句

在这里插入图片描述

在这里插入图片描述
首先学习DQL从单表查询开始:
单表查询分为五种:
1.基本查询
2.条件查询
3.分组查询(和聚合函数一起学习)
4 排序查询
5.分页查询
这就是查询 当上面所有因素都存在的情况下会发生的情况 也就是他们的执行权限 执行步骤

在这里插入图片描述
1基本排序
查询 学生表中的 多个字段

在这里插入图片描述
查询 员工表中的所有字段
在这里插入图片描述
注意 在开发中 不建议频繁的使用使用(*)因为会影响数据库查询性能。

去除重复记录(一个小技巧应当注意)
在这里插入图片描述
好像可以当分类用
在这里插入图片描述
关于起别名:
给字段起别名 用 as 可以省略 给字段取别名 更多的是为了更好显示阅读。
在这里插入图片描述

给表取别名 也是用as 可以省略 给表取别名 更多的时候是为了后面的再次使用 常见与多表查询中
在这里插入图片描述
2.条件查询(常用基础)

条件查询用where 关键字来标识 条件查询的条件是用比较运算符和逻辑运算符来完成的。
比较运算符
在这里插入图片描述
逻辑运算符
在这里插入图片描述
在这里插入图片描述
上面场景的 大于小于 等于 不等于是属于简单的条件运算符 和java中使用的方式基本一致 就不过多叙述。可以记录下 不常见或者说mysql特有关键字是什么作用。
is null 和 is not null 在数据库中空的概念很简单 空为啥不能选择0 在我们的认知里面 null 不是就是0么 但是在数据库 认为Null 不能为0 因为 0有时候是可以表示某些数据的 像 0和1 表示二进制
性别字段 用 0 和 1 表示 状态字段用 0和1表示 如果你设置了为0 就会概念上有冲突 所以为了 方便
很多语言上都有 null 这概念。
is null 是Null is not null

查询出工作为Null的字段

在这里插入图片描述
查询出工作非空的 字段
在这里插入图片描述
between and 两者什么什么之间 可以用在一个字段上 截取字段上一部分符合条件的数据
比如像 时间截取符合时间内的数据。
查询出入职时间在 2001-01-01 到2010-01-01之间的员工

在这里插入图片描述
关于 between and 后面还可接 and 表示还可以继续添加条件 一个and 表示一个条件
比如查询出入职时间在 2001-01-01 到2010-01-01之间 并且 性别为男的 员工
在这里插入图片描述
in()
in 有条件表示 几个条件值 一般里面放的 是单个字段具体的值 比如in(2,3,4) 用工作字段来表示
在这里插入图片描述
查询出来的 数据全部都是 要么是2 要么是3 要么是4 最少符合一个。
模糊查询 like
模糊查询也是常用的 像百度你在查询某些资料的同时是不是也是查询出了某些你不要的数据 模糊查询是这样的 当你不记得完整的条件了 就可以用模糊查询 像你不记得某个人的名字了 就可以用模糊查询一下试试 再返回结果里面 看看能不能找出你要找的信息。
模糊查询 用 like 关键字标识
案例: 查询出姓张的所有人的资料
在这里插入图片描述
like 可以和两个符号通用一个是% 一个是_ 都表示模糊
%表示后面随便几个 只要符合条件就行 _下划线表示站位符 一个_下划线一个字符 他们之间的关系
%(多个)模糊一些 _(一个)更精确一些
在这里插入图片描述
用站位符查询出来的结果就没有 因为占位符表示的是一位 那么我们的要求就是查询出两个字符的名字 在数据库中没有 如果是% 只要姓张的 就全部查询出来 不管你是几位的 3位 4为 5为 只要有就统统查询出来。

聚合函数
在这里插入图片描述
聚合函数是对一列数据 来进行运算的 函数 比如就一列有多少个 一列中最大值 一列中最小值
一列中的平均值 求和等等
注意得点 一 聚合函数 的书写语法是写在字段 前面的像
在这里插入图片描述
有趣的是聚合函数里面的字段 都是有类型的 看看上面的 什么计数 什么最大值 最小值 求平均值 求和
本以为 只能对数值进行操作 就本着好玩的心态试了一下 如果 我们对字符串类型的数据进行求平均值会爆错么?

对名字求平均值 (这个在现实生活中应该没有吧 没有作业叫你对名字求平均值吧)

在这里插入图片描述
有结果 没错误。
刚刚上面 名字是中文 所以显示的是0 如果 我们换成 username 字段呢? 里面全是英文字符
在这里插入图片描述
答案是也没有
在这里插入图片描述
换个函数 max 就有了
在这里插入图片描述
可以自己试试 就到这

在说下一个小细节 关于count的 count 用来统计一列中有多少行 常用来统计 一个数据中有多少行
但是有个细节可以说下 count()是统计表中的行数 count(字段也是统计字段的行数) 它们一般情况下统计出来的结果事相等的 但是有一种是意外的 count()会统计表中列的长度 他会统计包括为字段为null的数据
在这里插入图片描述
这个数据为17 说明表中有17行数据

在这里插入图片描述
这个工作中有一个是null的 所以没有统计到 会造成数据的遗漏 注意下。

聚合函数 可以对任何地方的字段进行统计 可以在查询语句的前半部分 可以在查询语句中的 having 中 具体看你怎么用。

3.分组查询
分组查询在数据库中很常见 分组查询我觉都可以理解为 分类查询 像 我对查询出来的结果还是不满意 想分下类 就可以用分组查询 group by 像对查询出来的结果可以分为 男 和 女 对查询出来的结果职位可以继续分类 那么在数据库中 数据就会很规范的显示 看的很清晰 不会 这里一个 那里一个 有点乱的感觉。

select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];

where和having的区别

执行时机不同:where在分组之前就已经执行了 而having则在 分组之后执行
执行条件不同 where不能对聚合函数就行 判断 而having 则可以

group by 之后 查询的字段一般为聚合函数和分组字段 查询其余的字段毫无意义。
例子
A. 根据性别分组 , 统计男性和女性员工的数量

分析 条件 筛选有用数据 性别分组(group by)统计数量(count*)

这种分组分类的条件 我们一般可以这样思考需要将 这个字段所有的数据全部查询 出来 再来分组
select gender count(*) from emp groub by gender;
在这里插入图片描述
你既然要分组一般都要显示出来。一般分组的数据都要显示出来 要不那将毫无意义。

在这里插入图片描述
感觉这些查询中就分组查询最难 其余的都好理解 从上面两个例子 可以看出 我们的分组查询都跟上了
count(*) 如果我不带上这个count * 呢?
在这里插入图片描述
可以看出数据 分组出来好像没啥意义 我们只知道了其 具体分了两组 其余的什么信息都没有 所以一般都要带上聚合函数来一起统计一下 分类之后的 平均值 最大值 个数之类的 暂时就怎么理解

在这里插入图片描述
从上面的结果我们可以看出 job里面的数值是1或者2 我们并不能清晰的显示出来具体的职位到底是什么 有没有更简单显示方法呢?有 if函数
在这里插入图片描述
if主要用在字段上 当一个字有两个选择时 可以用if 有点像java中的三元运算符 只有两种结果。当我们
分类的时候用到了多种结果的时候就三元运算符就不好用了 就变成了case when then 可以给字段字段属性去别名 可以这样理解 字段取别名 用 as 表名取别名用 as 字段中的属性 取别名 用 if和 case
if和case when then end 这两个函数可以理解为字段里面的属性取别名。

在这里插入图片描述
case 函数需要注意的几点 首先需要用()包起来 括号中要有 end结尾
if是在括号外面的。 一个在外面一个在里面。
4.排序查询

select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;

排序查询意思就是对最后得到的结果进行排序 排序分为 升序和降序 用order by 关键字来表示
升序 ASC
降序 DESC

例子根据 入职时间 对公司的员工进行升序排序
在这里插入图片描述
升序 数据库默认的就是升序 可以不写 asc 只要有order by就好

在这里插入图片描述
降序。

排序还有一个点就是 有两个以上的 排序条件 如果出现这样的情况 是先要排序第一个 在第一个条件分辨不出来的情况下 在进行第二个 条件排序 比如 第一次排序按时间排序 得出的结果 时间是一样的
我们就可以对同样时间进行再一次的排序
在这里插入图片描述
先降序 降序中结果一样的时间 在进行升序排序 注意 第二次排序的数据只是涉及到第一次 无法排序出来 结果一样的才会 进行下面的第二次 排序 第一次排序出来的结果 不参与第二次排序。

5.分页查询
分页查询 基本都是放在最后 将数据返回到前端去显示

分页查询对应着前端的分页功能 前端有分页 才会有分页查询 要不就不会有分页查询。

分页查询 用关键字 limit 来表示分页 格式

select 字段列表 from 表名 limit 起始索引, 查询记录数 ;

这里有个公式 计算起始索引的公式 起始索引(要展示的页面-1)* 每页展示页面的数量

举个例子 比如 你有100条数据 前端 需要跳转到 5页 每页显示10 条数据 那起始索引就是 (5-1)*10
40
代码实现一下(ps我没有100条数据)

在这里插入图片描述
显示的是第二页的数据
在这里插入图片描述
总数 没错。
细节 当你要显示第一页的时候 可以不写起始数据
在这里插入图片描述

四.多表

在这里插入图片描述
多表之间的学习操作操作分为

  1. 表与表之间的关系 要学习多表 就要认识表与表之间的关系 在前面我们学习得都是单表 之间的查询 现在要查询多个表 要查询多个表 就要先学习一下 表与表之间的关系 为啥表与表之间会有关系呢?
    因为在项目开发中 在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
  • 一对多
  • 一对一
  • 多对多
    首先来让我们看一个案例:
    需求:准备两个表 分别是员工表 和部门表
    部门表sql:
    – 部门管理
    create table dept(
    id int unsigned primary key auto_increment comment ‘主键ID’,
    name varchar(10) not null unique comment ‘部门名称’,
    create_time datetime not null comment ‘创建时间’,
    update_time datetime not null comment ‘修改时间’
    ) comment ‘部门表’;

insert into dept (id, name, create_time, update_time) values
(1,‘学工部’,now(),now()),(2,‘教研部’,now(),now()),(3,‘咨询部’,now(),now()),
(4,‘就业部’,now(),now()),(5,‘人事部’,now(),now());
--------------------------------------华丽的分割线----------------------------------------------
员工表
– 员工管理(带约束)
create table emp (
id int unsigned primary key auto_increment comment ‘ID’,
username varchar(20) not null unique comment ‘用户名’,
password varchar(32) default ‘123456’ comment ‘密码’,
name varchar(10) not null comment ‘姓名’,
gender tinyint unsigned not null comment ‘性别, 说明: 1 男, 2 女’,
image varchar(300) comment ‘图像’,
job tinyint unsigned comment ‘职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师’,
entrydate date comment ‘入职时间’,
dept_id int unsigned comment ‘部门ID’,
create_time datetime not null comment ‘创建时间’,
update_time datetime not null comment ‘修改时间’
) comment=‘员工表’;

INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
(1,‘jinyong’,‘123456’,‘金庸’,1,‘1.jpg’,4,‘2000-01-01’,2,now(),now()),
(2,‘zhangwuji’,‘123456’,‘张无忌’,1,‘2.jpg’,2,‘2015-01-01’,2,now(),now()),
(3,‘yangxiao’,‘123456’,‘杨逍’,1,‘3.jpg’,2,‘2008-05-01’,2,now(),now()),
(4,‘weiyixiao’,‘123456’,‘韦一笑’,1,‘4.jpg’,2,‘2007-01-01’,2,now(),now()),
(5,‘changyuchun’,‘123456’,‘常遇春’,1,‘5.jpg’,2,‘2012-12-05’,2,now(),now()),
(6,‘xiaozhao’,‘123456’,‘小昭’,2,‘6.jpg’,3,‘2013-09-05’,1,now(),now()),
(7,‘jixiaofu’,‘123456’,‘纪晓芙’,2,‘7.jpg’,1,‘2005-08-01’,1,now(),now()),
(8,‘zhouzhiruo’,‘123456’,‘周芷若’,2,‘8.jpg’,1,‘2014-11-09’,1,now(),now()),
(9,‘dingminjun’,‘123456’,‘丁敏君’,2,‘9.jpg’,1,‘2011-03-11’,1,now(),now()),
(10,‘zhaomin’,‘123456’,‘赵敏’,2,‘10.jpg’,1,‘2013-09-05’,1,now(),now()),
(11,‘luzhangke’,‘123456’,‘鹿杖客’,1,‘11.jpg’,5,‘2007-02-01’,3,now(),now()),
(12,‘hebiweng’,‘123456’,‘鹤笔翁’,1,‘12.jpg’,5,‘2008-08-18’,3,now(),now()),
(13,‘fangdongbai’,‘123456’,‘方东白’,1,‘13.jpg’,5,‘2012-11-01’,3,now(),now()),
(14,‘zhangsanfeng’,‘123456’,‘张三丰’,1,‘14.jpg’,2,‘2002-08-01’,2,now(),now()),
(15,‘yulianzhou’,‘123456’,‘俞莲舟’,1,‘15.jpg’,2,‘2011-05-01’,2,now(),now()),
(16,‘songyuanqiao’,‘123456’,‘宋远桥’,1,‘16.jpg’,2,‘2010-01-01’,2,now(),now()),
(17,‘chenyouliang’,‘123456’,‘陈友谅’,1,‘17.jpg’,NULL,‘2015-03-21’,NULL,now(),now());

执行完毕生成 员工表和部门表
在这里插入图片描述
此时,我们看到员工表中有五个员工都归属于 1 号部门(学工部),而我们在数据库中是可以直接删除1号部门的,删除之后的情况为:
在这里插入图片描述
部门表中的数据id为1的数据已经删除了 但是看 员工表中的数据 还在 在现实中逻辑是 我部门都没了
那你肯定没有员工 但是员工表中竟然有 部门数据 这样就照成了数据的冗余 数据的维护没有达到一致性
在这里插入图片描述
这样 表与表之间的一个部门对应多个员工之间的关系的 这种我们称之为 一对多 维护两张表数据的统一意见两张表之间的一致性 我们就出现了 外键这个方案这个解决方案 需要再 从表中 主表id 的字段上加个外键约束 就可以达到数据的统一
让我们来把表个删除下重新生成一下两个表 加上外键约束 看看这个外键约束有什么效果
在这里插入图片描述
删除 部门表的 学工部报错 无法删除
删除 员工表 dept_id 等于1的第一行数据
在这里插入图片描述
看下结果如何
在这里插入图片描述
从上面看出 没删除前数据有五条数据 删除后 有4条数据 删除成功
那这样怎么体现一对多的关系呢? 一对多我的理解 就是 只要你从表中被约束的字段还有数据 主表中的数据就不能 删除 这样就体现了 一对多的关系 只要有 一条数据 主表字段就不会删除 问题 那我们怎么删除主表中的部门呢?其实在现实生活中 也是 等员工没了 部门才没有的 那我们在 数据中试试 两张表的结构是不是这样的 部门删除不了 我们先把这个部门的员工干掉 干掉员工之后 在 来删除部门在这里插入图片描述
这个id为1的员工 已经全部被干掉了 接下来试试 删除部门对应的id=1 的那一列 试试能不能删除
在这里插入图片描述
删除成功
这就是表与表之间一对多的关系
在这要说明一下:物理外键和逻辑外键
物理外键 就是看的见的外键 两个表之间明确存在着有约束关系 并且用约束绑定在一起的 这就是物理外键。
逻辑外键 就是看不到的 但是我们程序员都知道的 怎么分辨呢? 其实我们在开发中一般用得都是逻辑外键 我们看到了像上面那种 带有别的表.id 这就一般表示这就是存在逻辑外键 我们并不会给这个外键一个存在的外键 我们看到了就会认为这个表和别的表存在着一对多或者多对多 或一对一关系
因为物理外键缺点比较明显:
在这里插入图片描述

接下来在来看下 在数据库中表与表之间的关系之一对一 一对一是怎么来维护两个表之间的关系的呢?
一对一之间的关系举个例子(栗子)
用户有用户详情:
关系:一对一关系
准备sql:
create table tb_user(
id int auto_increment primary key comment ‘主键ID’,
name varchar(10) comment ‘姓名’,
age int comment ‘年龄’,
gender char(1) comment ‘1: 男 , 2: 女’,
phone char(11) comment ‘手机号’
) comment ‘用户基本信息表’;

create table tb_user_edu(
id int auto_increment primary key comment ‘主键ID’,
degree varchar(20) comment ‘学历’,
major varchar(50) comment ‘专业’,
primaryschool varchar(50) comment ‘小学’,
middleschool varchar(50) comment ‘中学’,
university varchar(50) comment ‘大学’,
userid int unique comment ‘用户ID’,
constraint fk_userid foreign key (userid) references tb_user(id)
) comment ‘用户教育信息表’;

insert into tb_user(id, name, age, gender, phone) values
(null,‘黄渤’,45,‘1’,‘18800001111’),
(null,‘冰冰’,35,‘2’,‘18800002222’),
(null,‘码云’,55,‘1’,‘18800008888’),
(null,‘李彦宏’,50,‘1’,‘18800009999’);

insert into tb_user_edu(id, degree, major, primaryschool, middleschool, university, userid) values
(null,‘本科’,‘舞蹈’,‘静安区第一小学’,‘静安区第一中学’,‘北京舞蹈学院’,1),
(null,‘硕士’,‘表演’,‘朝阳区第一小学’,‘朝阳区第一中学’,‘北京电影学院’,2),
(null,‘本科’,‘英语’,‘杭州市第一小学’,‘杭州市第一中学’,‘杭州师范大学’,3),
(null,‘本科’,‘应用数学’,‘阳泉第一小学’,‘阳泉区第一中学’,‘清华大学’,4);

得到两张表
用户详情表
在这里插入图片描述
用户表
在这里插入图片描述

两张表 都是4条数据 由于我们 用户表中的第一行数据 也就是黄渤的数据 和 用户详情表的数据 的第一行就是 黄渤本人的详细信息 那咋样 怎么来来维护 这两张表之间的一对一的关系呢? 在正常逻辑下我们删除了一种用户表就得删除一张其对应的详情表 在上面我们说过 维护关系我们都是利用外键来维护的 所以我们需要把外键用上 又说过 外键分为逻辑外键和物理外键 物理外键在开发中不常用
不好用 那我们只能用逻辑外键了 其中的数据由我们程序员来维护 我们只需要在其中一张表之中建立一个另外表的主键作为字段 我们就认为两个表之间就具有 关系 我们在对表进行数据进行修改时 就得把两个表中的数据一同修改 保持数据的一致性。(不能用物理外键 感觉有点麻烦,想要一个spring)

总结:一对一的实现 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
设置外键我唯一是为了 一对一 如果不是唯一 会出现一对二的情况 那就变成了一对多

多对多
案例: 学生与课程之间的关系
● 关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择
● 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

在这里插入图片描述

![create table student(
id int auto_increment primary key comment ‘主键ID’,
name varchar(10) comment ‘姓名’,
no varchar(10) comment ‘学号’
) comment ‘学生表’;
insert into student values (null, ‘黛绮丝’, ‘2000100101’),(null, ‘谢逊’, ‘2000100102’),(null, ‘殷天正’, ‘2000100103’),(null, ‘韦一笑’, ‘2000100104’);

create table course(
id int auto_increment primary key comment ‘主键ID’,
name varchar(10) comment ‘课程名称’
) comment ‘课程表’;
insert into course values (null, ‘Java’), (null, ‘PHP’), (null , ‘MySQL’) , (null, ‘Hadoop’);

create table student_course(
id int auto_increment comment ‘主键’ primary key,
studentid int not null comment ‘学生ID’,
courseid int not null comment ‘课程ID’,
constraint fk_courseid foreign key (courseid) references course (id),
constraint fk_studentid foreign key (studentid) references student (id)
)comment ‘学生课程中间表’;

insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);](https://img-blog.csdnimg.cn/6b19217a73a349e28877d59010a1eb2c.png)

从上述的图片中就可以看到 我们维护表与表之间多对多关系 是通过中间表来维护的 一般我们看到这种简单的表格就知道两个表格之间是存在多对多关系的
具体怎么操作呢?
直接修改中间表就行了 其余两个表无需改变
在这里插入图片描述
(重点)多表查询

在这里插入图片描述
在正常的业务中 工作我们大部分写的都是 查询 语句 所以查询很重要
先来个案例
– 部门管理
create table dept(
id int unsigned primary key auto_increment comment ‘主键ID’,
name varchar(10) not null unique comment ‘部门名称’,
create_time datetime not null comment ‘创建时间’,
update_time datetime not null comment ‘修改时间’
) comment ‘部门表’;

insert into dept (id, name, create_time, update_time) values(1,‘学工部’,now(),now()),(2,‘教研部’,now(),now()),(3,‘咨询部’,now(),now()), (4,‘就业部’,now(),now()),(5,‘人事部’,now(),now());

– 员工管理(带约束)
create table emp (
id int unsigned primary key auto_increment comment ‘ID’,
username varchar(20) not null unique comment ‘用户名’,
password varchar(32) default ‘123456’ comment ‘密码’,
name varchar(10) not null comment ‘姓名’,
gender tinyint unsigned not null comment ‘性别, 说明: 1 男, 2 女’,
image varchar(300) comment ‘图像’,
job tinyint unsigned comment ‘职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师’,
entrydate date comment ‘入职时间’,
dept_id int unsigned comment ‘部门ID’,
create_time datetime not null comment ‘创建时间’,
update_time datetime not null comment ‘修改时间’
) comment=‘员工表’;

INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
(1,‘jinyong’,‘123456’,‘金庸’,1,‘1.jpg’,4,‘2000-01-01’,2,now(),now()),
(2,‘zhangwuji’,‘123456’,‘张无忌’,1,‘2.jpg’,2,‘2015-01-01’,2,now(),now()),
(3,‘yangxiao’,‘123456’,‘杨逍’,1,‘3.jpg’,2,‘2008-05-01’,2,now(),now()),
(4,‘weiyixiao’,‘123456’,‘韦一笑’,1,‘4.jpg’,2,‘2007-01-01’,2,now(),now()),
(5,‘changyuchun’,‘123456’,‘常遇春’,1,‘5.jpg’,2,‘2012-12-05’,2,now(),now()),
(6,‘xiaozhao’,‘123456’,‘小昭’,2,‘6.jpg’,3,‘2013-09-05’,1,now(),now()),
(7,‘jixiaofu’,‘123456’,‘纪晓芙’,2,‘7.jpg’,1,‘2005-08-01’,1,now(),now()),
(8,‘zhouzhiruo’,‘123456’,‘周芷若’,2,‘8.jpg’,1,‘2014-11-09’,1,now(),now()),
(9,‘dingminjun’,‘123456’,‘丁敏君’,2,‘9.jpg’,1,‘2011-03-11’,1,now(),now()),
(10,‘zhaomin’,‘123456’,‘赵敏’,2,‘10.jpg’,1,‘2013-09-05’,1,now(),now()),
(11,‘luzhangke’,‘123456’,‘鹿杖客’,1,‘11.jpg’,5,‘2007-02-01’,3,now(),now()),
(12,‘hebiweng’,‘123456’,‘鹤笔翁’,1,‘12.jpg’,5,‘2008-08-18’,3,now(),now()),
(13,‘fangdongbai’,‘123456’,‘方东白’,1,‘13.jpg’,5,‘2012-11-01’,3,now(),now()),
(14,‘zhangsanfeng’,‘123456’,‘张三丰’,1,‘14.jpg’,2,‘2002-08-01’,2,now(),now()),
(15,‘yulianzhou’,‘123456’,‘俞莲舟’,1,‘15.jpg’,2,‘2011-05-01’,2,now(),now()),
(16,‘songyuanqiao’,‘123456’,‘宋远桥’,1,‘16.jpg’,2,‘2007-01-01’,2,now(),now()),
(17,‘chenyouliang’,‘123456’,‘陈友谅’,1,‘17.jpg’,NULL,‘2015-03-21’,NULL,now(),now());
导入两个表 并插入数据。
![在这里插入图片描述](https://img-blog.csdnimg.cn/c3c7c1c504784717a588060b16841893.png
在这里插入图片描述

在这里插入图片描述
大概是这样
上面的是17条数据 下面的5条数据 如果我们要查询 出两张表的数据呢?
查询下试试
在这里插入图片描述
查询出来 85条数据 仔细看一下 员工表 有17条 数据 部门表有5条 数据 我们查询出 85条数据 那不就是 两张表之间的乘积么 这就是 笛卡尔积
在思考一下 我们查询两张表是为了什么 仔细想想是不是这两张表是不是有关系 他们的数据维护要得到统一 没关系我一起查干嘛 单独单独 的查询不爽么? 表与表之间 从上面我们可以得知 有各种关系
一对多 多对一 多对多 从表名分析一下 员工表 部门表 这是一张典型的一对多关系 一对多关系
我们是怎么来怎么来维护其中的关系的呢?

外键 我们是通过外键来维护两张表与表之间的关系的.外键分为逻辑外键和物理外键 物理外键在开发中我们怎么用 一般都用逻辑外键 建立一个主表的主键id字段 就表示 两张表之间的关系了。
在这里插入图片描述
主表中有五个部门 从表中有17个人
在这里插入图片描述
表与表之间是由一对多关系的 主表中的id 数据对应着 从表中的 dept_id字段 但是从表中的17个人中有一个dept_id 是为null 的而主表的中id 主键 是没有空这个属性的 所以他们的数据是没有关系
一般来说我们要是要查询出有关联关系的数据 才来查 而没关系的数据 我们用统一维护
所以说 怎么查 sql语句怎么写
select * from dept d,emp e where e.dept_id=d.id;
在这里插入图片描述
查出来的数据只有16条 两张表合成了一张表 这就是我们需要的答案 而不是上面的那种 85种答案
每个员工在每个部门都有职位 这样是不合逻辑的 。

内连接和外连接
什么是内连接 首先连接是发生在两个表之间的 内连接表示的就是 两个表 之间有关系的部分 也就是上面说的那16条数据 就是隐式内连接
内连接分为两种 显示内连接和隐式内连接 两种写法的结果都一样 但是写法不同 显示内连接可读性更好一些 (推荐使用这种)
显示内连接 和隐式内连接的区别?
它们的结果度都一样为啥还要分两种写法
隐式内连接 写法简单 但是 在连接多表的时候变的很困难 可读性 可维护性很差
隐式内连接 写法稍难一点 但是 在进行两张表以上的情况下 连接更加的方便 可读写 可维护性更强一些。(推荐)
在这里插入图片描述
外连接
什么是外连接 外连接的作用

内连接查询的是 两个表中关联的数据 外连接查询的是两个表关联的数据在加上一个 主表数据 或者从表数据。 这就是外连接
左外连接 = 内连接数据+左表中的数据(一般是从表 不知道是不是和你写表的顺序有关)
右外连接 = 内连接数据+右边中的数据
以上面的数据为例子 进行左外连接查询
在这里插入图片描述
比较一下 内连接和 外连接的 数据的查询 左外连接 将 没有关联的数据页查询出来了 从表中的数据不会是每一条数据都和主表中的数据相同的 有时候我们用了内连接会 只是显示两表之间有关系的数据
这样会让人感觉不数据不全 的感觉 这时我们就需要 看一下 关联和不关联之间的 区别了 这时候就用到了左外连接
右外连接 一样的
select 字段列表 from 表1 right [ outer ] join 表2 on 条件 … ;
在这里插入图片描述
显示 的是右表中关联的数据 表中两个null 就是 对应就是 右表 关联 那两个id 没有

子查询
什么是子查询
selcect语句中嵌套select语句成为嵌套查询,又被称为子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部嵌套的语句可以是insert /update/delete/select的任何一个。

根据结果不同,分为
1.标量子查询(子查询结果为单个)
2.列子查询(子查询结果为一列)
3.行子查询(子查询结果为一行)
4.表子查询(子查询结果为一个表格)


根据子查询的位置分为
1.where之后
2. FROM之后
3. SELECT之后
子查询都是放在后面 基本

A. 查询 “教研部” 的所有员工信息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
案例
在这里插入图片描述
列子查询
列子查询的结果可以是一列(可以是多行这种查询结果成为列子查询)
常用的操作符 in not in
在这里插入图片描述
其实仔细想想 这个子查询 有点像连表的 内连接 外连接 查询 这里没有笛卡尔效应罢了。
一步一步来。

行子查询

常用的操作符:= 、<> 、IN 、NOT IN

案例

A. 查询与 “韦一笑” 的入职日期 及 职位都相同的员工信息 ;

-先查询韦一笑的入职日期 和 职位是什么 在连表查询 员工信息
在这里插入图片描述
第一步我写的都没有问题 第二步老是差点写出来。

表子查询:
子查询的结果是多行多列 常做为零时表 这种查询称为表子查询。
常用的运算符in

A. 查询入职日期是 “2006-01-01” 之后的员工信息 , 及其部门信息

仔细分析一下 这个得出的结果 要两个表中的数据 一个是员工表 一个是部门表

这时候就要想到 外连接了

第一步 查循出 入职日期在 2006-01-01之前的员工有多少 在连接表查询

在这里插入图片描述
不熟悉 不会

通过上面的案例发现 我们多表查询 基本就是 子查询了 其中的表子查询 更是子查询中的一种

在这里好像忘记 记录下老师说的写多表查询的流程了
重要

  1. 先确定要 查询的几张表
  2. 查询的条件是什么 (主键id = 主键表名.id)(常用)加上其他条件
  3. 确定返回的结果是什么 最后写
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值