首頁  >  問答  >  主體

mysql - 一个sql查询的题目,望路过大神看下

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);
巴扎黑巴扎黑2712 天前675

全部回覆(6)我來回復

  • 迷茫

    迷茫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));

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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 15:54:17

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

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

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

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

    回覆
    0
  • PHPz

    PHPz2017-04-17 15:54:17

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

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

    回覆
    0
  • 黄舟

    黄舟2017-04-17 15:54:17

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 15:54:17

    問題的核心是,如何在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)
    )

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦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

    回覆
    0
  • 取消回覆