SQL第三练

举报
川川菜鸟 发表于 2022/06/06 22:58:28 2022/06/06
【摘要】 一、计算特殊奖金 1.1题目描述 表: Employees +-------------+---------+ | 列名 | 类型 | +-------------+-----...

一、计算特殊奖金

1.1题目描述

表: Employees

+-------------+---------+
| 列名        | 类型     |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
| salary      | int     |
+-------------+---------+
employee_id 是这个表的主键。
此表的每一行给出了雇员id ,名字和薪水。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0。

Return the result table ordered by employee_id.

返回的结果集请按照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 是28的两个雇员得到的奖金是0。
雇员id为3的因为他的名字以'M'开头,所以,奖金是0。
其他的雇员得到了百分之百的奖金。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

1.2求解

if/case when then ed两种方法求解

思路一:

  1. 使用CASE WHEN 模拟 雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0
  2. 满足条件 MOD(employee_id, 2) = 1 AND name not rlike ‘^M’ THEN salary ELSE 0 END AS bonus

思路二:if…

先用if语句来做:

select 
    employee_id,
    if (employee_id %2 = 1 and left(name,1)!='M', salary, 0) as bonus
from Employees

  
 
  • 1
  • 2
  • 3
  • 4

执行:
在这里插入图片描述
用case写:

select 
    employee_id,
    case
        when employee_id % 2= 1 and left(name,1)!='M' then salary
        else 0
    end bonus
from Employees

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行:
在这里插入图片描述
也可以使用MOD求余:

select employee_id,
if  ( MOD(employee_id,2) = 1 and left(name,1)!='M' ,salary,0) as bonus
from Employees;

  
 
  • 1
  • 2
  • 3

执行结果:
在这里插入图片描述
再使用like来做一下:

select employee_id,
if  ( MOD(employee_id,2) = 1 and name not like 'M%' ,salary,0) as bonus
from Employees;

  
 
  • 1
  • 2
  • 3

执行结果:
在这里插入图片描述

1.3知识点

left函数:LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。
语法:

LEFT(str,length);

  
 
  • 1
  • str是要提取子字符串的字符串。
  • length是一个正整数,指定将从左边返回的字符数

例如:返回左边的四个字

SELECT LEFT('我是川川菜鸟,菜了',4);

  
 
  • 1

执行输出:
在这里插入图片描述

if内部expression:

IF(expr,v1,v2)

  
 
  • 1

表示:表达式 expr 得到不同的结果,当 expr 为真是返回 v1 的值,否则返回 v2.

CASE语句
语法形式:

CASE  case_expression
   WHEN when_expression_1 THEN commands
   WHEN when_expression_2 THEN commands
   ...
   ELSE commands
END CASE;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们将case_expression的值与每个WHEN子句中的when_expression进行比较,例如when_expression_1,when_expression_2等。如果case_expression和when_expression_n的值相等,则执行相应的WHEN分支中的命令(commands)。
如果WHEN子句中的when_expression与case_expression的值匹配,则ELSE子句中的命令将被执行。ELSE子句是可选的。 如果省略ELSE子句,并且找不到匹配项,MySQL将引发错误,还是一般加上ELSE.

2变更性别

2.1题目描述

Salary 表:

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| sex         | ENUM     |
| salary      | int      |
+-------------+----------+
id 是这个表的主键。
sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
本表包含公司雇员的信息。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

请你编写一个 SQL 查询来交换所有的 ‘f’ 和 ‘m’ (即,将所有 ‘f’ 变为 ‘m’ ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。

注意,你必须仅使用一条 update 语句,且 不能 使用 select 语句。

查询结果如下例所示。

输入:
Salary 表:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1  | A    | m   | 2500   |
| 2  | B    | f   | 1500   |
| 3  | C    | m   | 5500   |
| 4  | D    | f   | 500    |
+----+------+-----+--------+
输出:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1  | A    | f   | 2500   |
| 2  | B    | m   | 1500   |
| 3  | C    | f   | 5500   |
| 4  | D    | m   | 500    |
+----+------+-----+--------+
解释:
(1, A)(3, C)'m' 变为 'f'(2, B)(4, D)'f' 变为 'm'
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.2求解

使用update:

update Salary set sex=if(sex='m','f','m');

  
 
  • 1

用case也很方便:


UPDATE salary
SET  sex =( CASE sex
        WHEN 'm' THEN 'f'
        ELSE 'm'
    END);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行:
在这里插入图片描述

2.3知识点

更新语句时需要用到update语句,update语句使用方法如下:

update 表名
set 列名 = 修改后的值;

  
 
  • 1
  • 2
  1. 在遇到需要将表内某列特定值替换成其他值时,记住case表达式如何使用。
  2. 本题如果只是要求查询的话,使用select语句即可:select (上面的case表达式) from 表名
  3. 需要直接更新表中的数据的情况,熟记update语句。但要注意,在使用update更新表数据前,最好先将原表备份。
  4. “按条件修改表数据”的应用例题

3删除重复的电子邮箱

3.1题目描述

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

查询结果格式如下所示。

输入: 
Person 表:
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
输出: 
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
解释: john@example.com重复两次。我们保留最小的Id = 1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3.2求解

  1. 内连接,形成笛卡尔积
  2. 记录中如果 email相同,但是id不同说明有重复
  3. 并且,id大的email需要删除,从而保留小id的数据
DELETE a
from Person a inner join Person b
where a.email=b.email and a.id>b.id;

  
 
  • 1
  • 2
  • 3

执行:
在这里插入图片描述

知识点

  • delete会删除满足where条件的记录。
  • MySQL 中, INNER JOIN 等价于 JOIN 用 。

文章来源: chuanchuan.blog.csdn.net,作者:川川菜鸟,版权归原作者所有,如需转载,请联系作者。

原文链接:chuanchuan.blog.csdn.net/article/details/125143059

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。