SQLD: SQL 기본(2)

SeongGyun Hong·2024년 10월 29일

SQL

목록 보기
5/51
post-thumbnail

1. DECODE

DECODE는 SQL에서 조건에 따라 값을 변환할 수 있도록 도와주는 함수이다. Oracle 데이터베이스에서 주로 사용되며, 특정 조건을 평가하여 그 결과에 따라 다른 값을 반환한다.
DECODE는 복잡한 조건문을 간단하게 표현할 수 있는 장점이 있다.

기본 문법

DECODE(expression, search_1, result_1, [search_2, result_2, ...], [default])
  • expression: 평가할 표현식.
  • search_n: 찾을 값. 이 값은 expression과 비교된다.
  • result_n: search_n과 일치할 경우 반환될 값.
  • default (선택사항): search_n 값이 모두 일치하지 않을 경우 반환될 값.

작동 방식

  • DECODE 함수는 expression의 값을 순차적으로 search_n 값과 비교한다.
  • 일치하는 값이 있으면 해당하는 result_n 값을 반환하고, 일치하는 값이 없으면 default 값을 반환한다.
  • default 값은 생략할 수 있으며, 생략 시 일치하는 값이 없을 경우 NULL이 반환된다.

예시

  1. 기본 사용법
SELECT DECODE(grade, 'A', '우수', 'B', '양호', 'C', '보통', 'F', '미흡', '정보 없음') AS 결과
FROM 학생;
  • 설명: grade 열의 값에 따라 각각 '우수', '양호', '보통', '미흡' 또는 '정보 없음'으로 변환.
  1. 조건문에서 사용
SELECT 이름, DECODE(성별, 'M', '남성', 'F', '여성', '성별 미상') AS 성별_표기
FROM 직원;
  • 설명: 성별 열의 값에 따라 '남성', '여성' 또는 '성별 미상'으로 변환.

장점

  • 복잡한 CASE 문 대신 간단하게 조건을 처리할 수 있음.
  • 가독성이 높고, SQL 문이 간결해짐.

단점

  • 사용자의 친숙도에 따라 CASE 문보다 이해하기 어려울 수 있음.
  • SQL 표준이 아니므로 모든 데이터베이스 시스템에서 사용할 수 있는 것은 아님 (예: MySQL에서는 CASE 문을 사용해야 함).

요약

  • DECODE는 SQL에서 조건에 따라 값을 변환하는 함수로, 주로 Oracle에서 사용됨.
  • 특정 표현식에 대해 다양한 조건을 간단히 처리할 수 있도록 도와줌.
  • 적절히 사용하면 SQL 쿼리를 간결하게 유지할 수 있는 장점이 있음.

문제 사용 예

DECODE (C2, 'A', C1, 'B', 1)

구성 요소 설명

  • C2: 평가할 열 또는 표현식이다. 이 값이 조건 비교의 기준이 된다.
  • 'A': C2의 값이 이 값과 일치하는지를 확인하는 첫 번째 조건이다.
  • C1: C2의 값이 'A'일 경우 반환되는 값이다. 즉, C2'A'일 때 C1의 값을 반환한다.
  • 'B': 두 번째 조건. C2의 값이 이 값과 일치하는지를 확인한다.
  • 1: C2'B'일 경우 반환되는 값이다. 즉, C2'B'일 때 1을 반환한다.

작동 방식

  1. C2의 값을 평가한다.
  2. C2'A'일 경우 C1의 값을 반환한다.
  3. C2'B'일 경우 1을 반환한다.
  4. C2'A''B'가 아닐 경우, DECODE는 기본적으로 NULL을 반환한다. 만약 NULL 대신 다른 기본값을 반환하고 싶다면, 마지막 인자로 기본값을 지정할 수 있다.

2. Group BY 쓸 때 주의할 점

GROUP BY는 SQL 쿼리에서 집계 함수와 함께 사용하여 데이터를 그룹화할 때 유용한 절차이다.
하지만 사용 시 주의해야 할 몇 가지 중요한 사항이 있다.

