来源:高频 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 使用三值逻辑 —— TRUE
, FALSE
和 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
也挺送分的,重点有两点,其他没什么:
- 使用
AS
给列取别名; - 使用
DISTINCT
去重; 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;