【高频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个字符及以下 → 有效推文
相关推荐
2301_788662402 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
晓13132 小时前
第四章:Redis实战应用及常见问题(下篇)
java·数据库·缓存·wpf
菜鸟小九2 小时前
redis高级篇(多级缓存)
数据库·redis·缓存
SamRol2 小时前
达梦数据库指令 及 在Spring Boot + MyBatis-Plus上的使用
java·数据库·spring boot·mybatis·达梦·intellij idea
Lethehong2 小时前
化繁为简,一库统揽:金仓数据库以“一体化替代”战略重构企业数据核心
数据库·重构
A懿轩A2 小时前
【2026 最新】MySQL 与 DataGrip 详细下载安装教程带图展示(Windows版)
数据库·mysql·datagrip
羊锦磊2 小时前
AI 助手大模型---阿里云创建AI应用
运维·服务器·数据库
wei_shuo2 小时前
金仓数据库 KingbaseES:多模融合架构引领,一库全替代构筑数字化转型底座
数据库·金仓数据库
知识分享小能手2 小时前
Oracle 19c入门学习教程,从入门到精通,Oracle系统调优 —— 内存结构与参数优化详解(15)
数据库·学习·oracle