[SQLD] 강의 14~16. WHERE절, GROUP BY절, JOIN
3.4 WHERE절
WHERE절
- 특정 조건을 만족하는 행만을 대상으로 연산을 수행.
- SELECT, UPDATE, DELETE에 사용 가능하나 INSERT에는 사용 불가.
- FROM절을 먼저 수행하므로 FROM절에서 정의한 테이블에 대한 별명(Alias)은 사용할 수 있으나,
SELECT절에서 정의한 칼럼에 대한 별명은 사용할 수 없다.
SELECT 컬럼1 [[ , 컬럼2] ... ] FROM 테이블1 [[ , 테이블2] ... ] WHERE 조건식;
SELECT * FROM EMP WHERE DEPTNO = 30 ;
=> EMP 테이블에서 FROM
=> DEPTNO가 30인 WHERE
=> 모든 행을 조회 SELECT
UPDATE EMP SET JOB = 'SALESMAN' WHERE DEPTNO = 30 ;
=> DEPTNO가 30인 행에 대해서 JOB 컬럼의 값을 'SALESMAN'으로 변경한다.
DELETE FROM EMP WHERE COMM IS NULL ;
=> COMM 컬럼의 값이 Null인 행을 삭제한다.
- WHERE 절에서 NULL과의 동등/부정 비교
WHERE절에서의 NULL과의 동등/부정 비교는 IS NULL, IS NOT NULL만 사용 가능.
(컬럼 = NULL, 컬럼 != NULL 등 비교연산자를 이용한 조건식은 제대로 동작하지 않는다.)
무조건 false
3.5 GROUP BY절
- GROUP BY절
특정 값을 기준으로 데이터를 그룹핑할 때 사용.
SELECT DEPTNO, SUM(SAL) AS SALS FROM EMP GROUP BY DEPTNO;
=> EMP 테이블에서 FROM
=> DEPTNO로 그룹핑한 후 GROUP BY
=> DEPTNO별 SAL의 합계 조회 SELECT
- 집계함수
GROUP BY 절로 그룹핑한 후에는 해당 그룹에 대해 집계함수를 사용하여 개수, 합, 평균 등을 계산.
ex) SELECT 고객번호, SUM(주문금액) FROM 주문 GROUP BY 고객번호;
집계함수는 그룹을 대상으로 연산을 수행하므로,
GROUP BY절 없이 집계함수를 사용하면 전체 행을 하나의 그룹으로 간주하고 연산 수행.
- COUNT : 입력된 컬럼에서 값이 NULL인 행을 제외한 행의 개수를 반환.
- SUM : 입력된 컬럼의 합을 반환.
- AVG : 입력된 컬럼의 평균을 반환.
- MIN : 입력된 컬럼의 최솟값을 반환.
- MAX : 입력된 컬럼의 최댓값을 반환.
* COUNT(컬럼명) => 해당 컬럼이 NULL인경우 제외
* COUNT(*) => 특정컬럼 혹은 모든컬럼이 NULL인 경우도 포함
* 컬럼명 앞에 DISTINCT를 붙이면 컬럼값의 중복을 제거하므로,
집계함수의 인자로 입력되는 컬럼명에 DISTINCT를 사용하면 해당 그룹에서 첫 번째 행에 대해서만 연산을 수행.
- HAVING절
GROUP BY 연산이 끝난 결과에 대해서 HAVING절의 조건을 만족하는 그룹만 추출.
SELECT ID FROM TBL GROUP BY ID HAVING COUNT(*) = 2;
=> TBL 테이블에서 FROM
=> ID 로 그룹핑한 후 GROUP BY
=> ID별로 그룹핑한 개수가 2인 WHERE
=> ID를 조회 SELECT
** WHERE절은 GROUP BY 보다 먼저 수행
** HAVING절은 GROUP BY 이후 수행, 집계함수 사용가능
GROUP BY 연산은 연산부하가 높은편
==> WHERE절로 필터링 후 GROUP BY 로 그룹핑 하는게 성능 향상.
3.7 조인 (JOIN) _ 테이블병합
- EQUI / Non EQUI
- INNER / OUTER / NATURAL / CROSS
* JOIN
두 개의 테이블을 하나로 병합하는 연산.
* EQUI JOIN
- Equal(=), 즉 등식을 조건으로 사용할 때 발생하는 조인.
- 컬럼 값이 정확하게 일치할 때에 성립하는 것으로 WHERE절의 조건이 등식인 경우 발생.
* Non EQUI JOIN
- WHERE절의 조건이 등식이 아닌 부등식(BETWEEN, >, >=, <=)을 사용해 범위를 나타낸 조건일 떄 발생하는 조인.
* 표준조인 / 일반조인
1) INNER JOIN
교집합의 개념으로 기준이 되는 키에 따른 컬럼값이 존재하는 것만 병합.
컬럼구성(스키마)이 다른 두 테이블
SELECT A1.ACTOR_NO ACT_NO1, A2.ACTOR_NO ACT_NO2, A2.MOVIE_NO, A1.NAME, A1.GENDER
FROM ACTOR A1 INNER JOIN APPR A2 ON A1.ACTOR_NO = A2.ACTOR_NO ;
* UNION : 합집합, 스키마가 동일한 두 테이블 병합.
2) OUTER JOIN
합집합의 개념으로, 기준이 되는 키에 따른 컬럼값이 존재하지 않더라도 모든 튜플을 병합.
- LEFT OUTER JOIN : 왼쪽 테이블의 모든 행을 포함시키면서 조인.
- RIGHT OUTER JOIN : 오른쪽 테이블의 모든 행을 포함시키면서 조인.
- FULL OUTER JOIN : 왼쪽 테이블의 모든 행과, 오른쪽 테이블의 모든 행을 포함하는 조인.
SELECT A1.ACTOR_NO ACT_NO1, A2.ACTOR_NO ACT_NO2, A2.MOVIE_NO, A1.NAME, A1.GENDER
FROM ACTOR A1 LEFT OUTER JOIN APPR A2 ON A1.ACTOR_NO = A2.ACTOR_NO ;
* Oracle 문법
SELECT A1.ACTOR_NO ACT_NO1, A2.ACTOR_NO ACT_NO2, A2.MOVIE_NO, A1.NAME, A1.GENDER
FROM ACTOR A1, APPR A2 WHERE A1.ACTOR_NO = A2.ACTOR_NO(+);
3) NATURAL JOIN
조인의 대상이 되는 두 테이블에서 같은 이름의 컬럼에 대해서는 동일한 컬럼값을 가지는 행만 병합.
SELECT * FROM ACTOR NATURAL JOIN APPR;
=> ON 절이 필요없음, 비교 기준이 되는 키가 이미 정해져있음.
4) CROSS JOIN
왼쪽 테이블의 각 행에 대한 오른쪽 테이블 모든 행의 대응을 조합하여 결과를 출력.
왼쪽 테이블이 M행이고 오른쪽 테이블이 N행이면 CROSS JOIN의 결과는 M x N 행.
SELECT * FROM T1, T2 => 카테시안 곱(Cartesian Product).
SELECT S1.NAME, C1.NAME FROM STUDENT S1, CLUB C1; (일반문법)
SELECT S1.NAME, C1.NAME FROM STUDENT S1 CROSS JOIN CLUB C1; (표준문법)
https://www.youtube.com/watch?v=qexvDBcvXNs&list=PLDI0745yTBjXFuIFYqq3vzcQYuVyajFpC&index=14
https://www.youtube.com/watch?v=eNR5t7UXLlU&list=PLDI0745yTBjXFuIFYqq3vzcQYuVyajFpC&index=15
https://www.youtube.com/watch?v=y-L9EJx4Hck&list=PLDI0745yTBjXFuIFYqq3vzcQYuVyajFpC&index=16