【高频SQL基础版】查询

题目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');

解释:

  1. SELECT product_id:
  • 题目要求返回产品编号,所以选择product_id列
  • 如果只写SELECT FROM会报错,因为不知道要查询什么列
  1. WHERE:
  • 用于筛选行的条件语句
  • 不能用switch,这是其他编程语言的关键字
  1. 条件逻辑:
  • low_fats = 'Y':检查是否为低脂产品
  • recyclable = 'Y':检查是否可回收
  • AND:两个条件都要满足(既是低脂又是可回收)
  1. 字符串值:
  • SQL中字符串必须用单引号:'Y'
  • 如果是数字值才不需要引号,比如product_id = 1

题目2

答案2

要找出 没有被任何用户推荐 的客户,需要检查 referee_id 是否为 NULL。

完整SQL查询:

复制代码
SELECT name
FROM Customer
WHERE referee_id != 2 OR referee_id IS NULL;

解释:

两个条件:

  1. referee_id != 2:被 id ≠ 2 的用户推荐
  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

主要错误:

  1. 数字格式错误:不能在数字后面直接写单位

  2. 语法错误: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;

解释:

  1. DISTINCT:
  • 因为表可能有重复行
  • 同一个作者可能多次浏览自己的文章
  • 使用 DISTINCT 去重,每个作者只出现一次
  1. WHERE author_id = viewer_id:
  • 查找浏览自己文章的作者
  • 题目说明:同一人的 author_id 和 viewer_id 相同
  1. ORDER BY author_id ASC:
  • ORDER BY:排序
  • author_id:按作者ID排序
  • ASC:升序(从小到大)
  • 可以省略 ASC,因为默认就是升序
  1. 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() 函数获取字符串长度

函数说明:

  1. LENGTH(content):
  • 返回字符串的字节数
  • 对于大多数英文字符,1个字符 = 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个字符及以下 → 有效推文
相关推荐
加农炮手Jinx几秒前
Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南
数据库·flutter·华为·postgresql·restful·harmonyos·鸿蒙
发现一只大呆瓜8 分钟前
深入浅出 AST:解密 Vite、Babel编译的底层“黑盒”
前端·面试·vite
xiaohe0731 分钟前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
setmoon2141 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
发现一只大呆瓜1 小时前
前端模块化:CommonJS、AMD、ES Module三大规范全解析
前端·面试·vite
2401_833197731 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
执笔画情ora1 小时前
oracle数据库优化-表碎片优化性能。
数据库·oracle
givemeacar2 小时前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
用户851160276122 小时前
Spring Boot 自动配置原理是什么?
面试
skiy2 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql