「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)。
- 栗子🌰:参考608中
select 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取代.