mysql - 一个sql查询的题目,望路过大神看下
巴扎黑
巴扎黑 2017-04-17 15:52:17
0
6
674

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);
巴扎黑
巴扎黑

全部回覆(6)
迷茫
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));

對應的資料替換一下就可以了.

小葫芦

那段SQL所表達的意思大概是:

如果一個員工他所掌握的那些skill,從Skills清單裡刨除後清單為空了,那麼選出這個員工。 skill,从Skills列表里刨除后列表为空了,那么选出这个员工。

注意except后面是这个员工掌握的所有skill

注意except後面是這個員工掌握的所有skill。 🎜
PHPzhong

1.無論是SQL書籍,或是網路上的資料,都喜歡寫很長、很複雜的SQL語句,這樣做其實是不對的。因為過長、過於複雜的SQL語句,不利於結構設計、程式碼書寫、調試、維護、專案移交等。

2.正確的思路,應該是保證每條語句盡量簡單,長度盡量少。多使用變數、表格變數、暫存表來降低複雜度,多使用函數、預存程序、視圖來增加多用性與減少耦合及程式碼冗餘。

黄舟

個人疑問:
題目描述是不是不太準確?
要求找出會Skills中3個技能的員工如果存在某員工不僅掌握這3個技能還掌握了其他技能
這樣的員工會被書中的sql語句篩選出去
或者題目是不是應該修改為掌握並只掌握skills表中所有技能的員工?

刘奇

問題的核心是,如何在SQL中表示集合A的所有成員都在集合B中。
用的是否定之否定的邏輯:不存在集合A的成員不在集合B中

集合A:Skills表的所有記錄
集合B: EmpSkills表是每位員工對應的記錄

SQL的邏輯變類的過程:
1、找出EmpSkill的所有員工

  1. 去除每位員工在EmpSkill表中對應的skill

  2. 依照上面所說的「否定之否定」條件,判斷員工是否擁有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)
)
伊谢尔伦

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!