Access SQL Select语句和子查询结果之间的连接讲解
最近项目需要用到sql语句,让刚入手的我着实头疼,现在想把自己的一些理解分享一下,权当记录。
第一部分:对于select查询语句理解
最基本的查询语句:
select 列名 (最终查询结果,你希望出现的列名)
from 表名 (你想要从哪里找寻数据)
where 查询条件 (筛选数据的条件)
举个栗子1:
你想要从表device中找到deviceno为257的设备的status。
device表
sql可以这样写:
select status (最终查询结果,我们只想知道设备的状态信息,所以想要显示状态信息的一列)
from device (我们想要从device表格中找寻数据)
where deviceno=257 (要找的数据是deviceno为257的)
看看,执行的结果
例子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
执行之后的结果如下图
例子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: 取排序后的第一行
结果如下所示
例子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
结果如下所示
标题