1. 程式人生 > >Access SQL Select語句、子查詢結果之間的連線(JION)

Access SQL Select語句、子查詢結果之間的連線(JION)

最近專案需要用到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

結果如下所示

標題