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

示例解析

例如,登录名是 ANOAK(Andy Li,居住在 Oak Park)

示例

1

2

3

4

5

6

7

8

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 '客户姓名',

    cust_contact VARCHAR(255) NOT NULL COMMENT '客户联系人',

    cust_city VARCHAR(255) NOT NULL COMMENT '客户城市'

);

INSERT `Customers` VALUES ('a1','Andy Li','Andy Li','Oak Park'),('a2','Ben Liu','Ben Liu','Oak Park'),('a3','Tony Dai','Tony Dai','Oak Park'),('a4','Tom Chen','Tom Chen','Oak Park'),('a5','An Li','An Li','Oak Park'),('a6','Lee Chen','Lee Chen','Oak Park'),('a7','Hex Liu','Hex Liu','Oak Park');

解答

根据题意以及示例结果,可以看到登录名全是大写,所以需要用到函数 upper(),然后需要将顾客联系人前两个字符和所在城市的前三个字符相拼接,则需要用到函数 concat(),再接着就是需要从 cust_namecust_city 中截取字符串,则需要用到 substring(),最后则是通过将字符串拼接转换之后取别名为 user_login,需要用到关键字 AS。以上提到的三个函数用法如下:

  • upper(字符串):将字符串中所有字符转换为大写。

  • substring(字符串, 起始位置, 截取的字符数),需要注意的是起始位置是从 1 开始的。

  • concat(字符串 1, 字符串 2, 字符串 3, …)

1

SELECT cust_id, cust_name, upper(concat(substring(cust_name, 1, 2), substring(cust_city, 1, 3))) AS user_login FROM Customers;

SQL23 返回 2020 年 1 月的所有订单的订单号和订单日期


描述

Orders 订单表

| order_num | order_date |

| — | — |

| a0001 | 2020-01-01 00:00:00 |

| a0002 | 2020-01-02 00:00:00 |

| a0003 | 2020-01-01 12:00:00 |

| a0004 | 2020-02-01 00:00:00 |

| a0005 | 2020-03-01 00:00:00 |

问题

编写 SQL 语句,返回 2020 年 1 月的所有订单的订单号(order_num)和订单日期(order_date),并按订单日期升序排序

【示例结果】

返回订单号 order_num,和 order_date 订单时间

| order_num | order_date |

| — | — |

| a0001 | 2020-01-01 00:00:00 |

| a0003 | 2020-01-01 12:00:00 |

| a0002 | 2020-01-02 00:00:00 |

示例解析

a0001、a0002、a0003 时间属于 2020 年 1 月

示例

1

2

3

4

5

6

7

8

9

10

DROP TABLE IF EXISTS `Orders`;

CREATE TABLE IF NOT EXISTS `Orders`(

    order_num VARCHAR(255) NOT NULL COMMENT '订单号',

    order_date TIMESTAMP NOT NULL COMMENT '订单日期'

);

INSERT `Orders` VALUES ('a0001','2020-01-01 00:00:00'),

('a0002','2020-01-02 00:00:00'),

('a0003','2020-01-01 12:00:00'),

('a0004','2020-02-01 00:00:00'),

('a0005','2020-03-01 00:00:00');

解答

其实我们依然可以将本题看做模糊查询,只要订单日期满足对应条件即可,可以使用关键字 WHERE … LIKE … 来实现。

1

SELECT order_num, order_date FROM Orders WHERE order_date LIKE '2020-01%' ORDER BY order_date;

此外,SQL 中也提供了对于日期的操作函数 date_format(),用于返回日期的一部分。

1

SELECT order_num, order_date FROM Orders WHERE date_format(order_date, '%Y-%m') = '2020-01' ORDER BY order_date;

另外,我们还可以单独提取出日期中的年份和月份,然后将两个条件串联,筛选出同时满足两个条件的数据。

1

SELECT order_num, order_date FROM Orders WHERE year(order_date) = 2020 AND month(order_date) = 1 ORDER BY order_date;

SQL24 确定已售出产品的总数


描述

OrderItems 表代表售出的产品,quantity 代表售出商品数量。

| quantity |

| — |

| 10 |

| 100 |

| 1000 |

| 10001 |

| 2 |

| 15 |

问题

编写 SQL 语句,确定已售出产品的总数。

示例结果

返回 items_ordered 列名,表示已售出商品的总数。

| items_ordered |

| — |

| 11128 |

示例

1

2

3

4

5

DROP TABLE IF EXISTS `OrderItems`;

CREATE TABLE IF NOT EXISTS `OrderItems`(

    quantity INT(16) NOT NULL COMMENT '商品数量'

);

INSERT `OrderItems` VALUES (10),(100),(1000),(10001),(2),(15);

解答

考察求和函数以及取别名两个知识点,取别名需要关键字 AS,而且可要可不要。

而求和函数则是 SUM(列名) ,它会统计列中所有记录的综合。

1

SELECT SUM(quantity) items_ordered FROM OrderItems;

SQL25 确定已售出产品项 BR01 的总数


描述

OrderItems 表代表售出的产品,quantity 代表售出商品数量,产品项为 prod_id。

| quantity | prod_id |

| — | — |

| 10 | AR01 |

| 100 | AR10 |

| 1000 | BR01 |

| 10001 | BR010 |

问题

修改创建的语句,确定已售出产品项(prod_id)为 “BR01” 的总数。

示例结果

返回商品项已订购订单数

| items_ordered |

| — |

| 1000 |

示例解析

已订购商品 BR01 的数量 quantity 为 1000。

示例

1

2

3

4

5

6

DROP TABLE IF EXISTS `OrderItems`;

CREATE TABLE IF NOT EXISTS `OrderItems`(

    quantity INT(16) NOT NULL COMMENT '商品数量',

    prod_id VARCHAR(255) NOT NULL COMMENT '商品项'

);

INSERT `OrderItems` VALUES (10,'AR01'),(100,'AR10'),(1000,'BR01'),(10001,'BR010');

解答

主要考察的知识点:

  • 求和函数:SUM()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

…(img-Npt3m2MK-1711999906915)]

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

[外链图片转存中…(img-6omghDjS-1711999906916)]

[外链图片转存中…(img-p9E0pI6z-1711999906916)]

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值