코드 그라데이션

Day06. SELF JOIN, UNION(ALL), (NOT)IN 본문

Database/Mega-MySQL

Day06. SELF JOIN, UNION(ALL), (NOT)IN

완벽한 장면 2023. 6. 22. 13:37

SELF JOIN

문제

 

- 이런 상황일 때 self join을 활용하여 우대리 직속상관의 연락처를 확인하기

 

정답 코드

select e1.emp as '부하직원', e2.emp as '직속상관', e2.empTel as '직속상관 연락처'
   from empTbl e1
   inner join empTbl e2
       On e1.manager = e2.emp
       where e1.emp = '우대리';

실행 결과

 

해당 쿼리는 empTbl 테이블을 자기 자신과 조인하여 부하직원과 직속 상관의 정보를 가져오고, 

그 중에서 "우대리"의 정보를 선택합니다. 

조인 조건은 e1.manager = e2.emp로 설정되어 있으며, 

이는 부하직원의 관리자(empTbl 테이블의 manager 열)와 직속 상관의 이름(empTbl 테이블의 emp 열)이 

일치하는 경우에 조인이 이루어집니다.

조인된 결과에서 "부하직원", "직속상관", "직속상관 연락처"의 열을 선택하여 반환합니다. 따라서 결과는 "우대리"의 직속상관의 이름과 연락처가 포함된 행이 반환됩니다.

 

1. FROM empTbl e1

: empTbl 테이블을 e1이라는 별칭으로 사용합니다. 이는 첫 번째 테이블로서 부하직원의 정보를 나타냅니다.

2. INNER JOIN empTbl e2 ON e1.manager = e2.emp

: empTbl 테이블을 자기 자신과 조인합니다. 조인 조건은 e1.manager와 e2.emp가 일치해야 합니다.

 이는 관리자와 직속 상관의 관계를 나타냅니다.

3. WHERE e1.emp = '우대리'

: 부하직원이 '우대리'인 행만 선택합니다.

4. SELECT e1.emp AS '부하직원', e2.emp AS '직속상관', e2.empTel AS '직속상관 연락처'

: 결과로 반환될 열을 선택합니다. '부하직원'은 e1.emp 열을 의미하며, '직속상관'은 e2.emp 열을 의미합니다.

  '직속상관 연락처'는 e2.empTel 열을 의미합니다.

쿼리 실행 결과로서 "부하직원", "직속상관", "직속상관 연락처" 열을 포함한 행이 반환됩니다. 

이 중에서 '우대리'의 직속 상관의 이름과 연락처가 포함된 행이 반환됩니다.

따라서 위의 쿼리를 실행하면 "우대리"의 직속상관의 이름과 연락처가 표시되는 결과를 얻을 수 있습니다.


UNION

  • 두 쿼리의 결과를 행으로 합치는 것

형식

SELECT 문장1
	UNION [ALL]
SELECT 문장2
  • SELECT 문장1과 SELECT 문장2의 결과가 같아야 하고, 데이터 형식도 각 열 단위로 같거나 서로 호환되는 데이터 형식이어야 한다.
  • 열 이름은 문장1의 열 이름을 따른다.
  • UNION만 쓰면 중복된 열은 제거되고 데이터가 정렬되어 나온다.
  • UNION ALL을 사용하면 중복된 열까지 모두 출력 된다.

UNION ALL 실행하기

SELECT stdName, addr FROM stdtbl
   UNION ALL
SELECT clubName, roomNo FROM clubtbl;

실행 결과

 

NOT IN

  • 첫 번째 쿼리의 결과 중에서 두 번째 쿼리에 해당하는 것을 제외하기 위한 구문.

sqldb의 사용자를 모두 조회하되, 전화가 없는 사람을 제외하고자 하는 경우(있는 사람만 출력)

SELECT name, CONCAT(mobile1, mobile2) AS '전화번호' FROM usertbl
   WHERE name NOT IN ( SELECT name FROM usertbl WHERE mobile1 IS NULL) ;

 

실행 결과

 

IN

  • 첫 번째 쿼리의 결과 중에서, 두 번째 쿼리에 해당되는 것만 조회하기 위해서

전화가 없는 사람만 조회하고자 할 때

SELECT name, CONCAT(mobile1, mobile2) AS '전화번호' FROM usertbl
   WHERE name IN ( SELECT name FROM usertbl WHERE mobile1 IS NULL) ;

 

실행 결과

 

 

 

 

 

 

 

 

 

 

 

 

728x90
Comments