笔者本是个Android开发工程师,处于工作需要不得不去客串几天java后台,谢谢接口。
以下是在写接口时用到的一个功能点,叫做联表查询,虽然不是我Android端的知识,但毕竟也是自己不懂的东西,总结下来吧。
联表查询,顾名思义,指的是结合多张数据库表进行查询,取两张表的内容结合成一个视图返回。
在我的项目中,使用的是Spring Boot框架。
下面用一个例子来简单说一下联表查询怎么用,sql语句怎么写。
两张表如下:
表1-IPERMISSION表
表2-IINTERFACE表
比如我们的目的是查询表1中所有ID=1的数据,并根据表1的IPERMISSION 字段的值作为表2的ID查询表2中的INTER_NAME字段的值。
下面是两种思路,即两种写法:
写法一:
select a.GROUPING,a.IPERMISSION,b.INTER_NAME
from IPERMISSION a, IINTERFACE b
where a.IPERMISSION = b.ID
and a.GROUPING = 1;
思路如下(帮助理解的sql语句,实际每一步并不一定能单独运行):
首先写sql语句select * from IPERMISSION a, IINTERFACE b
,查询两张表所有字段,分别给两张表起个别名叫 a 和 b。
然后,要开始写条件了。这里有两个条件,因为两个表中一定会有个字段是有联系的,就像表1的IPERMISSION和表2的ID,这两个字段的值是相等的关联字段,即 a.IPERMISSION = b.ID,这是第一个条件。然后我们想要查表1中ID 为1的所有记录,所以第二个条件是 a.ID=1。
根据上面两个条件,补上where a.IPERMISSION = b.ID and a.GROUPING = 1
这段sql语句。
最后,我们想要查所有字段中的三个字段的值,其他的不需要,所以将sql中的 “*”改成自己想要的字段名字就ok啦。
写法二:
select
a.GROUPING,a.IPERMISSION,
(SELECT b.INTER_NAME FROM INTERFACE b WHERE b.ID = a.IPERMISSION) INTER_NAME
from
T_IPERMISSION a
where a.GROUPING = 1;
这种方法叫子查询,也很好理解,首先写sql:
select
*
from
T_IPERMISSION a
where a.GROUPING = 1;
从第一个表中查询所有GROUPING=1的值,并给表1起个别名叫 a。
然后,将 “*” 更换成子查询语句
SELECT b.INTER_NAME
FROM INTERFACE b
WHERE b.ID = a.IPERMISSION
同样给表2起了个别名叫 b,而且设置了查询条件 b.ID = a.IPERMISSION。
到这里,直接执行得到的只有一个字段。我们想要三个字段,因此还需要在子查询语句的位置补全其他两个字段a.GROUPING,a.IPERMISSION
写到这里,基本就已经完成了 但是你会发现第三个字段(表2的INTER_NAME )的字段名居然是子查询的sql语句,这显然不是我们要的结果,而且这样的话我将结果传回前端界面,他们解析也会很费劲,因为键的名字太长了。所以最后,给子查询sql语句一个别名“INTER_NAME”,这也就是我在子查询语句后面跟了“INTER_NAME”的原因。
总结就到这里。我个人觉得还算好理解,今天的接口 ,没白写。