자격증/SQLD

[SQLD] 강의 14~16. WHERE절, GROUP BY절, JOIN

phyho 2025. 2. 6. 21:52

 

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