高频 SQL 50 题(基础版)- 01. 查询

98 阅读3分钟

来源:高频 SQL 50 题(基础版) leetcode.cn/studyplan/s…

1. 第一天:查询

1757. 可回收且低脂的产品

编写解决方案找出既是低脂又是可回收的产品编号。

返回结果 无顺序要求 。

返回结果格式如下例所示:

SQL

select
    product_id
from 
    Products 
where 
    low_fats = 'Y' and recyclable = 'Y';

送分题不解释。

584. 寻找用户推荐人

找出那些 没有被 id = 2 的客户 推荐 的客户的姓名。

以 任意顺序 返回结果表。

结果格式如下所示。

思路

这题的最大误区是,直接按照日常里想的,搜索 referee_id 不为 2 的用户。

select name from Customer where referee_id != 2;

其他的 referee_id 为 null 的并没有被查询出来,他们也是没有被推荐的。

MySQL 使用三值逻辑 —— TRUEFALSE 和 UNKNOWN

SQL的保留字中,很多都被归类为谓词一类,例如 >, <>, = 等比较谓词,以及BETWEEN, LIKE, IN, IS NULL等。总结,谓词是一种特殊的函数,返回值是真值。

因为查询结果只会包含 WHERE 子句里的判断结果为 true 的行!不包含判断结果为 false 和 unknown 的行。且不仅是等号,对 NULL 使用其他比较谓词(比如 > NULL),结果也都是 unknown。

重点理解: NULL不是值,所以不能对其使用谓词,如果使用谓词,结果是 unknown。

所以, "NULL值" 和 "列的值为NULL" 这个说法是错误的(应该说是空的/非空的)。NULL 不属于关系型数据库中的某种类型。

在 WHERE 语句中我们需要做一个额外的条件判断 referee_id IS NULL,即可解决这个问题。

SQL

select
  name
from
  customer
where
  referee_id != 2
  or referee_id is null;

595. 大的国家

如果一个国家满足下述两个条件之一,则认为该国是 大国 :

  • 面积至少为 300 万平方公里(即,3000000 km2),或者
  • 人口至少为 2500 万(即 25000000)

编写解决方案找出 大国 的国家名称、人口和面积。

按 任意顺序 返回结果表。

返回结果格式如下例所示。

SQL

select
  name,
  population,
  area
from
  world
where
  area >= 3000000
  or population >= 25000000;

送分题不解释。

1148. 文章浏览 I

请查询出所有浏览过自己文章的作者

结果按照 id 升序排列。

查询结果的格式如下所示:

SQL

也挺送分的,重点有两点,其他没什么:

  1. 使用 AS 给列取别名;
  2. 使用 DISTINCT 去重;
  3. id 升序排列;
select
  distinct author_id as id
from
  views
where
  author_id = viewer_id
order by
  id asc;

1683. 无效的推文

查询所有无效推文的编号(ID)。当推文内容中的字符数严格大于 15 时,该推文是无效的。

任意顺序返回结果表。

查询结果格式如下所示:

SQL

难点在于长度的函数为CHAR_LENGTH,返回严格的字符串的长度,需要记住。

LENGTH函数并不推荐使用,这个函数返回的字符串的字节数,某些字符是多于一个字节的。

SELECT
  tweet_id
FROM
  tweets
WHERE
  CHAR_LENGTH(content) > 15;