Oracle/SQL

표현식과 조건식

psys 2020. 6. 3. 19:05
728x90

표현식

 

CASE문

한 개 이상의 값과 연산자, SQL함수 등이 결합

특정 값에 대해 정해진 조건에 따라 다르게 표현

CASE WHEN 조건1 THEN 값1
     WHEN 조건2 THEN 값2
...
     ELSE 기타 값
END
select employee_id, salary
    , case when salary<=5000 then 'C등급'
           when salary > 5000 and salary <= 15000 then 'B등급'
    else 'A등급'
    end as salary_grade
from employees;

ex>

표현식을 이용하여 다음과 같이 작성하시오. 
MEMBER 테이블에서
MEM_MILIAGE가 1000 이하 FAMILY
            1000 초과 2000 이하 GOLD
            2000 초과 4000 이하 VIP
                        나머지  VVIP

select mem_name
      ,case when mem_mileage<=1000 then 'FAMILY'
            when mem_mileage>1000 and mem_mileage<=2000 then 'GOLD'
            when mem_mileage>2000 and mem_mileage<=4000 then 'VIP'
       else 'VVIP'
       end
from member;

마지막에 order by mem_mileage desc;를 하게되면 vvip~family로 정렬

 

DISTINCT

데이터 조회 시 데이터 중복을 제거하기 위한 방법 중 하나(그 다른 하나는 GROUP BY)

select distinct country_region
from countries
order by country_region asc;

ex>

countries 테이블에서 
'국가이름'과, '국가_지역' 컬럼의 6개의 지역의 영문명을 한국어로 바꾸어 출력하세요
ex>
United States of America    아메리카
Germany                                     유럽
United Kingdom                      유럽

select country_region
    , case 
            when country_region='Africa' then '아프리카'
            when country_region='Americas' then '아메리카'
            when country_region='Asia' then '아시아'
            when country_region='Europe' then '유럽'
            when country_region='Middle East' then '중동'
            when country_region='Oceania' then '오세아니아'
            end as country_na
from countries
group by country_region;

조건식

 

비교조건식

비교 조건식은 논리 연산자나 ANY, SOME, ALL 키워드로 비교하는 조건식을 말함

1) ANY와 SOME

아무거나 하나라도 일치

select employee_id, salary
from employees
where salary = any(2000,3000,4000)
--where salary = some(2000,3000,4000)
order by employee_id;

2) ALL

모두 만족

select employee_id
    , department_id
    , salary
from employees
where salary < all(select salary
                    from employees
                    where department_id = 20);

논리조건식

논리 조건식은 조건절에서 AND, OR, NOT 을 사용하는 조건식

1) OR

A와 B 둘 중 하나만 만족해도 출력

select employee_id, emp_name, salary, job_id
from employees
where salary > 5000 or job_id = 'IT_PROG'
order by employee_id;

2) AND

A, B 조건 모두 만족해야 출력

select employee_id, emp_name, salary, job_id
from employees
where salary > 5000 and job_id = 'IT_PROG'
order by employee_id;

3) NOT

select employee_id, salary
from employees
where not (salary >= 2500)
order by employee_id;

 

salary가 2500이상인 것이 아닌것들로 2500이하의 salary들만 출력

 

BETWEEN AND 조건식

between A and B로 A와 B사이의 값들을 출력

select employee_id, salary
from employees
where salary between 2100 and 2500
order by employee_id;

 

IN과 NOT IN조건식

select employee_id, salary
from employees
where salary in (2000,3000,4000) --포함
order by employee_id;
select employee_id, salary
from employees
where salary not in (2000,3000,4000) -- NOT 포함
order by employee_id;

LIKE조건식

select mem_name
from member
where mem_name like '김%';

김%       - 김으로 시작하는 모든 단어를 출력

%김       - 김으로 끝나는 모든 단어를 출력

김__      - 김으로 시작하는 3글자짜리 단어를 출력

%김%   - 김이 포함된 단어를 출력

ex>

CUSTOMERS 테이블에서 'Barry' 또는 'Ashley'라는 성을 가진
모든 사람의 이름(컬럼1), 성별(컬럼2), 출생년도(컬럼3),
도시: 주소: 우편번호:   (컬럼4)출력하시오.
ex> [Barry Cook][남자][1986][도시 : Ravensburg 주소:87 East Harbor Avenue 우편번호:40715]
1. like
2. case
3. 문자연산자
4. birth 어린순서

select CUST_NAME, 
case when cust_gender ='F' then '여자'
     else '남자'
     end as Cust_gender 
     ,cust_year_of_birth as birth
     , '도시 : '|| CUST_city
       || ' 주소:'|| cust_street_address
       || ' 우편번호:'|| cust_postal_code
       as total
from customers
where CUST_NAME like 'Barry%' or CUST_NAME like 'Ashley%'
order by birth DESC;

 

NULL조건식

특정 값이 NULL인지 체크 ( 특정 컬럼 값이 NULL 인지 여부를 체크할 때는 연산자를 사용하면 제대로
비교하지 못함)

1) 해당 컬럼에 널이 있을 경우

SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NULL;

2) 해당 컬럼에 널이 없는 경우

SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL;

'Oracle > SQL' 카테고리의 다른 글

정규표현식  (0) 2020.06.10
내장함수  (0) 2020.06.05
DDL(Data Define Language, 데이터정의어)  (0) 2020.06.03
수식연산자  (0) 2020.06.03
DML(Data Manipulation Language, 데이터조작어)  (0) 2020.06.03