【问题标题】:SQL Join techniqueSQL 连接技术
【发布时间】:2014-05-09 15:03:02
【问题描述】:

我在 Bsc 上遇到了一些 SQL 问题。 CS 复习试卷 - 我知道你们都不喜欢回答学术问题,但这是我最后的手段(也是周一考试的复习),我不知道该怎么做。

我有 2 张桌子:

Department (deptId: string, deptName: string, managerId: string) 
Employee (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 

我需要运行 2 个查询:

1) 显示人数最多的部门的名称和id 员工

2) 显示员工平均工资不低于的部门名称 40000

我认为我需要在这里使用joinhaving,但这些都是我无法完全理解的东西。

所以我的问题是,我将如何编写这些查询?我本身不需要答案,而是知道如何实现目标的解释性方法。同样,这不是学术工作,而是期末考试的修订。

【问题讨论】:

  • 首先,您将如何找到每个部门的员工人数?
  • 在您的问题中,“Department”和“Employee”是 tables ,而不是数据库。
  • 他们确实是我的错 - 我整天都在盯着这些东西 :p 为了找到每个部门的员工数量,我会运行 select count(*) from employee group by deptid 但这并没有让我知道deptname,当然——这是个问题。
  • @Timmy: 你能在那个查询的 SELECT 列表中返回 deptid 吗?如果您还为 COUNT(*) 分配了一个别名,您是否可以将该查询包装在括号中,然后对它运行一个 SELECT,就像它是一个表一样?
  • @Timmy 如果我们将此讨论转移到聊天中不是更好吗?

标签: sql postgresql


【解决方案1】:

首先你必须弄清楚这两个表是什么以及如何连接的?

如果你深入表结构:

Department 
(deptId: string, deptName: string, managerId: string) 

Employee
 (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 

您可以看到deptId 是公共字段,因此是这些表的连接键。 (可能是部门的主键和员工的外键)

如果确实是主键,那么作为字符串是最好的datatype 选择。

现在您可以继续制作join query

我想为您的问题提供确切的解决方案,我只是为您提供连接语句的语法:

Select * from Table1 join Table2 on Table1.samefield=Table2.samefield  where='condition'

【讨论】:

    【解决方案2】:

    1

    使用 Rank 并确定谁是 = 1。为简单起见,请尝试创建一个子查询:按部门 ID 分组并获取员工数量。

    2 - 是的,你需要拥有

    Select
        d.deptid, d.deptName, Average(e.salary)
    from Department as d
    inner join Employee as e
    on d.deptId = e.deptId
    group by d.deptid, d.deptName
    having Average(e.salary) >= 40000
    

    【讨论】:

      【解决方案3】:

      首先,您希望有一个表格结合来自DepartmentEmployee 的信息。这是这些表之间INNER JOIN 的经典用例。

      • 您要从这些表中选择哪些列(例如,您真的需要经理 ID 吗?)?
      • 您的ON 子句将是什么?

      此时,您将获得一张包含所有员工及其各自部门的表格。

      之后,您可以使用此表和 group by、count()、order by 并选择 top 1 作为您的第一个问题/group by、have 和 avg() 作为您的第二个问题。

      奖励:现在您可能想知道,如果两个部门的员工人数相同会怎样?

      【讨论】:

        【解决方案4】:

        首先加入你的两个表。

        查看结果并查看需要添加的内容。对于第一个考虑排序的东西可能与选择一定数量的结果相结合。对于第二个,您将不得不向该连接添加一些内容。也许是聚合等的子查询。

        SQL 是一种用于反复试验的优美语言。它速度很快,可以立即为您提供结果。如果您没有环境,请尝试 SQL Fiddle。

        【讨论】:

          【解决方案5】:
          /*, managerId VARCHAR(100)*/
          
          
          DECLARE @Department TABLE (deptId VARCHAR(100), deptName VARCHAR(100)) 
          DECLARE @Employee TABLE (empId VARCHAR(100), empName VARCHAR(100), jobName VARCHAR(100), salary INT, deptId  VARCHAR(100)) 
          
          INSERT INTO @Department (deptId, deptName) VALUES ('IT','Tech')
          INSERT INTO @Department (deptId, deptName) VALUES ('ST','Stores')
          
          INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('A','AAA',10000,'IT')
          INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('B','AAA',20000,'IT')
          INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('C','AAA',30000,'ST')
          INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('D','AAA',220000,'ST')
          INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('E','AAA',12000,'ST')
          
          
          /*Department with the largest number of employees*/
          SELECT  
              TOP 1 DP.deptId, DP.deptName, COUNT(EE.deptId) AS NoEmployees
          FROM    
              @Department AS DP 
          
              INNER JOIN @Employee AS EE
              ON DP.deptId = EE.deptId
          
          GROUP BY
              DP.deptId , DP.deptName
          ORDER BY
              COUNT(EE.deptId) DESC
          
          /*Department with the largest number of employees*/
          SELECT  
              DP.deptId, DP.deptName, AVG(EE.salary) AS NoEmployees
          FROM    
              @Department AS DP 
              INNER JOIN @Employee AS EE
              ON DP.deptId = EE.deptId
          
          GROUP BY
              DP.deptId , DP.deptName
          HAVING
               AVG(EE.salary)>40000
          ORDER BY
              COUNT(EE.deptId) DESC
          

          【讨论】:

          • 解释很少,OP 没有要求明确的查询,而是要求指示
          • 很清楚,答案的评论非常好,并且清楚地显示了每个部分的作用。在 BSc 级别,对上述代码的理解应该被认为是最低限度的。如果有人乱写代码,那我就明白了。以上是可以接受的。
          • 同意,但 OP 没有明确声明“我不需要答案,本身,而是知道如何实现目标的解释性方法。” ?
          猜你喜欢
          • 2017-05-17
          • 2023-03-29
          • 2016-09-10
          • 2017-03-10
          • 1970-01-01
          • 2017-01-18
          • 2016-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多