Python高级编程10:多表操作与联合查询
目录
前言
从上一篇我们学习了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,效果更好。
如果这篇博客对你有帮助的话,可以点个赞支持一下。
每日励志文案:
先努力优秀,再大方拥有
更多推荐


所有评论(0)