▶ 한줄평 : 서브쿼리가 어느상황에서 쓰이는지를 알았고 어려운 내용임에도 민경태 강사님께서 차근차근 설명해주셔서 이해가 잘되었다.
<복습>
-> INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN
-> ON 조인조건(1:M 관계 일치하는지?)
(EX) 부서 2개, 사원 4명 -> 8개 결과 (데이터가 많아짐) - 입출력 테스트 용도로 쓰임
내부조인 : 두 칼럼에 공통적으로 존재하는 값만 결함됨
-> 3,4번 조회대상이 아님
★외부조인 : 일치 여부와 상관없이 한 테이블의 내용은 모두 포함됨(꼭 기억!)
//
ANSI 왼쪽의 값이(3,4) (EMPLOYEE에는 없지만) 도 조회대상에 시키자
(왼쪽의 값은 항상 포함을 시켜라)
RIGHT OUTER JOIN : 오른쪽 테이블을 모두 포함
셀프조인 : 하나의 테이블에 하는 조인방식, 각각 다른 별명
(주인공이 누구인지 생각해서 join방향 설정)
EMP 사원 번호
MGR 상사 번호
(EX) 이은영 - 상사
상사번호도 사원번호 안에서 데이터 가져올 수 있다
1:M(일:다) 관계
EMPLOYEE_TBL A(좌측 테이블) : 사원정보 (EMPLOYEE_NO사용하는 사원 TABLE)
EMPLOYEE_TBL B(우측 테이블) : 상사정보
연습문제 풀이 1~7 : 조인, 8~10 : 셀프 조인
- 모든 사원들의 EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER의 FIRST_NAME을 조회하시오. (SELF JOIN)
-> MANAGER_ID 조회가능(NAME아니라 ID는 쉽게 해결가능)
-> 사원테이블의 매니저번호 = 상사테이블의 사원번호 일치하는 정보를 조인하는 것
inner join 사용시)
kim 의 사원 1 없음
lee ,park 일치하는 정보 있으니까 조회 됨
-> inner join시) 사원 2명 조인됨 (kim은 빠짐)
-> 값이 일치 하지 않으니까
(kim 상사 없으면 null이라고 표시해서 상사가 없구나 표시하기 위해서)
--> 결론, 외부조인함
1 : DRIVE 쓰면 좋음(상사테이블 = DRIVE TABLE)
포함시키고 싶은건
(원래는 누락되는데 -> 사원테이블 E 에있음 -> 오른쪽)
-> 외부조인 (STEVEN KING이 포함됨, 내부조인 : 빠짐)
오라클문법
서브쿼리
-제품번호 '1001'인 제품이 동일한 공장 : 정확히 어느 공장인지
-빨간색 : 서브쿼리
-파란색 : 메인쿼리
-해석순서: 파란색(서브쿼리 먼저) : 공장이름 나옴 -> 빨간색
-> 서브쿼리 먼저 처리
-결과가 N개 : 없을수도 있다 .
서브쿼리
-서브쿼리 들어갈 자리(파란색) (WHERE절 자리)
단일행 서브쿼리 결과 1개 -> =(등호) (메인쿼리와 )
다중행 서브쿼리 결과 2개 -> IN(메인쿼리와)
*ANY , OR 잘 안씀 - 대체품이 있어서
-> () 넣지 않아도 서브쿼리 먼저 함 (실행순서는 같음)
-> SELECT JOB_ID 답으로 내주니 ) WHERE JOB)ID로 내놔야 함
-> 서브쿼리 결과 NULL
PK라서 중복 X -> 단일행
부서테이블과 사원테이블이 서브쿼리의 형태로 ~
-> PK아니고 UNIQUE칼럼도 아님
-> 운좋게 중복이 없을 뿐이다
-> PK도 아니라서 중복을 가질 수 있는 아이
IT라는 가질 수 있는게 2개 이상있을 수 있다
IT 만족하는 데이터가 여러개 있을 수 있다
1 . 부서번호를 찾기
근무지에 따라서 부서번호 다름
부서 테이블 - LOCATION_IT 정보 있음
-> CITY UNIQUE 가 아니라서 2개 나올 수 있음
(EX) 광주 - 서울, 경기도 -2개
-> 결과가 두개 이상 나올 수 있음 : IN
-> 2번째 서브쿼리의 결과가 여러개 나올 수 있으니까
-> IN으로 바꾸기
-> SEATTLE 18명
-> 어떤 거든 상관없이 먼저 떠오르는 걸로 풀기!
-> 안됨
가장 먼저 입사 -> '작은값'(옛날값)
평균 연봉 이상을 받는 사원 조회하기
FROM 절의 서브쿼리(인라인 뷰)
뷰 : 쿼리문을 저장하고 있는것, 실행하면) 테이블이 나옴
-진짜 테이블 - 하드디스크에 데이터가 저장되어 있음
-가짜 테이블 - 쿼리문만 있음(SELECT만 있음 - SELECT실행시 테이블이 답으로 나옴)
(실행하면 테이블이라 테이블이라고 부르긴함)
FROM TABLE인데
TABLE 대신 VIEW
= FROM VIEW
= FROM SELECT
-> FROM 절에 포함된 뷰(인라인 뷰)
(EX) 웹툰 - 1PAGE
-> 작성일자 : '내림차순'으로 함
-> 목록 처리시) 가장 먼저 해야할 것 (날짜순으로)
*CRUD (게시판)(Create=Insert, Read(목록,상세페이지), Update, Delet) : (구현해야 하는 5가지 핵심 기술)
★ 목록 - 필수 기술 - SELECT로 만듦
★ 상세페이지 -SELECT로 만듦
삽입, 수정, 삭제
☆ 면접 : 게시판 CRUD는 할 줄 아는가?
-> 기타함수(행번호 붙이기 함수 : 정렬을 시키는 쿼리문법이 함께 사용됨)
1) 2) 가 서브 쿼리가 됨
2,3번 연봉이 같음
-> RANK로 바꾸기
-> 실행순서 안맞음
-> 서브쿼리로 조정해야함
-> 행번호 인식 시키기 위해서 FROM절로 뺌 (순서만 조정하면 됨)
(FROM절에서 먼저 인식하고 WHERE절에서 인식함)
(1) 정렬 시킨대로 번호
(2) 구간에 따라서 값 가지고 오기
SELECT 절의 서브쿼리
-> 조인 , 서브쿼리 가능
-> 부서명 :부서테이블에서 가지고 오는 SELECT를 넣음
-> MAIN 쿼리에도 DEPARTMENT_ID 있음
-> 비상관쿼리 : 메인쿼리, 서브쿼리하고 상관이 없음
-> 상관쿼리 : 메인 쿼리, 서브쿼리 관계 있음
-기술 , 유지 보수 관점에서도 위에 방법이 나음
-> 50번 번호 한번만 들어가서(위에는 두번 들어감)
-> 스칼라 서브 쿼리를 의도적으로 많이 쓸 필요는 없음(서브쿼리 중 성능떨어짐)
-> 조인으로 풀면 더 간단하게 풀 수 있음
-> FROM 절의 서브쿼리 제외하고 나머지는 원하면) 조인으로 바꿀 수 있음
★★FROM 절의 서브쿼리는 꼭 기억!
-공공기관 서비스 : 자바 많이 씀
-전자정부 프레임 워크 : 자바로 되어있음
-스타트업 : NODE.JS 등 씀
-확실하게 알때까지 한가지 기술만 공부하기!
WITH
1. 자주 사용하거나 복잡한 쿼리문을 WITH절의 코드 블록으로 등록시켜 놓을 수 있다.
2. WITH 절의 코드 블록은 임시로 저장되기 때문에 곧바로 사용해야한다.(성능의 향상 기대할 수 없음)
3. 쿼리문의 가독성이 좋아진다.(쿼리문 읽기가 편해진다)
SELECT EMPLOYEE_ID, HIRE_DATE
FROM (SELECT ROW_NUMBER() OVER(ORDER BY HIRE_DATE ASC) AS RN, EMPLOYEE_ID, HIRE_DATE FROM EMPLOYEES)
WHERE RN BETWEEN 1 AND 10;
-> MY_SUBQUERY 이름으로 블록을
-> WITH로 저장시키고
WITH
MY_SUBQUERY AS(
SELECT ROW_NUMBER() OVER(ORDER BY HIRE_DATE ASC) AS RN, EMPLOYEE_ID, HIRE_DATE
FROM EMPLOYEES
)
SELECT DEPARTMENT_ID, SUM(SALARY) AS TOTAL_SALARY
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
SELECT MY.DEPARTMENT_ID
, MY.TOTAL_SALARY
, D.DEPARTMENT_NAME
FROM DEPARTMENTS D INNER JOIN(SELECT DEPARTMENT_ID, SUM(SALARY) AS TOTAL_SALARY
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID) MY
ON D.DEPARTMENT_ID = MY.DEPARTMENT_ID;
-> EMPLOYEE TABLE만 있으면 ) 부서 이름은 안나오지만
부서별 연봉총액 구할 수 있음
-> DISTNICT 랑 같음
SELECT (하나의 테이블)
JOIN
D_ID
-> D_ID 이용한 JOIN
WITH MY_SUBQUERY AS(
SELECT DEPARTMENT_ID, SUM(SALARY) AS TOTAL_SALARY
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
)
SELECT MY.DEPARTMENT_ID
, D.DEPARTMENT_NAME
, MY.TOTAL_SALARY
FROM DEPARTMENTS D INNER JOIN MY_SUBQUERY MY
ON D.DEPARTMENT_ID = MY.DEPARTMENT_ID;
-> 덩어리로 봐서 가독성이 편해지는 경우 있음
-> 따로따로 보고 합치기