一、患某种疾病的患者
题目描述:
患者信息表: Patients +--------------+---------+ | 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 。 按 任意顺序 返回结果表。 查询结果格式如下示例所示。 示例 1: 输入: Patients表: +------------+--------------+--------------+ | patient_id | patient_name | conditions | +------------+--------------+--------------+ | 1 | Daniel | YFEV COUGH | | 2 | Alice | | | 3 | Bob | DIAB100 MYOP | | 4 | George | ACNE DIAB100 | | 5 | Alain | DIAB201 | +------------+--------------+--------------+ 输出: +------------+--------------+--------------+ | patient_id | patient_name | conditions | +------------+--------------+--------------+ | 3 | Bob | DIAB100 MYOP | | 4 | George | ACNE DIAB100 | +------------+--------------+--------------+ 解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。
代码详解:
select * from Patients # 注意上面的DIAB1前有一个空格,防止匹配到类似'ABCDIAB1'这种字符串 where conditions like '% DIAB1%' # 为了匹配conditions字段以DIAB1开头的记录,因此没有空格 or conditions like 'DIAB1%'
二、按日期分组销售产品
题目描述:
表 Activities: +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | sell_date | date | | product | varchar | +-------------+---------+ 此表没有主键,它可能包含重复项。 此表的每一行都包含产品名称和在市场上销售的日期。 编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 查询结果格式如下例所示。 示例 1: 输入: Activities 表: +------------+-------------+ | sell_date | product | +------------+-------------+ | 2020-05-30 | Headphone | | 2020-06-01 | Pencil | | 2020-06-02 | Mask | | 2020-05-30 | Basketball | | 2020-06-01 | Bible | | 2020-06-02 | Mask | | 2020-05-30 | T-Shirt | +------------+-------------+ 输出: +------------+----------+------------------------------+ | sell_date | num_sold | products | +------------+----------+------------------------------+ | 2020-05-30 | 3 | Basketball,Headphone,T-shirt | | 2020-06-01 | 2 | Bible,Pencil | | 2020-06-02 | 1 | Mask | +------------+----------+------------------------------+ 解释: 对于2020-05-30,出售的物品是 (Headphone, Basketball, T-shirt),按词典序排列,并用逗号 ',' 分隔。 对于2020-06-01,出售的物品是 (Pencil, Bible),按词典序排列,并用逗号分隔。 对于2020-06-02,出售的物品是 (Mask),只需返回该物品名。
代码详解:
# 查找每个日期、销售的不同产品的数量及其名称。 # 每个日期的销售产品名称应按词典序排列。 # 返回按 sell_date 排序的结果表。 select sell_date, # 获取“不同的”产品数【count(distinct product)】 count(distinct product) as num_sold, # “不同的”【distinct product】产品按照字典排序【order by product】 & “,”分割【separator ','】 group_concat(distinct product order by product separator ',') as products from Activities group by sell_date order by sell_date;
三、修复表中的名字
题目描述:
表: Users +----------------+---------+ | Column Name | Type | +----------------+---------+ | user_id | int | | name | varchar | +----------------+---------+ user_id 是该表的主键。 该表包含用户的 ID 和名字。名字仅由小写和大写字符组成。 编写一个 SQL 查询来修复名字,使得只有第一个字符是大写的,其余都是小写的。 返回按 user_id 排序的结果表。 查询结果格式示例如下。 示例 1: 输入: Users table: +---------+-------+ | user_id | name | +---------+-------+ | 1 | aLice | | 2 | bOB | +---------+-------+ 输出: +---------+-------+ | user_id | name | +---------+-------+ | 1 | Alice | | 2 | Bob | +---------+-------+
代码详解:
# CONCAT 可以将多个字符串拼接在一起 # LEFT(str, length) 函数:从左开始截取字符串,length 是截取的长度。 # UPPER(str) 将字符串中所有字符转为大写 # LOWER(str) 将字符串中所有字符转为小写 # SUBSTRING(name, 2) 从第二个截取到末尾,注意并不是下标,就是第二个。 select user_id, CONCAT (Upper(left(name,1)),Lower(substring(name,2))) name from users order by user_id;