题目1
答案1
方法1:基本查询
SELECT product_id
FROM Products
WHERE low_fats = 'Y' AND recyclable = 'Y';
方法2:使用别名(可选)
SELECT product_id
FROM Products
WHERE low_fats = 'Y'
AND recyclable = 'Y';
方法3:使用括号增加可读性
SELECT product_id
FROM Products
WHERE (low_fats = 'Y')
AND (recyclable = 'Y');
解释:
- SELECT product_id:
- 题目要求返回产品编号,所以选择product_id列
- 如果只写SELECT FROM会报错,因为不知道要查询什么列
- WHERE:
- 用于筛选行的条件语句
- 不能用switch,这是其他编程语言的关键字
- 条件逻辑:
- low_fats = 'Y':检查是否为低脂产品
- recyclable = 'Y':检查是否可回收
- AND:两个条件都要满足(既是低脂又是可回收)
- 字符串值:
- SQL中字符串必须用单引号:'Y'
- 如果是数字值才不需要引号,比如product_id = 1
题目2
答案2
要找出 没有被任何用户推荐 的客户,需要检查 referee_id 是否为 NULL。
完整SQL查询:
SELECT name
FROM Customer
WHERE referee_id != 2 OR referee_id IS NULL;
解释:
两个条件:
- referee_id != 2:被 id ≠ 2 的用户推荐
- referee_id IS NULL:没有被任何用户推荐(推荐人为空)
为什么要用 OR?
- 题目要求的是满足 任一条件 的客户
- 所以用 OR 连接两个条件
为什么不用 AND?
- 如果用 AND,需要同时满足两个条件,但这是不可能的(一个客户不能同时既有推荐人又没有推荐人)
注意特殊情况:
在SQL中,NULL 值表示"未知"或"不存在",使用 !=、= 等比较运算符与 NULL 比较时,结果都是 NULL(假),所以必须用 IS NULL 或 IS NOT NULL 来判断。
错误写法:
-- 错误!这不会返回 referee_id 为 NULL 的记录
WHERE referee_id != 2
正确写法:
-- 正确!使用 OR 和 IS NULL
WHERE referee_id != 2 OR referee_id IS NULL
示例数据:
假设表中有:
+----+-------+------------+
| id | name | referee_id |
+----+-------+------------+
| 1 | Will | NULL | # 没有被任何用户推荐
| 2 | Jane | NULL | # 没有被任何用户推荐
| 3 | Alex | 1 | # 被 id=1 的用户推荐
| 4 | Bill | 1 | # 被 id=1 的用户推荐
| 5 | Zack | 2 | # 被 id=2 的用户推荐(不满足条件)
| 6 | Mark | 2 | # 被 id=2 的用户推荐(不满足条件)
| 7 | Alice | 3 | # 被 id=3 的用户推荐
+----+-------+------------+
查询结果:
+-------+
| name |
+-------+
| Will | # 没有推荐人
| Jane | # 没有推荐人
| Alex | # 推荐人 id=1 ≠ 2
| Bill | # 推荐人 id=1 ≠ 2
| Alice | # 推荐人 id=3 ≠ 2
+-------+
题目3
答案3
主要错误:
-
数字格式错误:不能在数字后面直接写单位
-
语法错误:3000000km2 不是合法的数字格式
正确SQL:SELECT name, population, area
FROM World
WHERE area >= 3000000 OR population >= 25000000;
题目4

答案4
升序排列使用 ORDER BY 列名 ASC,其中 ASC 可以省略(默认就是升序)。
完整SQL查询:
SELECT DISTINCT author_id AS id
FROM Views
WHERE author_id = viewer_id
ORDER BY author_id ASC;
或者简写(省略ASC):
SELECT DISTINCT author_id AS id
FROM Views
WHERE author_id = viewer_id
ORDER BY author_id;
解释:
- DISTINCT:
- 因为表可能有重复行
- 同一个作者可能多次浏览自己的文章
- 使用 DISTINCT 去重,每个作者只出现一次
- WHERE author_id = viewer_id:
- 查找浏览自己文章的作者
- 题目说明:同一人的 author_id 和 viewer_id 相同
- ORDER BY author_id ASC:
- ORDER BY:排序
- author_id:按作者ID排序
- ASC:升序(从小到大)
- 可以省略 ASC,因为默认就是升序
- AS id(可选):
- 将列名 author_id 改名为 id 输出
- 这样更符合题目要求的输出格式
示例数据:
假设Views表数据:
+------------+-----------+-----------+------------+
| article_id | author_id | viewer_id | view_date |
+------------+-----------+-----------+------------+
| 1 | 3 | 5 | 2023-08-01 |
| 1 | 3 | 3 | 2023-08-02 | # 作者3浏览自己的文章
| 2 | 7 | 7 | 2023-08-03 | # 作者7浏览自己的文章
| 2 | 7 | 6 | 2023-08-04 |
| 4 | 7 | 7 | 2023-08-05 | # 作者7再次浏览自己的文章
| 3 | 4 | 4 | 2023-08-06 | # 作者4浏览自己的文章
+------------+-----------+-----------+------------+
查询结果:
+----+
| id |
+----+
| 3 |
| 4 |
| 7 |
+----+
结果按升序排列:3, 4, 7
题目5

答案5
应该检查内容的长度是否大于15,而不是直接比较内容和数字15。
正确SQL:
SELECT tweet_id
FROM Tweets
WHERE LENGTH(content) > 15;
或者使用 CHAR_LENGTH(两者在MySQL中对于英文字符通常相同):
SELECT tweet_id
FROM Tweets
WHERE CHAR_LENGTH(content) > 15;
错误原因:
- WHERE content > 15:将字符串 content 与数字 15 比较,MySQL会尝试将字符串转换为数字,这会导致错误或不准确的结果
- 正确方法是使用 LENGTH() 函数获取字符串长度
函数说明:
- LENGTH(content):
- 返回字符串的字节数
- 对于大多数英文字符,1个字符 = 1个字节
- 对于某些特殊字符或中文,1个字符可能占用多个字节
- CHAR_LENGTH(content):
- 返回字符串的字符数
- 更准确地计算字符数量
- 在这个问题中更合适
示例数据:
假设Tweets表数据:
+----------+---------------------------------------+
| tweet_id | content |
+----------+---------------------------------------+
| 1 | Hello World! | # 12个字符
| 2 | This is a very long tweet example! | # 35个字符
| 3 | Short tweet. | # 12个字符
| 4 | This one is 16 chars. | # 16个字符
| 5 | This is exactly 15. | # 15个字符
+----------+---------------------------------------+
查询结果:
+----------+
| tweet_id |
+----------+
| 2 | # 35个字符 > 15
| 4 | # 16个字符 > 15
+----------+
注意:
- tweet_id=4 有16个字符,严格大于15,所以是无效的
- tweet_id=5 有15个字符,等于15,不是严格大于,所以是有效的,不会被查询出来
为什么使用 > 而不是 >=:
题目要求"严格大于15",意思是字符数必须大于15才是无效的。
- 16个字符及以上 → 无效推文
- 15个字符及以下 → 有效推文