欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Access SQL Select语句和子查询结果之间的连接讲解

程序员文章站 2022-03-23 19:35:26
最近项目需要用到sql语句,让刚入手的我着实头疼,现在想把自己的一些理解分享一下,权当记录。 第一部分:对于select查询语句理解 最基本的查询语句: select 列名 (最终查询结果,你希望出...

最近项目需要用到sql语句,让刚入手的我着实头疼,现在想把自己的一些理解分享一下,权当记录。

第一部分:对于select查询语句理解

最基本的查询语句:

select 列名 (最终查询结果,你希望出现的列名)

from 表名 (你想要从哪里找寻数据)

where 查询条件 (筛选数据的条件)

举个栗子1:

你想要从表device中找到deviceno为257的设备的status。

Access SQL Select语句和子查询结果之间的连接讲解device表

sql可以这样写:

select status (最终查询结果,我们只想知道设备的状态信息,所以想要显示状态信息的一列)

from device (我们想要从device表格中找寻数据)

where deviceno=257 (要找的数据是deviceno为257的)

看看,执行的结果

Access SQL Select语句和子查询结果之间的连接讲解例子1结果

我们可以看到,子查询的表格就是一个只有status列的,行结果是deviceno为257的设备状态。

第二部分:对于groupby的理解

有时候我们希望把数据按一定条件分组,这是通常会用到groupby。

据我所知,groupby只能用于聚合函数(如有错误,还望批评指正),聚合函数如count(), max(). min()这类。

还是以上面的device表格为例,现在我们希望得到设备状态为idle的相同bzj_deviceno出现的次数,并从大到小排序。

这里要得到列中同一个元素出现的次数,就需要用到count函数了。查找的条件是bzj_deviceno对应行的设备状态为idle。

按bzj_deviceno进行分组。

select bzj_deviceno, count(bzj_deviceno) as count

from device

where status = 'idle'

group by bzj_deviceno

order by count(bzj_deviceno) desc

执行之后的结果如下图

Access SQL Select语句和子查询结果之间的连接讲解例子2结果

第三部分:同一表格子查询结果的连接(join)

当我们希望连接从同一张表格查询出来的两个子表时,就需要用到join了。

select [a.xxx 或 b.xxx](最终连接表出现的列名,针对哪个子查询的列)

from

( select [xxx] (子查询1开始)

from [device] (表名)

where [xxx] (查询条件)

) as a, (此时a是上述子查询1的结果)

( select [xxx](子查询2开始)

from [device] (表名)

where [xxx] (查询条件)

) as b (此时b是上述子查询2的结果)

where [a.xxx(列名) = b.xxx(列名)] (通过什么将子查询a和b连接,就是将a和b查询中xxx列中相同的行连接起来)

注意:()中写入的是解释,[]中写入的是sql语句。最后的a.xxx与b.xxx的列名需要相等。

同样举个例子:

假设子查询a是第二部分获得的表格,可以看到最大的count有两个,但我们希望从中选出一个。

希望选出的bzj_deviceno与设备为run状态的lastinputtime最大值对应的bzj_deviceno不相同。

所以b查询的条件是,设备状态为run且其lastinputtime最大。

为获得b查询sql可以这样写,

select top 1 bzj_deviceno, lastinputtime

from device

where status = 'run'

order by lastinputtime desc

top 1: 取排序后的第一行

结果如下所示

Access SQL Select语句和子查询结果之间的连接讲解例子3 子查询b结果

至此,我们获得了a和b两个子查询,目的是获取一个bzj_deviceno,条件是a查询中count值最大且bzj_deviceno与b查询中bzj_deviceno不相等。

select top 1 a.bzj_deviceno

from

(

select bzj_deviceno, count(bzj_deviceno) as count

from device

where status = 'idle'

group by bzj_deviceno

order by count(bzj_deviceno) desc

) a,

(

select top 1 bzj_deviceno, lastinputtime

from device

where status = 'run'

order by lastinputtime desc

) b

where a.bzj_deviceno <> b.bzj_deviceno

order by count desc

结果如下所示

Access SQL Select语句和子查询结果之间的连接讲解标题