【高频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个字符及以下 → 有效推文
相关推荐
whn19773 分钟前
虚拟机搭建oracle 19c rac 点滴
数据库·oracle
m0_741173337 分钟前
CSS移动端实现卡片悬浮投影_利用box-shadow设置层次感
jvm·数据库·python
Lyyaoo.7 分钟前
Session粘滞性问题->Redis实现session共享
数据库·redis·缓存
AI人工智能+电脑小能手9 分钟前
【大白话说Java面试题】【Java基础篇】第21题:HashMap和Hashtable的区别是什么
java·开发语言·面试·哈希算法·散列表·hash table
珠海西格电力9 分钟前
零碳园区管理系统“云-边-端”架构协同的价值及具体案例
大数据·数据库·人工智能·架构·能源
sinat_3834373610 分钟前
如何在 Laravel 中筛选并格式化匹配预定义列表的产品数据
jvm·数据库·python
2401_8463395611 分钟前
mysql如何用执行流程思维写好SQL_SQL优化方法总结
jvm·数据库·python
鸽芷咕12 分钟前
KingbaseES数据库设计规范与SQL开发最佳实践
数据库·sql·设计规范
布吉岛的石头15 分钟前
云原生面试考点:K8s 核心组件 + Deployment 实战
云原生·面试·kubernetes
forEverPlume15 分钟前
SQL如何统计分组内不重复值的数量_COUNT与DISTINCT结合应用
jvm·数据库·python