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이 반환된다.SELECT DECODE(grade, 'A', '우수', 'B', '양호', 'C', '보통', 'F', '미흡', '정보 없음') AS 결과
FROM 학생;
grade 열의 값에 따라 각각 '우수', '양호', '보통', '미흡' 또는 '정보 없음'으로 변환.SELECT 이름, DECODE(성별, 'M', '남성', 'F', '여성', '성별 미상') AS 성별_표기
FROM 직원;
성별 열의 값에 따라 '남성', '여성' 또는 '성별 미상'으로 변환.CASE 문 대신 간단하게 조건을 처리할 수 있음.CASE 문보다 이해하기 어려울 수 있음.CASE 문을 사용해야 함).DECODE는 SQL에서 조건에 따라 값을 변환하는 함수로, 주로 Oracle에서 사용됨.DECODE (C2, 'A', C1, 'B', 1)
C2: 평가할 열 또는 표현식이다. 이 값이 조건 비교의 기준이 된다.'A': C2의 값이 이 값과 일치하는지를 확인하는 첫 번째 조건이다.C1: C2의 값이 'A'일 경우 반환되는 값이다. 즉, C2가 'A'일 때 C1의 값을 반환한다.'B': 두 번째 조건. C2의 값이 이 값과 일치하는지를 확인한다.1: C2가 'B'일 경우 반환되는 값이다. 즉, C2가 'B'일 때 1을 반환한다.C2의 값을 평가한다.C2가 'A'일 경우 C1의 값을 반환한다.C2가 'B'일 경우 1을 반환한다.C2가 'A'나 'B'가 아닐 경우, DECODE는 기본적으로 NULL을 반환한다. 만약 NULL 대신 다른 기본값을 반환하고 싶다면, 마지막 인자로 기본값을 지정할 수 있다.GROUP BY는 SQL 쿼리에서 집계 함수와 함께 사용하여 데이터를 그룹화할 때 유용한 절차이다.
하지만 사용 시 주의해야 할 몇 가지 중요한 사항이 있다.
SELECT 문에 GROUP BY를 사용할 때, 집계 함수로 사용되지 않는 모든 열은 GROUP BY 절에 명시해야 한다.SELECT department, COUNT(*)
FROM employees
GROUP BY department; -- department는 GROUP BY에 포함되어야 함GROUP BY와 함께 집계 함수(SUM, AVG, COUNT, MIN, MAX 등)를 사용하여 결과를 요약한다.SELECT department, AVG(salary)
FROM employees
GROUP BY department;GROUP BY 절을 사용한 후에는 ORDER BY 절을 사용하여 결과를 정렬할 수 있다.SELECT department, COUNT(*)
FROM employees
GROUP BY department
ORDER BY COUNT(*) DESC; -- COUNT로 정렬GROUP BY는 NULL 값을 하나의 그룹으로 처리하므로, NULL이 포함된 열로 그룹화할 경우 결과에 영향을 미칠 수 있다.SELECT department, COUNT(*)
FROM employees
GROUP BY department;
-- NULL 값이 있는 department도 하나의 그룹으로 처리됨WHERE 절은 그룹화 이전의 행에 대해 필터링할 수 있지만, HAVING 절은 그룹화 후의 집계 결과를 필터링하는 데 사용된다.SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10; -- 그룹화된 결과에서 필터링GROUP BY를 사용할 경우 성능이 저하될 수 있다. 인덱스를 활용하거나 적절한 쿼리 최적화가 필요하다.GROUP BY를 사용할 때 데이터의 정합성에 유의해야 하며, 정확한 결과를 얻기 위해 그룹화 기준을 명확히 해야 한다.GROUP BY 사용 시에는 집계 함수와 비집계 열의 관계를 이해하고, HAVING과 ORDER BY의 용도를 구분하는 것이 중요하다. ORDER BY 절은 동순위(즉, 같은 값을 가진 행)에도 영향을 미친다.
기본적으로 ORDER BY는 지정된 열의 값에 따라 결과를 정렬하고, 동일한 값을 가진 행이 있을 경우 그 행들은 원래의 데이터 순서에 따라 나타난다.그러나 동순위에 대한 정렬을 더 세분화하고 싶다면 추가적인 열을 이용하여 정렬 기준을 설정할 수 있다.
기본 정렬
salary를 기준으로 오름차순 정렬한다고 가정했을 때, 동일한 급여를 가진 직원들이 있을 경우, 그 직원들은 원래의 데이터 순서대로 표시된다.SELECT name, salary
FROM employees
ORDER BY salary;
결과:
| name | salary |
|---|---|
| Alice | 3000 |
| Bob | 3000 |
| Charlie | 4000 |
다중 기준 정렬
salary와 name을 기준으로 정렬하면, 동일한 급여를 가진 직원들이 이름 순서에 따라 정렬된다.SELECT name, salary
FROM employees
ORDER BY salary, name; -- salary를 기준으로 정렬한 후, name으로 정렬
결과:
| name | salary |
|---|---|
| Alice | 3000 |
| Bob | 3000 |
| Charlie | 4000 |
ORDER BY 절은 기본적으로 동순위를 가진 행들을 원래의 순서대로 표시하지만, 추가적인 열을 이용하여 정렬 기준을 세분화할 수 있다.
동순위를 처리하고자 할 때는 적절한 정렬 기준을 설정하여 결과의 일관성을 유지하는 것이 중요하다.
다만
ORDER BY 절을 실행할 때 각 정렬 기준이 순차적으로 적용되다가 만약 두 번째 기준까지 정렬이 완료되어 동순위가 없다면, 세 번째 기준은 적용되지 않는다.
예를 들어, 첫 번째와 두 번째 정렬 기준만으로 모든 데이터가 고유하게 정렬된다면, 세 번째 기준은 무시되는데, 이는 효율성에 기여한다.
SELECT SUM(B.주문금액) / COUNT(DISTINCT A.고객번호) AS R1
FROM 고객 A, 주문 B
WHERE B.고객번호(+) = A.고객번호
AND B.주문금액(+) > 10000;
SUM(B.주문금액) / COUNT(DISTINCT A.고객번호) AS R1:
R1이라는 컬럼 이름으로 반환한다.FROM 고객 A, 주문 B:
고객 테이블을 A로, 주문 테이블을 B로 각각 별칭 지정하여 조인하고 있다.WHERE B.고객번호(+) = A.고객번호:
B.고객번호(+)는 B 테이블에 있는 값과 A 테이블의 고객번호 값을 LEFT OUTER JOIN 방식으로 조인하는 것을 의미한다.A에 포함된 모든 고객을 대상으로 하되, B 테이블에 없는 고객도 포함되게 한다.AND B.주문금액(+) > 10000:
B.주문금액이 10,000 이상인 행을 필터링한다. + 기호가 붙어있어, B 테이블에 주문금액이 없는 고객(주문 내역이 없는 고객)도 포함되도록 되어 있다.OUTER JOIN과 INNER JOIN의 차이INNER JOIN:
고객 테이블과 주문 테이블에서 같은 고객번호를 가진 행들만 반환.OUTER JOIN:
(+) 기호를 통해 OUTER JOIN을 지정할 수 있으며, 이 쿼리에서 B.고객번호(+)는 A 테이블의 모든 고객을 대상으로 하되, B에 고객번호가 일치하지 않더라도 결과에 포함되도록 한다.| JOIN 유형 | 설명 |
|---|---|
| LEFT OUTER JOIN | 왼쪽 테이블(A)의 모든 행 포함 |
| RIGHT OUTER JOIN | 오른쪽 테이블(B)의 모든 행 포함 |
| FULL OUTER JOIN | 양쪽 테이블의 모든 행 포함 |
(+) 기호의 의미Oracle SQL의 구문으로, OUTER JOIN을 지정할 때 사용하는 기호이다. WHERE 절의 조건에서 이 기호가 있는 쪽이 옵션 테이블이 되어, 값이 없어도 해당 행이 결과에 포함된다.
OUTER JOIN을 지정하는 구문으로, 필수 행이 아닌 선택 행으로 포함.NATURAL JOIN은 SQL에서 두 테이블 간에 동일한 이름의 모든 열을 자동으로 기준 삼아 조인하는 방식이다.
즉, 두 테이블에 이름이 같은 열이 있을 때, 자동으로 해당 열을 기준으로 조인 조건이 설정된다.
일반적으로는 INNER JOIN으로 동작하며, 두 테이블에서 공통된 열의 값이 일치하는 행만 반환된다.
NATURAL JOIN 특징INNER JOIN 결과와 유사하며, 공통된 값이 있는 행들만 반환된다. 예를 들어, employees와 departments 테이블이 있고, 두 테이블에 공통 열인 department_id가 있다고 하자.
SELECT *
FROM employees
NATURAL JOIN departments;
이 경우, NATURAL JOIN은 자동으로 department_id를 기준으로 INNER JOIN을 수행한다. 결과는 department_id가 일치하는 행만 포함되며, department_id는 한 번만 출력된다.
NATURAL JOIN은 실패하거나 에러를 발생시킬 수 있다.JOIN 사용이 더 안전하다.NATURAL JOIN은 간단한 조인 작업에서 유용한 것은 사실이나, 조인 기준을 명확히 지정해야 할 때는 ON 또는 USING 절을 활용하는 것이 좋다.
ON과USING
1.ON절
- 특정 열을 기준으로 조인 조건을 지정할 때 사용.
- 두 테이블의 열 이름이 다를 때도 사용할 수 있다.
- 주로
INNER JOIN,LEFT JOIN,RIGHT JOIN등의 조인에서 사용되며, 복잡한 조건을 추가할 수 있다.
예제:
SELECT *
FROM employees e
JOIN departments d
ON e.department_id = d.dept_id;
여기서는
employees의department_id와departments의dept_id가 일치하는 행을 기준으로 조인한다. 두 테이블의 열 이름이 달라도 사용할 수 있는 것이 특징이다.
USING절
- 두 테이블에 동일한 이름의 열이 있는 경우에만 사용할 수 있다.
- 조인된 결과에서는
USING으로 지정된 열이 한 번만 나타난다.- 사용이 간편하지만, 열 이름이 동일해야 한다는 제한이 있다.
예제:
SELECT *
FROM employees
JOIN departments
USING (department_id);
이 경우
employees와departments모두에 있는department_id열을 기준으로 조인한다. 결과에서department_id는 한 번만 나타난다.차이 요약
절 특징 예제 ON열 이름이 달라도 특정 조건으로 조인 가능, 복잡한 조건도 추가 가능 ON e.department_id = d.dept_idUSING동일한 열 이름이 있는 경우만 사용 가능, 조인 후 해당 열이 한 번만 출력 USING (department_id)
USING은 열 이름이 같고 단순한 조인 조건에 적합하며,ON절은 보다 유연하고 복잡한 조건이 필요한 경우에 적합하다.
주의할 것은SELECT A.C1, B.C3 FROM T1 A JOIN T2 B USING (C1);위 경우처럼 USING 절에 지정한 칼럼을 ALIAS 등으로 한정할 수는 없다.
따라서 위의 SQL은 에러가 발생한다.