查看: 52|回复: 3

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

[复制链接]
  • TA的每日心情
    难过
    2016-3-1 09:50
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-7-7 11:12:27 | 显示全部楼层 |阅读模式
    最近项目需要用到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
    结果如下所示
    标题

    您需要登录后才可以回帖 登录 | 注册青鸟豆号

    本版积分规则

    Copyright 1999-2019 Beijing Aptech Beida Jade Bird Information Technology Co.,Ltd

    北大青鸟IT教育 北京阿博泰克北大青鸟信息技术有限公司 版权所有

    京ICP备11045574号-3 京公网安备11010802013845号

    快速回复 返回顶部 返回列表