Mysql联表查询

关系型数据库设计的表一般都是一类信息一张表。当我们查询的信息来自于多个表时,除了使用刚才学的子查询可以实现,还可以使用联表查询,联表查询由于效率高于子查询,是更推荐的。联表查询就是在多张表之间建立一种联系,一种条件,通过这个条件,去每个表中筛选数据,最终得到正确的匹配数据。所以正确的联表条件才是关键。

如果没有联表条件,就拿不到正确的数据,拿到的是多个表之间的数据的任意组合,这是不正确的数据。

如股票没有联表条件,查询的结果就是所有数据的排列组合,这显然是不正确的,所以需要有联表条件

复制代码
SELECT stuname,assistant FROM studentinfo,classinfo;

1)内连接

指的是联表条件要在每个表中都能找到匹配的数据,才可以返回最终正确的结果,只要任意一张表中没有匹配的数据,就不会返回这次的结果。意味着,内连接会丢失一部分数据

语法:表1 inner join 表2 on 联表条件

另外一种语法:使用普通的查询语句,使用where指定连表条件,from后面直接把要连接的多个表写到一起,逗号分开

例如,查询学生姓名和班主任,但是数据在两张表中,这时可以通过联表查询解决这个问题,联表条件是班级号相同

复制代码
SELECT stuname,assistant 
FROM studentinfo 
INNER JOIN classinfo 
ON studentinfo.`classnum`=classinfo.`classnum`;
-- 下面是简写的语法,也是内连接
SELECT stuname,assistant FROM studentinfo,classinfo WHERE studentinfo.`classnum`=classinfo.`classnum`; 

2)外连接

外连接跟内连接相反,它不要求联表条件在每个表中都能匹配到数据,它只负责联表,按照联表条件将数据组合到一起,对于没有匹配到数据的表,在组合数据的时候,只能填NULL。存在以哪个表为主的问题,这个主表要看到它所有数据的匹配情况,包括每一条数据,即使这条数据跟其他表匹配不到结果,也要返回。这时看到的是主表的所有数据。

左外:

以左表为主表,跟其他表进行外连接,返回的结果中必须包括左表的每一条记录。

语法:表1 left join 表2 on 联表条件

复制代码
SELECT stuname,assistant 
FROM studentinfo 
LEFT JOIN classinfo 
ON studentinfo.`classnum`=classinfo.`classnum`;

右外:

以右表为主表,跟其他表进行外连接,返回的结果中必须包括右表的每一条记录。

语法:表1 right join 表2 on 联表条件

左外连接和右外连接的区别就是 以左表为主表,跟其他表进行外连接,返回的结果中必须包括左表的每一条记录,右外连接其本质和左外连接是相同的

相关推荐
山沐与山32 分钟前
【数据库】PostgreSQL架构与索引深度剖析
数据库·postgresql·架构
不穿格子的程序员1 小时前
Redis篇6——Redis深度剖析:从单机到集群,Redis高可用进化史
数据库·redis·集群·主从·高可用·哨兵
阿坤带你走近大数据1 小时前
什么是元数据管理?(附具体实施方案供参考)
数据库·金融
俊男无期1 小时前
超效率工作法
java·前端·数据库
2301_823438021 小时前
【无标题】解析《采用非对称自玩实现强健多机器人群集的深度强化学习方法》
数据库·人工智能·算法
中国胖子风清扬1 小时前
SpringAI和 Langchain4j等 AI 框架之间的差异和开发经验
java·数据库·人工智能·spring boot·spring cloud·ai·langchain
Elastic 中国社区官方博客2 小时前
Elasticsearch:你是说,用于混合搜索(hybrid search)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
czlczl200209252 小时前
高并发下的 Token 存储策略: Redis 与 MySQL 的一致性
数据库·redis·mysql
虹科网络安全2 小时前
艾体宝产品 | 基准测试:ArangoDB性能碾压Neo4j,速度最高提升8倍!
数据库·neo4j
哈哈老师啊2 小时前
Springboot校园订餐管理系统k2pr7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端