如何高效的使用表连接进行拼接查询

今天说一下SQL语句中的表连接的两种写发 虽然查出来的结果相同,但对于查出结果的效率确是天壤之别。其实很简单,但对于刚入职的我却收益匪浅,以前写SQL都是以完成功能为目标,现在是以功能之上的效率为任务。这种转变起初不是很适应,但当我深入学习后,体会到了编程的乐趣,之后有闲暇时间我会记录我在公司成长的过程,和所学的东西,一是分享给将来入坑之后的你们。二是记录我成长的过程,以后也算是一种回味吧。

表连接很多人都是这样写的:

select a.id,b.id

  from a,b

where a.id=b.id;

或者

select a.id,b.id

  from a  

join b

on a.id=b.id;  (包括内,外连接,左,右连接,全连接)

这两种写法。一直觉得没毛病,书上是这么教的,之前项目也是这么写的。但当面对千万级别的数据库查询时此种写法会导致查询效率很低,特别是当表关联多的时候,可读性也很差。

公司做的是保险项目,这种写法也可能会导致后台数据异常。

举个例子

如果两张表的关系是一对多,通过此种表连接可能后台会查询出来两条数据,可能就会出现后台结算时出现异常,多算了一份账单。当然可以通过其他方式去解决,但就sql语句而言不是太完美。主要是此种写法查询太慢了,上干货!

 

可以看出来两种查询的方式,耗时都是为3秒。

这种方法查询效率贼快,而且能解决上面的查重问题,而且可读性还是很好的,写的再多也能分清楚写的是什么,还可以拼接SQL。建立一张新表。

举一个经典的面试例子 学生选课的示例:

大家都知道 学生和课程是一个多对多的关系。一个学生可以选多门课程,一个课程也可以被多个学生选择。关于多对多关系,我们解决的办法是建立一个选课表,包含学生,课程的主键,我们把这两个主键字段设置成该表的两个外键。如图:

面试所问的问题是让你写sql,展示出学生所选的课程。有几种方法?有什么差别?

你就可以很随意的写出这三中方法。然后去解释。

第三种方法写出来的sql效果:

select sc.couid,
       (select c.couname from course c where sc.couid = c.couid) couName,
       (select s.stuname from student s where s.stuid = sc.stuid) stuName
  from sc

此种方法的原理就是建立一个关联表,然后往里面添加你需要的字段,再查询出来。用着很方便,感觉也很牛X,觉得公司在写复杂查询的时候都会用这个模板在写然后在嵌套一下。组成新的SQL。如图:

可以慢慢理解,这种方法建立主表是只适用多对一的关系,可以有效的结局一对多查重问题。主表必须是多。因为如果主表是一对多sql直接会错。逻辑也很完整。

谢谢道友的观看,我是一个刚入职的Java 菜鸟 第一次写博客,有很多不足之处,希望道友指点。这篇文章逻辑也可能有些问题,或者有什么不懂的都可以留言,咱们一起讨论。如果有错的地方希望大佬及时提出,一面误人子弟!

谢谢你的观看,我以后也会像写日记一样记录我在公司的成长,以及遇见的问题,希望对刚入职的道友有所帮助。

猜你喜欢

转载自blog.csdn.net/weixin_43620238/article/details/83898591