1. 모든 비집계 열 포함

  • SELECT 문에 GROUP BY를 사용할 때, 집계 함수로 사용되지 않는 모든 열은 GROUP BY 절에 명시해야 한다.
  • 예시:
    SELECT department, COUNT(*) 
    FROM employees 
    GROUP BY department;  -- department는 GROUP BY에 포함되어야 함

2. 집계 함수 사용

  • GROUP BY와 함께 집계 함수(SUM, AVG, COUNT, MIN, MAX 등)를 사용하여 결과를 요약한다.
  • 집계 함수를 사용할 경우, 그룹화된 결과에 따라 집계된 값이 반환된다.
  • 예시:
    SELECT department, AVG(salary) 
    FROM employees 
    GROUP BY department;

3. 정렬(ORDER BY)

  • GROUP BY 절을 사용한 후에는 ORDER BY 절을 사용하여 결과를 정렬할 수 있다.
  • 예시:
    SELECT department, COUNT(*) 
    FROM employees 
    GROUP BY department 
    ORDER BY COUNT(*) DESC;  -- COUNT로 정렬

4. NULL 값 처리

  • GROUP BYNULL 값을 하나의 그룹으로 처리하므로, NULL이 포함된 열로 그룹화할 경우 결과에 영향을 미칠 수 있다.
  • 예시:
    SELECT department, COUNT(*) 
    FROM employees 
    GROUP BY department; 
    -- NULL 값이 있는 department도 하나의 그룹으로 처리됨

5. HAVING 절 사용

  • WHERE 절은 그룹화 이전의 행에 대해 필터링할 수 있지만, HAVING 절은 그룹화 후의 집계 결과를 필터링하는 데 사용된다.
  • 예시:
    SELECT department, COUNT(*) 
    FROM employees 
    GROUP BY department 
    HAVING COUNT(*) > 10;  -- 그룹화된 결과에서 필터링

6. 성능 고려

  • 대량의 데이터에 대해 GROUP BY를 사용할 경우 성능이 저하될 수 있다. 인덱스를 활용하거나 적절한 쿼리 최적화가 필요하다.

7. 데이터 정합성

  • GROUP BY를 사용할 때 데이터의 정합성에 유의해야 하며, 정확한 결과를 얻기 위해 그룹화 기준을 명확히 해야 한다.

요약

  • GROUP BY 사용 시에는 집계 함수와 비집계 열의 관계를 이해하고, HAVINGORDER BY의 용도를 구분하는 것이 중요하다.
  • NULL 값 처리와 성능, 데이터 정합성도 항상 염두에 두어야 한다.

3. ORDER BY 절에서 동순위 처리

ORDER BY 절은 동순위(즉, 같은 값을 가진 행)에도 영향을 미친다.
기본적으로 ORDER BY는 지정된 열의 값에 따라 결과를 정렬하고, 동일한 값을 가진 행이 있을 경우 그 행들은 원래의 데이터 순서에 따라 나타난다.그러나 동순위에 대한 정렬을 더 세분화하고 싶다면 추가적인 열을 이용하여 정렬 기준을 설정할 수 있다.

동순위 처리 예시

  1. 기본 정렬

    • 예를 들어, salary를 기준으로 오름차순 정렬한다고 가정했을 때, 동일한 급여를 가진 직원들이 있을 경우, 그 직원들은 원래의 데이터 순서대로 표시된다.
    SELECT name, salary 
    FROM employees 
    ORDER BY salary;
    • 결과:

      namesalary
      Alice3000
      Bob3000
      Charlie4000
  1. 다중 기준 정렬

    • 동순위에 대한 추가적인 정렬을 원할 경우, 다른 열을 추가하여 정렬 기준을 명확히 할 수 있다. 예를 들어, salaryname을 기준으로 정렬하면, 동일한 급여를 가진 직원들이 이름 순서에 따라 정렬된다.
    SELECT name, salary 
    FROM employees 
    ORDER BY salary, name;  -- salary를 기준으로 정렬한 후, name으로 정렬
    • 결과:

      namesalary
      Alice3000
      Bob3000
      Charlie4000

