1.上图两个表,要求找出掌握Skills中全部3个技能的员工,即神崎和相田,要求用mysql的语句实现
2.刚学sql,不是很会,想了好久
3.下面是书里面用sql server写的,我也不是很理解,另外mysql中没有except
SELECT DISTINCT emp
FROM EmpSkills ES1
WHERE NOT EXISTS
(SELECT skill
FROM Skills
EXCEPT
SELECT skill
FROM EmpSkills ES2
WHERE ES1.emp = ES2.emp);
迷茫2017-04-17 15:54:17
SELECT DISTINCT emp FROM EmpSkills s WHERE NOT exists(SELECT skill FROM skills WHERE skill NOT IN
(SELECT skill FROM EmpSkills Es2 WHERE Es2.emp = s.emp));
對應的資料替換一下就可以了.
高洛峰2017-04-17 15:54:17
那段SQL所表達的意思大概是:
如果一個員工他所掌握的那些
skill
,從Skills
清單裡刨除後清單為空了,那麼選出這個員工。skill
,从Skills
列表里刨除后列表为空了,那么选出这个员工。
注意except
后面是这个员工掌握的所有skill
except
後面是這個員工掌握的所有skill
。 🎜PHPz2017-04-17 15:54:17
1.無論是SQL書籍,或是網路上的資料,都喜歡寫很長、很複雜的SQL語句,這樣做其實是不對的。因為過長、過於複雜的SQL語句,不利於結構設計、程式碼書寫、調試、維護、專案移交等。
2.正確的思路,應該是保證每條語句盡量簡單,長度盡量少。多使用變數、表格變數、暫存表來降低複雜度,多使用函數、預存程序、視圖來增加多用性與減少耦合及程式碼冗餘。
黄舟2017-04-17 15:54:17
個人疑問:
題目描述是不是不太準確?
要求找出會Skills中3個技能的員工如果存在某員工不僅掌握這3個技能還掌握了其他技能
這樣的員工會被書中的sql語句篩選出去
或者題目是不是應該修改為掌握並只掌握skills表中所有技能的員工?
怪我咯2017-04-17 15:54:17
問題的核心是,如何在SQL中表示集合A的所有成員都在集合B中。
用的是否定之否定的邏輯:不存在集合A的成員不在集合B中
集合A:Skills表的所有記錄
集合B: EmpSkills表是每位員工對應的記錄
SQL的邏輯變類的過程:
1、找出EmpSkill的所有員工
去除每位員工在EmpSkill表中對應的skill
依照上面所說的「否定之否定」條件,判斷員工是否擁有Skills表中的所有skill
另一個思路,先建構出員工、技能對矩陣,然後看是否在EmpSkill表中,如果存在的話說明技能不全,作為排除條件,sql大概是這樣的:
select distinct emp
from EmpSkills
where emp not in (
select distinct t1.emp
from (select distinct emp
from EmpSkills) t1 inner join Skills t2
where not exists (select 1 from EmpSkills t3 where t3.emp = t1.emp and t2.skill)
)
伊谢尔伦2017-04-17 15:54:17
SELECT a.emp,SUM((CASE WHEN a.skill='Oracle' THEN 1 ELSE 0 END) + (CASE WHEN a.skill='UNIX' THEN 1 ELSE 0 END) + (CASE WHEN a.skill=' Java' THEN 1 ELSE 0 END)) AS count FROM empskills a JOIN Skills b ON a.skill = b.skill GROUP BY a.emp HAVING count = 3