# SQL考題 資料表 產品資料表(Products) | ProductId | ProductName | UnitPrice | | --------- | ---------------------------- | --------- | | 1 | Chai | 18.00 | | 2 | Chang | 19.00 | | 3 | Aniseed Syrup | 10.00 | | 4 | Chef Anton's Cajun Seasoning | 22.00 | | 5 | Chef Anton's Gumbo Mix | 21.35 | 訂單資料表(Orders) | OrderId | CustomerName | OrderDate | | ------- | ------------ | ------------------- | | 10248 | VINET | 2019-07-05 00:00:00 | | 10249 | TOMSP | 2019-07-07 00:00:00 | | 10250 | HANAR | 2019-07-08 00:00:00 | | 10251 | VITCE | 2019-07-10 00:00:00 | 訂單明細資料表(OrderDetails) | OrderId | ProductId | Quantity | | ------- | --------- | -------- | | 10248 | 1 | 5 | | 10248 | 3 | 8 | | 10248 | 4 | 15 | | 10248 | 5 | 24 | | 10249 | 2 | 7 | | 10249 | 5 | 2 | | 10250 | 3 | 45 | | 10250 | 4 | 6 | | 10251 | 1 | 9 | | 10251 | 4 | 1 | | 10251 | 5 | 3 | 建立Table的SQL Script ``` CREATE TABLE `Products` (`ProductId` int, `ProductName` varchar(29), `UnitPrice` decimal) ; INSERT INTO `Products` (`ProductId`, `ProductName`, `UnitPrice`) VALUES (1, 'Chai', 18.00), (2, 'Chang', 19.00), (3, 'Aniseed Syrup', 10.00), (4, 'Chef Anton''s Cajun Seasoning', 25.00), (5, 'Chef Anton''s Gumbo Mix', 21.35) ; CREATE TABLE `Orders` (`OrderId` varchar(7), `CustomerName` varchar(12), `OrderDate` date) ; INSERT INTO `Orders` (`OrderId`, `CustomerName`, `OrderDate`) VALUES ('10248', 'VINET', '2019-07-05 13:00:00'), ('10249', 'TOMSP', '2019-07-07 14:00:00'), ('10250', 'HANAR', '2019-07-08 15:00:00'), ('10251', 'VITCE', '2019-07-10 16:00:00') ; CREATE TABLE `OrderDetails` (`OrderId` varchar(7), `ProductId` int, `Quantity` int) ; INSERT INTO `OrderDetails` (`OrderId`, `ProductId`, `Quantity`) VALUES ('10248', 1, 5), ('10248', 3, 8), ('10248', 4, 15), ('10248', 5, 24), ('10249', 2, 7), ('10249', 5, 2), ('10250', 3, 45), ('10250', 4, 6), ('10251', 1, 9), ('10251', 4, 1), ('10251', 5, 3) ; ``` 1. 找出Customer為`VITCE`的客戶 所購買的最高單價的產品名稱 ``` SELECT Products.ProductName, MAX(Products.UnitPrice) as UnitPrice FROM `Products` INNER JOIN `OrderDetails` ON OrderDetails.ProductId = Products.ProductId INNER JOIN `Orders` ON Orders.OrderId = OrderDetails.OrderId WHERE Orders.CustomerName = 'VITCE' ``` 2. 找出Customer為`VINET`的客戶 沒有購買的產品編號與產品名稱 ``` SELECT Products.ProductId, Products.ProductName FROM `Products` LEFT JOIN ( SELECT OrderDetails.ProductId,OrderDetails.OrderId FROM `OrderDetails` INNER JOIN `Orders` ON Orders.OrderId = OrderDetails.OrderId WHERE Orders.CustomerName = 'VINET' ) AS Table1 ON Table1.ProductId = Products.ProductId WHERE Table1.OrderId IS NULL ``` 3. 找出`2019-07-05`到`2019-07-08`期間 每筆訂單數量最多的產品與總價 ``` SELECT Orders.OrderId, Products.ProductName, MAX(OrderDetails.Quantity) as Quantity, Products.UnitPrice * Quantity as Total FROM `Orders` INNER JOIN `OrderDetails`ON Orders.OrderId = OrderDetails.OrderId INNER JOIN `Products` ON Products.ProductId = OrderDetails.ProductId WHERE OrderDate BETWEEN '2019-07-05 00:00:00' AND '2019-07-08:23:59:59' GROUP BY Orders.OrderId ORDER BY Quantity DESC ``` ### MongoDB gamelist Collection中的資料如下 { _id: ObjectId(7df78ad8902c) title: 'Two-Eight Bar', minplayer: 3, maxplayer: 5, allow: 100, type: 'table' }, { _id: ObjectId(7df78ad8902d) title: 'Golden Flower', minplayer: 4, maxplayer: 6, allow: 200, type: 'table' }, { _id: ObjectId(7df78ad8902d) title: 'Holdem Poker', minplayer: 4, maxplayer: 6, allow: 300, type: 'table' }, { _id: ObjectId(7df78ad8902e) title: 'Fish Joy', minplayer: 4, maxplayer: 4, allow: 10, type: 'fish' }, { _id: ObjectId(7df78ad8902e) title: 'Yellow Man', minplayer: 1, maxplayer: 1, allow: 10, type: 'slot' }, 1. 找出gamelist maxplayer > 5 的項目 ``` db.gamelist.find({maxplayer : {$gt : 5}}) ``` 2. 透過aggreate()計算不同type各有多少款遊戲 ``` db.gamelist.aggregate([{$group : {_id : "$type", num: {$sum : 1}}}]) ```