Sql查询显示不正确的数据

时间:2013-03-21 10:21:15

标签: mysql sql

您好我有以下数据库scheema

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)

3 个答案:

答案 0 :(得分:1)

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

    SELECT company-name,city FROM company 
    WHERE city IN(SELECT city  FROM company 
WHERE company-name='Small Bank Corporation');

答案 1 :(得分: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);

答案 2 :(得分: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步:了解问题

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

第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 x公司B)
  • 从该表中我们想要预测城市A和城市B相同的所有行,公司B是小银行公司。
  • 根据该预测,我们要选择公司名称。
  • 使用group by删除多余的公司名称(此问题中可能存在多个具有相同公司名称的行,因为同一公司可以存在于不同的城市)。

尝试使用我提供的步骤计算其余提示,如果您仍然遇到问题,请随时在此处打开更具体的问题。