LeetCode MySQL 刷题条记 (四)

104 阅读5分钟

「4月日新计划更文活动」

题目:1965. 丢失信息的雇员

Employees 
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
+-------------+---------+
employee_id 是这个表的主键。
每一行表示雇员的id 和他的姓名。

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| salary      | int     |
+-------------+---------+
employee_id is 这个表的主键。
每一行表示雇员的id 和他的薪水。

需求

写出一个查询语句,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:

雇员的 姓名 丢失了,或者 雇员的 薪水信息 丢失了,或者 返回这些雇员的id  employee_id , 从小到大排序 。

解析

# Write your MySQL query statement below

select employee_id   from Employees as em  where employee_id not in (select employee_id from  Salaries as sa ) union
select employee_id  from  Salaries as sa where employee_id not in (select employee_id  from Employees as em ) order by employee_id 

题目:1795. 每个产品在不同商店的价格

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_id  | int     |
| store1      | int     |
| store2      | int     |
| store3      | int     |
+-------------+---------+
这张表的主键是product_id(产品Id)。
每行存储了这一产品在不同商店store1, store2, store3的价格。
如果这一产品在商店里没有出售,则值将为null

需求

请你重构 Products 表,查询每个产品在不同商店的价格,使得输出的格式变为(product_id, store, price) 。如果这一产品在商店里没有出售,则不输出这一行。

输出结果表中的 顺序不作要求 。

解析

# Write your MySQL query statement below

select product_id,'store1' as store,store1 as price from Products where store1 is not null  union all
select product_id,'store2' as store,store2 as price from Products   where store2 is not null  union all  
select product_id,'store3' as store,store3 as price from Products  where store3 is not null  

题目:608. 树节点

+----+------+
| id | p_id |
+----+------+
| 1  | null |
| 2  | 1    |
| 3  | 1    |
| 4  | 2    |
| 5  | 2    |
+----+------+

id 是树节点的编号, p_id 是它父节点的 id 。

需求

树中每个节点属于以下三种类型之一:

叶子:如果这个节点没有任何孩子节点。 根:如果这个节点是整棵树的根,即没有父节点。 内部节点:如果这个节点既不是叶子节点也不是根节点。  

写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。上面样例的结果为:

+----+------+
| id | Type |
+----+------+
| 1  | Root |
| 2  | Inner|
| 3  | Leaf |
| 4  | Leaf |
| 5  | Leaf |
+----+------+

解析

# Write your MySQL query statement below

select id,
case  when  P_id is null  then  'Root'
when id  in(select p_id from tree where p_id is not null)  then  'Inner'
else 'Leaf' end as type
from  tree 

题目:176. 第二高的薪水

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。

需求

编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null。

解析

# Write your MySQL query statement below

select ifNull(( select distinct  salary   from Employee order by salary  desc limit 1,1), null) as SecondHighestSalary

知识点

IS NOT NULL 函数
  • 定义:IS NOT NULL 是一个用于判断一个表达式是否为非 NULL 值的条件函数。如果表达式的值不为 NULL,则 IS NOT NULL 函数返回 1(true),否则返回 0(false)。
  • 栗子🌰:参考608select p_id from tree where p_id is not null
  • 优点:使用 IS NOT NULL 函数可以确保查询结果只包含非 NULL 值,避免不必要的数据错误或异常。
UNION 函数
  • 定义:UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
  • 优点:UNION从查询结果集中自动去除了重复的行
  • 使用场景:在单个查询中从不同的表返回类似结构的数据,对单个表执行多个查询,按单个查询返回数据
  • 注意⚠️:
    • 只适合小数据量下调用,不适合大数据量下使用该方法
    • 在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后
  • 语句格式select 列名 from 表 where 条件 UNION select 列名 from 表 where 条件
UNION ALL 函数
  • 功能:返回所有匹配行(包括重复的行)
  • 语句格式select 列名 from 表 where 条件 UNION ALL select 列名 from 表 where 条件

ifNull函数

  • 定义:IFNULL() 函数用于检查一个表达式是否为 NULL 值,并在表达式为 NULL 时返回一个替代值。IFNULL() 函数需要两个参数,第一个参数是要检查的表达式,第二个参数是表达式为 NULL 时返回的替代值
  • 栗子🌰:参考176 SELECT column1, IFNULL(column2, 'N/A') AS column2 FROM table_name;

limit 函数

  • 定义:限制行数显示,返回第一行或前几行内容
  • 语句格式select 列名 from 表名 limit 数字(需要返回行数);
  • 注意⚠️:检索出来的第一行为行0而不是行1,limit 1 ,1将检索出第二行而不是第一行。
  • 栗子🌰:
    • select 列名 from 表名 limit 数字1,数字2;
    • (数字1代表从多少行开始,数字2 代表需要检索的条数)
  • 延伸⭐:MYSQL 5支持的一种替代语法 LIMIT 4 OFFSET 3

not in 与not 的原理

  • NOT 是一个逻辑运算符,它用于反转某个表达式的结果。

  • 栗子🌰:NOT (a = b) 将返回 "a不等于b" 的结果

  • NOT IN 子句用于查询不在指定列表内的数据。

  • 栗子🌰:SELECT * FROM table_name WHERE column_name NOT IN (value1, value2, ...);

    • 这将返回 table_name 表中 column_name 列中不包含 value1、value2 等值的所有行。
  • 关于题目608**解析:not in B的原理是拿A表值与B表值做是否不等的比较, 也就是a != b. 在sql中, null是缺失未知值而不是空值,当你判断任意值a != null时, 如果当你询问 id not in (select p_id from tree)时, 因为p_id有null值, 返回结果全为false, 于是跳到else的结果, 返回值为inner. 所以在答案中,leaf结果从未彰显,全被inner取代.