簡體   English   中英

基本的SQL誤解

[英]Extremely basic SQL Misunderstanding

我正在准備數據庫和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).

表申請人顯然代表申請人表。 工作是可用工作表。 合格表顯示一個人有資格從事的工作,而願望表顯示一個人感興趣的工作。

問題是編寫一個查詢,以顯示每個工作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;

一切都很好,我不確定為什么我們需要“ as q1”和“ as 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存在於所有這三個表中。

您只能引用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表中的行數。 也許您添加了該表,以為萬一需要時添加它會很痛苦,但這根本不是什么意思。

如果數據庫在applicantqualified孤兒記錄中,您的查詢將列出不存在的工作,並且還可能會省略沒有合格和願意的候選人的工作。

我不確定,因為我不知道當沒有關於要從中獲取該值的表的信息時,是否有任何數據庫可以接受COUNT(a-id)

編輯:有趣的是,它看起來像這兩個問題通過共享雙方 的的解決方案,但shawnt00有一個觀點:您的解決方案,使三個表的一個巨大的無意義笛卡爾:看到它沒有GROUP BY

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM