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
結果如下所示
標題