主頁 > 資料庫 > 《SQL 必知必會》全決議

《SQL 必知必會》全決議

2023-06-08 09:43:09 資料庫

不要哀求,學會爭取,若是如此,終有所獲,

原文: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 >= 3prod_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 >= 3prod_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');

解答

主要是一處錯誤,搞錯了關鍵字 WHEREORDER 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 即可,但是需要注意 WHEREORDER 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');

解答

題目中明確要求使用 LIKEAND 關鍵字,那么可以將條件拆分為兩個模糊查詢,一個是描述中含有 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 ');

解答

題目中已經進行了提示,要查詢產品描述中以先后順序同時出現 toycarrots 的產品,但沒有說他們兩者之間存在的字符以及 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_namecust_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_idBR01 的記錄 ,然后再從 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 為 BR01order_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]');

解答

多個行內接的組合,先是篩選出 OrderItemsOrders 表中 order_num 相同的列,然后根據篩選出的結果列中的 cust_idCustomers 表中找對應的顧客資訊即可,

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 BYHAVING 同時使用用于過濾結果
  • 排序: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 表中的列為主,然后取 CustomersOrders 中的交集,對于 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

標籤:其他

上一篇:GaussDB(DWS)查詢過濾器原理與應用

下一篇:返回列表

標籤雲
其他(160597) Python(38215) JavaScript(25484) Java(18209) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7238) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4585) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1983) 功能(1967) HtmlCss(1955) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1880) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 《SQL 必知必會》全決議

    > 不要哀求,學會爭取。若是如此,終有所獲。 > > 原文:https://mp.weixin.qq.com/s/zbOqyAtsWsocarsFIGdGgw ## 前言 你是否還在煩惱 SQL 該從何學起,或者學了 SQL 想找個地方練練手?好巧不巧,最近在作業之余登上牛客,發現了牛客不知道啥時候 ......

    uj5u.com 2023-06-08 09:43:09 more
  • GaussDB(DWS)查詢過濾器原理與應用

    摘要:GaussDB(DWS)查詢過濾器(黑名單)提供查詢過濾功能,支持自動隔離反復被終止的查詢,防止爛SQL再次執行。 本文分享自華為云社區《GaussDB(DWS)查詢過濾器原理與應用》,作者:門前一棵葡萄樹 。 一、概述 GaussDB(DWS)查詢過濾器(黑名單)提供查詢過濾功能,支持自動隔 ......

    uj5u.com 2023-06-08 09:43:01 more
  • SQL Server 補丁理解及安裝 內附完整版下載地址及sp1/2/3補丁

    啟動安裝程式 下載sqlserver2014,雙擊startup.exe進行安裝 系統配置檢查器 使用系統配置檢查器,看系統是否符合安裝sqlserver2014的所有要求 開始安裝 然后點擊安裝,全新sqlserver獨立安裝或向現有安裝添加功能 安裝規則 然后就是使用默認的設定,點開詳細資訊,可 ......

    uj5u.com 2023-06-08 09:42:22 more
  • 一份配置輕松搞定表單渲染,配置式表單渲染器在袋鼠云的實作思路與

    前段時間,[袋鼠云離線開發產品](https://www.dtstack.com/dtinsight?src=https://www.cnblogs.com/DTinsight/archive/2023/06/07/szsm)接到改造資料同步表單的需求。 一方面,[資料同步模塊](https://www.dtstack.com/dtinsight?src=szsm)的代碼可讀性和可維護性較差,導致在資料 ......

    uj5u.com 2023-06-08 09:40:24 more
  • SQL Server 補丁理解及安裝 內附完整版下載地址及sp1/2/3補丁

    啟動安裝程式 下載sqlserver2014,雙擊startup.exe進行安裝 系統配置檢查器 使用系統配置檢查器,看系統是否符合安裝sqlserver2014的所有要求 開始安裝 然后點擊安裝,全新sqlserver獨立安裝或向現有安裝添加功能 安裝規則 然后就是使用默認的設定,點開詳細資訊,可 ......

    uj5u.com 2023-06-08 09:39:20 more
  • 國產資料庫的譜系

    資料庫產品的成功絕對不是技術堆疊的成功,而是需要有大量的應用場景磨合才能逐步成功的。如果僅僅依靠自己那幾百個用戶,想要發展出成熟的高水平的商用資料庫產品來,那幾乎是不太能的。依靠開源社區的廣大用戶來研發自己的資料庫產品不失為一種比較好的策略。 ......

    uj5u.com 2023-06-08 09:38:28 more
  • 手記系列之五 ----- SQL使用經驗分享

    ## 前言 本篇文章主要介紹的關于本人從剛作業到現在使用Sql一些使用方法和經驗,從最基本的SQL函式使用,到一些場景的業務場景SQL撰寫。 ## SQL基礎函式使用 ### 1.欄位轉換 CASE WHEN 意義: If(a==b) a=c; 用法: 1, CASE 欄位 WHEN 欄位結果1 T ......

    uj5u.com 2023-06-08 09:36:41 more
  • 《SQL 必知必會》全決議

    > 不要哀求,學會爭取。若是如此,終有所獲。 > > 原文:https://mp.weixin.qq.com/s/zbOqyAtsWsocarsFIGdGgw ## 前言 你是否還在煩惱 SQL 該從何學起,或者學了 SQL 想找個地方練練手?好巧不巧,最近在作業之余登上牛客,發現了牛客不知道啥時候 ......

    uj5u.com 2023-06-08 09:36:17 more
  • GaussDB(DWS)查詢過濾器原理與應用

    摘要:GaussDB(DWS)查詢過濾器(黑名單)提供查詢過濾功能,支持自動隔離反復被終止的查詢,防止爛SQL再次執行。 本文分享自華為云社區《GaussDB(DWS)查詢過濾器原理與應用》,作者:門前一棵葡萄樹 。 一、概述 GaussDB(DWS)查詢過濾器(黑名單)提供查詢過濾功能,支持自動隔 ......

    uj5u.com 2023-06-08 09:36:10 more
  • Hive執行計劃之hive依賴及權限查詢和常見使用場景

    [TOC] ## 概述 Hive查看執行計劃的命令中還有兩個不怎么常用但很重要的命令,接下來詳細介紹一下。 有一個問題:**如何在hiveSQL執行之前就探查到這段邏輯的血緣依賴關系?** hive血緣是很多生產級數倉必須要提供的功能,大多數解決方案都是**使用hive hooks的方法通過SQL執 ......

    uj5u.com 2023-06-08 09:35:52 more