【高频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个字符及以下 → 有效推文
相关推荐
IvorySQL5 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·6 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师6 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
IT邦德6 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
UrbanJazzerati6 小时前
Python编程基础:类(class)和构造函数
后端·面试
惊讶的猫6 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i6 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.6 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn6 小时前
【Redis】渐进式遍历
数据库·redis·缓存