不要哀求,學會爭取,若是如此,終有所獲,
原文:https://mp.weixin.qq.com/s/zbOqyAtsWsocarsFIGdGgw
前言
你是否還在煩惱 SQL 該從何學起,或者學了 SQL 想找個地方練練手?好巧不巧,最近在作業之余登上牛客,發現了牛客不知道啥時候上線了SQL 必知必會的練習題,
《SQL 必知必會》作為麻省理工學院、伊利諾伊大學等眾多大學的參考教材,由淺入深地講解了SQL的基本概念和語法,涉及資料的排序、過濾和分組,以及表、視圖、聯結、子查詢、游標、存盤程序和觸發器等內容,實體豐富,方便查閱,可以說作為一個 CRUD BOY/GIRL 必讀書目,
想著正好給它刷一遍,然后將自己刷題的一些想法總結下,于是有了今天這篇文章,希望能給需要的小伙伴一點點幫助,
SQL1 從 Customers 表中檢索所有的 ID
描述
現有表Customers如下:
| cust_id |
|---|
| A |
| B |
| C |
問題
撰寫 SQL 陳述句,從 Customers 表中檢索所有的 cust_id,
示例答案
回傳 cust_id 列的內容
| cust_id |
|---|
| A |
| B |
| C |
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) DEFAULT NULL
);
INSERT `Customers` VALUES ('A'),('B'),('C');
解答
考察最簡單的查詢陳述句,因為 Customers 表中僅有 cust_id 一列,所以我們可以使用以下兩種解答方式,
- 第一種方式,選擇特定列進行輸出,這也是我們在作業中更加推薦使用的一種方式,將需要輸出的列名全部描述出來,
SELECT cust_id FROM Customers;
- 第二種方式,使用
*對表中所有列進行輸出,因為Customers表中僅有一列,所以可以使用該方式,但在日常作業中,就算查詢結果列中包含了資料庫表的所有欄位,也不要直接使用*.
SELECT * FROM Customers;
SQL2 檢索并列出已訂購產品的清單
描述
表OrderItems含有非空的列prod_id代表商品id,包含了所有已訂購的商品(有些已被訂購多次),
| prod_id |
|---|
| a1 |
| a2 |
| a3 |
| a4 |
| a5 |
| a6 |
| a7 |
問題
撰寫SQL 陳述句,檢索并列出所有已訂購商品(prod_id)的去重后的清單,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '商品id'
);
INSERT `OrderItems` VALUES ('a1'),('a2'),('a3'),('a4'),('a5'),('a6'),('a6')
解答
要對結果去重,可以使用 DISTINCT 關鍵字,使用時,在后邊跟上需要去重的欄位即可保證這些去重欄位的查詢結果不重復,
SELECT DISTINCT prod_id FROM OrderItems;
此外還可以使用 GROUP BY 關鍵字,改關鍵字支持在去重的同時,同步回傳其他欄位的資訊,
SELECT prod_id FROM OrderItems GROUP BY prod_id;
SQL3 檢索所有列
描述
現在有 Customers 表(表中含有列 cust_id 代表客戶 id,cust_name 代表客戶姓名) ,
| cust_id | cust_name |
|---|---|
| a1 | andy |
| a2 | ben |
| a3 | tony |
| a4 | tom |
| a5 | an |
| a6 | lee |
| a7 | hex |
問題
需要撰寫 SQL陳述句,檢索所有列,
示例結果
回傳所有列 cust_id 和 cust_name,
| cust_id | cust_name |
|---|---|
| a1 | andy |
| a2 | ben |
| a3 | tony |
| a4 | tom |
| a5 | an |
| a6 | lee |
| a7 | hex |
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('a1','andy'),('a2','ben'),('a3','tony'),('a4','tom'),('a5','an'),('a6','lee'),('a7','hex');
解答
類似于第一題,最簡單的查詢陳述句,只不過相比第一題多了一列,所以同樣可以使用兩種方式,
- 使用
*表示所有列,
SELECT * FROM Customers;
- 將需要列印出的列詳細列出,
SELECT cust_id, cust_name FROM Customers;
SQL4 檢索顧客名稱并且排序
描述
有表 Customers,cust_id 代表客戶 id,cust_name 代表客戶姓名,
| cust_id | cust_name |
|---|---|
| a1 | andy |
| a2 | ben |
| a3 | tony |
| a4 | tom |
| a5 | an |
| a6 | lee |
| a7 | hex |
問題
從 Customers 中檢索所有的顧客名稱(cust_name),并按從 Z 到 A 的順序顯示結果,
示例結果
回傳客戶姓名 cust_name
| cust_name |
|---|
| tony |
| tom |
| lee |
| hex |
| ben |
| andy |
| an |
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('a1','andy'),('a2','ben'),('a3','tony'),('a4','tom'),('a5','an'),('a6','lee'),('a7','hex');
解答
要對資料庫中的資料進行排序,需要使用關鍵字 ORDER BY,此外,默認情況下,SQL 中列的結果默認是正序排列的,即實際情況下以下陳述句執行結果是一樣的,
SELECT cust_name FROM Customers;
SELECT cust_name FROM Customers ORDER BY cust_name ASC;
而要對查詢結果逆序輸出,則需要用到 DESC 關鍵字,表示逆序輸出,
SELECT cust_name FROM Customers ORDER BY cust_name DESC;
SQL5 對顧客ID和日期排序
描述
有 Orders 表
| cust_id | order_num | order_date |
|---|---|---|
| andy | aaaa | 2021-01-01 00:00:00 |
| andy | bbbb | 2021-01-01 12:00:00 |
| bob | cccc | 2021-01-10 12:00:00 |
| dick | dddd | 2021-01-11 00:00:00 |
問題
撰寫 SQL 陳述句,從 Orders 表中檢索顧客 ID(cust_id)和訂單號(order_num),并先按顧客 ID 對結果進行排序,再按訂單日期倒序排列,
示例答案
回傳 2 列,cust_id 和 order_num
| cust_id | order_num |
|---|---|
| andy | bbbb |
| andy | aaaa |
| bob | cccc |
| dick | dddd |
示例決議
首先根據 cust_id 進行排列,andy 在 bob 和 dick 前,再根據 order_date 進行排列,訂單號 bbbb 的訂單時間是 "2021-01-01 12:00:00" 大于訂單號 aaaa 的時間 "2021-01-01 00:00:00"
示例
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders` (
`cust_id` varchar(255) NOT NULL COMMENT '顧客 ID',
`order_num` varchar(255) NOT NULL COMMENT '訂單號',
`order_date` timestamp NOT NULL COMMENT '訂單時間'
);
INSERT INTO `Orders` VALUES ('andy','aaaa','2021-01-01 00:00:00'),
('andy','bbbb','2021-01-01 12:00:00'),
('bob','cccc','2021-01-10 12:00:00'),
('dick','dddd','2021-01-11 00:00:00');
解答
要對列進行排序,則需要使用 ORDER BY 關鍵字,此外就是正序和倒序輸出,
ASC:正序輸出,也是默認輸出的情況,DESC:倒序輸出,
SELECT cust_id, order_num FROM Orders ORDER BY cust_id, order_date DESC;
SQL6 按照數量和價格排序
描述
假設有一個 OrderItems 表
| quantity | item_price |
|---|---|
| 1 | 100 |
| 10 | 1003 |
| 2 | 500 |
問題
撰寫 SQL 陳述句,顯示 OrderItems 表中的數量(quantity)和價格(item_price),并按數量由多到少、價格由高到低排序,
示例答案
回傳 quantity 和 item_price
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems` (
`quantity` INT(64) NOT NULL COMMENT '數量',
`item_price` INT(64) NOT NULL COMMENT '訂單價格'
);
INSERT INTO `OrderItems` VALUES (1,100),
(10,1003),
(2,500);
解答
同樣是查詢陳述句,要對查詢結果進行排序,則需要使用 ORDER BY 關鍵字,最后則是需要注意是正序還是倒序,題目中由多到少和由高到低都是屬于倒序,所以需要使用關鍵字 DESC,
SELECT quantity, item_price FROM OrderItems ORDER BY quantity DESC, item_price DESC;
SQL7 檢查SQL陳述句
描述
有 Vendors 表
| vend_name |
|---|
| 海底撈 |
| 小龍坎 |
| 大龍燚 |
問題
下面的 SQL 陳述句有問題嗎?嘗試將它改正確,使之能夠正確運行,并且回傳結果根據 vend_name 逆序排列
SELECT vend_name,
FROM Vendors
ORDER vend_name DESC;
示例展示
回傳 vend_name
| vend_name |
|---|
| 海底撈 |
| 小龍坎 |
| 大龍燚 |
示例
DROP TABLE IF EXISTS `Vendors`;
CREATE TABLE IF NOT EXISTS `Vendors` (
`vend_name` VARCHAR(255) NOT NULL COMMENT 'vend名稱'
);
INSERT INTO `Vendors` VALUES ('海底撈'),
('小龍坎'),
('大龍燚');
解答
SELECT vend_name, FROM Vendors ORDER vend_name DESC;
主要存在兩處錯誤,首先是選取需要展示的列 vend_name 后,后面并沒有跟上需要展示的其他列,所以此處多了一個 ,,另外,對選取列進行排序使用的關鍵字是 ORDER BY,而題目中只是給出了 ORDER,忘記了 BY,所以會導致查詢結果錯誤,針對這兩處錯誤改正后,得到的正確的陳述句如下所示,
SELECT vend_name FROM Vendors ORDER BY vend_name DESC;
SQL8 回傳固定價格的產品
描述
有表 Products
| prod_id | prod_name | prod_price |
|---|---|---|
| a0018 | sockets | 9.49 |
| a0019 | iphone13 | 600 |
| b0018 | gucci t-shirts | 1000 |
問題
從 Products 表中檢索產品 ID(prod_id)和產品名稱(prod_name),只回傳價格為 9.49 美元的產品,
示例結果
回傳 prod_id 和 prod_name
| prod_id | prod_name |
|---|---|
| a0018 | sockets |
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱',
`prod_price` DOUBLE NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES ('a0018','sockets',9.49),
('a0019','iphone13',600),
('b0019','gucci t-shirts',1000);
解答
查詢符合指定條件的資料,可以使用關鍵字 WHERE 對條件進行限制,然后就是對條件的實作,這里可以使用兩種方式,
第一種,直接利用 =,既然條件是需要價格為 9.49 美元的產品,則我們將價格列設定為 prod_price = 9.49 即可,
SELECT prod_id, prod_name FROM Products WHERE prod_price = 9.49;
第二種,除開 = 之外,我們也可以使用 in,表示價格只要在指定的資料之中,我們將價格列設定為 in (9.49) 即可,但是此時要注意不要忽略 (),否則陳述句會報錯,
SELECT prod_id, prod_name FROM Products WHERE prod_price in (9.49);
SQL9 回傳更高價格的產品
描述
Products 表
| prod_id | prod_name | prod_price |
|---|---|---|
| a0018 | sockets | 9.49 |
| a0019 | iphone13 | 600 |
| b0019 | gucci t-shirts | 1000 |
問題
撰寫 SQL 陳述句,從 Products 表中檢索產品 ID(prod_id)和產品名稱(prod_name),只回傳價格為 9 美元或更高的產品,
示例答案
回傳 prod_id 商品 id 和 prod_name 商品名稱
| prod_id | prod_name |
|---|---|
| a0018 | sockets |
| a0019 | iphone13 |
| b0019 | gucci t-shirts |
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱',
`prod_price` DOUBLE NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES ('a0011','usb',9.49),
('a0019','iphone13',600),
('b0019','gucci t-shirts',1000);
解答
條件查詢陳述句,查詢格式:
SELECT [列名] FROM [表名] WHERE 判斷條件 …
既然判斷條件是要產品價格不低于 9 美元,則產品需要大于等于 9 美元,可以將產品價格設定為 prod_price >= 9 即可,
SELECT prod_id, prod_name FROM Products WHERE prod_price >= 9;
此外,我們還可以將 >= 拆分為兩個條件,一個是 prod_price > 9,而另一個則是 prod_price = 9,然后滿足任一條件即可,則利用關鍵字 OR 將兩個條件進行連接,
SELECT prod_id, prod_name FROM Products WHERE prod_price > 9 OR prod_price = 9;
SQL10 回傳產品并且按照價格排序
描述
有 Products 表
| prod_id | prod_name | prod_price |
|---|---|---|
| a0011 | egg | 3 |
| a0019 | sockets | 4 |
| b0019 | coffee | 15 |
問題
撰寫 SQL 陳述句,回傳 Products 表中所有價格在 3 美元到 6 美元之間的產品的名稱(prod_name)和價格(prod_price),然后按價格對結果進行排序
示例結果
回傳商品名稱 prod_name 和商品價格 prod_price
| prod_name | prod_price |
|---|---|
| egg | 3 |
| sockets | 4 |
注:不需要考慮商品價格相同的情況
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱',
`prod_price` DOUBLE NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES ('a0011','egg',3),
('a0019','sockets',4),
('b0019','coffee',15);
解答
條件查詢,通過將條件拆分為 prod_price >= 3 和 prod_price <= 6 兩個條件,然后利用關鍵字 AND 將兩個條件串聯起來,同時滿足兩個條件的資料則進行輸出,然后要對價格進行排序,則可以使用關鍵字 ORDER BY,
SELECT prod_name, prod_price FROM Products WHERE prod_price >= 3 AND prod_price <=6 ORDER BY prod_price;
除開上述將兩個條件拆分開然后利用關鍵字 AND 串聯起來之外,其實 SQL 還提供了關鍵字 BETWEEN … AND …,可以將滿足介于兩者之間的數進行篩選輸出,
SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 3 AND 6 ORDER BY prod_price;
SQL11 回傳更多的產品
描述
OrderItems 表含有:訂單號 order_num,quantity 產品數量
| order_num | quantity |
|---|---|
| a1 | 105 |
| a2 | 1100 |
| a2 | 200 |
| a4 | 1121 |
| a5 | 10 |
| a2 | 19 |
| a7 | 5 |
問題
從 OrderItems 表中檢索出所有不同且不重復的訂單號(order_num),其中每個訂單都要包含 100 個或更多的產品,
示例結果
回傳訂單號列 order_num
| order_num |
|---|
| a1 |
| a2 |
| a4 |
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
quantity VARCHAR(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a1','105'),('a2','1100'),('a2','200'),('a4','1121'),('a5','10'),('a2','19'),('a7','5')
解答
要篩選指定列中不重復的資料,則需要使用關鍵字 DISTINCT,此外,要篩選出滿足指定條件的資料,則需要關鍵字 WHERE,然后根據題意,可以將條件寫到一起,也可以將條件進行拆分后用關鍵字 OR 并聯,
SELECT DISTINCT order_num FROM OrderItems WHERE quantity >= 100;
SELECT DISTINCT order_num FROM OrderItems WHERE quantity > 100 OR quantity = 100;
SQL12 檢索供應商名稱
描述
Vendors 表有欄位供應商名稱(vend_name)、供應商國家(vend_country)、供應商州(vend_state)
| vend_name | vend_country | vend_state |
|---|---|---|
| apple | USA | CA |
| vivo | CNA | shenzhen |
| huawei | CNA | xian |
問題
撰寫 SQL 陳述句,從 Vendors 表中檢索供應商名稱(vend_name),僅回傳加利福尼亞州的供應商(這需要按國家[USA]和州[CA]進行過濾,沒準其他國家也存在一個 CA)
示例答案
回傳供應商名稱 vend_name
| vend_name |
|---|
| apple |
示例
DROP TABLE IF EXISTS `Vendors`;
CREATE TABLE IF NOT EXISTS `Vendors` (
`vend_name` VARCHAR(255) NOT NULL COMMENT 'vend名稱',
`vend_country` VARCHAR(255) NOT NULL COMMENT 'vend國家',
`vend_state` VARCHAR(255) NOT NULL COMMENT 'vend州'
);
INSERT INTO `Vendors` VALUES ('apple','USA','CA'),
('vivo','CNA','shenzhen'),
('huawei','CNA','xian');
解答
既然要篩選出加利福利亞州的提供商,則首要條件是滿足 vend_state = 'CA',另外,除開美國有加利福利亞州之外,有可能其他國家也有加利福利亞州,所以需要對國家也進行限定,設定條件為 vend_country = 'USA',然后用關鍵字 AND 將條件串聯,滿足這兩個條件的資料則進行輸出,
SELECT vend_name FROM Vendors WHERE vend_country = 'USA' AND vend_state = 'CA';
SQL13 檢索并列出已訂購產品的清單
描述
OrderItems 表包含了所有已訂購的產品(有些已被訂購多次),
| prod_id | order_num | quantity |
|---|---|---|
| BR01 | a1 | 105 |
| BR02 | a2 | 1100 |
| BR02 | a2 | 200 |
| BR03 | a4 | 1121 |
| BR017 | a5 | 10 |
| BR02 | a2 | 19 |
| BR017 | a7 | 5 |
問題
撰寫 SQL 陳述句,查找所有訂購了數量至少 100 個的 BR01、BR02 或 BR03 的訂單,你需要回傳 OrderItems 表的訂單號(order_num)、產品 ID(prod_id)和數量(quantity),并按產品 ID 和數量進行過濾,
示例答案
回傳商品 id prod_id、訂單 order_num、數量 quantity,
| order_num | prod_id | quantity |
|---|---|---|
| a1 | BR01 | 105 |
| a2 | BR02 | 1100 |
| a2 | BR02 | 200 |
| a4 | BR03 | 1121 |
示例決議
回傳的結果中,數量滿足大于等于 100,且滿足 prod_id 是 "BR01",“BR02”,“BR03" 中的任意一個,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '商品號',
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
quantity INT(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('BR01','a1','105'),('BR02','a2','1100'),('BR02','a2','200'),('BR03','a4','1121'),('BR017','a5','10'),('BR02','a2','19'),('BR017','a7','5')
解答
多條件查詢,將兩個條件進行拆分,然后將兩個查詢條件進行串聯即可,
數量滿足大于等于 100,則設定為 quantyty >= 100,
產品 id 滿足 "BR01",“BR02”,“BR03” 中的任意一個,則使用關鍵字 in,
SELECT order_num, prod_id, quantity FROM OrderItems WHERE quantity >= 100 AND prod_id IN ('BR01', 'BR02', 'BR03');
SQL14 回傳所有價格在 3 美元到 6 美元之間的產品的名稱和價格
描述
有表 Products
| prod_id | prod_name | prod_price |
|---|---|---|
| a0011 | egg | 3 |
| a0019 | sockets | 4 |
| b0019 | coffee | 15 |
問題
撰寫 SQL 陳述句,回傳所有價格在 3 美元到 6 美元之間的產品的名稱(prod_name)和價格(prod_price),使用 AND 運算子,然后按價格對結果進行升序排序
示例結果
回傳商品名稱 prod_name 和商品價格 prod_price
| prod_name | prod_price |
|---|---|
| egg | 3 |
| sockets | 4 |
注:不需要考慮價格相同時的排序問題
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱',
`prod_price` INT(255) NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES ('a0011','egg',3),
('a0019','sockets',4),
('b0019','coffee',15);
解答
兩個條件,首先是價格介于 3 到 6 美元,則可以使用關鍵字 BETWEEN … AND …,另外,按價格升序排序,則使用關鍵字 ORDER BY,
SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 3 AND 6 ORDER BY prod_price;
題目中指定需要使用關鍵字 AND,則需要將價格條件替換成 prod_price >= 3 和 prod_price <= 6 兩個條件,然后將其串聯,
SELECT prod_name, prod_price FROM Products WHERE prod_price >= 3 AND prod_price <= 6 ORDER BY prod_price;
SQL15 糾錯2
描述
供應商表 Vendors 有欄位供應商名稱 vend_name、供應商國家 vend_country、供應商省份 vend_state
| vend_name | vend_country | vend_state |
|---|---|---|
| apple | USA | CA |
| vivo | CNA | shenzhen |
| huawei | CNA | xian |
問題
修改正確下面 sql,使之正確回傳
SELECT vend_name
FROM Vendors
ORDER BY vend_name
WHERE vend_country = 'USA' AND vend_state = 'CA';
示例結果
結果回傳 vend_name
| vend_name |
|---|
| apple |
示例
DROP TABLE IF EXISTS `Vendors`;
CREATE TABLE IF NOT EXISTS `Vendors` (
`vend_name` VARCHAR(255) NOT NULL COMMENT 'vend名稱',
`vend_country` VARCHAR(255) NOT NULL COMMENT 'vend國家',
`vend_state` VARCHAR(255) NOT NULL COMMENT 'vend州'
);
INSERT INTO `Vendors` VALUES ('apple','USA','CA'),
('beef noodle king','USA','CA'),
('vivo','CNA','shenzhen'),
('huawei','CNA','xian');
解答
主要是一處錯誤,搞錯了關鍵字 WHERE 和 ORDER BY 的先后順序,正確的 SQL 陳述句格式為:
SELECT [列名] FOMR [表名] WHERE [條件] ORDER BY [列名];
SELECT vend_name FROM Vendors WHERE vend_country = 'USA' AND vend_state = 'CA' ORDER BY vend_name;
SQL16 檢索產品名稱和描述(一)
描述
Products表
| prod_name | prod_desc |
|---|---|
| a0011 | usb |
| a0019 | iphone13 |
| b0019 | gucci t-shirts |
| c0019 | gucci toy |
| d0019 | lego toy |
問題
撰寫 SQL 陳述句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅回傳描述中包含 toy 一詞的產品名稱
示例結果
回傳產品名稱和產品描述
| prod_name | prod_desc |
|---|---|
| c0019 | gucci toy |
| d0019 | lego toy |
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_desc` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0011','usb'),
('a0019','iphone13'),
('b0019','gucci t-shirts'),
('c0019','gucci toy'),
('d0019','lego toy');
解答
模糊查詢,主要產品描述中含有 toy 一詞,就需要回傳這時候需要用到模糊查詢關鍵字 LIKE 然后是通配符,題目中并沒有明確說明 toy 前后包含多少個字符,所以用 %,
SELECT prod_name, prod_desc FROM Products WHERE prod_desc LIKE '%toy%'
SQL17 檢索產品名稱和描述(二)
描述
Products 表
| prod_name | prod_desc |
|---|---|
| a0011 | usb |
| a0019 | iphone13 |
| b0019 | gucci t-shirts |
| c0019 | gucci toy |
| d0019 | lego toy |
問題
撰寫 SQL 陳述句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅回傳描述中未出現 toy 一詞的產品,最后按”產品名稱“對結果進行排序,
示例結果
回傳產品名稱和產品描述
| prod_name | prod_desc |
|---|---|
| a0011 | usb |
| a0019 | iphone13 |
| b0019 | gucci t-shirts |
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_desc` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0011','usb'),
('a0019','iphone13'),
('b0019','gucci t-shirts'),
('c0019','gucci toy'),
('d0019','lego toy');
解答
這題就是 16 題的反面,那我們只要對 16 的查詢陳述句進行取反即可,此時添加一個關鍵字 NOT 即可,此外,還需要按“產品名稱”對結果排序,使用關鍵字 ORDER BY 即可,但是需要注意 WHERE 和 ORDER BY 關鍵字的先后順序,
SELECT prod_name, prod_desc FROM Products WHERE prod_desc NOT LIKE '%toy%' ORDER BY prod_name;
SQL18 檢索產品名稱和描述(三)
描述
Products 表
問題
撰寫 SQL 陳述句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅回傳描述中同時出現 toy 和 carrots 的產品,有好幾種方法可以執行此操作,但對于這個挑戰題,請使用 AND 和兩個 LIKE 比較,
| prod_name | prod_desc |
|---|---|
| a0011 | usb |
| a0019 | iphone13 |
| b0019 | gucci t-shirts |
| c0019 | gucci toy |
| d0019 | lego carrots toy |
示例結果
回傳產品名稱和產品描述
| prod_name | prod_desc |
|---|---|
| d0019 | lego carrots toy |
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_desc` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0011','usb'),
('a0019','iphone13'),
('b0019','gucci t-shirts'),
('c0019','gucci toy'),
('d0019','lego carrots toy');
解答
題目中明確要求使用 LIKE 和 AND 關鍵字,那么可以將條件拆分為兩個模糊查詢,一個是描述中含有 toy 的產品,一個是描述中含有 carrots 的產品,然后利用關鍵字 AND 將兩個條件串聯就可以了,
SELECT prod_name, prod_desc FROM Products WHERE prod_desc LIKE '%toy%' AND prod_desc LIKE '%carrots%';
SQL19 檢索產品名稱和描述(四)
描述
Products 表
| prod_name | prod_desc |
|---|---|
| a0011 | usb |
| a0019 | iphone13 |
| b0019 | gucci t-shirts |
| c0019 | gucci toy |
| d0019 | lego toy carrots |
問題
撰寫 SQL 陳述句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅回傳在描述中以先后順序同時出現 toy 和 carrots 的產品,提示:只需要用帶有三個 % 符號的 LIKE 即可,
示例結果
回傳產品名稱和產品描述
| prod_name | prod_desc |
|---|---|
| d0019 | lego toy carrots |
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_desc` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0011','usb'),
('a0019','iphone13'),
('b0019','gucci t-shirts'),
('c0019','gucci toy'),
('d0019','lego toy carrots ');
解答
題目中已經進行了提示,要查詢產品描述中以先后順序同時出現 toy 和 carrots 的產品,但沒有說他們兩者之間存在的字符以及 toy 前面和 carrots 后邊所包含的字符,那么需要使用通配符 % ,得到最終的結果 %toy%carrots%,
SELECT prod_name, prod_desc FROM Products WHERE prod_desc LIKE '%toy%carrots%';
SQL20 別名
描述
別名的常見用法是在檢索出的結果中重命名表的列欄位(為了符合特定的報表要求或客戶需求),有表 Vendors 代表供應商資訊,vend_id 供應商 id、vend_name 供應商名稱、vend_address 供應商地址、vend_city 供應商城市,
| vend_id | vend_name | vend_address | vend_city |
|---|---|---|---|
| a001 | tencent cloud | address1 | shenzhen |
| a002 | huawei cloud | address2 | dongguan |
| a003 | aliyun cloud | address3 | hangzhou |
| a003 | netease cloud | address4 | guangzhou |
問題
撰寫 SQL 陳述句,從 Vendors 表中檢索 vend_id、vend_name、vend_address 和 vend_city,將 vend_name 重命名為 vname,將 vend_city 重命名為 vcity,將 vend_address 重命名為 vaddress,按供應商名稱對結果進行升序排序,
示例結果
回傳 vend_id 供應商 id、vname 供應商名稱、vaddress 供應商地址、vcity 供應商城市,
| vend_id | vname | vaddress | vcity |
|---|---|---|---|
| a003 | aliyun cloud | address3 | hangzhou |
| a002 | huawei cloud | address2 | dongguan |
| a003 | netease cloud | address4 | guangzhou |
| a001 | tencent cloud | address1 | shenzhen |
示例
DROP TABLE IF EXISTS `Vendors`;
CREATE TABLE IF NOT EXISTS `Vendors` (
`vend_id` VARCHAR(255) NOT NULL COMMENT '供應商id',
`vend_name` VARCHAR(255) NOT NULL COMMENT '供應商名稱',
`vend_address` VARCHAR(255) NOT NULL COMMENT '供應商地址',
`vend_city` VARCHAR(255) NOT NULL COMMENT '供應商城市'
);
INSERT INTO `Vendors` VALUES ('a001','tencent cloud','address1','shenzhen'),
('a002','huawei cloud','address2','dongguan'),
('a003','aliyun cloud','address3','alibaba');
解答
SQL 中,要對列取別名,需要用到關鍵字 AS,使用格式如下:
列名 AS 別名
通過對題目中的三個欄位取別名,然后使用 ORDER BY 關鍵字,按照供應商名稱列對結果進行升序排序,
SELECT vend_id, vend_name AS vname, vend_address AS vaddress, vend_city AS vcity FROM Vendors ORDER BY vend_name;
此外,AS 其實可要可不要,你也可以寫成以下的方式,在列名之后跟上別名即可,實作的效果和上面陳述句一致,
SELECT vend_id, vend_name vname, vend_address vaddress, vend_city vcity FROM Vendors ORDER BY vend_name;
SQL21 打折
描述
我們的示例商店正在進行打折促銷,所有產品均降價 10%,Products 表包含 prod_id產品 id、prod_price 產品價格
問題
撰寫 SQL陳述句,從 Products 表中回傳 prod_id、prod_price 和 sale_price,sale_price 是一個包含促銷價格的計算欄位,提示:可以乘以 0.9,得到原價的 90%(即 10%的折扣)
示例結果
回傳產品 id prod_id、產品價格 prod_price、銷售價格 sale_price
| prod_id | prod_price | sale_price |
|---|---|---|
| a0011 | 9.49 | 8.541 |
| a0019 | 600 | 540 |
| b0019 | 1000 | 900 |
示例決議
sale_price 的價格是 prod_price 的 90%
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_price` DOUBLE NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES ('a0011',9.49),
('a0019',600),
('b0019',1000);
解答
此題考察了取別名以及如何在 SQL 中直接使用算數運算,sale_price 不是表中的資料,而是通過 prod_price 而來,所以需要通過關鍵字 AS 來進行取別名,最終的實作陳述句如下,
SELECT prod_id, prod_price, prod_price * 0.9 AS sale_price FROM Products;
SQL22 顧客登錄名
描述
我們的商店已經上線了,正在創建顧客賬戶,所有用戶都需要登錄名,默認登錄名是其名稱和所在城市的組合,
給出 Customers 表 如下:
| cust_id | cust_name | cust_contact | cust_city |
|---|---|---|---|
| a1 | Andy Li | Andy Li | Oak Park |
| a2 | Ben Liu | Ben Liu | Oak Park |
| a3 | Tony Dai | Tony Dai | Oak Park |
| a4 | Tom Chen | Tom Chen | Oak Park |
| a5 | An Li | An Li | Oak Park |
| a6 | Lee Chen | Lee Chen | Oak Park |
| a7 | Hex Liu | Hex Liu | Oak Park |
問題
撰寫 SQL 陳述句,回傳顧客 ID(cust_id)、顧客名稱(cust_name)和登錄名(user_login),其中登錄名全部為大寫字母,并由顧客聯系人的前兩個字符(cust_contact)和其所在城市的前三個字符(cust_city)組成,提示:需要使用函式、拼接和別名,
示例結果
回傳顧客 id cust_id,顧客名稱 cust_name,顧客登錄名 user_login
| cust_id | cust_name | user_login |
|---|---|---|
| a1 | Andy Li | ANOAK |
| a2 | Ben Liu | BEOAK |
| a3 | Tony Dai | TOOAK |
| a4 | Tom Chen | TOOAK |
| a5 | An Li | ANOAK |
| a6 | Lee Chen | LEOAK |
| a7 | Hex Liu | HEOAK |
示例決議
例如,登錄名是 ANOAK(Andy Li,居住在 Oak Park)
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名',
cust_contact VARCHAR(255) NOT NULL COMMENT '客戶聯系人',
cust_city VARCHAR(255) NOT NULL COMMENT '客戶城市'
);
INSERT `Customers` VALUES ('a1','Andy Li','Andy Li','Oak Park'),('a2','Ben Liu','Ben Liu','Oak Park'),('a3','Tony Dai','Tony Dai','Oak Park'),('a4','Tom Chen','Tom Chen','Oak Park'),('a5','An Li','An Li','Oak Park'),('a6','Lee Chen','Lee Chen','Oak Park'),('a7','Hex Liu','Hex Liu','Oak Park');
解答
根據題意以及示例結果,可以看到登錄名全是大寫,所以需要用到函式 upper(),然后需要將顧客聯系人前兩個字符和所在城市的前三個字符相拼接,則需要用到函式 concat(),再接著就是需要從 cust_name 和 cust_city 中截取字串,則需要用到 substring(),最后則是通過將字串拼接轉換之后取別名為 user_login,需要用到關鍵字 AS,以上提到的三個函式用法如下:
upper(字串):將字串中所有字符轉換為大寫,substring(字串, 起始位置, 截取的字符數),需要注意的是起始位置是從 1 開始的,concat(字串 1, 字串 2, 字串 3, …)
SELECT cust_id, cust_name, upper(concat(substring(cust_name, 1, 2), substring(cust_city, 1, 3))) AS user_login FROM Customers;
SQL23 回傳 2020 年 1 月的所有訂單的訂單號和訂單日期
描述
Orders 訂單表
| order_num | order_date |
|---|---|
| a0001 | 2020-01-01 00:00:00 |
| a0002 | 2020-01-02 00:00:00 |
| a0003 | 2020-01-01 12:00:00 |
| a0004 | 2020-02-01 00:00:00 |
| a0005 | 2020-03-01 00:00:00 |
問題
撰寫 SQL 陳述句,回傳 2020 年 1 月的所有訂單的訂單號(order_num)和訂單日期(order_date),并按訂單日期升序排序
【示例結果】
回傳訂單號 order_num,和 order_date 訂單時間
| order_num | order_date |
|---|---|
| a0001 | 2020-01-01 00:00:00 |
| a0003 | 2020-01-01 12:00:00 |
| a0002 | 2020-01-02 00:00:00 |
示例決議
a0001、a0002、a0003 時間屬于 2020 年 1 月
示例
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '訂單號',
order_date TIMESTAMP NOT NULL COMMENT '訂單日期'
);
INSERT `Orders` VALUES ('a0001','2020-01-01 00:00:00'),
('a0002','2020-01-02 00:00:00'),
('a0003','2020-01-01 12:00:00'),
('a0004','2020-02-01 00:00:00'),
('a0005','2020-03-01 00:00:00');
解答
其實我們依然可以將本題看做模糊查詢,只要訂單日期滿足對應條件即可,可以使用關鍵字 WHERE … LIKE … 來實作,
SELECT order_num, order_date FROM Orders WHERE order_date LIKE '2020-01%' ORDER BY order_date;
此外,SQL 中也提供了對于日期的操作函式 date_format(),用于回傳日期的一部分,
SELECT order_num, order_date FROM Orders WHERE date_format(order_date, '%Y-%m') = '2020-01' ORDER BY order_date;
另外,我們還可以單獨提取出日期中的年份和月份,然后將兩個條件串聯,篩選出同時滿足兩個條件的資料,
SELECT order_num, order_date FROM Orders WHERE year(order_date) = 2020 AND month(order_date) = 1 ORDER BY order_date;
SQL24 確定已售出產品的總數
描述
OrderItems 表代表售出的產品,quantity 代表售出商品數量,
| quantity |
|---|
| 10 |
| 100 |
| 1000 |
| 10001 |
| 2 |
| 15 |
問題
撰寫 SQL 陳述句,確定已售出產品的總數,
示例結果
回傳 items_ordered 列名,表示已售出商品的總數,
| items_ordered |
|---|
| 11128 |
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
quantity INT(16) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES (10),(100),(1000),(10001),(2),(15);
解答
考察求和函式以及取別名兩個知識點,取別名需要關鍵字 AS,而且可要可不要,
而求和函式則是 SUM(列名) ,它會統計列中所有記錄的綜合,
SELECT SUM(quantity) items_ordered FROM OrderItems;
SQL25 確定已售出產品項 BR01 的總數
描述
OrderItems 表代表售出的產品,quantity 代表售出商品數量,產品項為 prod_id,
| quantity | prod_id |
|---|---|
| 10 | AR01 |
| 100 | AR10 |
| 1000 | BR01 |
| 10001 | BR010 |
問題
修改創建的陳述句,確定已售出產品項(prod_id)為 "BR01" 的總數,
示例結果
回傳商品項已訂購訂單數
| items_ordered |
|---|
| 1000 |
示例決議
已訂購商品 BR01 的數量 quantity 為 1000,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
quantity INT(16) NOT NULL COMMENT '商品數量',
prod_id VARCHAR(255) NOT NULL COMMENT '商品項'
);
INSERT `OrderItems` VALUES (10,'AR01'),(100,'AR10'),(1000,'BR01'),(10001,'BR010');
解答
主要考察的知識點:
- 求和函式:
SUM() - 取別名:
AS - 條件查詢:
WHERE
需要注意的是 SQL 陳述句中關鍵字的先后順序,否則可能會導致陳述句出錯,
SELECT SUM(quantity) AS items_ordered FROM OrderItems WHERE prod_id = 'BR01';
SQL26 確定 Products 表中價格不超過 10 美元的最貴產品的價格
描述
Products 表
| prod_price |
|---|
| 9.49 |
| 600 |
| 1000 |
問題
撰寫 SQL 陳述句,確定 Products 表中價格不超過 10 美元的最貴產品的價格(prod_price),將計算所得的欄位命名為 max_price,
示例結果
回傳 max_price
| max_price |
|---|
| 9.49 |
示例決議
回傳十元以下最高價格 max_price,
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_price` DOUBLE NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES (9.49),
(600),
(1000);
解答
考察知識點:
- 條件查詢:使用關鍵字
WHERE,將產品價格不超過 10 美元的產品篩選出來, - MAX(列名):找出列中的最大值,
- 取別名:通過關鍵字
AS將不超過 10 美元的產品中價格最高的記錄篩選出來后重命名,
SELECT MAX(prod_price) AS max_price FROM Products WHERE prod_price <= 10;
SQL27 回傳每個訂單號各有多少行數
描述
OrderItems 表包含每個訂單的每個產品
| order_num |
|---|
| a002 |
| a002 |
| a002 |
| a004 |
| a007 |
問題
撰寫 SQL 陳述句,回傳每個訂單號(order_num)各有多少行數(order_lines),并按 order_lines 對結果進行升序排序,
示例結果
回傳訂單號 order_num 和對應訂單號的行數 order_lines
| order_num | order_lines |
|---|---|
| a004 | 1 |
| a007 | 1 |
| a002 | 3 |
示例決議
訂單號 a002 有 3 行訂單記錄也是最多的訂單號故排在最后一位回傳,相同訂單行數的訂單無需過多處理,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號'
);
INSERT `OrderItems` VALUES ('a002'),('a002'),('a002'),('a004'),('a007');
解答
考察知識點:
COUNT(列名):回傳指定列的值的數目,AS:取別名,GROUP BY:根據指定列或者運算式的值將行進行分組,ORDER BY:根據尾隨的列名進行排序,ASC表示正序,也是默認排序,DESC表示倒序,
SELECT order_num, COUNT(order_num) AS order_lines FROM OrderItems GROUP BY order_num ORDER BY order_lines;
SQL28 每個供應商成本最低的產品
描述
有Products表,含有欄位prod_price代表產品價格,vend_id代表供應商id
| vend_id | prod_price |
|---|---|
| a0011 | 100 |
| a0019 | 0.1 |
| b0019 | 1000 |
| b0019 | 6980 |
| b0019 | 20 |
問題
撰寫 SQL 陳述句,回傳名為 cheapest_item 的欄位,該欄位包含每個供應商成本最低的產品(使用 Products 表中的 prod_price),然后從最低成本到最高成本對結果進行升序排序,
示例結果
回傳供應商 id vend_id 和對應供應商成本最低的產品 cheapest_item,
| vend_id | cheapest_item |
|---|---|
| a0019 | 0.1 |
| b0019 | 20 |
| a0011 | 100 |
示例決議
例如 b0019 成本最低的價格是 20,且最后根據成本價格排序回傳依次是 a0019、b0019、a0011,
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`vend_id` VARCHAR(255) NOT NULL COMMENT '供應商ID',
`prod_price` DOUBLE NOT NULL COMMENT '產品價格'
);
INSERT INTO `Products` VALUES ('a0011',100),
('a0019',0.1),
('b0019',1000),
('b0019',6980),
('b0019',20);
解答
要找出各個供應商中成本最低的產品,則需要通過關鍵字 GROUP BY 來進行分組,然后借助函式 MIN() 找出 prod_price 中最小的值,接著取別名為 cheapest_item,最后則是按照找出的各供應商中的成本最低產品 cheapest_item 利用關鍵字 ORDER BY 進行升序排序,
SELECT vend_id, MIN(prod_price) AS cheapest_item FROM Products GROUP BY vend_id ORDER BY cheapest_item;
SQL29 回傳訂單數量總和不小于100的所有訂單的訂單號
描述
OrderItems 代表訂單商品表,包括:訂單號order_num 和訂單數量 quantity,
| order_num | quantity |
|---|---|
| a1 | 105 |
| a2 | 1100 |
| a2 | 200 |
| a4 | 1121 |
| a5 | 10 |
| a2 | 19 |
| a7 | 5 |
問題
請撰寫 SQL 陳述句,回傳訂單數量總和不小于 100 的所有訂單號,最后結果按照訂單號升序排序,
示例結果
回傳 order_num 訂單號,
| order_num |
|---|
| a1 |
| a2 |
| a4 |
示例決議
訂單號 a1、a2、a4 的 quantity 總和都大于等于 100,按順序為 a1、a2、a4,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
quantity INT(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a1',105),('a2',200),('a4',1121),('a5',10),('a7',5);
解答
條件查詢,只是此時不再是過濾指定的行,而是需要過濾分組,所以這個時候不能再使用關鍵字 WHERE,而是需要使用到關鍵字 HAVING,它通常是和關鍵字 GROUP BY 連用,另外需要注意的是各個關鍵字之間的先后順序,先是 GROUP BY,緊接著是 HAVING,最后才是 ORDER BY,
SELECT order_num FROM OrderItems GROUP BY order_num HAVING SUM(quantity) >= 100 ORDER BY order_num;
SQL30 計算總和
描述
OrderItems表代表訂單資訊,包括欄位:訂單號 order_num 和 item_price 商品售出價格、quantity 商品數量,
| order_num | item_price | quantity |
|---|---|---|
| a1 | 10 | 105 |
| a2 | 1 | 1100 |
| a2 | 1 | 200 |
| a4 | 2 | 1121 |
| a5 | 5 | 10 |
| a2 | 1 | 19 |
| a7 | 7 | 5 |
問題
撰寫 SQL 陳述句,根據訂單號聚合,回傳訂單總價不小于 1000 的所有訂單號,最后的結果按訂單號進行升序排序,
提示:總價 = item_price 乘以 quantity
示例結果
| order_num | total_price |
|---|---|
| a1 | 1050 |
| a2 | 1319 |
| a4 | 2242 |
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
item_price INT(16) NOT NULL COMMENT '售出價格',
quantity INT(16) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a1',10,105),('a2',1,1100),('a2',1,200),('a4',2,1121),('a5',5,10),('a2',1,19),('a7',7,5);
解答
以上幾題都已經將知識點講過了,這題只是綜合運用,主要涉及如下:
SUM():對同一產品的總價求和,AS:取別名,GROUP BY:按照列進行分組,HAVING:與GROUP BY聯合使用從而實作條件過濾,ORDER BY:按列進行排序,
SELECT order_num, SUM(item_price * quantity) AS total_price FROM OrderItems GROUP BY order_num HAVING total_price >= 1000 ORDER BY order_num;
SQL31 糾錯3
描述
OrderItems 表含有 order_num 訂單號
| order_num |
|---|
| a002 |
| a002 |
| a002 |
| a004 |
| a007 |
問題
將下面代碼修改正確后執行
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY items
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
示例結果
回傳訂單號 order_num 和出現的次數 items
| order_num | items |
|---|---|
| a002 | 3 |
示例決議
由于訂單號 a002 出現了三次,所以回傳3
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號'
);
INSERT `OrderItems` VALUES ('a002'),('a002'),('a002'),('a004'),('a007');
解答
最主要的錯誤在于 GROUP BY 后邊跟著的是統計結果,其次在于 HAVING 后邊的 COUNT() 其實是可以不用再次計算的,可以直接利用已經統計出的結果,第二處不算錯誤,但是改了之后能提高 SQL 陳述句所執行的效率,
SELECT order_num, COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING COUNT(*) >= 3 ORDER BY items, order_num;
SELECT order_num, COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING items >= 3 ORDER BY items, order_num;
SQL32 回傳購買價格為 10 美元或以上產品的顧客串列
描述
OrderItems 表示訂單商品表,含有欄位訂單號:order_num、訂單價格:item_price;Orders 表代表訂單資訊表,含有顧客 id:cust_id 和訂單號:order_num
OrderItems 表
| order_num | item_price |
|---|---|
| a1 | 10 |
| a2 | 1 |
| a2 | 1 |
| a4 | 2 |
| a5 | 5 |
| a2 | 1 |
| a7 | 7 |
Orders表
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a2 | cust1 |
| a4 | cust2 |
| a5 | cust5 |
| a2 | cust1 |
| a7 | cust7 |
問題
使用子查詢,回傳購買價格為 10 美元或以上產品的顧客串列,結果無需排序,
注意:你需要使用 OrderItems 表查找匹配的訂單號(order_num),然后使用Order 表檢索這些匹配訂單的顧客 ID(cust_id),
示例結果
回傳顧客 id cust_id
| cust_id |
|---|
| cust10 |
示例決議
cust10 顧客下單的訂單為 a1,a1 的售出價格大于等于 10
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
item_price INT(16) NOT NULL COMMENT '售出價格'
);
INSERT `OrderItems` VALUES ('a1',10),('a2',1),('a2',1),('a4',2),('a5',5),('a2',1),('a7',7);
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a2','cust1'),('a4','cust2'),('a5','cust5'),('a2','cust1'),('a7','cust7');
解答
題目已經提示使用子查詢,則先用最簡單的條件查詢從 OrderItems 表中找出訂單價格不低于 10 美元的訂單,接著從篩選出的結果中再次篩選出對應訂單的顧客 id,需要注意的一點是對顧客 id 去重,需要使用到關鍵字 DISTINCT,
SELECT DISTINCT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE item_price >= 10)
SQL33 確定哪些訂單購買了 prod_id 為 BR01 的產品(一)
描述
表 OrderItems 代表訂單商品資訊表,prod_id 為產品 id;Orders 表代表訂單表有 cust_id 代表顧客 id 和訂單日期 order_date
OrderItems 表
| prod_id | order_num |
|---|---|
| BR01 | a0001 |
| BR01 | a0002 |
| BR02 | a0003 |
| BR02 | a0013 |
Orders表
| order_num | cust_id | order_date |
|---|---|---|
| a0001 | cust10 | 2022-01-01 00:00:00 |
| a0002 | cust1 | 2022-01-01 00:01:00 |
| a0003 | cust1 | 2022-01-02 00:00:00 |
| a0013 | cust2 | 2022-01-01 00:20:00 |
問題
撰寫 SQL 陳述句,使用子查詢來確定哪些訂單(在 OrderItems 中)購買了 prod_id 為 "BR01" 的產品,然后從 Orders 表中回傳每個產品對應的顧客 ID(cust_id)和訂單日期(order_date),按訂購日期對結果進行升序排序,
示例結果
回傳顧客 id cust_id 和定單日期 order_date,
| cust_id | order_date |
|---|---|
| cust10 | 2022-01-01 00:00:00 |
| cust1 | 2022-01-01 00:01:00 |
示例決議
產品 id 為 "BR01" 的訂單 a0001 和 a002 的下單顧客 cust10 和 cust1 的下單時間分別為 2022-01-01 00:00:00 和 2022-01-01 00:01:00
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號'
);
INSERT `OrderItems` VALUES ('BR01','a0001'),('BR01','a0002'),('BR02','a0003'),('BR02','a0013');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id',
order_date TIMESTAMP NOT NULL COMMENT '下單時間'
);
INSERT `Orders` VALUES ('a0001','cust10','2022-01-01 00:00:00'),('a0002','cust1','2022-01-01 00:01:00'),('a0003','cust1','2022-01-02 00:00:00'),('a0013','cust2','2022-01-01 00:20:00');
解答
使用子查詢,先從 OrderItems 表中查詢出 prod_id 為 BR01 的記錄 ,然后再從 Orders 表中篩選出 order_num 為子查詢結果集中的記錄,最后按照 order_date 進行排序即可,主要是通過對條件查詢陳述句的嵌套使用,從而實作多重篩選,
SELECT cust_id, order_date FROM Orders WHERE order_num in (SELECT order_num FROM OrderItems WHERE prod_id = 'BR01') ORDER BY order_date;
SQL34 回傳購買 prod_id 為 BR01 的產品的所有顧客的電子郵件(一)
描述
你想知道訂購 BR01 產品的日期,有表 OrderItems 代表訂單商品資訊表,prod_id 為產品 id;Orders 表代表訂單表有 cust_id 代表顧客 id 和訂單日期order_date;Customers表含有 cust_email 顧客郵件和 cust_id 顧客 id
OrderItems 表
| prod_id | order_num |
|---|---|
| BR01 | a0001 |
| BR01 | a0002 |
| BR02 | a0003 |
| BR02 | a0013 |
Orders 表
| order_num | cust_id | order_date |
|---|---|---|
| a0001 | cust10 | 2022-01-01 00:00:00 |
| a0002 | cust1 | 2022-01-01 00:01:00 |
| a0003 | cust1 | 2022-01-02 00:00:00 |
| a0013 | cust2 | 2022-01-01 00:20:00 |
Customers 表代表顧客資訊,cust_id 為顧客 id,cust_email 為顧客 email
| cust_id | cust_email |
|---|---|
| cust10 | [email protected] |
| cust1 | [email protected] |
| cust2 | [email protected] |
問題
回傳購買 prod_id 為 BR01 的產品的所有顧客的電子郵件(Customers 表中的 cust_email),結果無需排序,
提示:這涉及 SELECT 陳述句,最內層的從 OrderItems 表回傳 order_num,中間的從 Customers 表回傳 cust_id,
示例結果
回傳顧客 email cust_email
| cust_email |
|---|
| [email protected] |
| [email protected] |
示例決議
產品 id 為 BR01 的訂單 a0001 和 a002 的下單顧客 cust10 和 cust1 的顧客email cust_email 分別是:[email protected] 、[email protected]
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號'
);
INSERT `OrderItems` VALUES ('BR01','a0001'),('BR01','a0002'),('BR02','a0003'),('BR02','a0013');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id',
order_date TIMESTAMP NOT NULL COMMENT '下單時間'
);
INSERT `Orders` VALUES ('a0001','cust10','2022-01-01 00:00:00'),('a0002','cust1','2022-01-01 00:01:00'),('a0003','cust1','2022-01-02 00:00:00'),('a0013','cust2','2022-01-01 00:20:00');
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id',
cust_email VARCHAR(255) NOT NULL COMMENT '顧客email'
);
INSERT `Customers` VALUES ('cust10','[email protected]'),('cust1','[email protected]'),('cust2','[email protected]');
解答
多重條件查詢的過濾,只要細心一點,就能做出來,拆分為 3 個條件查詢后,從內向外依次查詢,然后基于上一層查詢結果再做條件過濾,
SELECT cust_email FROM Customers WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'BR01'));
SQL35 回傳每個顧客不同訂單的總金額
描述
我們需要一個顧客 ID 串列,其中包含他們已訂購的總金額,
OrderItems 表代表訂單資訊,OrderItems 表有訂單號:order_num 和商品售出價格:item_price、商品數量:quantity,
| order_num | item_price | quantity |
|---|---|---|
| a0001 | 10 | 105 |
| a0002 | 1 | 1100 |
| a0002 | 1 | 200 |
| a0013 | 2 | 1121 |
| a0003 | 5 | 10 |
| a0003 | 1 | 19 |
| a0003 | 7 | 5 |
Orders 表訂單號:order_num、顧客 id:cust_id
| order_num | cust_id |
|---|---|
| a0001 | cust10 |
| a0002 | cust1 |
| a0003 | cust1 |
| a0013 | cust2 |
問題
撰寫 SQL陳述句,回傳顧客 ID(Orders 表中的 cust_id),并使用子查詢回傳total_ordered 以便回傳每個顧客的訂單總數,將結果按金額從大到小排序,
提示:你之前已經使用 SUM() 計算訂單總數,
示例結果
回傳顧客 id cust_id 和 total_order 下單總額
| cust_id | total_ordered |
|---|---|
| cust2 | 2242 |
| cust1 | 1300 |
| cust10 | 1050 |
| cust2 | 104 |
示例決議
cust2 在 Orders 里面的訂單 a0013,a0013 的售出價格是 2 售出數量是 1121,總額是 2242,最后回傳 cust2 的支付總額是 2242,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
item_price INT(16) NOT NULL COMMENT '售出價格',
quantity INT(16) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a0001',10,105),('a0002',1,1100),('a0002',1,200),('a0013',2,1121),('a0003',5,10),('a0003',1,19),('a0003',7,5);
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a0001','cust10'),('a0003','cust1'),('a0013','cust2');
解答
題目要求利用子查詢,則實作如下,
SELECT cust_id, (SELECT SUM(item_price * quantity) FROM OrderItems WHERE OrderItems.order_num = Orders.order_num) AS total_ordered FROM Orders ORDER BY total_ordered DESC;
此外我們可以使用內連接方式:利用 SUM() 函式進行求和,求出每個顧客的訂單總數,然后通過條件查詢找出兩個表中 order_num 相同記錄的并通過 cust_id 分組,最后則是將求和的訂單總數倒序排列,
SELECT cust_id, SUM(item_price * quantity) AS total_ordered FROM OrderItems, Orders WHERE OrderItems.order_num = Orders.order_num GROUP BY cust_id ORDER BY total_ordered DESC;
SQL36 從 Products 表中檢索所有的產品名稱以及對應的銷售總數
描述
Products 表中檢索所有的產品名稱:prod_name、產品 id:prod_id
| prod_id | prod_name |
|---|---|
| a0001 | egg |
| a0002 | sockets |
| a0013 | coffee |
| a0003 | cola |
OrderItems 代表訂單商品表,訂單產品:prod_id、售出數量:quantity
| prod_id | quantity |
|---|---|
| a0001 | 105 |
| a0002 | 1100 |
| a0002 | 200 |
| a0013 | 1121 |
| a0003 | 10 |
| a0003 | 19 |
| a0003 | 5 |
問題
撰寫 SQL 陳述句,從 Products 表中檢索所有的產品名稱(prod_name),以及名為 quant_sold 的計算列,其中包含所售產品的總數(在 OrderItems 表上使用子查詢和 SUM(quantity) 檢索),
示例結果
回傳產品名稱 prod_name 和產品售出數量總和
| prod_name | quant_sold |
|---|---|
| egg | 105 |
| sockets | 1300 |
| coffee | 1121 |
| cola | 34 |
示例決議
prod_name 是 cola 的 prod_id 為 a0003,quantity 總量為 34,回傳結果無需排序,
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0001','egg'),
('a0002','sockets'),
('a0013','coffee'),
('a0003','cola');
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
quantity INT(16) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a0001',105),('a0002',1100),('a0002',200),('a0013',1121),('a0003',10),('a0003',19),('a0003',5);
解答
解法類似于 35 題,同樣主要有兩種方式,第一種是通過內連接的方式,
SELECT prod_name, SUM(quantity) AS quant_sold FROM OrderItems, Products WHERE Products.prod_id = OrderItems.prod_id GROUP BY prod_name;
第二種則是通過子查詢的方式,
SELECT prod_name, (SELECT SUM(quantity) FROM OrderItems WHERE OrderItems.prod_id = Products.prod_id) FROM Products;
SQL37 回傳顧客名稱和相關訂單號
描述
Customers 表有欄位顧客名稱 cust_name、顧客 id cust_id
| cust_id | cust_name |
|---|---|
| cust10 | andy |
| cust1 | ben |
| cust2 | tony |
| cust22 | tom |
| cust221 | an |
| cust2217 | hex |
Orders訂單資訊表,含有欄位order_num訂單號、cust_id顧客id
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a3 | cust2 |
| a4 | cust22 |
| a5 | cust221 |
| a7 | cust2217 |
問題
撰寫 SQL 陳述句,回傳 Customers 表中的顧客名稱(cust_name)和Orders 表中的相關訂單號(order_num),并按顧客名稱再按訂單號對結果進行升序排序,你可以嘗試用兩個不同的寫法,一個使用簡單的等聯結語法,另外一個使用 INNER JOIN,
示例結果
cust_name 代表用戶名稱 cust_name 和訂單號 order_num,
| cust_name | order_num |
|---|---|
| an | a5 |
| andy | a1 |
| ben | a2 |
| hex | a7 |
| tom | a4 |
| tony | a3 |
示例決議
顧客名稱為 an 的 cust_id 為 cust221,他的訂單號為 a5,
示例
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex');
解答
考察 SQL 中的 INNER JOIN,其實也就是 JOIN,主要用于篩選出兩個表中的交集部分,
使用語法如下:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
因此,此題使用 INNER JOIN 實作的方法如下,
SELECT cust_name, Orders.order_num FROM Customers INNER JOIN Orders ON Orders.cust_id = Customers.cust_id ORDER BY cust_name;
此外,也可以使用最常用的 WHERE 來進行聯接,
SELECT cust_name, order_num FROM Customers, Orders WHERE Customers.cust_id = Orders.cust_id ORDER BY cust_name;
SQL38 回傳顧客名稱和相關訂單號以及每個訂單的總價
描述
Customers 表有欄位,顧客名稱:cust_name、顧客 id:cust_id
| cust_id | cust_name |
|---|---|
| cust10 | andy |
| cust1 | ben |
| cust2 | tony |
| cust22 | tom |
| cust221 | an |
| cust2217 | hex |
Orders 訂單資訊表,含有欄位,訂單號:order_num、顧客 id:cust_id
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a3 | cust2 |
| a4 | cust22 |
| a5 | cust221 |
| a7 | cust2217 |
OrderItems 表有欄位,商品訂單號:order_num、商品數量:quantity、商品價格:item_price
| order_num | quantity | item_price |
|---|---|---|
| a1 | 1000 | 10 |
| a2 | 200 | 10 |
| a3 | 10 | 15 |
| a4 | 25 | 50 |
| a5 | 15 | 25 |
| a7 | 7 | 7 |
問題
除了回傳顧客名稱和訂單號,回傳 Customers 表中的顧客名稱(cust_name)和Orders 表中的相關訂單號(order_num),添加第三列 OrderTotal,其中包含每個訂單的總價,并按顧客名稱再按訂單號對結果進行升序排序,
示例結果
回傳顧客名稱 cust_name、訂單號 order_num、訂單總額 OrderTotal
| cust_name | order_num | OrderTotal |
|---|---|---|
| an | a5 | 375 |
| andy | a1 | 10000 |
| ben | a2 | 2000 |
| hex | a7 | 49 |
| tom | a4 | 1250 |
| tony | a3 | 150 |
示例決議
例如顧客名稱 cust_name 為 an 的顧客的訂單 a5 的訂單總額為 quantity*item_price = 15 * 25 = 375,最后以 cust_name 和 order_num 來進行升序排序,
示例
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex');
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
quantity INT(16) NOT NULL COMMENT '商品數量',
item_price INT(16) NOT NULL COMMENT '商品價格'
);
INSERT `OrderItems` VALUES ('a1',1000,10),('a2',200,10),('a3',10,15),('a4',25,50),('a5',15,25),('a7',7,7);
解答
SQL 陳述句先后順序:
SELECT ……
FROM ……
WHERE ……
GROUP BY ……
ORDER BY ……
書寫 SQL 陳述句時,一定要遵守以上關鍵字的先后順序,然后根據題意將各個條件組合即可,
SELECT cust_name, Orders.order_num, SUM(quantity * item_price) AS OrderTotal
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id AND Orders.order_num = OrderItems.order_num
GROUP BY Customers.cust_name, Orders.order_num
ORDER BY cust_name, Orders.order_num;
SQL39 確定哪些訂單購買了 prod_id 為 BR01 的產品(二)
描述
表 OrderItems 代表訂單商品資訊表,prod_id 為產品 id;Orders 表代表訂單表有 cust_id 代表顧客id和訂單日期 order_date
OrderItems 表
| prod_id | order_num |
|---|---|
| BR01 | a0001 |
| BR01 | a0002 |
| BR02 | a0003 |
| BR02 | a0013 |
Orders 表
| order_num | cust_id | order_date |
|---|---|---|
| a0001 | cust10 | 2022-01-01 00:00:00 |
| a0002 | cust1 | 2022-01-01 00:01:00 |
| a0003 | cust1 | 2022-01-02 00:00:00 |
| a0013 | cust2 | 2022-01-01 00:20:00 |
問題
撰寫 SQL 陳述句,使用子查詢來確定哪些訂單(在 OrderItems 中)購買了 prod_id 為 "BR01" 的產品,然后從 Orders 表中回傳每個產品對應的顧客 ID(cust_id)和訂單日期(order_date),按訂購日期對結果進行升序排序,
提示:這一次使用聯結和簡單的等聯結語法,
示例結果
回傳顧客 id cust_id 和定單日期 order_date
| cust_id | order_date |
|---|---|
| cust10 | 2022-01-01 00:00:00 |
| cust1 | 2022-01-01 00:01:00 |
示例決議
產品 id 為 BR01 的訂單 a0001 和 a002 的下單顧客 cust10 和 cust1 的下單時間分別為 2022-01-01 00:00:00 和 2022-01-01 00:01:00
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號'
);
INSERT `OrderItems` VALUES ('BR01','a0001'),('BR01','a0002'),('BR02','a0003'),('BR02','a0013');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id',
order_date TIMESTAMP NOT NULL COMMENT '下單時間'
);
INSERT `Orders` VALUES ('a0001','cust10','2022-01-01 00:00:00'),('a0002','cust1','2022-01-01 00:01:00'),('a0003','cust1','2022-01-02 00:00:00'),('a0013','cust2','2022-01-01 00:20:00');
解答
多個條件的組合查詢,先查詢出產品 id 為 BR01 的 order_num,然后從查詢出的結果列中再去篩選出 Orders 表中 order_num,最后則是正序排序即可,
SELECT cust_id, order_date
FROM Orders, (SELECT order_num FROM OrderItems WHERE prod_id = 'BR01') AS result
WHERE result.order_num = Orders.order_num
ORDER BY order_date;
SQL40 回傳購買 prod_id 為 BR01 的產品的所有顧客的電子郵件(二)
描述
有表 OrderItems 代表訂單商品資訊表,prod_id 為產品 id;Orders 表代表訂單表有 cust_id 代表顧客 id 和訂單日期 order_date;Customers 表含有 cust_email 顧客郵件和 cust_id 顧客 id
OrderItems 表
| prod_id | order_num |
|---|---|
| BR01 | a0001 |
| BR01 | a0002 |
| BR02 | a0003 |
| BR02 | a0013 |
Orders 表
| order_num | cust_id | order_date |
|---|---|---|
| a0001 | cust10 | 2022-01-01 00:00:00 |
| a0002 | cust1 | 2022-01-01 00:01:00 |
| a0003 | cust1 | 2022-01-02 00:00:00 |
| a0013 | cust2 | 2022-01-01 00:20:00 |
Customers 表代表顧客資訊,cust_id 為顧客 id,cust_email 為顧客 email
| cust_id | cust_email |
|---|---|
| cust10 | [email protected] |
| cust1 | [email protected] |
| cust2 | [email protected] |
問題
回傳購買 prod_id 為BR01 的產品的所有顧客的電子郵件(Customers 表中的 cust_email),結果無需排序,
提示:涉及到 SELECT 陳述句,最內層的從 OrderItems 表回傳 order_num,中間的從 Customers 表回傳 cust_id,但是必須使用 INNER JOIN 語法,
示例結果
回傳顧客 email cust_email
| cust_email |
|---|
| [email protected] |
| [email protected] |
示例決議
產品 id 為 BR01 的訂單 a0001 和 a002 的下單顧客 cust10 和 cust1 的顧客 email cust_email 分別是:[email protected] 、[email protected]
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號'
);
INSERT `OrderItems` VALUES ('BR01','a0001'),('BR01','a0002'),('BR02','a0003'),('BR02','a0013');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id',
order_date TIMESTAMP NOT NULL COMMENT '下單時間'
);
INSERT `Orders` VALUES ('a0001','cust10','2022-01-01 00:00:00'),('a0002','cust1','2022-01-01 00:01:00'),('a0003','cust1','2022-01-02 00:00:00'),('a0013','cust2','2022-01-01 00:20:00');
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id',
cust_email VARCHAR(255) NOT NULL COMMENT '顧客email'
);
INSERT `Customers` VALUES ('cust10','[email protected]'),('cust1','[email protected]'),('cust2','[email protected]');
解答
多個行內接的組合,先是篩選出 OrderItems 和 Orders 表中 order_num 相同的列,然后根據篩選出的結果列中的 cust_id 從 Customers 表中找對應的顧客資訊即可,
SELECT
cust_email
FROM
Customers JOIN Orders ON
Orders.cust_id = Customers.cust_id
JOIN OrderItems ON OrderItems.prod_id = 'BR01' AND OrderItems.order_num = Orders.order_num;
SQL41 確定最佳顧客的另一種方式(二)
描述
OrderItems 表代表訂單資訊,確定最佳顧客的另一種方式是看他們花了多少錢,OrderItems 表有訂單號 order_num 和 item_price 商品售出價格、quantity 商品數量
| order_num | item_price | quantity |
|---|---|---|
| a1 | 10 | 105 |
| a2 | 1 | 1100 |
| a2 | 1 | 200 |
| a4 | 2 | 1121 |
| a5 | 5 | 10 |
| a2 | 1 | 19 |
| a7 | 7 | 5 |
Orders 表含有欄位 order_num 訂單號、cust_id 顧客 id
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a3 | cust2 |
| a4 | cust22 |
| a5 | cust221 |
| a7 | cust2217 |
顧客表 Customers 有欄位 cust_id 客戶 id、cust_name 客戶姓名
| cust_id | cust_name |
|---|---|
| cust10 | andy |
| cust1 | ben |
| cust2 | tony |
| cust22 | tom |
| cust221 | an |
| cust2217 | hex |
問題
撰寫 SQL 陳述句,回傳訂單總價不小于 1000 的客戶名稱和總額(OrderItems 表中的 order_num),
提示:需要計算總和(item_price 乘以 quantity),按總額對結果進行排序,請使用INNER JOIN 語法,
示例結果
| cust_name | total_price |
|---|---|
| andy | 1050 |
| ben | 1319 |
| tom | 2242 |
示例決議
總額(item_price 乘以 quantity)大于等于 1000 的訂單號,例如 a2 對應的顧客id 為 cust1,cust1 的顧客名稱 cust_name 是 ben,最后回傳 ben 作為 order_num a2 的quantity * item_price 總和的結果 1319,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
item_price INT(16) NOT NULL COMMENT '售出價格',
quantity INT(16) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a1',10,105),('a2',1,1100),('a2',1,200),('a4',2,1121),('a5',5,10),('a2',1,19),('a7',7,5);
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
解答
主要考察的知識點:
- 取別名:
AS關鍵字 - 求和:
SUM() GROUP BY和HAVING同時使用用于過濾結果- 排序:
ORDER BY關鍵字
主要考察對多個 SQL 關鍵字的運用,同時還需要注意 SQL 中關鍵字的前后順序,
SELECT cust_name, SUM(item_price * quantity) AS total_price
FROM OrderItems, Orders, Customers
WHERE OrderItems.order_num = Orders.order_num AND Orders.cust_id = Customers.cust_id
GROUP BY cust_name
HAVING total_price >= 1000
ORDER BY total_price;
SQL42 檢索每個顧客的名稱和所有的訂單號(一)
描述
Customers 表代表顧客資訊含有顧客 id cust_id 和顧客名稱 cust_name
| cust_id | cust_name |
|---|---|
| cust10 | andy |
| cust1 | ben |
| cust2 | tony |
| cust22 | tom |
| cust221 | an |
| cust2217 | hex |
Orders 表代表訂單資訊含有訂單號 order_num 和顧客 id cust_id
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a3 | cust2 |
| a4 | cust22 |
| a5 | cust221 |
| a7 | cust2217 |
問題
使用 INNER JOIN 撰寫 SQL 陳述句,檢索每個顧客的名稱(Customers 表中的 cust_name)和所有的訂單號(Orders 表中的 order_num),最后根據顧客姓名 cust_name 升序回傳,
示例結果
回傳顧客名稱 cust_name 和訂單號 order_num
| cust_name | order_num |
|---|---|
| an | a5 |
| andy | a1 |
| ben | a2 |
| hex | a7 |
| tom | a4 |
| tony | a3 |
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
解答
主要考察 INNER JOIN 的用法,其使用語法如下:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
要實作本題,利用上述語法填入對應欄位名和表名即可,最后則是關鍵字 ORDER BY 的使用,
SELECT cust_name, Orders.order_num FROM Customers JOIN Orders ON Orders.cust_id = Customers.cust_id ORDER BY cust_name;
SQL43 檢索每個顧客的名稱和所有的訂單號(二)
描述
Orders 表代表訂單資訊含有訂單號 order_num和顧客 id cust_id
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a3 | cust2 |
| a4 | cust22 |
| a5 | cust221 |
| a7 | cust2217 |
Customers 表代表顧客資訊含有顧客 id cust_id 和 顧客名稱 cust_name
| cust_id | cust_name |
|---|---|
| cust10 | andy |
| cust1 | ben |
| cust2 | tony |
| cust22 | tom |
| cust221 | an |
| cust2217 | hex |
| cust40 | ace |
問題
檢索每個顧客的名稱(Customers 表中的 cust_name)和所有的訂單號(Orders 表中的 order_num),列出所有的顧客,即使他們沒有下過訂單,最后根據顧客姓名 cust_name 升序回傳,
示例結果
回傳顧客名稱 cust_name 和訂單號 order_num
| cust_name | order_num |
|---|---|
| ace | NULL |
| an | a5 |
| andy | a1 |
| ben | a2 |
| hex | a7 |
| tom | a4 |
| tony | a3 |
示例決議
基于兩張表,回傳訂單號 a1 的顧客名稱 andy 等人,沒有下單的顧客 ace 也統計了進來,
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_id VARCHAR(255) NOT NULL COMMENT '客戶id',
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex'),('cust40','ace');
DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders`(
order_num VARCHAR(255) NOT NULL COMMENT '商品訂單號',
cust_id VARCHAR(255) NOT NULL COMMENT '顧客id'
);
INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
解答
根據題意,主要以 Customers 表中的列為主,然后取 Customers 和 Orders 中的交集,對于 Orders 表中不存在的列則取值 null,所以可以使用外聯結中的 LEFT JION,其使用語法如下:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
套用上述語法,填入對應表和列名即可實作,最后則是再加入簡單的排序即可,
SELECT cust_name, Orders.order_num FROM Customers LEFT JOIN Orders On Orders.cust_id = Customers.cust_id ORDER BY cust_name;
SQL44 回傳產品名稱和與之相關的訂單號
描述
Products 表為產品資訊表含有欄位 prod_id 產品 id、prod_name 產品名稱
| prod_id | prod_name |
|---|---|
| a0001 | egg |
| a0002 | sockets |
| a0013 | coffee |
| a0003 | cola |
| a0023 | soda |
OrderItems 表為訂單資訊表含有欄位 order_num 訂單號和產品 id prod_id
| prod_id | order_num |
|---|---|
| a0001 | a105 |
| a0002 | a1100 |
| a0002 | a200 |
| a0013 | a1121 |
| a0003 | a10 |
| a0003 | a19 |
| a0003 | a5 |
問題
使用 OUTER JOIN 聯結 Products 表和 OrderItems 表,回傳產品名稱(prod_name)和與之相關的訂單號(order_num)的串列,并按照產品名稱升序排序,
示例結果
回傳產品名稱 prod_name 和訂單號 order_num
| prod_name | order_num |
|---|---|
| coffee | a1121 |
| cola | a5 |
| cola | a19 |
| cola | a10 |
| egg | a105 |
| sockets | a200 |
| sockets | a1100 |
| soda | NULL |
示例決議
回傳產品和對應實際支付訂單的訂單號,但是無實際訂單的產品 soda 也回傳,最后根據產品名稱升序排序,
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0001','egg'),
('a0002','sockets'),
('a0013','coffee'),
('a0003','cola'),
('a0023','soda');
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
order_num VARCHAR(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a0001','a105'),('a0002','a1100'),('a0002','a200'),('a0013','a1121'),('a0003','a10'),('a0003','a19'),('a0003','a5');
解答
此題解法類似于 43 題,主要使用 OUTER JOIN 中的左聯結 LEFT JOIN,主要清除相關語法,然后套用填入表名和列名即可,
SELECT prod_name, OrderItems.order_num FROM Products
LEFT JOIN OrderItems ON OrderItems.prod_id = Products.prod_id
ORDER BY prod_name;
SQL45 回傳產品名稱和每一項產品的總訂單數
描述
Products 表為產品資訊表含有欄位 prod_id 產品 id、prod_name 產品名稱
| prod_id | prod_name |
|---|---|
| a0001 | egg |
| a0002 | sockets |
| a0013 | coffee |
| a0003 | cola |
| a0023 | soda |
OrderItems 表為訂單資訊表含有欄位 order_num 訂單號和產品 id prod_id
| prod_id | order_num |
|---|---|
| a0001 | a105 |
| a0002 | a1100 |
| a0002 | a200 |
| a0013 | a1121 |
| a0003 | a10 |
| a0003 | a19 |
| a0003 | a5 |
問題
使用 OUTER JOIN 聯結 Products 表和 OrderItems 表,回傳產品名稱(prod_name)和每一項產品的總訂單數(不是訂單號),并按產品名稱升序排序,
示例結果
回傳產品名稱 prod_name 和訂單號訂單數 orders
| prod_name | orders |
|---|---|
| coffee | 1 |
| cola | 3 |
| egg | 1 |
| sockets | 2 |
| soda | 0 |
示例決議
回傳產品和產品對應的實際支付的訂單數,但是無實際訂單的產品 soda 也回傳,最后根據產品名稱升序排序,
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0001','egg'),
('a0002','sockets'),
('a0013','coffee'),
('a0003','cola'),
('a0023','soda');
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
order_num VARCHAR(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a0001','a105'),('a0002','a1100'),('a0002','a200'),('a0013','a1121'),('a0003','a10'),('a0003','a19'),('a0003','a5');
解答
考察的知識點仍然是外連接,只不過加入了 COUNT() 函式用于分組統計,最后同樣是簡單的排序,
SELECT prod_name, COUNT(order_num) AS orders
FROM Products LEFT JOIN OrderItems ON OrderItems.prod_id = Products.prod_id
GROUP BY prod_name ORDER BY prod_name;
SQL46 列出供應商及其可供產品的數量
描述
有 Vendors 表含有 vend_id 供應商id.
| vend_id |
|---|
| a0002 |
| a0013 |
| a0003 |
| a0010 |
有 Products 表含有供應商 id 和供應產品 id
| vend_id | prod_id |
|---|---|
| a0001 | egg |
| a0002 | prod_id_iphone |
| a00113 | prod_id_tea |
| a0003 | prod_id_vivo phone |
| a0010 | prod_id_huawei phone |
問題
列出供應商(Vendors 表中的 vend_id)及其可供產品的數量,包括沒有產品的供應商,你需要使用 OUTER JOIN 和 COUNT() 聚合函式來計算 Products 表中每種產品的數量,最后根據 vend_id 升序排序,
注意:vend_id 列會顯示在多個表中,因此在每次參考它時都需要完全限定它,
示例結果
回傳供應商 id 和對應供應商供應的產品的個數
| vend_id | prod_id |
|---|---|
| a0002 | 1 |
| a0013 | 0 |
| a0003 | 1 |
| a0010 | 1 |
示例決議
供應商 a00013 供應的商品不在 Products 表中所以為 0,其他供應商供應的產品為 1 個,
示例
DROP TABLE IF EXISTS `Vendors`;
CREATE TABLE IF NOT EXISTS `Vendors` (
`vend_id` VARCHAR(255) NOT NULL COMMENT 'vend名稱'
);
INSERT INTO `Vendors` VALUES ('a0002'),
('a0013'),
('a0003'),
('a0010');
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`vend_id` VARCHAR(255) NOT NULL COMMENT '產品 ID',
`prod_id` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('a0001','egg'),
('a0002','prod_id_iphone'),
('a00113','prod_id_tea'),
('a0003','prod_id_vivo phone'),
('a0010','prod_id_huawei phone');
解答
利用 COUNT() 函式對 Vendors 中的 vend_id 分組并統計,
另外則是考察 LEFT JOIN,即題目中所說的 OUTER JOIN,其具體使用語法如下,
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
SELECT Vendors.vend_id, COUNT(Products.prod_id) FROM Vendors LEFT JOIN Products ON Vendors.vend_id = Products.vend_id GROUP BY Vendors.vend_id ORDER BY Vendors.vend_id;
SQL47 將兩個 SELECT 陳述句結合起來(一)
描述
表 OrderItems 包含訂單產品資訊,欄位 prod_id 代表產品 id、quantity 代表產品數量
| prod_id | quantity |
|---|---|
| a0001 | 105 |
| a0002 | 100 |
| a0002 | 200 |
| a0013 | 1121 |
| a0003 | 10 |
| a0003 | 19 |
| a0003 | 5 |
| BNBG | 10002 |
問題
將兩個 SELECT 陳述句結合起來,以便從 OrderItems 表中檢索產品 id(prod_id)和 quantity,其中,一個 SELECT 陳述句過濾數量為 100 的行,另一個 SELECT 陳述句過濾 id 以 BNBG 開頭的產品,最后按產品 id 對結果進行升序排序,
示例結果
回傳產品 id prod_id和產品數量 quantity
| prod_id | quantity |
|---|---|
| a0002 | 100 |
| BNBG | 10002 |
示例決議
產品 id a0002 因為數量等于 100 被選取回傳;BNBG 因為是以 BNBG 開頭的產品所以回傳;最后以產品 id 進行排序回傳,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
quantity VARCHAR(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a0001',105),('a0002',100),('a0002',200),('a0013',1121),('a0003',10),('a0003',19),('a0003',5),('BNBG',10002);
解答
依照題意,其實我們利用一個 SELECT 然后搭配 WHERE 條件查詢就能將滿足題意的紀律篩選出來,但是為了練習關鍵字 UNION 的使用,可以將兩個條件查詢陳述句分開,然后用 UNION 聯接起來,最后則是按照 prod_id 正序排列,
SELECT prod_id, quantity FROM OrderItems WHERE quantity = '100' UNION SELECT prod_id, quantity FROM OrderItems WHERE prod_id LIKE 'BNBG%' ORDER BY prod_id;
SQL48 將兩個 SELECT 陳述句結合起來(二)
描述
表 OrderItems 包含訂單產品資訊,欄位 prod_id 代表產品 id、quantity 代表產品數量,
| prod_id | quantity |
|---|---|
| a0001 | 105 |
| a0002 | 100 |
| a0002 | 200 |
| a0013 | 1121 |
| a0003 | 10 |
| a0003 | 19 |
| a0003 | 5 |
| BNBG | 10002 |
問題
將兩個 SELECT 陳述句結合起來,以便從 OrderItems 表中檢索產品 id(prod_id)和 quantity,其中,一個 SELECT 陳述句過濾數量為 100 的行,另一個 SELECT 陳述句過濾 id 以 BNBG 開頭的產品,最后按產品 id 對結果進行升序排序,
注意:這次僅使用單個 SELECT 陳述句,
示例結果
回傳產品 id prod_id 和產品數量 quantity
| prod_id | quantity |
|---|---|
| a0002 | 100 |
| BNBG | 10002 |
示例決議
產品 id a0002 因為數量等于 100 被選取回傳;BNBG 因為是以 BNBG 開頭的產品所以回傳;最后以產品 id 進行排序回傳,
示例
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
prod_id VARCHAR(255) NOT NULL COMMENT '產品id',
quantity VARCHAR(255) NOT NULL COMMENT '商品數量'
);
INSERT `OrderItems` VALUES ('a0001',105),('a0002',100),('a0002',200),('a0013',1121),('a0003',10),('a0003',19),('a0003',5),('BNBG',10002);
解答
根據題意僅使用單個 SELECT 陳述句,那就直接利用 WHERE 條件查詢,然后將兩個條件利用連接符 OR 并聯即可,
SELECT prod_id, quantity FROM OrderItems WHERE prod_id LIKE 'BNBG%' OR quantity = '100' ORDER BY prod_id;
SQL49 組合 Products 表中的產品名稱和 Customers 表中的顧客名稱
描述
Products 表含有欄位 prod_name 代表產品名稱
| prod_name |
|---|
| flower |
| rice |
| ring |
| umbrella |
Customers 表代表顧客資訊,cust_name 代表顧客名稱
| cust_name |
|---|
| andy |
| ben |
| tony |
| tom |
| an |
| lee |
| hex |
問題
撰寫 SQL 陳述句,組合 Products 表中的產品名稱(prod_name)和 Customers 表中的顧客名稱(cust_name)并回傳,然后按產品名稱對結果進行升序排序,
示例結果
| prod_name |
|---|
| an |
| andy |
| ben |
| flower |
| hex |
| lee |
| rice |
| ring |
| tom |
| tony |
| umbrella |
示例決議
拼接 cust_name 和 prod_name 并根據結果升序排序
示例
DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_name` VARCHAR(255) NOT NULL COMMENT '產品名稱'
);
INSERT INTO `Products` VALUES ('flower'),
('rice'),
('ring'),
('umbrella');
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_name VARCHAR(255) NOT NULL COMMENT '客戶姓名'
);
INSERT `Customers` VALUES ('andy'),('ben'),('tony'),('tom'),('an'),('lee'),('hex');
解答
同樣考察 UNION 運算子,通過將兩個 SELECT 陳述句的結果合并起來即可,
這里需要注意的是得出的結果是 prod_name,所以需要注意兩個 SELECT 陳述句的先后順序,再然后就是需要對查詢出的記錄按照 prod_name 正序排列,
SELECT prod_name FROM Products UNION SELECT cust_name FROM Customers ORDER BY prod_name;
SQL50 糾錯4
描述
表 Customers 含有欄位 cust_name 顧客名、cust_contact 顧客聯系方式、cust_state 顧客州、cust_email 顧客 email
| cust_name | cust_contact | cust_state | cust_email |
|---|---|---|---|
| cust10 | 8695192 | MI | [email protected] |
| cust1 | 8695193 | MI | [email protected] |
| cust2 | 8695194 | IL | [email protected] |
問題
修正下面錯誤的 SQL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state = 'MI'
ORDER BY cust_name;
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state = 'IL' ORDER BY cust_name;
示例結果
回傳顧客名稱:cust_name、顧客聯系方式:cust_contact、顧客 email:cust_email
| cust_name | cust_contact | cust_email |
|---|---|---|
| cust1 | 8695193 | [email protected] |
| cust10 | 8695192 | [email protected] |
| cust2 | 8695194 | [email protected] |
示例決議
回傳住在 "IL" 和 "MI" 的顧客資訊,最后根據顧客名稱升序排序,
示例
DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
cust_name VARCHAR(255) NOT NULL COMMENT '顧客id',
cust_contact VARCHAR(255) NOT NULL COMMENT '顧客聯系方式',
cust_state VARCHAR(255) NOT NULL COMMENT '顧客州',
cust_email VARCHAR(255) NOT NULL COMMENT '顧客email'
);
INSERT `Customers` VALUES ('cust10','8695192','MI','[email protected]'),('cust1','8695193','MI','[email protected]'),('cust2','8695194','IL','[email protected]');
解答
主要有兩處錯誤,第一是 UNION 前多加了 ;,; 表示一條 SQL 的結束,加在此處不適合,
第二則是只主要對 cust_name 排序一次即可,放在 UNION 前的 ORDER BY 關鍵字顯然位置不對,
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state = 'MI'
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state = 'IL' ORDER BY cust_name;
致謝
感謝牛客網提供的題目串列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554639.html
標籤:其他
下一篇:返回列表
