本文已同步至:村雨遙
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;
致謝
感謝牛客網提供的題目列表。