目录

前言

一、上节回顾

1.1 条件约束

1.2 数据更新与删除

1.3 数据排序

二、数据查询

2.1 模糊查询 -- like语句

2.2 去除重复内容 -- distinct

2.3 限制返回数据 -- limit

2.4 聚合函数

2.5 as别名

2.6 数据分组 -- group by

2.7 聚合筛选 -- having

2.8 子查询

三、多表之间的联系

3.1 一对一关系

3.2 一对多 / 多对一关系

3.3 多对多关系

四、多表连接

4.1 外键约束 -- foreign key

五、联合查询

5.1 内连接 -- inner join

5.2 左连接 -- left join

5.3 右连接 -- right join

5.4 同步更新与删除

总结


前言

从上一篇我们学习了MySQL数据表的增删改查操作以及约束,相信大家已经对单表操作有了初步的认识,这篇文章我们主要学习多表之间的关联操作,包括多表之间的联系、联合查询等内容,如果还不了解单表操作的小伙伴,可以翻到上一篇的博客来学习:点击此处链接

Let's do it ! ! !


一、上节回顾

在开始多表之前,我们先来回顾一下上节课学到的知识,这些内容非常重要,是后续学习的基础:

1.1 条件约束

约束的作用是保证数据库的完整性跟有效性,主要有五种:

约束类型 作用
NOT NULL 非空约束,数据不能为空
DEFAULT 默认值约束,给字段设置默认值,传值了就覆盖,没传值就用默认值
UNIQUE 唯一约束,数据不能重复
PRIMARY KEY 主键约束,唯一+非空
AUTO_INCREMENT 数据自增,只能加给主键

1.2 数据更新与删除

-- 更新数据
update 表名 set 字段名=值 where 条件;

-- 删除数据
delete from 表名 where 条件;


1.3 数据排序

  排序我们主要使用 order by 语句,默认是升序(asc),从大到小是降序(desc)

-- 按年龄升序排列
select * from stu order by age;

-- 按年龄降序排列
select * from stu order by age desc;

二、数据查询

这一部分我们在上节课的基础上进行更深入的讲解,包括模糊查询、去重、限制返回、聚合函数等高级用法。


2.1 模糊查询 -- like语句

我们在查询的时候,有时候不知道精确的值,只记得部分特征,这时候就可以用like语句来实现模糊查询。

通配符:

  • %:匹配0个或多个字符
  • _:匹配任意一个字符,一个下划线就代表一个字

使用示例:

假设有一张商品表item,里面有这些数据:

insert into item(name,price) values("box",5.0);

案例:

-- 找到商品名里有x这个字的商品
select * from item where name like "%x%";

-- 找到第三个字是x的商品
select * from item where name like "__x";

-- 价格里以88结尾的数据
select * from item where price like "%88";

-- 价格里以50开头的数据
select * from item where price like "50%";

2.2 去除重复内容 -- distinct

有的时候我们查询出来的数据有重复的,想去掉重复的部分,这时候就可以用distinct来实现。

-- 查看去重之后的名字
select distinct name from stu;

-- 查看去重后的年龄
select distinct age from stu;

注意:distinct是对查询结果进行去重,而不是删除表中重复的数据


2.3 限制返回数据 -- limit

有的时候我们不需要返回全部数据,只需要前几条或者指定范围的数据,这时候就可以用limit来实现。

-- 只要stu的前5条数据
select * from stu limit 5;

-- 从第3条数据开始的后3条数据(也就是456)
select * from stu limit 3,3;

-- 只要stu里的男学生数据前5条
select * from stu where sex = '男' limit 5;

这里的limit 3,3,第一个参数是起始位置(从0开始计数,但是一般从0我们可以省略不写),第二个参数是返回的条数


2.4 聚合函数

聚合函数就是用来计算的函数,主要有五个:

函数 作用
avg 平均值
max 最大值
min 最小值
sum 总和值
count 数据个数,NULL不算
-- 获取平均价格
select avg(price) from item;

-- 获取最高价格
select max(price) from item;

-- 获取最低价格
select min(price) from item;

-- 获取价格总和
select sum(price) from item;

