- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Employees
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | employee_id | int | | name | varchar | | salary | int | +-------------+---------+ employee_id 是这个表的主键(具有唯一值的列)。 此表的每一行给出了雇员id ,名字和薪水。编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以
'M'
开头,那么他的奖金是他工资的100%
,否则奖金为0
。返回的结果按照
employee_id
排序。返回结果格式如下面的例子所示。
示例 1:
输入: Employees 表: +-------------+---------+--------+ | employee_id | name | salary | +-------------+---------+--------+ | 2 | Meir | 3000 | | 3 | Michael | 3800 | | 7 | Addilyn | 7400 | | 8 | Juan | 6100 | | 9 | Kannon | 7700 | +-------------+---------+--------+ 输出: +-------------+-------+ | employee_id | bonus | +-------------+-------+ | 2 | 0 | | 3 | 0 | | 7 | 7400 | | 8 | 0 | | 9 | 7700 | +-------------+-------+ 解释: 因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。 雇员id为3的因为他的名字以'M'开头,所以,奖金是0。 其他的雇员得到了百分之百的奖金。
三,建表语句
Create table If Not Exists Employees (employee_id int, name varchar(30), salary int);
Truncate table Employees;
insert into Employees (employee_id, name, salary) values ('2', 'Meir', '3000');
insert into Employees (employee_id, name, salary) values ('3', 'Michael', '3800');
insert into Employees (employee_id, name, salary) values ('7', 'Addilyn', '7400');
insert into Employees (employee_id, name, salary) values ('8', 'Juan', '6100');
insert into Employees (employee_id, name, salary) values ('9', 'Kannon', '7700');
四,分析
题解:
表:员工表
字段:员工id,姓名,薪资
要求:返回id和特殊薪资
特殊薪资 不为0的条件 是奇数 并且首字母不是M
思路一,用if 判断
第一步,查询员工表
在字段里面添加if 判断 满足%2=1 这是奇数 满足substring (name,1,1) 首字母不是M
第二步,那么if条件满足 则给薪资,反之给0
第三步,排序
思路二,case when then 语法
和if差不多,只不过把if语法换成case when而已
核心判定依旧是:
- 条件判断id %2 得到奇数和偶数
- 首字母 substring(name ,1,1) 拿到首字母 如果不等于M
思路三,用左连接
第一步:先条件,筛选, where
- 条件判断id %2 得到奇数和偶数
- 首字母 substring(name ,1,1) 拿到首字母 如果不等于M
第二步,把拿到的表和原表左连接
第三步,在用if 如果列为null 那么给0 反之给薪资
第四步排序
五,SQL解答
解法一,if判断语句
select employee_id,
if(employee_id%2=1 and substring(name,1,1)!='M',salary,0) as bonus
from employees order by employee_id;
解法二,case判断语句
-- 解法二 自联结
with t1 as (
select employee_id as e_id,name as t_n from employees where employee_id%2 =1 and substring(name,1,1) !='M'
),t2 as (
select
employee_id,
case when e_id is null then 0
else salary
end as bonus
from employees e left join t1 on e.employee_id=t1.e_id
)
select * from t2 order by employee_id;
解法三,左连接语句
-- 解法三
select employee_id,
case when employee_id%2=1 and substring(name,1,1)!='M' then salary
else 0
end as bonus
from employees;
六,验证
case 语句验证
自联结语法验证
if判断语句验证
七,知识点总结
- if 判断语句练习
- case when语法练习
- 奇数,偶数判定 %2 是否为0
- sunstring 字符串截取函数
- 左连接练习
- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用