SQL练习(3/81)
目录
1.COALESCE函数
2.空值与空集
3.rank相关
1.COALESCE函数
用于返回其参数列表中的第一个非空值。如果所有参数都是空值(NULL
),则返回 NULL
。
语法
COALESCE(value1, value2, ..., valueN)
功能
-
参数:可以接受多个参数,这些参数可以是列名、表达式或常量。
-
返回值:返回参数列表中的第一个非空值。如果所有参数都是
NULL
,则返回NULL
。
示例
假设有一个表 employees
,其中包含以下列:
-
id
:员工 ID -
first_name
:员工名字 -
last_name
:员工姓氏 -
middle_name
:员工中间名(可能为空)
现在,我们希望生成一个包含员工全名的列,格式为 first_name middle_name last_name
,但如果中间名为空,则忽略它。可以使用 COALESCE
函数来实现:
SELECT id,first_name,last_name,COALESCE(first_name || ' ' || middle_name || ' ' || last_name, first_name || ' ' || last_name) AS full_name
FROM employees;
解释
-
first_name || ' ' || middle_name || ' ' || last_name
:尝试将名字、中间名和姓氏拼接在一起。 -
COALESCE
函数确保如果中间名为空(NULL
),则返回first_name || ' ' || last_name
。
更多示例
假设有一个表 sales
,其中包含以下列:
-
id
:销售记录 ID -
amount
:销售金额 -
discount
:折扣金额(可能为空)
现在,我们希望计算每个销售记录的实际金额,即 amount - discount
。但如果折扣为空,则直接返回销售金额。可以使用 COALESCE
函数来实现:
SELECT id,amount,COALESCE(amount - discount, amount) AS final_amount
FROM sales;
解释
-
amount - discount
:计算实际金额。 -
COALESCE
函数确保如果折扣为空(NULL
),则返回销售金额amount
。
与 IFNULL
和 ISNULL
的区别
-
COALESCE
可以接受多个参数,返回第一个非空值。 -
IFNULL
和ISNULL
通常只接受两个参数,返回第一个非空值。例如:-
IFNULL(value1, value2)
:如果value1
不为空,则返回value1
,否则返回value2
。 -
ISNULL(value1, value2)
:与IFNULL
功能相同,但具体实现可能因数据库系统而异。
-
总结
COALESCE
是一个非常有用的函数,用于处理空值(NULL
),确保查询结果中不会出现空值,从而提高数据的完整性和可用性。
题目:
1407. 排名靠前的旅行者 - 力扣(LeetCode)
2.空值与空集
第一种查询方式
SELECT(SELECT salaryFROM employeeORDER BY salary DESCLIMIT 1 OFFSET 1)
AS SecondHighestSalary;
-
子查询:
-
子查询
(SELECT salary FROM employee ORDER BY salary DESC LIMIT 1 OFFSET 1)
是一个标量子查询(scalar subquery),它返回一个单一的值。 -
如果子查询没有找到任何结果,MySQL 会返回
NULL
。
-
-
外层查询:
-
外层查询将子查询的结果命名为
SecondHighestSalary
。 -
如果子查询返回一个值,外层查询会显示这个值。
-
如果子查询没有返回任何值(即没有第二高的薪水),外层查询会显示
NULL
。
-
第二种查询方式
SELECT salary AS SecondHighestSalary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;
-
直接查询:
-
这是一个普通的
SELECT
查询,使用了ORDER BY
和LIMIT
。 -
如果表中没有足够的行来满足
LIMIT 1 OFFSET 1
,MySQL 会返回一个空的结果集,而不是返回NULL
。
-
-
另:
LIMIT
:用于限制查询结果的行数。
OFFSET
:用于跳过结果集中的前几行。
组合使用:LIMIT
和 OFFSET
通常一起使用,用于实现分页查询。
176. 第二高的薪水 - 力扣(LeetCode)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGINDECLARE M INT;SET M=N-1;RETURN (# Write your MySQL query statement below.select (select DISTINCT salary from employeeorder by salary DESClimit 1 offset M) as getNthHighestSalary);
END
1.使用 DISTINCT
确保返回的是不同的薪水值
2.MySQL 函数中不能直接使用负数偏移量(OFFSET N-1
)。
在 MySQL 中,OFFSET
的值必须是非负整数。
因此,直接在函数中使用 N-1
会导致语法错误; 需要在函数内部先对 N
进行减 1 操作
177. 第N高的薪水 - 力扣(LeetCode)
3.rank相关
1. RANK()
-
功能:为每一行分配一个排名,根据指定的排序条件。
-
特点:
-
相同值的行会分配相同的排名。
-
但后续的排名会跳过一些数字以保持排名的连续性。
-
例如,如果有两个第 1 名,下一个排名将是第 3 名。
-
-
语法
RANK() OVER ([PARTITION BY column1, column2, ...]ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ... )
2. DENSE_RANK()
-
功能:为每一行分配一个排名,根据指定的排序条件。
-
特点:
-
相同值的行会分配相同的排名。
-
不会跳过排名,因此排名是连续的。
-
例如,如果有两个第 1 名,下一个排名将是第 2 名。
-
-
语法
DENSE_RANK() OVER ([PARTITION BY column1, column2, ...]ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ... )
3. ROW_NUMBER()
-
功能:为每一行分配一个唯一的序号,根据指定的排序条件。
-
特点:
-
即使有相同的值,每一行也会获得一个唯一的序号。
-
没有跳过的序号。
-
-
语法
ROW_NUMBER() OVER ([PARTITION BY column1, column2, ...]ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ... )
4. PARTITION BY
-
功能:将结果集分成多个分区,每个分区独立进行窗口函数的计算。
-
特点:
-
适用于需要在不同组内进行排名或计算的情况。
-
-
语法
OVER (PARTITION BY column1, column2, ...ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ... )
5. 排序方向
-
ASC
:升序排列(默认)。 -
DESC
:降序排列。
6. 保留字
-
注意:某些单词(如
rank
)是 SQL 的保留字。在使用这些单词作为列名或别名时,需要用反引号(`
)括起来,以避免语法错误。
select score,
-- rank()over (order by score desc) as rank
DENSE_RANK() OVER (ORDER BY score DESC) as 'rank'
from scores
178. 分数排名 - 力扣(LeetCode)