SQL 必知必會 50 題(1 - 5)

村雨遙發表於2022-04-10
本文已同步至:村雨遙

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_idcust_name
a1andy
a2ben
a3tony
a4tom
a5an
a6lee
a7hex

問題

需要編寫 SQL語句,檢索所有列。

示例結果

返回所有列 cust_id 和 cust_name。

cust_idcust_name
a1andy
a2ben
a3tony
a4tom
a5an
a6lee
a7hex

示例

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_idcust_name
a1andy
a2ben
a3tony
a4tom
a5an
a6lee
a7hex

問題

從 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_idorder_numorder_date
andyaaaa2021-01-01 00:00:00
andybbbb2021-01-01 12:00:00
bobcccc2021-01-10 12:00:00
dickdddd2021-01-11 00:00:00

問題

編寫 SQL 語句,從 Orders 表中檢索顧客 ID(cust_id)和訂單號(order_num),並先按顧客 ID 對結果進行排序,再按訂單日期倒序排列。

示例答案

返回 2 列,cust_id 和 order_num

cust_idorder_num
andybbbb
andyaaaa
bobcccc
dickdddd

示例解析

首先根據 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;

致謝

感謝牛客網提供的題目列表。

相關文章