SQL 질문 : SELF JOIN 에 대해서

 SELECT *

FROM emp a , emp b 

WHERE a.empno = b.mgr  

AND  a.empno BETWEEN 7369 AND 7698 


질문 : 우선 기본이 되는 자식이 있고 자식한테 맞춰주는 부모 열이 있는데 

지금 여기서는 a는 자식열이고 b 는 부모열이고 

a의 메니저의 번호에 따라서 b는 메니저의 이름이 ename이 되고 나머지도 메니저의 이름이 ename이 된것을 따라서 뒤에 COLUMN이 전부 따라서 바뀌게 되는데

그럼 a의 테이블과 b의 테이블이 서로 자리 배열을 할 때 a,b 이렇게 나오는 경우도 있고 b,a 이렇게 나오는경우도 있네...  



WHERE 절에서 앞뒤가 자리가 바껴도 정렬순서는 바뀌지 않는다 ( 여기서말하는거는 데이터자체내용이아니라 A, B 의 정렬


--> 여기서 그러니까 b 두번째 있는 애의mgr이니까 원래 기본으로 되는건 mgr이 왼쪽에 있는 정렬이었고 a가 그 왼쪽 자식 테이블에 mgr에 대한 empno 를 구하는 거기 때문에 여기서는 자식이 b 테이블이고 a는 자식에게 맞춰주는 부모 테이블이다.  


그래서

SELECT *

FROM emp a , emp b 

WHERE a.empno = b.mgr

AND b.empno BETWEEN 7369 AND 7698 

여기서 and 뒤에 empno 의 범위를 정할때 a가 아니라 자식배열인 b가 오는 것이다. 








두번째 질문 : join with using 이랑 join with on 에서 using 이랑 on 뒤에 괄호 () 를 안써도

되는건가? 

using 에는 항상 쓰고 on 에는 괄호를 안써도 됨.  




중요한 것 : 


SELECT  *                               

FROM emp a JOIN emp b 

ON  ( m.mgr = s.empno ) ; 


여기서는 열이 13열만 나오는데 

자식인 emp 배열에서 mgr이 없었던 king 이라는 애는 둘이 join 을 했을때 사라지게

된다. 즉  join을 한 뒤 자식배열이 늘 원래의 데이터테이블처럼 뽑아져 나오는 것은 아니다. 


원래 emp 테이블 


salgrade와 emp 테이블을 조인한 테이블 


emp 테이블과 salgrade 테이블이 합쳐졌는데 

emp 테이블에 있는 ename을 보면 king 이 사라져 있음 





질문 4. 



SELECT a.ename, b.ename mgr

FROM emp a, emp b

WHERE a.mgr = b.empno


여기서 보면 자식 테이블이었던 첫번째의 ename에 있는 애들이 전부 순서를

바꿔서 b.ename 즉 부모 테이블에 있던 ename이 별칭으로 변한 mgr 테이블의

동일한 이름이 묶여서 정렬이 되? 자동으로? 늘 ? 

부모테이블의 mgr 테이블에 맞춰서 정렬이 되네???? 



질문 5 

SELECT empno, ename, emp.deptno , dname  

FROM emp JOIN dept ON ( emp.deptno = dept.deptno ) 

ORDER BY emp .deptno


여기에서는 deptno 숫자대로 정렬이 안되니까 

order by 로 써줘야하는데....!! 


질문 6 

JOIN WITH USING과 NATURAL JOIN 은 한정자를 써주면 안되고

JOIN WITH ON 은 한정자를 써줘야 하는건가 



질문 8 

FROM 절에서 한정자를 붙인뒤

WHERE 절에서 한정자 대신 EMP, DEPT 처럼 이렇게 사용이 안되네??? 



















댓글