>  Q&A  >  본문

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일 전677

모든 응답(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列表里刨除后列表为空了,那么选出这个员工。

    注意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
  • 취소회신하다