不知道 MySQL 咋学?刷完牛客这 50 道题就够了!(第三篇)

本次内容共分为十篇,每次五题,其它篇章都在我主页的Mysql专栏中!

前言

你是否还在烦恼 SQL 该从何学起,或者学了 SQL 想找个地方练练手?好巧不巧,最近在工作之余登上牛客,发现了牛客不知道啥时候上线了SQL 必知必会的练习题。

《SQL 必知必会》作为麻省理工学院、伊利诺伊大学等众多大学的参考教材,由浅入深地讲解了SQL的基本概念和语法。涉及数据的排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容。实例丰富,方便查阅,可以说作为一个 CRUD BOY/GIRL 必读书目。

想着正好给它刷一遍,然后将自己刷题的一些想法总结下,于是有了今天这篇文章,希望能给需要的小伙伴一点点帮助

SQL11 返回更多的产品

描述

OrderItems 表含有:订单号 order_num,quantity 产品数量

order_numquantity
a1105
a21100
a2200
a41121
a510
a219
a75

问题

从 OrderItems 表中检索出所有不同且不重复的订单号(order_num),其中每个订单都要包含 100 个或更多的产品。

示例结果

返回订单号列 order_num

order_num
a1
a2
a4

示例

1

2

3

4

5

6

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 并联。

1

SELECT DISTINCT order_num FROM OrderItems WHERE quantity >= 100;

1

SELECT DISTINCT order_num FROM OrderItems WHERE quantity > 100 OR quantity = 100;

 

SQL12 检索供应商名称

描述

Vendors 表有字段供应商名称(vend_name)、供应商国家(vend_country)、供应商州(vend_state)

vend_namevend_countryvend_state
appleUSACA
vivoCNAshenzhen
huaweiCNAxian

问题

编写 SQL 语句,从 Vendors 表中检索供应商名称(vend_name),仅返回加利福尼亚州的供应商(这需要按国家[USA]和州[CA]进行过滤,没准其他国家也存在一个 CA)

示例答案

返回供应商名称 vend_name

vend_name
apple

示例

1

2

3

4

5

6

7

8

9

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 将条件串联,满足这两个条件的数据则进行输出。

1

SELECT vend_name FROM Vendors WHERE vend_country = 'USA' AND vend_state = 'CA';

 

SQL13 检索并列出已订购产品的清单

描述

OrderItems 表包含了所有已订购的产品(有些已被订购多次)。

prod_idorder_numquantity
BR01a1105
BR02a21100
BR02a2200
BR03a41121
BR017a510
BR02a219
BR017a75

问题

编写 SQL 语句,查找所有订购了数量至少 100 个的 BR01、BR02 或 BR03 的订单。你需要返回 OrderItems 表的订单号(order_num)、产品 ID(prod_id)和数量(quantity),并按产品 ID 和数量进行过滤。

示例答案

返回商品 id prod_id、订单 order_num、数量 quantity。

order_numprod_idquantity
a1BR01105
a2BR021100
a2BR02200
a4BR031121

示例解析

返回的结果中,数量满足大于等于 100,且满足 prod_id 是 "BR01",“BR02”,“BR03" 中的任意一个。

示例

1

2

3

4

5

6

7

8

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

复制代码

1

SELECT order_num, prod_id, quantity FROM OrderItems WHERE quantity >= 100 AND prod_id IN ('BR01', 'BR02', 'BR03');

 

SQL14 返回所有价格在 3 美元到 6 美元之间的产品的名称和价格

描述

有表 Products

prod_idprod_nameprod_price
a0011egg3
a0019sockets4
b0019coffee15

问题

编写 SQL 语句,返回所有价格在 3 美元到 6 美元之间的产品的名称(prod_name)和价格(prod_price),使用 AND 操作符,然后按价格对结果进行升序排序

示例结果

返回商品名称 prod_name 和商品价格 prod_price

prod_nameprod_price
egg3
sockets4

注:不需要考虑价格相同时的排序问题

示例

1

2

3

4

5

6

7

8

9

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

1

SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 3 AND 6 ORDER BY prod_price;

题目中指定需要使用关键字 AND,则需要将价格条件替换成 prod_price >= 3prod_price <= 6 两个条件,然后将其串联。

1

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_namevend_countryvend_state
appleUSACA
vivoCNAshenzhen
huaweiCNAxian

问题

修改正确下面 sql,使之正确返回

1

2

3

4

SELECT vend_name

FROM Vendors

ORDER BY vend_name

WHERE vend_country = 'USA' AND vend_state = 'CA';

示例结果

结果返回 vend_name

vend_name
apple

示例

1

2

3

4

5

6

7

8

9

10

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 语句格式为:

1

SELECT [列名] FOMR [表名] WHERE [条件] ORDER BY [列名];

1

SELECT vend_name FROM Vendors WHERE vend_country = 'USA' AND vend_state = 'CA' ORD

 

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十八岁讨厌Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值