查询
基础查询考查对 SELECT, WHERE, AND/OR 以及基本字符串匹配逻辑的掌握。
1757. 可回收且低脂的产品 (Recyclable and Low Fat Products)
题目描述
你有一张 Products 表,包含产品的信息:
product_id: 产品 ID,这是该表的主键。low_fats: 枚举类型 ('Y', 'N'),表示产品是否低脂。recyclable: 枚举类型 ('Y', 'N'),表示产品是否可回收。
请编写一个解决方案,找出所有 既是低脂又是可回收 的产品 ID。
解题思路
基础条件过滤。
- 使用
SELECT提取目标列product_id。 - 使用
WHERE子句结合AND操作符,同时满足low_fats = 'Y'和recyclable = 'Y'的记录。
SQL 实现 (MySQL)
SELECT product_id
FROM Products
WHERE low_fats = 'Y' AND recyclable = 'Y';
584. 寻找用户推荐人 (Find Customer Referee)
题目描述
Customer 表保存了每一位客户的 ID、姓名以及推荐他们的人 ID:
id: 客户 ID,主键。name: 客户姓名。referee_id: 推荐人的 ID。
请编写一个解决方案,查询所有 不是 由 ID 为 2 的客户推荐的客户姓名。
解题思路
处理 NULL 值的比较。
- SQL 中的三值逻辑:
referee_id != 2在referee_id为NULL时会返回UNKNOWN,因此这条记录不会被包含在结果中。 - 我们需要显式使用
OR referee_id IS NULL来捕获那些没有推荐人的客户,或者使用IFNULL(referee_id, 0) != 2等替代方案。
SQL 实现 (MySQL)
SELECT name
FROM Customer
WHERE referee_id != 2 OR referee_id IS NULL;
595. 大的国家 (Big Countries)
题目描述
World 表记录了各个国家的面积、人口等信息:
name: 国家名称。population: 人口数量。area: 面积。
一个国家如果满足以下 任意一个 条件,则被认为是 “大的国家”:
- 它的面积至少为 300 万平方千米(3,000,000 km²)。
- 它的人口至少为 2500 万(25,000,000)。
编写解决方案,查询所有 “大的国家” 的 国家名称、人口 和 面积。
解题思路
多条件逻辑或 (OR)。
- 在
WHERE中使用>=指定阈值。 - 使用
OR连接两个条件。
SQL 实现 (MySQL)
SELECT name, population, area
FROM World
WHERE area >= 3000000 OR population >= 25000000;
1148. 文章浏览 I (Article Views I)
题目描述
Views 表记录了每篇文章的浏览记录:
article_id: 文章 ID。author_id: 作者 ID。viewer_id: 浏览者 ID。view_date: 浏览日期。
注意:该表中存在同一个浏览者多次浏览同一篇文章的情况。 请编写一个解决方案,找出所有 浏览过自己文章 的作者。结果需要按作者 ID 升序排列。
解题思路
条件筛选 + 去重 + 排序。
- 匹配条件:只有当
author_id等于viewer_id时,才表示作者在看自己的文章。 - 去重:由于一个作者可能多次“自恋”浏览,使用
DISTINCT确保每个 ID 只出现一次。 - 排序:使用
ORDER BY author_id ASC满足输出要求。
SQL 实现 (MySQL)
SELECT DISTINCT author_id AS id
FROM Views
WHERE author_id = viewer_id
ORDER BY id ASC;
1683. 无效的推文 (Invalid Tweets)
题目描述
Tweets 表保存了每一条推文的 ID 和内容:
tweet_id: 推文 ID,主键。content: 推文内容。
查询所有 无效的推文 的 ID。如果推文内容中的 字符数 严格大于 15,则认为它是无效的。
解题思路
字符串长度函数。
- 在 MySQL 中,
LENGTH()返回字符串的字节数,而CHAR_LENGTH()返回字符串的字符数。 - 对于包含中文字符的推文,
LENGTH()可能会产生意外结果,因此针对“字符数”要求,应选用CHAR_LENGTH()。
SQL 实现 (MySQL)
SELECT tweet_id
FROM Tweets
WHERE CHAR_LENGTH(content) > 15;