【问题标题】:SQL Query to fetch emloyee name, salary where employee name is providedSQL查询获取员工姓名,提供员工姓名的薪水
【发布时间】:2020-07-17 18:36:27
【问题描述】:

对于具有列 EmpId、Name 和 Salary 列的 Employee 表,该表具有列 Id、EmpId、Salary,其中 Salary 表的 EmpId 是 Employee 表的外键。 是否可以编写一个 SQL 查询,使结果包含每个员工的姓名和员工姓名提供的所有员工的工资?

样本数据

Employee

EmpId      Name       
 1         Alice      
 2         Bob        
 3         Charlie     
 4         Doug        

Salary

样本数据

 Id      EmpId       Salary 
 1         1       1000
 2         2       2000 
 3         3       3000 
 4         4       4000 

查询我试过,但看不到,我如何写员工姓名,比如 Bob,我想在哪里获取薪水比 Bob 高的员工。下面的查询给出了工资角度的结果,但是如何按员工姓名获取?

--按条款更新,谢谢@Strawberry

    SELECT s.salary
    , e.empname 
    FROM
    test.employee as e, test.salary as s 
    WHERE s.empid = e.empid AND s.salary > 2000 
    ORDER BY s.Salary DESC 
    LIMIT 3;

【问题讨论】:

  • "是否可以编写 SQL 查询..." 是的,可以。
  • 我了解 Inner Join Eric,但我显然无法了解如何使用员工姓名进行过滤,请参见 select e.name, s.salary from employee e Inner Join pay as s where e。 empid = s.empid 这将给出所有员工的结果,但这里如何使用 emp 名称过滤器来检查?
  • ...请注意,没有 ORDER BY 的 LIMIT 是毫无意义的
  • 谢谢,虽然,我的结果不是按顺序实现,所以没有使用Order by Clause!公平地说,在 SELECT 语句中使用 LIMIT 子句来限制要返回的行数。但是,感谢您的提示,据我所知,最佳做法是始终使用 LIMIT 子句和 ORDER BY 子句来以唯一顺序约束结果行。

标签: mysql


【解决方案1】:

这是您可以用来获取 Bob 工资的查询:

SELECT Salary
FROM salary
WHERE EmpId = 2;

现在您想要获取所有薪水高于您在上面查询中找到的员工的姓名和薪水。因此,您将使用上述查询作为 WHERE 中的嵌套查询。给你:

SELECT employee.EmpId, employee.Name, salary.Salary
FROM employee
JOIN salary ON employee.EmpId = salary.EmpId
WHERE salary > (
                    SELECT Salary
                    FROM salary
                    WHERE EmpId = 2
                );

编辑 - 在您说要按名称而不是 EmpId 过滤的 cmets 下方。因此,您可能希望使用 WHERE Name="Bob" 进行过滤。问题是名称通常不是唯一的。因此,您可能有两个名为“Bob”的人。如果是这种情况,您必须找出一个解决方案,以获得哪种薪水 - 它们可能会有所不同。

这是一个示例查询,它将获取所有 Bob 中薪水最高的名为“Bob”的人的薪水,然后过滤其他员工以使其薪水高于任何人:

SELECT employee.EmpId, employee.Name, salary.Salary
FROM employee
JOIN salary ON employee.EmpId = salary.EmpId
WHERE salary > (
                    SELECT MAX(Salary)
                    FROM salary
                    WHERE EmpId IN (
                        SELECT EmpId
                        FROM employee
                        WHERE Name="Bob"
                    )
                );

如果没有名为“Bob”的人,最终可能会出现问题。上面的查询将返回一个空集。如果你想打印所有人,你可以这样做:

SELECT employee.EmpId, employee.Name, salary.Salary
FROM employee
JOIN salary ON employee.EmpId = salary.EmpId
WHERE salary > (
                    SELECT IF(MAX(Salary) IS NULL, 0, MAX(Salary))
                    FROM salary
                    WHERE EmpId IN (
                        SELECT EmpId
                        FROM employee
                        WHERE Name="Bob"
                    )
                );

现在如果没有“Bob”,它仍然会打印所有工资高于 0 的人。

【讨论】:

  • 我的查询也返回了同样的内容。询问的查询是按 emp name 过滤,比如 Bob,我想在其中将员工表中的收入超过 bob 的员工提取到 salary 表。
  • 只需将 WHERE EmpId = 2 更改为 WHERE Name = 'Bob'。现在如果有两个叫“Bob”的人会发生什么。让我知道,我们将寻求解决方案:)
  • 是的,我也是这么想的,但被问到了。无论如何,不​​同的 emp 名称,现在只是在这种情况下,没有 emp 名称重复两次。
  • 如果名字是唯一的,那么你可以跳过MAX函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2022-11-18
  • 2017-01-07
  • 1970-01-01
  • 2021-01-03
  • 2021-10-18
相关资源
最近更新 更多