20240105 SQL基础50题打卡

20240105 SQL基础50题打卡

1789. 员工的直属部门


表:Employee

+---------------+---------+
| Column Name   |  Type   |
+---------------+---------+
| employee_id   | int     |
| department_id | int     |
| primary_flag  | varchar |
+---------------+---------+
这张表的主键为 employee_id, department_id (具有唯一值的列的组合)
employee_id 是员工的ID
department_id 是部门的ID,表示员工与该部门有关系
primary_flag 是一个枚举类型,值分别为('Y', 'N'). 如果值为'Y',表示该部门是员工的直属部门。 如果值是'N',则否

一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为'N'.

请编写解决方案,查出员工所属的直属部门。

返回结果 没有顺序要求

返回结果格式如下例子所示:

示例 1:

输入:
Employee table:
+-------------+---------------+--------------+
| employee_id | department_id | primary_flag |
+-------------+---------------+--------------+
| 1           | 1             | N            |
| 2           | 1             | Y            |
| 2           | 2             | N            |
| 3           | 3             | N            |
| 4           | 2             | N            |
| 4           | 3             | Y            |
| 4           | 4             | N            |
+-------------+---------------+--------------+
输出:
+-------------+---------------+
| employee_id | department_id |
+-------------+---------------+
| 1           | 1             |
| 2           | 1             |
| 3           | 3             |
| 4           | 3             |
+-------------+---------------+
解释:
- 员工 1 的直属部门是 1
- 员工 2 的直属部门是 1
- 员工 3 的直属部门是 3
- 员工 4 的直属部门是 3

题解:

# Write your MySQL query statement below
select employee_id, department_id  
from Employee
where primary_flag  = 'Y'
UNION
select employee_id, department_id  
from Employee
group by employee_id
having count(*) = 1

知识点:

当涉及到在MySQL中使用UNION时,有几个关键知识点需要了解:

  1. 合并结果集: UNION操作符用于合并两个或多个SELECT语句的结果集。它会将查询的结果组合在一起,并自动去除重复的行。

示例:

SELECT column_name FROM table1
UNION
SELECT column_name FROM table2;

这将返回合并了table1table2column_name列的结果集,并且去除重复的行。

  1. UNION ALL:UNION不同,UNION ALL操作符也用于合并结果集,但它不会去除重复的行。相比UNIONUNION ALL的性能更好,因为不执行去重操作。

示例:

SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2;

这将返回合并了table1table2column_name列的结果集,包括所有行,即使有重复的行也会全部显示。

  1. 列数和数据类型匹配: 在使用UNIONUNION ALL时,确保每个查询的选择列表中列的数量和数据类型是相同的。如果列数或数据类型不匹配,MySQL会抛出错误。

示例:

SELECT name, age FROM employees
UNION
SELECT department, salary FROM departments;

这里,employees表中的nameage列与departments表中的departmentsalary列不匹配,可能导致错误。

  1. 使用排序: 您可以在UNION操作后添加ORDER BY子句来对合并的结果进行排序。此时,排序将应用于最终的合并结果。

示例:

SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
ORDER BY column_name ASC;

这将合并table1table2column_name列的结果,并按升序对合并后的结果进行排序。

请注意,UNION操作会执行排序并去除重复行,这可能会对性能产生影响。如果不需要排序或去重,请考虑使用UNION ALL来获得更好的性能。

610. 判断三角形


表: Triangle

+-------------+------+
| Column Name | Type |
+-------------+------+
| x           | int  |
| y           | int  |
| z           | int  |
+-------------+------+
在 SQL 中,(x, y, z)是该表的主键列。
该表的每一行包含三个线段的长度。

对每三个线段报告它们是否可以形成一个三角形。

任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入: 
Triangle 表:
+----+----+----+
| x  | y  | z  |
+----+----+----+
| 13 | 15 | 30 |
| 10 | 20 | 15 |
+----+----+----+
输出: 
+----+----+----+----------+
| x  | y  | z  | triangle |
+----+----+----+----------+
| 13 | 15 | 30 | No       |
| 10 | 20 | 15 | Yes      |
+----+----+----+----------+

题解:

# Write your MySQL query statement below
select * , 
    CASE 
        WHEN (x+y > z and x+z>y and y+z > x) THEN 'Yes' ELSE 'No'
    END as triangle
from Triangle;

知识点:

CASE语句是在 SQL 中用于实现条件逻辑的一种结构。它允许根据特定条件选择性地返回不同的值或执行不同的操作。CASE语句通常与WHEN一起使用。

CASE 语句的基本语法:

简单 CASE 表达式
CASE expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE default_result
END
搜索 CASE 表达式
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END

案例:

简单 CASE 表达式:
SELECT 
    grade,
    CASE grade
        WHEN 'A' THEN '优秀'
        WHEN 'B' THEN '良好'
        WHEN 'C' THEN '及格'
        ELSE '不及格'
    END AS grade_status
FROM students;

这个查询根据学生成绩 (grade) 字段的不同值返回相应的评级 (grade_status)。

搜索 CASE 表达式:
SELECT 
    name,
    age,
    CASE 
        WHEN age < 18 THEN '未成年'
        WHEN age BETWEEN 18 AND 65 THEN '成年人'
        ELSE '老年人'
    END AS age_group
FROM person_info;

这个查询根据年龄 (age) 字段的不同范围返回不同的年龄分组 (age_group)。

使用 CASE 更新数据:
UPDATE employees
SET salary = 
    CASE 
        WHEN department = 'IT' THEN salary * 1.1
        WHEN department = 'Sales' THEN salary * 1.05
        ELSE salary
    END;

这个更新语句根据员工所在部门,增加或者减少他们的薪水。

使用 CASE 来进行排序:
SELECT product_name, 
       stock_quantity,
       CASE 
           WHEN stock_quantity <= 10 THEN '紧缺'
           WHEN stock_quantity BETWEEN 11 AND 50 THEN '适中'
           ELSE '充足'
       END AS stock_status
FROM products
ORDER BY 
    CASE 
        WHEN stock_status = '紧缺' THEN 1
        WHEN stock_status = '适中' THEN 2
        ELSE 3
    END;

这个查询根据产品库存量将产品分为不同的状态,并且按照库存状态进行排序。

CASE语句非常灵活,可以在SELECTUPDATEINSERT等语句中使用,根据不同的条件返回不同的结果或执行不同的操作。

180. 连续出现的数字


表:Logs

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+
在 SQL 中,id 是该表的主键。
id 是一个自增列。

找出所有至少连续出现三次的数字。

返回的结果表中的数据可以按 任意顺序 排列。

结果格式如下面的例子所示:

示例 1:

输入:
Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+
输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+
解释:1 是唯一连续出现至少三次的数字。

题解:

# Write your MySQL query statement below
select distinct one.num as ConsecutiveNums
from Logs as one , Logs as two , Logs as three 
where three.id - two.id = 1 and two.id -one.id = 1 and one.num = two.num and one.num = three.num;

# 官方题解
SELECT DISTINCT
    l1.Num AS ConsecutiveNums
FROM
    Logs l1,
    Logs l2,
    Logs l3
WHERE
    l1.Id = l2.Id - 1
    AND l2.Id = l3.Id - 1
    AND l1.Num = l2.Num
    AND l2.Num = l3.Num
;

大家好,我是xwhking,一名技术爱好者,目前正在全力学习 Java,前端也会一点,如果你有任何疑问请你评论,或者可以加我QQ(2837468248)说明来意!希望能够与你共同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值