MySQL | SQL 必知必会 50 题(1 - 5)
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;
致谢
感谢牛客网提供的题目列表。
#数据库工程师##mysql#- 本专栏适合想要学习 Java 的小伙伴。 - 本专栏中主要博主自己学习 Java 过程中的笔记,希望能给想要学习 Java 的小伙伴们一点帮助。 - 首发公众号『村雨遥』,更新中 🎉