在資料庫中,建有資料表「CompanyA」與「CompanyB」,其分別為A與
B兩家電腦公司本身販賣的產品,內容如下表所示,表格有兩個欄位,欄
位分別代表ID與產品品項名稱。請回答下列問題:
CompanyA
CompanyB
寫一個SQL指令查詢上述兩家公司販售的所有產品品項,重複的品項不
要刪除,且產品品項名稱按字母順序排序,查詢結果如下表所示。(10分)
Item
CPU
GPU
Keyboard
Monitor
Mouse
Mouse
NB
NB
PC
PC
Router
Tablet
Tablet
寫一個SQL指令查詢上述兩家公司販賣的相同產品品項,且產品品項名
稱按字母順序反項排序,查詢結果如下表所示。(15分)
Item
Tablet
PC
NB
Mouse
寫一個SQL指令查詢CompanyB公司有販售但CompanyA公司沒有販售
的產品品項名稱,查詢結果如下表所示。(15分)
Item
CPU
Router
ID
Product
CPU
Tablet
NB
Router
PC
Mouse
ID
Product
PC
Monitor
GPU
NB
Tablet
Keyboard
Mouse
二、第一小題(保留重複、遞增排序):SELECT Product AS Item FROM CompanyA UNION ALL SELECT Product FROM CompanyB ORDER BY Item ASC; 關鍵在於 UNION ALL 不做重複資料刪除(duplicate elimination),故 Mouse、NB、PC、Tablet 各出現兩次,共 13 筆。若誤寫成 UNION(不帶 ALL),系統會自動去除重複並隱含排序,只會得到 9 筆,不符合題意。
三、第二小題(交集、遞減排序):SELECT Product AS Item FROM CompanyA INTERSECT SELECT Product FROM CompanyB ORDER BY Item DESC; INTERSECT 預設會回傳去除重複後的共同品項,結果為 Tablet、PC、NB、Mouse 四筆,再以 DESC 由大到小排列。若資料庫不支援 INTERSECT(例如 MySQL 8.0.31 以前的版本),可改寫為 SELECT DISTINCT a.Product AS Item FROM CompanyA a INNER JOIN CompanyB b ON a.Product = b.Product ORDER BY Item DESC; 或改用 IN 搭配 DISTINCT。
四、第三小題(差集、遞增排序):SELECT Product AS Item FROM CompanyB EXCEPT SELECT Product FROM CompanyA ORDER BY Item ASC; 差集具有方向性,是「B 減 A」,結果為 CPU、Router 兩筆。若系統不支援 EXCEPT,可改寫為 SELECT Product AS Item FROM CompanyB b WHERE NOT EXISTS (SELECT 1 FROM CompanyA a WHERE a.Product = b.Product) ORDER BY Item ASC;,或使用 LEFT JOIN CompanyA 並加上 WHERE a.Product IS NULL 的寫法。
五、作答提醒:ORDER BY 只能出現在整個集合運算的最後,不可分別寫在各 SELECT 之後;輸出欄位別名以第一個 SELECT 的 AS Item 為準;排序結果受 collation 影響,預設多為不分大小寫;EXCEPT ALL 與 INTERSECT ALL 在多数商用 DBMS 並未支援,答題時宜註明所用資料庫版本與替代語法,以展現對 SQL 標準(SQL:1992 起納入 UNION/INTERSECT/EXCEPT)的完整理解。
一、子網路遮罩(subnet mask):為 32 位元的二進位數,用來劃分 IP 位址中的網路位元(network portion)與主機位元(host portion)。其格式必為前面連續的 1 之後接連續的 0,1 的個數即網路位元數。將 IP 位址與子網路遮罩做位元 AND 運算,即可求得該主機所屬的網路位址(network address);例如 255.255.255.0 表示前 24 位元為網路位址、後 8 位元為主機位址。
二、預設閘道(default gateway):當主機判斷目的 IP 位址不在同一網段時,會將封包送往的「出口」路由器介面位址,通常設定為該網段中可用主機位址之一(慣例為 .1 或 .254)。若目的位址在同一網段,主機可直接以 ARP 取得對方 MAC 位址後經由交換器傳送,不須經過閘道;因此閘道位址必須與本機 IP 位於同一網段,否則無法連外。