<14:30 5교시> 점심 전까지의 복습

 

복습 1. GROUP BY의 내용

특정 row를 그룹으로 묶어야 하는 경우 = ~~별, ~~인 특징에 대해 등등

공통된 특징으로 묶일 수 있는 row들은  GROUP BY를 활용해서 묶어준다.

-- 부서별 급여의 총합을 출력해보세요

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno;

 

복습 2. HAVING 절의 사용 복습

위에서 만들어진 그룹의 리스트 중에서 그룹을 배제하는 방법은 HAVING 절을 사용하기

-- 부서별 급여의 총합을 출력하되, 급여의 총합이 7000이상 부서만 출력

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno

HAVING SUM(sal) >=7000;

 

복습 3. SELECT문의 실행 순서 복습

별칭이 들어가는 순서를 아는게 중요하다!

예를들어 

 

①SELECT deptno, SUM(sal) sum_sal

②FROM emp

③GROUP BY deptno

④HAVING sum_sal>=7000;

 

이문장은 에러가 난다!

왜냐하면, 실행 순서가 ② ③ ④ ①이어서 HAVING 절에서 SUM_SAL을 모르는 상태에서 값을 비교를 할 수가 없어서 에러가 나기 때문이다.

 

복습 4. TABLE JOIN 복습

서로 다른 테이블에서 같은 이름의 칼럼이 존재할 때, 두 개의 테이블의 칼럼을

테이블이름.칼럼명으로 명확하게

각 테이블의 deptno를 정의해줘서 칼럼이 애매모호하게 구분된 상태를 해결한다.

SELECT 되는 값은 서로 다른 테이블의 같은 칼럼명을 가진 녀석 중 하나면 된다.

ex) emp.deptno = dept.deptno 인 상황에서 deptno를 select 하려면

     select emp.deptno 도 되고, select dept.deptno도 된다.

 

예제)

 

 

■ JOIN 조건의 복잡도를 해결하는 방법

 

ㅇANSI(미국국가표준기구) JOIN : JOIN 조건을 (INNER) JOIN ___ ON 문구를 써서 빼준다.(INNER는 생략 가능)

 

ㅇ테이블 명에 별칭 붙이기

실무에서 테이블명은 좀 긴 편이다. 그때마다 JOIN 문구 안에서 테이블 이름을 다 반복해버리면 복잡도가 높아지기 때문에 이를 해결하기 위해 테이블 이름에 별칭을 붙인다.

테이블 이름에 별칭을 붙이는 방법은 from 에서 테이블 이름을 참조할 때 테이블 이름 바로 뒤에 붙이고자 하는 별칭을 띄어쓰기 한 칸하고 붙여주면 된다. (emp e, dept d 처럼)

 

 

ANSI JOIN에서 테이블 이름 별칭 붙이기

 

예시 문제는 ANSI JOIN과 테이블명 별칭 등을 섞어서 써봤다.

 

 

<15:30 6교시> SELF JOIN, OUTER JOIN 학습

■ SELF JOIN

이번에는 하나의 테이블을 자기 자신과 JOIN 시켜서 데이터를 조회하는 방법을 시도해 보았다.

일단 혼자 시도하느라 삽질이 꽤 이어졌다.

힌트는 emp 테이블을 자기 자신과 JOIN 시키라는 거라고 말씀해주셨다.

 

SQL> --각 사원의 이름과 메니저의 이름을 출력하세요.
SQL> select ename "사원", ename "메니저"
  2  from emp e, emp m
  3  where e.empno=m.empno=e.mgr;
where e.empno=m.empno=e.mgr
                          *
ERROR at line 3:
ORA-00933: SQL command not properly ended


SQL> select ename "사원", ename "메니저"
  2  from emp e, emp m
  3  where e.mgr=e.empno;
select ename "사원", ename "메니저"
                       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> select e.ename "사원", m.ename "메니저"
  2  from emp e, emp m
  3  where e.mgr=e.empno;

no rows selected

SQL> select e.ename "사원", m.ename "메니저"
  2  from emp e, emp m
  3  where m.mgr=e.empno;

사원                 메니저
-------------------- --------------------
FORD                 SMITH
BLAKE                ALLEN
BLAKE                WARD
KING                 JONES
BLAKE                MARTIN
KING                 BLAKE
KING                 CLARK
BLAKE                TURNER
BLAKE                JAMES
JONES                FORD
CLARK                MILLER

11 rows selected.

SQL> select e.ename "사원", m.ename "메니저"
  2  from emp e, emp m
  3  where e.mgr=m.empno;

사원                 메니저
-------------------- --------------------
FORD                 JONES
JAMES                BLAKE
TURNER               BLAKE
MARTIN               BLAKE
WARD                 BLAKE
ALLEN                BLAKE
MILLER               CLARK
CLARK                KING
BLAKE                KING
JONES                KING
SMITH                FORD

11 rows selected.

힌트와 위에서 배운 테이블의 별칭 넣기를 적용하려고 시도했는데,

처음에는 뭘 대입해야하는건지 헷갈려서 틀리고, 그러다가 대입하는 것의 좌우를 헷갈려서 헤매고, 반대로 입력한것을 알고 난 후에야 좌우를 이해해서 제대로 구할 수 있었다.

 

 

 

 

■ OUTER JOIN : 조회한 결과에 NULL 인 데이터를 표시하고 싶을 때 사용

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 방식이 있다.

LEFT OUTER JOIN

 

 

 

 

RIGHT OUTER JOIN

 

 

<17:30 7교시>

emp 테이블과 salgrade 테이블의 JOIN

나 혼자 막 해본거 ㅎㅎㅎ

 

 

테이블 3개를 조인시키기!!!!! 야호!!! 혼자 힘으로 해냈다!!!!!(맞으려나 모르겟찌만!!!! 캬캬)

e. 랑 s.을 생략해도 되던데 왜 되는지 아직 모르겠따!

→ 이건 sal, losal, hisal 얘네는 ambiguous하지 않으니까 e. s.을 쓰지 않아도 되고, 개발자로서 습관 들일려면 이렇게 생략하고 쓰는게 좋다고 하셨다!

ANSI 방법으로 3개의 테이블 JOIN하기

 

 

나혼자 해본거
서브쿼리를 이용해서 선생님과 한 것

 

<17:30 8교시>

오늘 한 거 Velog 보면서 따라서 복습해보기 + 나는 노트 정리도 하는 중

+ Recent posts