跳到主要内容

查询

基础查询考查对 SELECT, WHERE, AND/OR 以及基本字符串匹配逻辑的掌握。

1757. 可回收且低脂的产品 (Recyclable and Low Fat Products)

题目描述

你有一张 Products 表,包含产品的信息:

  • product_id: 产品 ID,这是该表的主键。
  • low_fats: 枚举类型 ('Y', 'N'),表示产品是否低脂。
  • recyclable: 枚举类型 ('Y', 'N'),表示产品是否可回收。

请编写一个解决方案,找出所有 既是低脂又是可回收 的产品 ID。

解题思路

基础条件过滤

  1. 使用 SELECT 提取目标列 product_id
  2. 使用 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 值的比较

  1. SQL 中的三值逻辑:referee_id != 2referee_idNULL 时会返回 UNKNOWN,因此这条记录不会被包含在结果中。
  2. 我们需要显式使用 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: 面积。

一个国家如果满足以下 任意一个 条件,则被认为是 “大的国家”:

  1. 它的面积至少为 300 万平方千米(3,000,000 km²)。
  2. 它的人口至少为 2500 万(25,000,000)。

编写解决方案,查询所有 “大的国家” 的 国家名称人口面积

解题思路

多条件逻辑或 (OR)

  1. WHERE 中使用 >= 指定阈值。
  2. 使用 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 升序排列。

解题思路

条件筛选 + 去重 + 排序

  1. 匹配条件:只有当 author_id 等于 viewer_id 时,才表示作者在看自己的文章。
  2. 去重:由于一个作者可能多次“自恋”浏览,使用 DISTINCT 确保每个 ID 只出现一次。
  3. 排序:使用 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,则认为它是无效的。

解题思路

字符串长度函数

  1. 在 MySQL 中,LENGTH() 返回字符串的字节数,而 CHAR_LENGTH() 返回字符串的字符数。
  2. 对于包含中文字符的推文,LENGTH() 可能会产生意外结果,因此针对“字符数”要求,应选用 CHAR_LENGTH()

SQL 实现 (MySQL)

SELECT tweet_id 
FROM Tweets
WHERE CHAR_LENGTH(content) > 15;