조건문⭐
DECODE
- SQL의 DECODE 함수는 프로그래밍 언어에서 if문과 비슷하다.
DECODE(A,B,'1',null) | A가 B일 경우 '1', 아닐 경우 null(생략가능) |
DECODE(A,B,'1','2') | A가 B일 경우 '1', 아닐 경우 '2' |
DECODE(A,B,'1',C,'2','3') | A가 B일 경우 '1', A가 C일 경우 '2', 둘 다 아닐 경우 '3' |
DECODE(A,B,DECODE(C,D,'1',null)) | A가 B일 경우, C가 D를 만족하면 '1', C가 D를 만족하지 않으면 null(생략가능) |
DECODE(A,B,DECODE(C,D,'1','2')) | A가 B일 경우, C가 D를 만족하면 '1', C가 D를 만족하지 않으면 '2' |
CASE ~ WHEN ~ THEN
CASE 조건 WHEN 결과1 THEN 출력1
[WHEN 결과2 THEN 출력2]
ELSE 출력3
END "컬럼명"
DECODE에 적용한 식을 CASE 함수에 적용해보자면..
case when A = 1 then 'a'
when A = 2 then 'b'
when A = 3 then 'c'
else 'd'
end
집계함수 ⭐ ⭐
- Count, min, max, sum ...
- NULL은 포함되지 않는다.
- ex) (1, null, 2, 3, null)의 데이터를 기준으로 결과는 다음과 같다.
Count() - 3
Sum() - 6
Avg() - 2
Min() - 1
Max() - 3
Group by
- 집약기능을 가지고 있다. ( 다수의 행을 하나로 합친다.)
- Group by 절에 온 컬럼만 select 절에 올 수 있다.
- SELECT 절에서 집계 함수를 제외한 칼럼을 GROUP BY절에 기술한다고 생각하면 된다.
select job, SUM(sal) -- 집계함수
from emp
where deptno IN (20,30)
group by job -- 그룹칼럼(selet의 job)
order by job; -- 정렬칼럼
Group by절에서 Having(조건절)
select job, SUM(sal) AS sum_sal
from emp
where deptno IN (20,30)
group by job having SUM(sal) > 5000;
- 급여(sal)의 합계가 5000보다 큰 직업(job)만 조회하는 예제이다.
- 집계 함수의 결과를 조건절에 사용하고 싶은 경우 HAVING 절을 사용하면 된다. HAVING 절에 일반 칼럼을 조건으로 부여할 수 있지만, 일반 칼럼은 WHERE절에서 조건을 부여하는 것이 좋다.
조건을 여러 개 부여하는 경우
select job, SUM(sal) AS sum_sal, AVG(sal) AS avg_sal
from emp
where deptno IN (20,30)
group by job
having SUM(sal) > 5000 AND AVG(sal) > 2000
- 급여(sal)의 합계가 5000보다 큰 직업(job), 평균 2000보다 큰 직업(job)만 조회하는 예제이다.
HAVING 절에서 AND또는 OR 연산자를 사용하여 여러 개의 조건을 부여할 수 있다.
JOIN ⭐ ⭐
1. Natual join
- 반드시 두 테이블 간의 동일한 이름, 타입을 가진 컬럼이 필요하다.
- 조인에 이용되는 컬럼은 명시하지 않아도 자동으로 조인에 사용된다.
- 동일한 이름을 갖는 컬럼이 있지만 데이터 타입이 다르면 에러가 발생한다.
- 조인하는 테이블 간의 동일 컬럼이 SELECT 절에 기술되도 테이블 이름을 생략해야 한다.
select department_id 부서, department_name 부서이름, location_id 지역번호, city 도시
from departments
natual join locations
where city = 'Seattle';
2. Using
- USING 절은 조인에 사용될 컬럼을 지정한다.
- NATURAL 절과 USING 절은 함께 사용할 수 없다.
- 조인에 이용되지 않은 동일 이름을 가진 컬럼은 컬럼명 앞에 테이블명을 기술한다.
- 조인 컬럼은 괄호로 묶어서 기술해야 한다.
- ALIAS, 접두사를 붙일 수 없다.
select department_id 부서번호, department_name 부서, location_id 지역번호, city 도시
from departments
join locations using (location_id);
- from a,b,c
: a와 b가 join되고, 그리고 c와 join된다.
서브쿼리 ⭐ ⭐ ⭐
- 하나의 SQL문에 포함되어 있는 또 다른 SQL문
- 주의사항
1. 서브쿼리를 괄호로 감싸서 사용한다.
2. 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능하다.
3. 서브쿼리에서는 ORDER BY를 사용하지 못한다.
- 서브쿼리가 사용 가능한 곳
select | 스칼라 서브쿼리 |
from | 인라인 뷰(메인 쿼리의 컬럼 사용 가능) |
where | 중첩 서브쿼리 |
group by | 사용 불가 |
having | 중첩 서브쿼리 |
order by | 스칼라 서브쿼리 |
in | 서브쿼리 출력값들 ord 조건 |
any/some | 서브쿼리 출력 값들 중 가장 작거나 큰 값과 비교 |
all | any/some과 반대 개념 |
exists | 서브쿼리 내 select 절엔 뭐가 나와도 상관 없다. Row가 있으면 true, 없으면 false |
'IT_STUDY > SQLD' 카테고리의 다른 글
[ SQLD ] DDL, DCL, DML (0) | 2024.03.04 |
---|---|
[ SQLD ] NULL, 정렬, 숫자함수, 문자함수, 날짜함수 (0) | 2024.03.01 |
[ SQLD ] ESCAPE / ROWNUM / TOP() (1) | 2024.02.10 |
[ SQLD ] SQL 연산 / Alias / CONCAT / IN / LIKE / NOT (0) | 2024.02.07 |
[ SQLD ] 데이터 모델과 성능 (2) (0) | 2024.02.05 |