프로그래밍/SQLD

6. 2과목 제 2장 SQL 활용 (1) - alias

량아이 2022. 8. 27. 18:34

분명 저번 포스팅에선 어..? 생각보다 할만한데?를 느꼈었던 반면, SQL 활용편에 들어가지마자 뭔가가 단단히 잘못되었다는것을 느꼈다.

 

SQL 기본편 오답노트를 끝내고 시간이 약 1시간가량 남아 한번 찍먹이라도 해보자 해서 바로 활용편을 들어봤으나 설명을 너무 잘하신다고 생각했던 전광절님은 설명을 어렵게 하시는 분으로 마음속 평가가 떡락해버렸고 어디서부터 어떻게 건들여야 할지 전혀 모르겠어서 진짜 이번에 따는걸 포기해야하나라는 생각밖에 안들었다.

그래도 일단 되든안되든 마쳐보자라는 생각에 꾸역꾸역 문제풀이를 듣고 그 유명하신 정미나님의 풀이까지 듣고서야 아 이런식으로 되는거구나 하고 이해가 조금씩 되었다.

물론 모든걸 하나하나 짚으면서 넘어가진 않았고 이번주 그니까 오늘, 내일로 기준 가이드? 외워야 할 것들 이해해야할 문법 들을 정리해두고 다음주부터 본격적으로 SQLD시험 대비를 하려고 한다.

 

진심으로 SQLD 단기간에 취득 가능하다고 한 블로거들 얼마나 똑똑한지, 저번의 저주는 먹혔는지 얼굴이나 좀 보고싶다.


일반 집합 연산자

  • UNION - 합집합 (중복 제거) -> 중복을 제거한 결과의 합을 검색

*별칭을 지정할 경우 첫번째 쿼리의 별칭을 따른다!

  • UNION ALL - 합집합 (중복 행도 표시) ->  중복을 포함한 결과의 합을 검색
  • INTERSECT - 교집합(중복 제거) ->  양쪽 모두에서 포함된 행을 검색
  • EXCEPT(SQL Server), MINUS(ORACLE) - 차집합 -> 첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 나머지를 검색
SELECT A, B
FROM 테이블이름1
EXCEPT
SELECT A, B
FROM 테이블이름2

*테이블1 - 테이블2 => 테이블1에만 존재하는 칼럼 A, B의 데이터를 추출

  • CROSS JOIN - 곱집합

순수 관계 연산자 : 관계형 DB를 새롭게 구현

  • SELECT -> WHERE
  • PROJECT -> SELECT
  • NATRUAL JOIN -> 다양한 JOIN
  • DIVIDE -> 사용 x

 

(3일동안 개고생해서 2장 이해하려고 한것치고 부끄럽지만 'a.컨텐츠' 이게 alias 를 사용한것인건 알았는데 정확히 어떻게 쓰는건지 이해가 안됐었다. alias도 리눅스마스터 2급을 따면서 막연히 별칭 이라는것만 알고있을뿐 sql 활용까지 오면서도 별칭에 대한 문제가 안나왔어서 어떤식인지 전혀 모르겠고 a.ID, b.ID이런식으로 쓰여서 왜!!!같은 데이터인데 a 와 b로 나뉘는지 몰랐었으나 이젠 안다 )

  • 테이블 alias 는 선 사용 후 정의 해도 된다. (select 문에서 사용 from 절에서 정의)
  • a.ID, b.ID 이렇게 겹친거는 fk이기 때문

그냥 의미 그대로 테이블을 보면서 이게 어느 테이블에서 왔는지 알면 된다.

이 간단한걸 굳이 설명해주는 동영상이나 블로그가 없어서 애먹었다.ㅎㅎ

 

 

이해가 안되지만 최대한 이해해보려던 흔적

JOIN

두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력

FROM 테이블이름1, 테이블이름2

    WHERE 조건식 

바로 조인을 맺고 조건을 WHERE절로 작성할 수도 있다.

 

EQUI JOIN - 2개의 테이블 간에 칼럼들이 서로 정확하게 일치하는 경우 사용, 대부분 PK, FK의 관계를 기반으로 사용

 

<조건절>

USING - 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다. alias 사용불가

                ex)테이블 1 INNER JOIN 테이블 2

                                           USING(칼럼이름)

ON - JOIN의 조건절(WHERE) , alias나 테이블명 반드시 사용

 

<형태>

INNER JOIN - JOIN 조건에서 동일한 값이 있는 행만 반환

                          USING 이나 ON 절을 필수적으로 사용(미사용시 syntax에러 발생)

OUTER JOIN - JOIN 조건에서 동일한 값이 없는 행도 반환

                          USING 이나 ON 절을 필수적으로 사용(미사용시 syntax에러 발생)

ㄴLEFT OUTER JOIN - 조인 수행시 먼저 표기된 좌측 테이블에 해당하는 데이터를 읽은 후, 나중 표기된 테이블에서 join 대상 테이블을 읽어온다.

                                           우측 값에서 같은 값이 없는 경우 NULL 값으로 채운다.

ㄴRIGHT OUTER JOIN - LEFT OUTER JOIN의 반대

ㄴFULL OUTER JOIN - 조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN하여 결과를 생성한다. 중복 데이터는 삭제한다.

CROSS JOIN - 양쪽 집합의 M * N 건의 데이터 조합이 발생

  • 카티시안 곱(Cartesian product) - 발생 가능한 모든 경우의 수의 곱이 출력, M(테이블1의 행) * N(테이블2의 행)

        ㄴ조인조건을 생략한 경우거나, 조인조건이 부적합할 경우 발생

 

OUTER JOIN의 차이점

 

<기억하기!!!>

FROM 게시판 A, 게시글 B
WHERE A.게시판ID = B.게시판ID(+)

AND B.삭제여부(+) = 'N'
AND A.사용여부 = 'Y'

위의 (+)의 의미는 ORACLE 에서의 (+)의 반대쪽을 향한 OUTER JOIN 표현이다

즉 이것을 풀어쓰게 되면

FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND B.삭제여부 = 'N')
WHERE A.사용여부 = 'Y'

으로 표현할 수 있다

 

94페이지 79번 문제

카페에서 왜이런지 찾아봤으나 이해가 되지 않는다! = 그냥 값이 다르게 나온다고 외운다!

 

START WITH절은 계층구조의 시작점을 지정하는 구문이다.

ORDER SIBLINGS BY절은 형제 노드 사이에서 정렬을 지정하는 구문이다.

순방향전개란 부모 노드로부터 자식 노드 방향으로 전개하는 것을 의미한다.

루트 노드의 LEVEL값은 1이다.