題組內容
四、假設現有如下個人實聯制登記紀錄的關連式資料庫,請使用SQL 回答相關的子問題。
Place(placeID, placeName, countyCity, district, address)PK:placeID
Place(placeID, placeName, countyCity, district, address)PK:placeID
Person(mobile, name, telecomProvider)PK:(mobile)
EnterRecord(placeID, mobile, date, time)
PK:(placeID, mobile, date, time)
FK:placeID ref. Place(placeID)
FK:mobile ref. Person(mobile)
PK:(placeID, mobile, date, time)
FK:placeID ref. Place(placeID)
FK:mobile ref. Person(mobile)
(三)請列出臺北市萬華區內"公有 XX 市場",2021/05/15~2021/05/28 進出人員 的手機號碼及姓名,並依手機登錄進出次數,由多至少排列顯示。 (5 分)
詳解 (共 2 筆)
詳解
SELECT
e.mobile,
p.name,
COUNT(*) AS visit_count
FROM
EnterRecord e
JOIN
Person p ON e.mobile = p.mobile
JOIN
Place pl ON e.placeID = pl.placeID
WHERE
pl.countyCity = '台北市'
AND pl.district = '萬華區'
AND pl.placeName LIKE '公有%XX%市場'
AND e.date BETWEEN '2021-05-15' AND '2021-05-28'
GROUP BY
e.mobile,
p.name
ORDER BY
visit_count DESC;
這個查詢語句的解釋如下:
e.mobile,
p.name,
COUNT(*) AS visit_count
FROM
EnterRecord e
JOIN
Person p ON e.mobile = p.mobile
JOIN
Place pl ON e.placeID = pl.placeID
WHERE
pl.countyCity = '台北市'
AND pl.district = '萬華區'
AND pl.placeName LIKE '公有%XX%市場'
AND e.date BETWEEN '2021-05-15' AND '2021-05-28'
GROUP BY
e.mobile,
p.name
ORDER BY
visit_count DESC;
這個查詢語句的解釋如下:
JOIN 子句:將 EnterRecord 表和 Person 表根據 mobile 進行連接,將 EnterRecord 表和 Place 表根據 placeID 進行連接,以便獲取所需的所有資訊。
WHERE 子句:篩選 EnterRecord 表中的記錄,符合下列條件:
地區為台北市萬華區 (pl.countyCity = '台北市' AND pl.district = '萬華區')。
公共場所名稱包含 "公有 XX 市場" (pl.placeName LIKE '公有%XX%市場')。
日期在 2021/05/15 到 2021/05/28 之間 (e.date BETWEEN '2021-05-15' AND '2021-05-28')。
GROUP BY 子句:根據手機號碼和姓名進行分組,以便計算每個人進出次數。
SELECT 子句:選擇手機號碼 (e.mobile)、姓名 (p.name) 和每組中的進出次數總和(COUNT(*))。
ORDER BY 子句:按進出次數總和降序排列結果。
這樣就可以列出符合條件的進出人員的手機號碼及姓名,並按登錄進出次數由多至少排列顯示。
WHERE 子句:篩選 EnterRecord 表中的記錄,符合下列條件:
地區為台北市萬華區 (pl.countyCity = '台北市' AND pl.district = '萬華區')。
公共場所名稱包含 "公有 XX 市場" (pl.placeName LIKE '公有%XX%市場')。
日期在 2021/05/15 到 2021/05/28 之間 (e.date BETWEEN '2021-05-15' AND '2021-05-28')。
GROUP BY 子句:根據手機號碼和姓名進行分組,以便計算每個人進出次數。
SELECT 子句:選擇手機號碼 (e.mobile)、姓名 (p.name) 和每組中的進出次數總和(COUNT(*))。
ORDER BY 子句:按進出次數總和降序排列結果。
這樣就可以列出符合條件的進出人員的手機號碼及姓名,並按登錄進出次數由多至少排列顯示。
詳解
SELECT P.mobile,P.name,COUNT(*) AS 登入次數 FROM Person P,Place PL,EnterRecord ER
WHERE PL.placeID=ER.placeID AND
P.mobile=ER.mobile AND ER.date BETWEEN
‘20210515’ AND ‘20210528’ AND
PL.countyCity=‘臺北市’ AND PL.district=‘萬華區’
AND PL.placeName=‘公有XX市場’
GROUP BY P.mobile,P.name ORDER BY 登入次數 DESC;