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
时,有几个关键知识点需要了解:
- 合并结果集:
UNION
操作符用于合并两个或多个SELECT
语句的结果集。它会将查询的结果组合在一起,并自动去除重复的行。
示例:
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2;
这将返回合并了table1
和table2
中column_name
列的结果集,并且去除重复的行。
- UNION ALL: 与
UNION
不同,UNION ALL
操作符也用于合并结果集,但它不会去除重复的行。相比UNION
,UNION ALL
的性能更好,因为不执行去重操作。
示例:
SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2;
这将返回合并了table1
和table2
中column_name
列的结果集,包括所有行,即使有重复的行也会全部显示。
- 列数和数据类型匹配: 在使用
UNION
或UNION ALL
时,确保每个查询的选择列表中列的数量和数据类型是相同的。如果列数或数据类型不匹配,MySQL会抛出错误。
示例:
SELECT name, age FROM employees
UNION
SELECT department, salary FROM departments;
这里,employees
表中的name
和age
列与departments
表中的department
和salary
列不匹配,可能导致错误。
- 使用排序: 您可以在
UNION
操作后添加ORDER BY
子句来对合并的结果进行排序。此时,排序将应用于最终的合并结果。
示例:
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
ORDER BY column_name ASC;
这将合并table1
和table2
中column_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
语句非常灵活,可以在SELECT
、UPDATE
、INSERT
等语句中使用,根据不同的条件返回不同的结果或执行不同的操作。
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)说明来意!希望能够与你共同进步