牛客题霸刷题-SQL必知必会50道

Posted IT邦德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客题霸刷题-SQL必知必会50道相关的知识,希望对你有一定的参考价值。

📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、mysql、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

前言

SQL每个人都要用,但是用来衡量产出的并不是SQL本身,你需要用这个工具,去创造其它的价值。

🐴 1.检索数据

🚀 1.1 从 Customers 表中检索所有的 ID

难度系数:🚩 入门

🚀 建表语句
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 |
+---------+
| A       |
| B       |
| C       |
+---------+

🚀 问题
编写 SQL 语句,从 Customers 表中检索所有的cust_id

🚀 示例答案
返回cust_id列的内容
+---------+
| cust_id |
+---------+
| A       |
| B       |
| C       |
+---------+

🐴🐴 答案
mysql> select cust_id from Customers;

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

难度系数:🚩🚩 简单

🚀 建表语句
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');

🚀 描述
表OrderItems含有非空的列prod_id代表商品id,包含了所有已订购的商品(有些已被订购多次)
+---------+
| prod_id |
+---------+
| a1      |
| a2      |
| a3      |
| a4      |
| a5      |
| a6      |
| a6      |
+---------+

🚀 问题
编写SQL 语句,检索并列出所有已订购商品(prod_id)的去重后的清单

🚀 示例答案
返回cust_id列的内容
+---------+
| prod_id |
+---------+
| a1      |
| a2      |
| a3      |
| a4      |
| a5      |
| a6      |
+---------+
6 rows in set (0.04 sec)

🐴🐴 答案
mysql> select distinct prod_id from OrderItems;

🚀 1.3 检索所有列

难度系数:🚩🚩🚩 中等

🚀 建表语句
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');

🚀 描述
现在有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       |
+---------+-----------+
7 rows in set (0.00 sec)


🐴🐴 答案
mysql> select * from Customers;

🐴 2.排序检索数据

🚀 2.1 检索顾客名称并且排序

难度系数:🚩🚩🚩 中等

🚀 建表语句
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');

🚀 描述
有表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        |
+-----------+
7 rows in set (0.01 sec)

🐴🐴 答案
mysql> select cust_name from Customers
order by cust_name desc;

🚀 2.2 对顾客ID和日期排序

难度系数:🚩🚩 简单

🚀 建表语句
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');

🚀 描述
有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      |
+---------+-----------+
4 rows in set (0.00 sec)

示例解析
首先根据cust_id进行排列,andy在bob和dick前,再根据order_date进行排列,
订单号bbbb的订单时间是 "2021-01-01 12:00:00"大于订单号aaaa的时间"2021-01-01 00:00:00"

🐴🐴 答案
mysql> select cust_id,order_num
from Orders
order by cust_id,order_date desc;

🚀 2.3 按照数量和价格排序

难度系数:🚩🚩 简单

🚀 建表语句
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);

🚀 描述
假设有一个OrderItems表
+----------+------------+
| quantity | item_price |
+----------+------------+
|        1 |        100 |
|       10 |       1003 |
|        2 |        500 |
+----------+------------+

🚀 问题
编写 SQL 语句,显示 OrderItems 表中的数量(quantity)和价格(item_price),
并按数量由多到少、价格由高到低排序。

🚀 示例答案
返回quantity和item_price
+----------+------------+
| quantity | item_price |
+----------+------------+
|       10 |       1003 |
|        2 |        500 |
|        1 |        100 |
+----------+------------+

🐴🐴 答案
mysql> select quantity,item_price
from OrderItems
order by quantity desc,item_price desc;

🐴 3.过滤数据

🚀 3.1 返回固定价格的产品

难度系数:🚩 入门

🚀 建表语句
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);

🚀 描述
有表Products
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| a0018   | sockets        |       9.49 |
| a0019   | iphone13       |        600 |
| b0019   | gucci t-shirts |       1000 |
+---------+----------------+------------+

🚀 问题
从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),
只返回价格为 9.49 美元的产品。


🚀 示例答案
返回prod_id和prod_name
+---------+-----------+
| prod_id | prod_name |
+---------+-----------+
| a0018   | sockets   |
+---------+-----------+
1 row in set (0.01 sec)

🐴🐴 答案
mysql> select prod_id,prod_name from Products
where prod_price=9.49;

🚀 3.2 返回更高价格的产品

难度系数:🚩🚩 简单

🚀 建表语句
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);

🚀 描述
有表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      |
+---------+----------------+
| a0011   | usb            |
| a0019   | iphone13       |
| b0019   | gucci t-shirts |
+---------+----------------+
3 rows in set (0.01 sec)

🐴🐴 答案
mysql> select prod_id,prod_name from Products
where prod_price >=9;

🚀 3.3 返回产品并且按照价格排序

难度系数:🚩🚩 简单

🚀 建表语句
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);

🚀 描述
有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 |
+-----------+------------+
2 rows in set (0.01 sec)

🐴🐴 答案
mysql> select prod_name,prod_price from Products 
where prod_price betw

以上是关于牛客题霸刷题-SQL必知必会50道的主要内容,如果未能解决你的问题,请参考以下文章

数据结构和算法必知必会的 50 道题目 12 种语言代码实现

牛客题霸-SQL篇——10~20题

牛客题霸-SQL篇——1~10题

牛客题霸在线编程Python题库——Python入门到实践40招循环语句 条件语句 元组

SQL最强刷提网站

SQL必知必会建库SQL语句