SQL连接技术

SQL连接技术,sql,postgresql,Sql,Postgresql,我在Bsc上遇到了一些SQL问题。CS复习试卷-我知道你们都不喜欢回答学术问题,但这是我最后的选择(也是周一考试的复习),我不知道该怎么做 我有两张桌子: Department (deptId: string, deptName: string, managerId: string) Employee (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 以及我需要运行的两个查询

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

我有两张桌子:

Department (deptId: string, deptName: string, managerId: string) 
Employee (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 
以及我需要运行的两个查询:

1) 显示拥有最多用户的部门的名称和id 雇员

2) 显示员工平均工资至少为的部门名称 四万

我相信我需要在这里使用
join
having
,但这些都是我无法完全理解的

所以我的问题是,我将如何编写这些查询?就其本身而言,我不需要答案,而是需要一种解释性的方法来了解如何实现目标。再次强调,这不是学术工作,而是期末考试的复习

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

2-是的,你需要
从连接两张桌子开始

看看结果,看看你需要添加什么。对于第一种情况,考虑通过某种方式排序,可能会将其与选择一定数量的结果相结合。对于第二个连接,您必须向该连接添加一些内容。可能是要聚合的子查询等


SQL是一种用于反复试验的漂亮语言。它是快速的,给你立即的结果。如果没有环境,请尝试使用SQL Fiddle。

首先要弄清楚的是这两个表是如何连接的

/*, 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
如果深入了解表格结构,请执行以下操作:

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

Employee
 (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 
您可以看到,
deptId
是公共字段,因此是这些表的连接键。 (可能是部门的主键,员工的外键)

如果确实是主键,则字符串是最佳选择

现在,您可以继续进行
join查询

我想为你的问题给出确切的解决方案我只是给你一个join语句的语法:

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

首先,您需要一个表,其中包含来自
部门
员工
的信息。这是这些表之间
内部联接的典型用例

  • 您将从这些表中选择哪些列(例如,您真的需要manager id吗?)
  • 你的
    ON
    条款是什么
此时,您将得到一张包含所有员工及其各自部门的表格

之后,您可以使用此表和分组依据、count()、order by,并为第一个问题选择top 1,为第二个问题选择group by,having和avg()


奖金:现在你可能想知道,如果两个部门有相同数量的员工,会发生什么情况?

首先,你如何找到每个部门的员工数量?在你的问题中,“部门”和“员工”是表格,而不是数据库。它们确实是,我的错-我整天都在盯着这个东西:p为了找到每个部门的员工人数,我会按deptid从员工组中运行
select count(*),但这当然不能得到
deptname
,这是一个问题。@Timmy:你能在该查询的选择列表中返回deptid吗?如果您还为COUNT(*)分配了一个别名,您能将该查询包装在parens中,然后对其运行SELECT吗?就像它是一个表一样?@Timmy如果我们将此讨论转移到chat,不是会更好吗?解释很少,OP没有要求显式查询,而是要求指示squite清楚,答案得到了很好的评论,并且清楚地显示了每个部分的功能。在BSc级别,至少应理解上述代码。如果有人乱写代码,我就知道了。以上是可以接受的。同意,但OP没有明确说明“我不需要答案,但需要一个解释性的方法来知道如何实现目标。”?
Select * from Table1 join Table2 on Table1.samefield=Table2.samefield  where='condition'