若有2个表

数据库表准备

category表

2025-10-16T08:06:40.png

dish表

2025-10-16T08:08:33.png

常见连接解释

左连接查询

左连接就是到时候会保留左边表的信息,不管最后满不满足表达式条件
比如 我们想查询套餐和菜品对应category(id)和dish(category_id)相同的数据
使用语句
select c.*,d.name from category c left join dish d on c.id=d.category_id;
这里就保留category的全部数据,即使对应多条dish表,也展示出来,dish不满住表达式,如果没有那么就是NULL;
结果如下:
2025-10-16T08:25:59.png

右连接查询

select c.*,d.name from category c right join dish d on c.id=d.category_id;
2025-10-16T08:29:48.png
这里查询出来全部都符合,可能就看不出右连接什么特点,这边就改下dish表的category_id数据字段为一个不存在的category表中的id
2025-10-16T08:33:13.png
2025-10-16T08:33:26.png
改为999以后,再来查询右连接的情况
2025-10-16T08:34:09.png
这边就可以看出保留了右边的表,左边的套餐不存在就是null;

内连接

这个就是交集的意思,值显示满足条件的数据,不会有null的情况
select c.*,d.name from category c inner join dish d on c.id=d.category_id;
2025-10-16T08:35:49.png

统计题

查询套餐对应菜品表中的数量,并且排序

这里因为需要查询套餐(category)中每一个套餐的数量,所以我们所以左连接保留左边的表(即使dish表没有对应的数据,那么左边所有套餐也显示出来)

select c.id,c.name,count(d.category_id) from category c left join dish d on c.id=d.category_id group by c.id;

步骤 1:执行 FROM 和 JOIN,获取原始数据集
首先执行 from category c left join dish d on c.id = d.category_id,这一步的作用是:
以 category 表(菜品分类表)为基础,左连接 dish 表(菜品表)。
连接条件是 c.id = d.category_id(分类 ID 匹配菜品所属的分类 ID)。

步骤 2:执行 GROUP BY,对数据分组
接着执行 group by c.id,作用是:
按 c.id(分类 ID)对 “步骤 1 的临时表” 进行分组。
每个组包含 c.id 相同的所有行(因为 c.id 是 category 表的主键,每个 c.id 对应唯一的分类,所以每个组本质上对应一个 “分类”)。

最后执行 select c.id, c.name, count(d.category_id) as dish_count,作用是:
从每个分组中提取需要的字段:
c.id:直接取分组的分类 ID(每个组唯一)。
c.name:取该分组对应的分类名称(因为 c.id 是主键,每个 c.id 对应唯一的 c.name,所以每个组中 c.name 相同,直接提取即可)。
count(d.category_id):统计每个分组中 d.category_id 非 NULL 的数量(即该分类下的菜品数量)。
2025-10-16T09:04:48.png
最后所有order by排序

select c.id,c.name,count(d.category_id) AS else_name from category c left join dish d on c.id=d.category_id group by c.id order by else_name desc;

2025-10-16T09:05:59.png