- 함수를 왜 배워야하는가?
ex)
우리반 테이블에서 전공, 전공별 인원수를 출력하시오!
우리반 테이블에세 가장 나이가 어린 학생의 이름을 출력하시오!
메일 도메인, 메일 도메인별 건수를 출력하시오!
- 함수란 무엇인가?
- 함수의 종류 2가지?
1. 단일행 함수
- 문자
- 숫자
- 날짜
- 변환
- 일반
1) 문자 함수
(1) 대소문자 변환 함수
- lower : 소문자로 출력하는 함수
- upper : 대문자로 출력하는 함수
- initcap: 첫번째 철자는 대문자 나머지는 소문자로 출력하는 함수
(2) 문자 조작 함수
- concat : 두개의 컬럼의 값을 연결하는 함수
- substr : 특정 철자를 잘라내는 함수
- length : 철자의 길이를 출력하는 함수
- instr : 특정 철자의 위치를 출력하는 함수
- lpad : 왼쪽에 특정값을 채워넣는 함수
- rpad : 오른쪽에 특정값을 채워넣는 함수
- trim : 특정 철자나 값을 잘라내는 함수
- replace : 특정 철자로 변경하는 함수
2) 숫자 함수
- round : 반올림하는 함수
- trunc : 잘라내는 함수
- mod : 나눈 나머지값을 출력
3) 날짜 함수
- between month : 해당 기간 동안의 몇달이 있었는지 출력
- add-months: 기준 날짜에서 입력한 달 수 만큼 지난 날짜를 출력
- next-day: 기준 날짜에서 해당 요일이 오늘 날짜를 출력
- last-day: 기준 날짜에서 해당 달의 끝까지 몇일이 남았는지 출력
4)변환 함수 / data type 을 변환
(1) data type
- 숫자
- 문자
- 날짜
(2) 형변환 2가지 (하나의 데이터가 아니라 형식을 바꾼다고 생각해라)
1. 암시적 형변환 : 오라클이 알아서 형변환 수행
예시) select ename, sal
from emp
where sal = '3000'
숫자 문자
- 이는 원래 실행 되어서는 안된지만 오라클 내부적으로 data type을 자동 변환하여 실행된다.
- 오라클은 숫자를 문자보다 더 높은 우선 순위에 두기 때문에 문자를 숫자로 변환한다. (숫자>문자)
- BUT. 이런 식의 코드는 실행은 되지만 효율이 떨어져 수정해야 한다.
2. 명시적 형변환:
- to_char :문자로 형변환하는 함수
날짜 ---> 문자
숫자 ---> 문자
- to_number : 숫자로 형변환하는 함수
- to_date :날짜로 형변환하는 함수
5) 일반 함수
- NVL 함수: null 값이 숫자를 변화하여 출력하라
- NVL2
- decode 함수
- case 함수
2. 복수행 함수
- max
- min
- count
- avg
- sum
문제 92. 나이대가 20대인 학생들의 이름과 나이와 주소를 출력하는데, 나이가 높은 학생부터 출력하시오!
SQL> SELECT ename, age, address
FROM EMP2
WHERE age BETWEEN 20 AND 29
ORDER BY age DESC;
문제 93. 서울에서 살지 않는 학생들의 이름과 학원까지의 시간을 출력하는데 시간이 가장 오래 걸리는 학생부터 출력하시오!
SQL> SELECT ename, distance
FROM EMP2
WHERE address NOT LIKE '%서울%'
ORDER BY distance DESC;
문제 94. 이름에 EN 또는 IN이 포함되어져 있는 사원의 이름과 월급을 출력하시오!(EMP 테이블)
SQL> SELECT ename, sal
FROM EMP
WHERE ename LIKE '%EN%' OR
ename LIKE '%IN%';
*Regexp_substr 활용하여 더 간편하게 검색 가능
SQL> select ename, sal
from emp
where regexp_like(ename,'(EN|IN)');
- 이 쿼리에서 '|'는 또는을 의미하며 계속 추가할 수 있다.
- regexp_like 는 '%'(와일드 카드)를 쓸 필요가 없다.
* MS_SQL에서는 regexp를 사용할 수 없다.
문제 95. 이름, 월급을 출력하는데 월급을 암호화해서 출력하시오! 월급의 숫자 234를 각각 *로 출력하시오
SQL> SELECT ename,regexp_REPLACE(sal,'[2-4]','*')
FROM EMP;
* regexp/정규 표현식
* 이 경우 이런 코드도 가능하다.
SELECT ename,regexp_REPLACE(sal,'(2|3|4)','*')
FROM EMP;
만약 연속 된 숫자가 아니였다면, 이런 식으로 입력가능 할듯 하다.
* MS_SQL 에서는 replace에 정규표현식을 사용할 수 없어서 위와 같은 결과를 내려면 아래와 같이 중첩으로 사용해야 한다.
select ename,replace(replace(replace(sal,'2','*'),'3','*'),'4','*')
from emp ;
문제 96. 이름, 월급, 보너스(sal,*02) 를 출력하시오!
컬럼별칭을 사용해서 월급*0.2가 보너스로 컬럼명이 출력되게하시오!
(보너스가 일의 자리에서 반올림되게 하시오!)
SELECT ename, sal, ROUND (sal*0.2,-1) AS 보너스
FROM EMP;
*ROUND / 반올림 하는 keyword
TRUNC / 버림하는 ketword
예시) select round(756.57,1), trunc (756.57,1)
여기서 '.'은 기준으로 '0'이 된다.
뒤로 가면서 1,2, ...
앞으로 가면서 -1, -2, -3, 으로 된다.
Tip. dual 이란?
- dumy table 인데 select절의 결과 값을 보기 위한 가상의 테이블
(실제 테이블을 일력하면 같은 숫자가 대체 되어 나온다.)
주의! 별칭을 정해주기 전에 ROUND로 묶어준다.
* MS_SQL도 반올림과 버림을 할 수 있지만 Oracle과 차이가 있다.
- round는 소수점 몇 번째까지 지정해 줄 수 있지만 버림음 floor 함수를 사용해서 정수만 나타낸다.
예시 ) select round(756.57,1) ;
- 이 문장은 756.5 으로 결과가 나타남
select FLOOR(756.57 ,1) ;
- 이 문장은 뒤에 1 때문에 문자 오류가 발생하고, 1을 없애면 756 만 출력된다.
문제 97. 우리반 테이블에서 이름과 나이를 출력하는데 이름과 나이컬럼 옆에 나이가 짝수인지 홀수인지를 출력되게 하시오!
SQL> SELECT ename, age, MOD(age,2) AS 짝수홀수여부
FROM EMP2;
*MOD/ 해당 숫자로 나누어서 나머지를 구하는 keyword
예시) select mod(10,3)
from dual;
- 10을 3으로 나눈 나머지 값
(실무에서는 해당 숫자가 짝수인지 홀수인지 판별할때 주로 사용한다.)
* MS_SQL 은 Oracle의 Mod 함수를 지원하지 않는다.
- 그래서 위의 Oracle 쿼리처럼 구현하기 위해서는 %를 사용해야 한다.
예시 ) SQL> SELECT ename, age, age%2 AS 짝수홀수여부
FROM EMP2;
문제 98. 오늘날짜를 출력하시오!
SQL> select sysdate
from daul;
*날짜 - 숫자 = 날짜 (date)
*날짜 + 숫자 = 날짜 (date)
*날짜 - 날짜 = 숫자 (for)
* MS_SQL에서 오늘의 날짜 출력 법
SQL> select SYSDATETIME() ;
문제 99 우리반 테이블에서 이름, 내가 태어날 날부터 오늘까지 총 몇일 살았는지 출력하시오!
SQL> SELECT ename, ROUND((sysdate - birth),0)
FROM EMP2;
* '0'을 쓰지 않아도 default 값이 0으로 자동 출력된다.
* MS_SQL에서는 이런식의 날짜 계산은 사용할 수 없다.
- 날짜 변환 시 문자 형식으로 변환되는데 문자끼리는 연산이 되질 않는다.
- 그래서 dateadd, datediff 같은 날짜 계산 함수를 써서만 날짜 계산이 가능하다.
문제 100. 우리반 테이블에서 이름, 내가 태어난 날부터 오늘까지 총 몇주를 살았는지 출력하시오!
SQL> SELECT ename, ROUND((sysdate - birth)/7,0)
FROM EMP2;
문제 101. 우리반 테이블에서 이름, 내가 태어난 날부터 오늘까지 총 몇달을 살았는지 출력하시오!
SQL> SELECT ename, MONTHS_BETWEEN(SYSDATE, birth)
FROM EMP2;
* 날짜 함수
1. months_between / 주의 사항은 앞에 변수 값에 최신 날짜를 입력해야 한다.
* MS_SQL에서 날짜 계산 함수 형식
- datediff( 시간단위구분자, 시작시간, 종료시간 )
select DATEDIFF ( mi , getdate() , getdate()+1 ) ==> 분
select DATEDIFF ( s , getdate() , getdate()+1 ) ==> 초
select DATEDIFF ( hour , getdate() , getdate()+1 ) ==> 시간 (1일)
select DATEDIFF ( day , getdate() , getdate()+1 ) ==> 일 (1일)
select DATEDIFF ( month , getdate() , getdate()+31 ) ==> 개월 (31일)
select DATEDIFF ( year , getdate() , getdate()+730 ) ==> 년 (730일)
예시) (위와 같이 출력하고자 할때)
SQL> select datediff(month, hirth, getdate())
from emp2 ;
문제 102. 사원 테이블에서 이름, 입사후 부터 그동안 받았던 총 급여를 출력하시오! (sal이 월급이라고 할 때)
SQL> SELECT ename, sal*ROUND(MONTHS_BETWEEN(SYSDATE,hiredate))
FROM EMP;
* MS_SQL에서 출력 시
SQL> select ename, sal*datediff(month, HIREDATE, getdate())
from emp ;
문제 103. 오늘부터 100달 뒤에 돌아오는 날짜를 출력하시오!
SQL> select add_months(sysdate, 100)
from dual;
* add_months/ 앞으로 해당 달 수 이후의 날짜
* MS_SQL에서 앞으로 해당 달 수 이후의 날짜 구하는 법
- MS_SQL에서는 Oracle 의 add_month 와 같은 dateadd 함수가 있다.
예시 ) select ename,dateadd(month,100,hiredate)
from emp ;
문제 104. 오늘부터 앞으로 돌아올 금요일에 날짜를 출력하시오!
SQL> select next_day(sysdate,'friday')
from dual;
주의! 지정 요일에는 ' ' 표시를 꼭 해야 한다.
* MS_SQL에서는 next_day와 같은 기능이 없다.
- 그래서 특정 날짜의 요일을 찾고 추론해야 한다.
예시 ) select datename(dw,getdate());
OR
select datename(weekday,getdate());
위의 쿼리를 돌리면 해당 요일이 나온다 거기서 원하는 요일까지 추론해야 한다.
문제 105. 오늘부터 200달 뒤에 돌아오는 목요일의 날짜를 출력하시오
SQL> select next_day(add_months(sysdate, 200),'thursday')
from dual;
* MS_SQL 에서 몇 달 후 돌아오는 날짜 출력하기
- 이번에도 위와 같이 특정 날짜를 찾고 추론해야 한다.
SQL > select datename(dw,dateadd(month,200,getdate()))
문제 106. 오늘부터 요번달 말일까지 총 몇일 남았는지 출력하시오!
SQL> SELECT LAST_DAY(SYSDATE)-SYSDATE
FROM dual;
* MS_SQL은 LAST_DAY를 지원하지 않는다.
- 그래서 날짜 비교함수를 이용해서 해당 말일까지 몇일이 남았는지 출력해야 한다.
예시 ) select datediff(day, getdate(), dateadd(month,1,getdate())-day(getdate()));
( dateadd(month,1,getdate())-day(getdate()) 는 해당달의 마지막 날을 표시해준다.)
문제 107. 이름과 월급을 출력하는데 월급을 출력할때에 천단위를 표시하시오!
SQL> select ename, to_char(sal), to_char(sal,'999,999')
from emp;
* to_char(sal) / sal 의 type 이 문자로 바뀜
따라서.
select ename, to_char(sal) AS aaa
from emp
ORDER BY aaa ASC;
이 코드는 숫자의 크기로 정렬되지 않는다.
* to_char(sal, '999,999')
- 이는 천단위로 끊어주게 해준다.
- 여기서 '9'는 0~9까지 무슨 수가 와도 관계 없다는 의미
* MS_SQL은 천단위 표시를 하기 위해서는 2번의 형변환이 필요하다
- 첫번째 money로 형변화, 두번째 문자로 형변환이다.
예시 ) select ename, replace (convert(varchar,cast(sal as money),1) , '.00','')
from emp ;
위의 예시를 설명하자면
1) 먼저 숫자를 money 형으로 바꾸어 주어야 한다.
2) 두번째는 money형을 문자로 바꾸어 주어야 한다.
(이때 convert에 3번째 인자 값은 money 형의 형식을 구분한다. '1' 의 형식은 천의자리에 콤마이다. )
3) 필요 없는 소수점을 없애주기 위해서 replace를 사용한다.
* money의 문자로 변환하기 위한 style 값의 차이 비교
값
|
출력
|
0(기본값)
|
소수점 왼쪽의 세 자릿수마다 쉼표를 사용하지 않으며, 소수점 오른쪽에 두자리가 나타난다
(예 : 1234.56)
|
1
|
소수점 왼쪽의 세 자릿수마다 쉼표를 사용하며, 소수점 오른쪽에 두자리가 나타납니다.
(예:1,234.56)
|
2
|
소수점 왼쪽의 세 자릿수마다 쉼표를 사용하지 않으며, 소수점 오른쪽에 네 자리가 나타납니다.
(예:1234,5678)
|
문제 108. 이름과 총급여 (SAL*25000000) 을 출력하는데, 총급여를 출력할때에 천단위와 백만단위를 출력되게하시오!
SQL> SELECT ename, TO_CHAR((sal*25000000),'999,999,999,999')
FROM EMP;
주의! 숫자를 끊어줄 때 범위를 실제 값보다 적게 잡아주면 모든 숫자가 '#'로 표시 된다.
* 숫자에 to_char 함수 사용
문제 109. 이름, 입사일, 입사한 요일을 출력하시오!
SQL> SELECT ename, hiredate, TO_CHAR(hiredate,'day')
FROM EMP;
* 지난 10년 동안 살인 사간이 가장 많이 일어난 요일이 무엇인가?
* 날짜 형식
- YYYY , RRRR, YY, RR : 숫자 년도
- YEAR : 영문으로 년도 출력
- MM : 달
- MONTH : 달을 영문으로 출력
- DD : 일
- DAY, DY : 요일 (DY는 요일이 요약해서 출력 됨)
문제 110. 현재 세션의 날짜 형식을 확인하시오!
SQL>SELECT *
FROM nls_session_parameters;
문제 111. 81년 12월 11일에 입사한 사원의 이름과 입사일을 출력하시오!
SQL> SELECT ename, hiredate
FROM EMP
WHERE hiredate = '11/dec/81';
*현재 세션의 날짜 형식을 RR/MM/DD 로 변경
ALTER SESSION SET nls_date_format='RR/MM/DD';
문제 112. 현재 세션의 날짜 형식을 아래와 같이 변경하고, 81년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시오
SQL> SELECT ename, hiredate
FROM EMP
WHERE hiredate = '81/12/11';
* RR 과 YY 의 차이
RR YY
81 81
1981 2081 1981 2081
2015 2015
현재 연도에서 가장 현재 세기의 연도
가까운 연도 선택
*주로 RR 을 사용한다.
문제 113. 현재 세션의 날짜 형식이 어떻게 되는 상관없이 81년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시오 !
1. to_char
select ename, hiredate
from emp
where to_char(hiredate, 'RR/MM/DD')='81/12/11';
* 그러나 이럴 경우 모든 데이타를 변화해야 하기 때문에 성능이 떨어지게 된다.
2. to_date
from emp
where hiredate = to_date('81/12/11','RR/MM/DD');
* 이럴 경우 성능에 영향을 주지 않으면서 정확하게 검색할 수 있다.
문제 114. 87년 5월 6일 부터 93년 3월 4일 사이에 태어난 학생들의 이름과 생일을 출력하시오!
SQL> SELECT ename, birth
FROM EMP2
WHERE birth BETWEEN TO_DATE('87/05/06','RR/MM/DD')
AND TO_DATE('93/03/04','RR/MM/DD');
* MS_SQL은 to_data 함수를 사용할 수 없다.
- 그래서 실제 날짜 데이터 형식과 다른 형식으로 검색해서 결과를 보고 싶다면 convert 함수를 이용해야 한다.
예시 ) select ename, hirth
from emp2
where hiredate between convert(varchar,'1987/05/06',111) and convert(varchar,'1993/03/04',111) ;
* convert 시 날짜 형식 변화 시 style 식
세기 포함 안함(yy)
|
세기 포함(yyyy)
|
표준
|
입력/출력**
|
-
|
0 또는
100 (*)
|
기본값
|
mon dd yyyy
hh:miAM(또는 PM)
|
1
|
101
|
USA
|
mm/dd/yy
|
2
|
102
|
ANSI
|
yy.mm.dd
|
3
|
103
|
영국/프랑스
|
dd/mm/yy
|
4
|
104
|
독일
|
dd.mm.yy
|
5
|
105
|
이탈리아
|
dd-mm-yy
|
6
|
106
|
-
|
dd mon yy
|
7
|
107
|
-
|
Mon dd, yy
|
8
|
108
|
-
|
hh:mm:ss
|
-
|
9 또는
109 (*)
|
기본값 + 밀리초
|
mon dd yyyy
hh:mi:ss:mmmAM(또는 PM)
|
10
|
110
|
USA
|
mm-dd-yy
|
11
|
111
|
일본
|
yy/mm/dd
|
12
|
112
|
ISO
|
yymmdd
|
-
|
13 또는
113 (*)
|
유럽 기본값 + 밀리초
|
dd mon yyyy
hh:mm:ss:mmm(24h)
|
14
|
114
|
-
|
hh:mi:ss:mmm(24h)
|
-
|
20 또는
120 (*)
|
ODBC 표준
|
yyyy-mm-dd
hh:mi:ss(24h)
|
-
|
21 또는
121 (*)
|
ODBC 표준(밀리초)
|
yyyy-mm-dd
hh:mi:ss.mmm(24h)
|
-
|
126(***)
|
ISO8601
|
yyyy-mm-dd
Thh:mm:ss.mmm(스페이스 없음)
|
-
|
130*
|
회교식****
|
dd mon yyyy
hh:mi:ss:mmmAM
|
-
|
131*
|
회교식****
|
dd/mm/yy
hh:mi:ss:mmmAM
|
문제 115. 오늘 부터 100달 뒤에 돌아오는 날짜가 어떻게 되는가?
SQL> SELECT ADD_MONTHS(SYSDATE,100)
FROM dual;
문제 116. 오늘 부터 100달뒤에 돌아오는 날짜의 요일을 출력하시오!
SQL> SELECT to_char(ADD_MONTHS(SYSDATE,100),'day')
FROM dual;
문제 117. 이름과 커미션을 출력하는데 커미션이 NULL 인 사원들은 0으로 출력되게 하시오!
SQL> SELECT ename,comm, NVL(comm,'0')
FROM EMP;
문제 118. 이름, 커미션을 출력하는데 커미션이 null인 사원들은 no comm이란 글씨로 출력되게 하시오!
SQL> select ename, comm, nvl(TO_CHAR(comm), 'no comm')
from emp;
주의 ! select ename, nvl(comm, 'no comm')
from emp;
- 이 경우 comm은 number이고 치환하는 값이 string 이기 때문에 오류가 난다.
Tip.
nvl 은 data가 없는 상태, data를 문자 type을 바꾸어도 null 값은 data가 없다.
그래서 변경, 치환된다.
즉, 자신이 변환하고 싶은 모양으로 미리 데이터를 변환 시켜놓아야 한다.
* MS_SQL은 Oracle 의 nvl 함수에 대응하는 isnull 이 있다.
- 그래서 Oracle의 nvl 함수와 동일한 효과를 MS_SQL에서 얻고 싶다면 isnull 함수를 사용해야 한다.
예시 ) SQL> select ename, isnull(cast(comm as varchar), 'no comm')
from emp ;
문제 119. 이름, mgr을 출력하는데 mgr이 null인 사원들은 no manager란 글씨로 출력되게하시오!
SQL> SELECT ename, NVL(TO_CHAR(mgr),'no manager')
FROM EMP;
문제 120. 이름, 월급, 커미션, 월급+커미션을 출력하시오!
SQL> SELECT ename, sal, comm, sal+NVL(comm,0)
FROM EMP;
SQL> SELECT ename, sal, comm, sal+NVL(comm,0),NVL2(comm,sal+comm,sal)
FROM EMP;
* nvl2 (comm, sal+comm,sal)
1. 만약 comm 이 null 이 아니면 sal+comm 값을 출력하고
2. 만약 comm 이 null 이면 sal 값을 출력해라
(자바스크립트의 if/else 와 비슷한듯 하다.)
주의!
- nvl 에서 '0'이 숫자 이기 때문에 ' '이 필요 없다.
문제 121. 이름, 직업, 보너스를 출력하는데 보너스가
직업이 SALESMAN이면 3000으로 출력되게하고
직업이 SALESMAN이 아니면 0으로 출력되게하시오 !
SQL> select ename, job, decode(job,'SALESMAN',3000,0) bonus
from emp;
*decode/ null 값이 아닌 data가 있는 값 중 특정 data를 선택해야 할 때
* MS_SQL은 decode를 지원하지 않는다.
- 그래서 Oracle의 decode 식을 MS_SQL에서 구현하기 위해서는 case 문을 사용해야 한다. (But. Oracle에서도 case 문을 지원한다.)
예시) select ename, job, (case job when 'SALESMAN' then 3000
else 0 end ) as bonus
from emp ;
문제 122. 이름 직업, 보너스를 출력하는데 보너스가 직업이 SALESMAN이면 3000이 출력되게하고
직업이 ANALYST면 2500이 출력되게하고
나머지 직업은 0으로 출력되게하시오!
SQL> select ename, job, decode(job,'SALESMAN',3000,
'ANALYST',2500,0) bonus
from emp;
문제 123. 이름, 나이, 등급을 출력하는데
나이가 30살 이상이면 A 등급
나이가 27살 이상이면서 30미만이면서 B등급
나이가 24살 이상이면서 27살 미만이면 C등급
나머지 나이는 D 등급으로 출력하시오!
SQL> SELECT ename, age, case when age >=30 then 'A'
when age >=27 then 'B'
when age >=24 then 'C'
else 'D' end as 등급
from emp2;
* decode는 등호비교만 가능하다. 부등호 비교를 하려면 case 를 사용해야 한다.
* case는 등호 비교, 부등호 비교 모두 가능하다.
* 부등호 사용시 자동으로 그 이전까지의 범위로 제한되는 듯 하다.
* 범위는 between and를 가지고도 설정 가능하다.
문제 124. 이름, 월급, 부서번호, 보너스를 출력하는데
부서번호 보너스가 부서번호가 10번이면 자신의 월급의 40%를 보너스로 출력하고
부서번호가 20번이면 자신의 월급의 20%를 보너스로 출력하고
나머지 부서번호는 그냥 0으로 출력하시오!
SQL> select ename, sal, empno, case when empno = 10 then sal*0.4
when empno = 20 then sal*0.2
else 0 end as bonus
from emp;
주의! case는 한 번만 쓰자!
* 점심시간 문제: ( 라인 검사)
내가 태어난 생일의 요일을 출력하시오!
SQL> SELECT ename,TO_CHAR(birth,'Day')
FROM EMP2
WHERE ename = '송수신';
* to_char 앞 부분에는 해당 날짜만 지정해주면 자동으로 요일을 찾아서 변환해준다.
* 마지막 문제 :
점심시간 면담순서 (연장자 부터) 일주일 목, 금
월, 화, 수
이름, 나이, 분류 (A,B,C,D)
A는 성별이 남자이고 서울에 거주하는 학생
B는 성별이 여자이고 서울에 거주 하는 학생
C는 성별이 남자이고 서울이 아닌 학생
D는 성별이 여자이고 서울이 아닌 학생
나이가 높은 순서대로 출력하시오!
SQL> SELECT ename, age, CASE WHEN (gender='남자' AND address LIKE '%서울%') THEN 'A'
WHEN (gender='여자' AND address LIKE '%서울%') THEN 'B'
WHEN (gender='남자' AND address NOT LIKE '%서울%') THEN 'C'
WHEN (gender='여자' AND address NOT LIKE '%서울%') Then 'D'
END AS 분류
FROM EMP2
ORDER BY age DESC;
SQL> SELECT ename, age, CASE WHEN (gender='남자' AND address LIKE '%서울%') THEN 'A'
WHEN (gender='여자' AND address LIKE '%서울%') THEN 'B'
WHEN (gender='남자' AND address NOT LIKE '%서울%') THEN 'C'
else 'D' END AS 분류
FROM EMP2
ORDER BY age DESC;
* 괄호는 안 넣어주어도 괜찮다.