요약

  • ORDER BY 절은 기본적으로 동순위를 가진 행들을 원래의 순서대로 표시하지만, 추가적인 열을 이용하여 정렬 기준을 세분화할 수 있다.

  • 동순위를 처리하고자 할 때는 적절한 정렬 기준을 설정하여 결과의 일관성을 유지하는 것이 중요하다.

  • 다만
    ORDER BY 절을 실행할 때 각 정렬 기준이 순차적으로 적용되다가 만약 두 번째 기준까지 정렬이 완료되어 동순위가 없다면, 세 번째 기준은 적용되지 않는다.
    예를 들어, 첫 번째와 두 번째 정렬 기준만으로 모든 데이터가 고유하게 정렬된다면, 세 번째 기준은 무시되는데, 이는 효율성에 기여한다.

4. INNER JOIN / OUTER JOIN

쿼리 해석

SELECT SUM(B.주문금액) / COUNT(DISTINCT A.고객번호) AS R1
FROM 고객 A, 주문 B
WHERE B.고객번호(+) = A.고객번호
AND B.주문금액(+) > 10000;
  1. SUM(B.주문금액) / COUNT(DISTINCT A.고객번호) AS R1:

    • 고객별로 10,000 이상의 주문금액을 더한 후, 이를 고객 수로 나눈 결과를 R1이라는 컬럼 이름으로 반환한다.
  2. FROM 고객 A, 주문 B:

    • 고객 테이블을 A로, 주문 테이블을 B로 각각 별칭 지정하여 조인하고 있다.
  3. WHERE B.고객번호(+) = A.고객번호:

    • 이 조건은 OUTER JOIN을 의미하며, Oracle SQL에서 B.고객번호(+)B 테이블에 있는 값과 A 테이블의 고객번호 값을 LEFT OUTER JOIN 방식으로 조인하는 것을 의미한다.
    • A에 포함된 모든 고객을 대상으로 하되, B 테이블에 없는 고객도 포함되게 한다.
  4. AND B.주문금액(+) > 10000:

    • B.주문금액이 10,000 이상인 행을 필터링한다.
    • 이 필터 조건에 + 기호가 붙어있어, B 테이블에 주문금액이 없는 고객(주문 내역이 없는 고객)도 포함되도록 되어 있다.

OUTER JOININNER JOIN의 차이

  1. INNER JOIN:

    • 양쪽 테이블에 일치하는 값이 있는 행들만 반환하는 조인.
    • 예를 들어 고객 테이블과 주문 테이블에서 같은 고객번호를 가진 행들만 반환.
  2. OUTER JOIN:

    • 일치하는 값이 없어도 왼쪽 테이블 또는 오른쪽 테이블에 있는 행들을 모두 포함하는 조인 방식.
    • Oracle SQL에서 (+) 기호를 통해 OUTER JOIN을 지정할 수 있으며, 이 쿼리에서 B.고객번호(+)A 테이블의 모든 고객을 대상으로 하되, B에 고객번호가 일치하지 않더라도 결과에 포함되도록 한다.
    JOIN 유형설명
    LEFT OUTER JOIN왼쪽 테이블(A)의 모든 행 포함
    RIGHT OUTER JOIN오른쪽 테이블(B)의 모든 행 포함
    FULL OUTER JOIN양쪽 테이블의 모든 행 포함

(+) 기호의 의미

Oracle SQL의 구문으로, OUTER JOIN을 지정할 때 사용하는 기호이다. WHERE 절의 조건에서 이 기호가 있는 쪽이 옵션 테이블이 되어, 값이 없어도 해당 행이 결과에 포함된다.

요약

  • 쿼리 목적: 고객별 10,000 이상의 주문금액 합을 고객 수로 나누어 반환.
  • OUTER JOIN: 없는 값을 가진 행도 포함시켜, 모든 고객을 대상으로 하되 주문금액이 없는 고객도 결과에 포함.
  • (+) 기호: Oracle SQL에서 OUTER JOIN을 지정하는 구문으로, 필수 행이 아닌 선택 행으로 포함.

5. NATURAL JOIN

NATURAL JOIN은 SQL에서 두 테이블 간에 동일한 이름의 모든 열을 자동으로 기준 삼아 조인하는 방식이다.
즉, 두 테이블에 이름이 같은 열이 있을 때, 자동으로 해당 열을 기준으로 조인 조건이 설정된다.
일반적으로는 INNER JOIN으로 동작하며, 두 테이블에서 공통된 열의 값이 일치하는 행만 반환된다.

NATURAL JOIN 특징

  • 자동 조건 설정: 조인 조건을 명시하지 않아도, 테이블 간의 동일한 이름을 가진 열을 기준으로 조인한다.
  • 조인 조건 생략: 동일 열이 여러 개일 경우, 모든 동일 열이 조건으로 적용된다.
  • 일반적인 결과: INNER JOIN 결과와 유사하며, 공통된 값이 있는 행들만 반환된다.
  • 중복 열 제거: 두 테이블의 동일한 열이 결과에서 중복되지 않도록 제거된다.

예제

예를 들어, employeesdepartments 테이블이 있고, 두 테이블에 공통 열department_id가 있다고 하자.

SELECT * 
FROM employees 
NATURAL JOIN departments;

이 경우, NATURAL JOIN은 자동으로 department_id를 기준으로 INNER JOIN을 수행한다. 결과는 department_id가 일치하는 행만 포함되며, department_id는 한 번만 출력된다.

주의사항

  1. 공통 열이 없으면 오류: 두 테이블에 공통된 열이 없으면 NATURAL JOIN은 실패하거나 에러를 발생시킬 수 있다.
  2. 비의도적 조인 위험: 테이블에 동일 이름의 열이 많을 경우, 의도하지 않은 열이 조인 기준으로 사용될 수 있다. 이런 경우 명시적인 JOIN 사용이 더 안전하다.
  3. 테이블 구조 변경: 테이블의 구조가 변경되어 열 이름이 달라지거나 추가될 경우, 조인 기준이 바뀔 수 있어 유지보수에 어려움이 생길 수 있다.
  • 다만
    NATURAL JOIN은 간단한 조인 작업에서 유용한 것은 사실이나, 조인 기준을 명확히 지정해야 할 때는 ON 또는 USING 절을 활용하는 것이 좋다.

ONUSING
1. ON

  • 특정 열을 기준으로 조인 조건을 지정할 때 사용.
  • 두 테이블의 열 이름이 다를 때도 사용할 수 있다.
  • 주로 INNER JOIN, LEFT JOIN, RIGHT JOIN 등의 조인에서 사용되며, 복잡한 조건을 추가할 수 있다.

예제:

SELECT * 
FROM employees e 
JOIN departments d 
ON e.department_id = d.dept_id;

여기서는 employeesdepartment_iddepartmentsdept_id가 일치하는 행을 기준으로 조인한다. 두 테이블의 열 이름이 달라도 사용할 수 있는 것이 특징이다.

  1. USING
  • 두 테이블에 동일한 이름의 열이 있는 경우에만 사용할 수 있다.
  • 조인된 결과에서는 USING으로 지정된 열이 한 번만 나타난다.
  • 사용이 간편하지만, 열 이름이 동일해야 한다는 제한이 있다.

예제:

SELECT * 
FROM employees 
JOIN departments 
USING (department_id);

이 경우 employeesdepartments 모두에 있는 department_id 열을 기준으로 조인한다. 결과에서 department_id는 한 번만 나타난다.

차이 요약

특징예제
ON열 이름이 달라도 특정 조건으로 조인 가능, 복잡한 조건도 추가 가능ON e.department_id = d.dept_id
USING동일한 열 이름이 있는 경우만 사용 가능, 조인 후 해당 열이 한 번만 출력USING (department_id)

USING은 열 이름이 같고 단순한 조인 조건에 적합하며, ON 절은 보다 유연하고 복잡한 조건이 필요한 경우에 적합하다.
주의할 것은

SELECT A.C1, B.C3
FROM T1 A JOIN T2 B
USING (C1);

위 경우처럼 USING 절에 지정한 칼럼을 ALIAS 등으로 한정할 수는 없다.
따라서 위의 SQL은 에러가 발생한다.

profile
헤매는 만큼 자기 땅이다.

0개의 댓글