极其基本的SQL误解

时间:2015-06-17 21:09:57

标签: mysql database

我正准备参加数据库和SQL考试,我正在解决这个问题:

我们有一个由4个表组成的数据库,代表一家人力资源公司。表格是:

 applicant(a-id,a-name,a-city,years-of-study),
 job(job-name,job-id), 
qualified(a-id,job-id) 
wish(a-id,job-id).

表格申请人显然代表申请人表。工作是可用工作的表。表格合格显示了一个人有资格获得的工作,表格愿望显示了一个人感兴趣的工作。

问题是编写一个查询,显示每个job-id,合格且有兴趣的申请人数。

以下是老师写的解决方案:

Select q1.job_id
    , count(q1.a_id) 
  from qualified as q1
    , wish as w1
Where q1.a_id = w1.a_id 
    and q1.job_id = w1.job_id
Group by job_id;

这一切都很好,我不知道为什么我们需要“作为q1”和“作为w1”,但我可以看出它为何起作用。

以下是我写的解决方案:

SELECT job-id,COUNT(a-id) FROM job,qualified,wish WHERE (qualified.a-id=wish.a-id)
GROUP BY job-id

为什么我的解决方案有误?而且 - 从哪个表中选择信息?假设我写SELECT job-id FROM job,qualified,wish。从哪个表中获取信息?因为job-id存在于所有这三个表中。

2 个答案:

答案 0 :(得分:1)

您只能引用FROM子句中提到的表格。如果它不明确(因为不止一个列具有相同名称的列),那么您需要通过限定名称来明确。通常限定符是别名,但如果没有指定别名,它也可以是表名。

有一个"自然连接的概念"它连接两个表之间的公共列上的表。并非所有系统都支持这种表示法,但我认为MySQL确实如此。我相信这些系统通常会将连接对折叠成一列。

select q1.job_id, count(q1.a_id) from qualified as q1, wish as w1
where q1.a_id = w1.a_id and q1.job_id = w1.job_id
group by job_id;

我不认为我曾在任何接受过上述查询的系统上工作,因为即使目的不是,分组列也会严格不清楚。因此,如果它真正在MySQL上正常工作,那么我的猜测是它识别列的等价性并减少你对语法的松懈。

顺便说一下,您的查询似乎不正确,因为您只需要在需要两列的联接中包含一个列。您还包括第三个表,这意味着您的结果将有效地对该表中的每一行进行交叉连接。分组仍然会将每个job_id减少到一行,但计数将乘以job表中的行数。也许你添加了那个表认为添加它会受到伤害,以防你需要它但这根本不是它的含义。

答案 1 :(得分:0)

如果数据库在applicantqualified中有孤立记录,您的查询将列出不存在的作业,并且可能还会省略没有合格且有意愿的候选人的作业。

我不确定,因为我不知道是否有任何数据库接受COUNT(a-id),而没有关于从中获取此值的表的信息。

编辑:有趣的是,both of the解决方案似乎共享了这两个问题,但shawnt00有一个观点:您的解决方案会产生三个表格的巨大无意义的笛卡儿:它without the group by

因此,我目前对工作答案的最佳猜测是http://sqlfiddle.com/#!9/09d0c/6