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
해당 SQL이 표현하는 의미는 아마도 다음과 같습니다.
직원이 마스터한
skill
목록이Skills
목록에서 제거된 후 비어 있으면 해당 직원이 선택됩니다.
참고 except
뒤에는 이 직원이 마스터한 모든 skill
이 옵니다.
PHPz2017-04-17 15:54:17
1. SQL 서적이든 온라인 정보이든 사람들은 길고 복잡한 SQL 문을 작성하는 것을 좋아합니다. 이것은 실제로 잘못된 것입니다. 너무 길고 복잡한 SQL 문은 구조 설계, 코드 작성, 디버깅, 유지 관리, 프로젝트 인계 등에 도움이 되지 않기 때문입니다.
2. 각 문장은 최대한 간단하고 짧게 작성하는 것이 올바른 생각입니다. 더 많은 변수, 테이블 변수 및 임시 테이블을 사용하여 복잡성을 줄이고 더 많은 함수, 저장 프로시저 및 뷰를 사용하여 재사용성을 높이고 결합 및 코드 중복성을 줄입니다.
黄舟2017-04-17 15:54:17
개인적인 질문:
제목 설명이 정확하지 않나요?
Skills에서 3가지 스킬을 아는 직원을 찾는 것이 필요합니다. 이 3가지 스킬뿐만 아니라 다른 스킬도 마스터하는 직원이 있다면
그런 직원은 책에 나오는 SQL 문으로 선별됩니다
혹은 질문은 스킬표에 있는 스킬을 모두 마스터하고 마스터만 하는 직원으로 수정하면 안되는 걸까요?
怪我咯2017-04-17 15:54:17
문제의 핵심은 집합 A의 모든 구성원이 집합 B에 속한다는 것을 SQL로 어떻게 표현하느냐 하는 것입니다.
부정의 부정 논리가 사용됩니다. 세트 A에는 세트 B에 속하지 않는 멤버가 없습니다.
세트 A: Skills 테이블의 모든 레코드
세트 B: EmpSkills 테이블은 각 직원에 해당하는 레코드입니다.
SQL의 논리적 변환 과정:
1. EmpSkill의 모든 직원을 찾습니다
EmpSkill 테이블에서 각 직원에 해당하는 스킬 제거
위에서 언급한 "부정의 부정" 조건에 따라 해당 직원이 Skills 테이블의 모든 스킬을 보유하고 있는지 판단
또 다른 아이디어는 먼저 직원과 기술의 매트릭스를 구성한 다음 EmpSkill 테이블에 있는지 확인하는 것입니다. 존재하는 경우 제외 조건으로 SQL은 다음과 같습니다. :
으아아아伊谢尔伦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 기술 b ON a.skill = b.skill GROUP BY a.emp HAVING 개수 = 3