본문 바로가기

Database

SQL 기본(GROUP BY, HAVING, ORDER BY, JOIN)


GROUP BY, HAVING 절

1. GROUP BY

GROUP BY는 말 그대로 데이터를 그룹별로 묶을 수 있도록 해주는 절이다. GROUP BY 뒤에는 그루핑의 기준이 되는 컬럼이 오게 된다. 컬럼은 하나 이상이다.

 

2. 집계 함수

  • 데이터를 그룹별로 데이터를 도출할 수 있게 해준다.

3. HAVING

  • HAVING 절은 GROUP BY 절을 사용할 때 WHERE 절처럼 사용흐는 조건절이라고 생각하면 되는데 주로 데이터를 그루핑한 후 특정 그룹을 골라낼 때 사용한다.
  • SELECT문의 논리적 수행 순서 
    • SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY
  • HAVING 절은 논리적으로 GROUP BY 절 이후에 수행되기 때문에 그루핑 후에 가능한 집계 함수로 조건을 부여할 수 있다.
SELECT PRODUCT_CODE,
		COUNT(ORDER_CNT) AS ORDER_CNT
    FROM ORDER_PROCUT
    WHERE ORDER_DATE BETWEEN '20230701' AND '20230731'
    GROUP BY PRODUCT_CODE
    HAVING COUNT(ORDER_CNT) >= 1000;
  • WHERE 절을 사용해도 되는 조건까지 HAVING 절로 써버리면 성능상 불리할 수 있음. -> WHERE 절에서 필터링이 선행되어야 GROUP BY 할 데이터양이 줄어든다.
  • GROUP BY는 비교적 비용이 큰 작업이므로 수행전 데이터양을 줄여놓는것이 바람직하다.

ORDER BY 절

1. ORDER BY

  • ORDER BY 절은 SELECT 문에서 논리적으로 맨 마지막에 수행된다.
  • ORDER BY 절을 사용해 SELECT한 데이터를 정렬할 수 있으며 ORDER BY 절을 따로 명시하지 않으면 데이터는 임의의 순서대로 출력된다. ORDER BY 절 뒤에는 정렬의 기준이 되는 컬럼이 오게되는데 컬럼은 이상이다. 또한 ORDER BY절 뒤에 오는 컬럼에는 옵션이 붙을 수 있으며 종류는 다음과 같다.
    • ASC(Ascending) : 오름차순( 기본값 )
    • DESC(Descending) : 내림차순 

JOIN

1. JOIN이란?

  • 조인이란 각기 다른 테이블을 한번에 보여줄 때 쓰는 쿼리문이다. ( 실무에서 8할이 JOIN 사용 )

2. EQUI JOIN

  • EQUI JOIN은 Equal 조건으로 JOIN 하는것으로 가장 흔히 볼 수 있는 JOIN의 방식이다.

3. Non EQUI JOIN

  • Equal이 아닌 다른 조건(BETWEEN, >, >=, <, <=)으로 JOIN하는 방식이다.

4. 3개 이상 TABLE JOIN

  • 3개 이상의 테이블을 JOIN

5. OUTER JOIN

  • OUTER JOIN은 다른 JOIN과 다르게 JOIN 조건에 만족하지 않는 행들도 출력되는 형태이다.

  • LEFT OUTER JOIN의 경우 LEFT TABLE과 RIGHT TABLE의 데이터 중 JOIN에 성공한 데이터와 JOIN에 성공하지 못한 나머지 LEFT TABLE의 데이터가 함께 출력된다. Oracle에서는 모든 행이 출력되는 테이블의 반대편 테이블의 옆에 (+) 기호를  붙여 작성해주면 된다.

STANDARD JOIN

DBMS 벤더별 SQL 문법 차이로 인한 호환성 이슈를 방지하고자 만든 ANSI SQL로 Oracl, MySQL 등등 어느곳에서도 돌아가는 JOIN 쿼리이다. (STANDARD JOIN보다는 ANSI JOIN, 표준 조인 이라는 말이 많이 쓰임)

1. INNER JOIN

JOIN 조건에 충족하는 데이터만 출력되는 방식이다.

앞서 본 SQL과의 차이점은 JOIN 조건을 ON 절을 사용해서 작성해야 한다는 점이다.

SELECT ~~~ FROM ~~ INNER JOIN ~~ ON ~~

2. OUTER JOIN

JOIN 조건에 충족하는 데이터가 아니어도 출력될 수 있는 방식이다.

  • LEFT OUTER JOIN  , RIGHT OUTER JOIN

SQL에서 왼쪽(오른쪽)에 표기된 테이블의 데이터는 무조건 출력되는 JOIN이다. 오른쪽(왼쪽) 테이블에 JOIN되는 데이터가 있든지 말든지 일단 나는 출력되고 본다는 식이라고 이해하면 쉽다. 대신 오른쪽(왼쪽) 테이블에 JOIN되는 데이터가 없는 ROW들은 오른쪽(왼쪽 테이블 컬럼의 값이 NULL로 출력된다.

  • FULL OUTER JOIN

왼쪽, 오른쪽 테이블의 데이터가 모두 출력되는 방식으로 LEFT OUTER JOIN과 RIGHT OUTER JOIN의 합집합이라 생각하면 된다( 단, 중복값은 제거 )

  • NATURAL JOIN

A 테이블과 B 테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을 경우 JOIN되는 방식이다.

  • CROSS JOIN

A테이블과 B 테이블 사이에 JOIN 조건이 없는 경우 조합할 수 있는 모든 경우의 수를 출력하는 방식으로 다른말로 Cartesian Product라고 표현하기도 한다.