2

嗨,我有以下数据库架构

employee (employee-name, street, city)
works (employee-name, company-name, salary)
company (company-name, city)
manages (employee-name, manager-name)

我需要执行以下操作,但根据我的培训师的说法,他们是错误的。

假设这些公司可能位于几个城市。查找位于 Small Bank Corporation 所在城市的所有公司。

SELECT company-name, city
FROM company
UNION ALL
SELECT company-name, city
FROM company
WHERE company-name = ‘Small Bank Corporation’

找出所有收入超过公司所有员工平均工资的员工。

SELECT employee-name
FROM works
WHERE salary > ( SELECT AVG(w1.salary) 
FROM works w1
INNER JOIN works w2
ON w1.company-name = w2.company-name)

找到员工最多的公司。

SELECT company-name
FROM works
GROUP BY company-name
HAVING count(*) = ( SELECT count(*)
FROM works
GROUP BY company-name
ORDER BY count(*) DESC
LIMIT 1)

找到工资最少的公司。

SELECT company-name
FROM works
GROUP BY company-name
HAVING count(*) < ( SELECT count(*)
FROM works
GROUP BY company-name
ORDER BY count(*) DESC
LIMIT 1)
4

3 回答 3

1

假设这些公司可能位于几个城市。查找位于 Small Bank Corporation 所在城市的所有公司。

    SELECT company-name,city FROM company 
    WHERE city IN(SELECT city  FROM company 
WHERE company-name='Small Bank Corporation');
于 2013-03-21T10:41:26.953 回答
0

对于一个单一的答案,这需要解决很多问题,因此我将列出您在第一个示例中出错的地方,如何解决它,以及如何在其余示例中使用该策略。您可能希望在 Stack Overflow 上将剩余的问题拆分为新问题。从上周给出的答案可以看出,人们不愿意回答整个请求。

所以,问题:

假设这些公司可能位于几个城市。查找位于 Small Bank Corporation 所在城市的所有公司。

第 1 步:正确阅读提示

当我说这通常是解决这类问题中最难的部分时,我是完全真诚地说的。语言并不总是像我们希望的那样具体,不同的人可以用多种方式解释同一个句子。如果提示中有任何歧义,请务必与您的讲师沟通,并要求他们澄清您需要编写查询的内容。

第 2 步:检查出了什么问题

所以你写的查询并不能解决被问到的问题。为什么不?我们可以通过弄清楚您的查询到底做了什么来开始回答这个问题。我们可以先把它分成几部分:

SELECT company-name, city
FROM company

上面的代码将从名为“company”的表中的每一行中获取公司名称和城市。

SELECT company-name, city
FROM company
WHERE company-name = ‘Small Bank Corporation’

上面的代码将从名为 company 的表中的每一行中获取公司名称和城市,其中公司名称为“Small Bank Corporation”。

UNION ALL

上面的行将创建它之前和之后的选择的联合。因此,您创建了表中所有行的并集,以及公司名称为“Small Bank Corporation”的所有行。这不仅没有解决上面给出的查询,而且还为我们提供了我们没有要求的额外的冗余行。我们可以创建一个模型表company来准确演示它的作用。

company-name            |  city
--------------------------------
Small Bank Corporation  |   A
Silly Bank Corporation  |   B
Large Bank Corporation  |   C

在此示例中,我们可以看到 Small Bank Corporation 是 A 市唯一的公司。因此,当我们使用 WHERE 语句指定它时,它将是唯一返回的行。所以当我们合并结果时,我们应该得到如下结果。

company-name            |  city
--------------------------------
Small Bank Corporation  |   A
Silly Bank Corporation  |   B
Large Bank Corporation  |   C
Small Bank Corporation  |   A

这真的没有帮助。那么我们该如何解决这个问题呢?

第 3 步:了解问题

提示要求查找位于Small Bank Corporation 所在城市的所有公司。我对该声明的解释是,在存在 Small Bank Corporation 的每个城市中,我们都想要镇上每家银行的名单。我们的最终结果将是 Small Bank Corporation 所在的每个城镇的所有银行的列表。例如,如果银行想要查看其竞争对手的完整列表,他们可能需要此信息。

第 4 步:修订

现在我们可以开始朝着正确的查询方向努力了。您知道要选择哪些变量,因此我们不需要更改第一行。编写查询的方法有很多,因此为了增加您对 SQL 的了解,我将提供现有答案的替代方法。

SELECT A.company_name
FROM company A, company B 
WHERE A.city = B.city AND B.company_name = 'Small Bank Corporation'
GROUP BY company_name;

请允许我分解这里发生的事情:

  • 创建了一个作为公司和公司的叉积的表。(A公司×B公司)
  • 从该表中,我们想要投影城市 A 和城市 B 相同且公司 B 是小型银行公司的所有行。
  • 从该投影中,我们要选择公司名称。
  • 使用 group by 去除多余的公司名称(这个问题可以存在多行同一个公司名称,因为同一个公司可以存在于不同的城市)。

尝试使用我提供的步骤来解决您的其余提示,如果您仍然遇到困难,请随时在此处提出更具体的问题。

于 2013-03-31T06:30:06.293 回答
0

找出所有收入超过公司所有员工平均工资的员工。

SELECT employee-name
FROM works
WHERE salary > ( SELECT AVG(salary) 
FROM works )

找到员工最多的公司。

select company-name from works group by company-name having count(*) 
= (select max(count(*)) from works group by company-name);
于 2013-03-21T10:29:44.180 回答