-- 获取数据个数
select count(price) from item;

2.5 as别名

-- 获取平均值并取别名
select avg(price) as avg from item;

-- 获取最大值并取别名
select max(price) as "最大值" from item;

-- 获取数据个数并取别名
select count(price) as count from item;

注意:别名可以用as关键字,也可以直接用空格加别名,如果是中文别名需要加引号


2.6 数据分组 -- group by

-- 按照性别进行分组
select * from stu group by sex;

-- 查看分组后每个组的数据个数
select sex,count(sex) as number from stu group by sex;

-- 按照年龄分组,显示年龄和对应人数
select age,count(age) as number from stu group by age;

分组后的缺点:只能看到以组为单位的数据,不能直接查看组员的数据


2.7 聚合筛选 -- having

-- 查看性别人数大于5的分组
select sex,count(sex) as number from stu group by sex having number > 5;

-- 只查看年龄大于25岁的分组数据
select age,count(age) as number from stu group by age having age > 25;

分组前用where,分组后用having


2.8 子查询

-- 查看学生表里年龄最大的值
select max(age) from stu;

-- 获取年龄最大的人的所有数据
select * from stu where age = (select max(age) from stu);

-- 获取所有年龄大于30岁的男同学
select * from(select * from stu where sex='男') as 男同学 where age>30;

三、多表之间的联系

实际开发中,我们的数据通常不会只有一张表,而是多张表互相联系。


3.1 一对一关系

A表和B表的其中一条数据是一样的,两者可以基于这个数据进行交互。

举例:

  • 商品ID / 身份证号 / 学号
  • 学生信息表 [学号,学生名字,学生性别,学生专业]
  • 班级信息表 [班级ID,学号]

3.2 一对多 / 多对一关系

A表的一条数据可以对应B表的多条数据。

举例:

  • 宿舍和学生
  • 1楼有101、102、103、104、105、106六个宿舍
  • 101宿舍里有学生a、学生b、学生c

3.3 多对多关系

A表中的多条数据可以对应B表的多条数据。

举例:

  • 大学生选课
  • 多个学生可以选多个不同的课程

四、多表连接

多表连接时,要区分主表和从表,需要使用外键约束进行连接。


4.1 外键约束 -- foreign key

外键约束用于建立表与表之间的连接。

概念:

  • 主表:被外部连接的一方,需要有一个主键作为外部链接使用,需要先创建
  • 从表:外键约束连接的表,基于主表的核心主键数据而连接

语法:

foreign key(从表外键字段名) references 主表(字段名)

创建示例:

-- 主表 --> 商品表
create table shop_item(
s_id int primary key auto_increment,
name varchar(10),
price float(10,2)
);

-- 从表 --> 商品订单表
create table item_orders(
o_id int primary key auto_increment,
count int,
foreign key(s_id) references shop_item(s_id)
);

-- 给商品表加入商品数据
insert into shop_item(name,price) values
("金箍棒",80000),
("口罩",30.55),
("外星人电脑",10000),
("小米SU7",333333.33),
("冰红茶",3),
("铅笔",1),
("叉烧包",25.5);

注意:需要先创建主表再创建从表


五、联合查询


5.1 内连接 -- inner join

select * from 表1 inner join 表2 on 连接条件;

5.2 左连接 -- left join

select * from 表1 left join 表2 on 连接条件;

5.3 右连接 -- right join

select * from 表1 right join 表2 on 连接条件;

inner join:只返回有关系的数据
left/right join:主表优先,没有匹配显示NULL


5.4 同步更新与删除

-- 同步删除
on delete cascade

-- 同步更新
on update cascade

总结

这篇文章我们主要学习了MySQL多表操作的核心内容:

  • 数据查询高级用法:模糊查询、去重、limit、聚合函数、分组、having、子查询
  • 多表关系:一对一、一对多、多对多
  • 外键约束:主表与从表
  • 联合查询:inner join、left join、right join

建议:边看边敲SQL,效果更好。


如果这篇博客对你有帮助的话,可以点个赞支持一下。


每日励志文案:

先努力优秀,再大方拥有

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