mysql多表关联

设想这样一个情景,我们在做作业的时候,一个班里总有一些人是没有完成作业的,毕竟每个学生的能力水平不一样啊,有的做的快能按时提交,有的不会做,就没办法提交。

我们设置两个表,一个students表,有学生id字段stu_id,学生姓名字段stu_name;

还有一个作业表homework,也有学生id字段stu_id,是否提交作业字段commited;

第一种情况:我想要查找每个学生的交作业的情况:

复制代码
select s.stu_id,s.stu_name,h.commited from students as s left join homework as h on s.stu_id=h.stu_id;

第二种情况:我想知道交作业的学生的情况:

复制代码
select s.stu_id,s.stu_name,h.commited from students as s right join homework as h on s.stu_id=h.stu_id;

好好观察一下以上两个语句有什么不同?

第一个情况是:left join;

第二个情况是:right join ;

我们可以知道,这两者的区别是:left join会把左表的所有的数据都显示出来,即使右边关联的数据表中没有对应的值;right joing会把右表的所有的数据都显示出来,即使左边关联的数据中没有对应的值;两者正好取的相反

现在,我们考虑下一种情况,我们向homework表中,再插入一条数据:

复制代码
insert into homework(stu_id,commited) values(4,"YES");

现在,我想要得到,两个表中stu_id相等的学生的作业数据:

复制代码
select s.stu_id,s.stu_name,h.stu_id as hstu_id,h.commited from students as s inner join homework as h on s.stu_id=h.stu_id;

注:这次我们使用了inner join,这个表示取交集的意思。看到区别了没有,students表中stu_id为3的值没有取出来,因为在homework表中没有stu_id为3的数据;同样的,homework表中stu_id为4的值也没有取出来,因为在students表中没有stu_id为4的数据。

拓展:在以上的sql语句中,有一个关键字 as ,这个就表示把什么录成什么的意思。

例如:

select s.stu_id,s.stu_name**,h.stu_id as hstu_id**,h.commited from students as s inner join homework as h on s.stu_id=h.stu_id;

数据表 as 新表 后,那么取数据表的字估可以使用 新表.字段 的形式来进行读取,并且读取某个字段后也可以 as 新字段,在结果中以新字段的形式表示出来!

相关推荐
瑞克-桑切斯1 小时前
4、MySQL 索引与事务
数据库·mysql
二宝哥1 小时前
【问题】本地启动springboot项目启动flowable引擎会提示数据库脚本错误,同事本地启动没有报错(MySQL表明大小写敏感参数)
数据库·mysql
John_Hui1 小时前
第 5 篇:Ubuntu 安装 Redis
数据库·redis·缓存
TDengine (老段)1 小时前
TDengine IDMP 十大实用功能(2)
大数据·数据库·chrome·时序数据库·tdengine·idmp·有问有答
Navicat中国1 小时前
Navicat 连接 Redis 数据库
数据库·redis·数据库开发·navicat
东方佑2 小时前
去魅:工具调用、Agent 调用、A2A、MCP、Harness 到底都是什么
服务器·网络·数据库
瑞克-桑切斯2 小时前
2、 MySQL 主从复制与读写分离
数据库·mysql
收纳过往2 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
咖啡八杯3 小时前
Redis 工具封装:RedisCache 对 Operations 体系的二次封装
java·数据库·redis·缓存·框架·springboot·若依