LeetCode MySQL 刷题条记 (三)

242 阅读4分钟

「4月日新计划更文活动」

题目:1667. 修复表中的名字

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| name           | varchar |
+----------------+---------+
user_id 是该表的主键。
该表包含用户的 ID 和名字。名字仅由小写和大写字符组成。

需求

编写一个 SQL 查询来修复名字,使得只有第一个字符是大写的,其余都是小写的。 返回按 user_id 排序的结果表。

解析

# Write your MySQL query statement below

select concat(upper(left(name,1)),lower(substr(name,2))) as name , user_id from users order by user_id
# Write your MySQL query statement below

select user_id ,CONCAT(UCASE(substr(users.name,1,1)),lower(substr(name,2))) as name  from users order by user_id

题目:1484. 按日期分组销售产品

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| sell_date   | date    |
| product     | varchar |
+-------------+---------+
此表没有主键,它可能包含重复项。
此表的每一行都包含产品名称和在市场上销售的日期。


需求

编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。

解析

# Write your MySQL query statement below

select sell_date,count(distinct product)as num_sold ,group_concat(distinct product)  products from Activities group by sell_date order by sell_date

题目:1527. 患某种疾病的患者

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| patient_id   | int     |
| patient_name | varchar |
| conditions   | varchar |
+--------------+---------+
patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。

需求

写一条 SQL 语句,查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。

解析

# Write your MySQL query statement below

select  *  from   Patients where  conditions like 'DIAB1%' or  conditions like '% DIAB1%'

知识点

CONCAT()函数
  • 定义CONCAT()函数是SQL中用于将字符串连接在一起的函数。
  • 语句格式CONCAT(first_name, ' ', last_name)
  • 注意⚠️:CONCAT()函数的最大长度为65535个字符,所以放心使用、超过这个范围那是真的很长了
LEFT()函数
  • 定义LEFT()函数是SQL中用于从左侧开始提取指定长度的字符或字符串的函数。它接受两个参数,第一个参数是要提取的字符串,第二个是要提取的字符数。
  • 语句格式:栗子1667🌰(left(name,1)
SUBSTR()函数
  • 定义SUBSTR()函数是SQL中一个用于截取字符串的函数。它可以从一个字符串中提取从指定位置开始的指定长度的子字符串。SUBSTR()函数通常有两个或三个参数:第一个参数是要截取的字符串,第二个参数是开始位置,第三个参数是可选的,它指定要截取的子字符串的长度。
  • 语句格式SUBSTRING(s, start, length)
UCASE()函数与Upper()函数
  • 定义:将字符串中所有字母转换为大写字母
  • 语句格式:栗子1667🌰upper(left(name,1))、UCASE(substr(users.name,1,1))
LOWER()函数
  • 定义:将字符串中的字符串转为小写字母
  • 语句格式:栗子1667🌰lower(substr(name,2))
GROUP_CONCAT函数
  • 定义:GROUP_CONCAT 函数用于将一个组的值连接为一个字符串。具体来说,它将在查询结果中返回一个字符串,其中包含与给定组合条件匹配的所有数据行中的某个列的值。该函数非常有用,使用场景,例如:当您需要在单个记录中检索已聚合的数据并将它们合并为一个单独的字符串时。
  • 语句格式:栗子1484🌰group_concat(distinct product) products
  • 备忘录:这个也算是第一次使用,上述栗子🌰中最后的products是我给 group_concat(distinct product)起的别名,针对group_concat中的 product 数据做了去重处理
GROUP BY函数
  • 定义:GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集
  • 语句格式select 列名1 , count(*) as 新列名 from 表 Group by 列名;
  • 补充定义:对于GROUP BY是一个用于分组数据的查询语句。它可以将查询结果按照指定的列分组,并计算每个组的合计、平均值、最大值、最小值等聚合函数的结果
  • 注意⚠️使用规定
    • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
    • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
ORDER BY函数
  • 定义:ORDER BY用于指定要按升序或降序排序的结果顺序。您可以指定要排序的列名或表达式,或您可以使用数字指定列位置。在使用此参数时,您也可以指定多个排序条件。
  • 注意⚠️:order 一般默认为升序(order by 列名 asc),如需降序需要order by 列名 desc