본문 바로가기
국비 교육/SQL(Oracle)

[오라클] 집합 set 과 함수 function -1

by 육츠 2024. 2. 1.
Contents 접기

집합 set

select 로 질의된 결과를 하나의 집합으로 인식해서 집합 연산 하는 것

집합의 종류

합집합 union 교집합 intersect 차집합 minus

 

교집합

select employee_id, first_name
from employees
where employee_id in (145,147,158)

intersect

select employee_id, first_name
from employees
where first_name like 'A%';

 

차집합 (순서 중요)

[Q] employee_id 145,147, 158 중에서 A로 시작하는 직원 제외

select employee_id, first_name
from employees
where employee_id in (145,147,158)

minus

select employee_id, first_name
from employees
where first_name like 'A%';

 

[Q] A 로 시작하는 직원 중에서  145, 147, 158 의 employee_id  직원 제외

select employee_id, first_name
from employees
where first_name like 'A%'

minus

select employee_id, first_name
from employees
where employee_id in (145,147,158);

 

 

합집합

- 중복 데이터는 1개만 출력

select employee_id, first_name
from employees
where first_name like 'A%'

union

select employee_id, first_name
from employees
where employee_id in (145,147,158);

 

[Q] 합집합 중복된 데이터도 무조건 다 조회되도록

select employee_id, first_name
from employees
where first_name like 'A%'

union all

select employee_id, first_name
from employees
where employee_id in (145,147,158)

order by first_name;
-- 어떤 명령이든 항상 마지막에 ~!

 

집합에서 오류가 난 경우

1) 컬럼의 개수가 다르면 다른 집합으로 인지되므로 오류

select employee_id, first_name,salary
from employees
where first_name like 'A%'

union all

select employee_id, first_name
from employees
where employee_id in (145,147,158);

 

2) 컬럼의 개수가 같지만 타입이 다르면 오류

select employee_id, first_name,hire_date
from employees
where first_name like 'A%'

union all

select employee_id, first_name, salary
from employees
where employee_id in (145,147,158);

 

3) 실행 오류가 아니라 논리적인 오류 (타입과 개수는 맞췄지만 컬럼이 다른 경우)

: 결과는 나오지만 원하는 결과가 나오지는 않는다.

select employee_id, first_name,last_name
from employees
where first_name like 'A%'

union

select employee_id, first_name, phone_number
from employees
where employee_id in (145,147,158);

 

함수 function

질의문과 함께 사용하여 결과를 강력하게 처리할 수 있는 기능

함수의 종류

종류 의미
단일행 함수 각각의 레코드에 기능을 적용시키는 함수
그룹행 함수 특정 조건에 맞게 레코드를 묶어서 기능을 적용

 

단일행 함수의 종류

단일행 함수 역할
lower(문자열) 영문자를 소문자로 변경
upper(문자열) 영문자를 대문자로 변경
initcap(문자열) 영문자를 첫글자만 대문자, 나머지 소문자로 변경
concat(문자열1, 문자열2) 문자열 결합
 substr(문자열, 위치값) 문자열에서 지정된 위치 뒤의 모든 문자열을 반환
substr(문자열, 위치1,개수)  문자열에서 지정된 위치1 ~ 개수 까지의 모든 문자열을 반환, 인덱스가 1부터 시작
length(문자열) 길이 반환
instr(문자열, 부분문자열) 문자열 내에서 부분 문자열의 위치
replace(문자열, 찾는 문자열, 바꿀 문자열) 문자열 치환

 

[Q] 이름을 소문자 / 대문자 로 조회

select lower(first_name), upper(first_name)
from employees;

 

더미 테이블 dual

- from은 필수 구문이기 때문에 table 이 존재하지 않는 데이터에 가상으로 쓰인다.

select lower('ASIAN CUP 2024'), initcap('ASIAN CUP 2024')
from dual;

 

substr(문자열, 위치) 

index가 1부터 시작

select upper(substr ('The Soap', 5))
from dual;

 

substr(문자열, 위치, 개수)

select upper(substr ('The Soap', 5, 2)) as RESULT
from dual;

 

LENGTH() : 길이 반환

select LENGTH ('The Soap')
from dual;

 

INSTR(문자열, 부분문자열): 위치값 찾기

위치 값을 찾지 못 할 경우 0 반환

select INSTR ('오라클 마스터','터')
FROM DUAL;

 

[참고] 다른 문장과 함께 사용

SELECT EMPLOYEE_ID, FIRST_NAME
FROM EMPLOYEES;

SELECT EMPLOYEE_ID, FIRST_NAME
FROM EMPLOYEES
WHERE SUBSTR(FIRST_NAME,-1,1) = 'n';

 

[Q] 이름의 끝에서 2번째 2 개가 'en' 으로 끝나는 직원의 사원번호와 이름

SELECT EMPLOYEE_ID, FIRST_NAME
FROM EMPLOYEES
WHERE SUBSTR(FIRST_NAME,-2,2) = 'en';

 

CONCAT() : 두 개의 문자열을 합치는 함수 (|| 와 동일)

SELECT CONCAT('I HAVE A ', 'DREAM')
FROM DUAL;

 

[Q] CONCAT()을 테이블에 적용

SELECT 
  CONCAT(EMPLOYEE_ID, FIRST_NAME),
    CONCAT(EMPLOYEE_ID, CONCAT(':', FIRST_NAME))
FROM EMPLOYEES;


SELECT 
  CONCAT(EMPLOYEE_ID, CONCAT(' ', FIRST_NAME)),
    CONCAT(EMPLOYEE_ID, CONCAT(':', FIRST_NAME))
FROM EMPLOYEES;

 

REPLACE(문자열, 찾을 문자열, 바꿀 문자열)

SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES;

 

[Q] 입사일의 날짜 '/'를 '-' 로 변환

SELECT FIRST_NAME, REPLACE(HIRE_DATE,'/','-')
FROM EMPLOYEES;

 

[Q] 이름, 전화 번호를 조회하되, 전화번호의 '.' 을 공백으로 치환하시오

SELECT FIRST_NAME, PHONE_NUMBER
FROM EMPLOYEES;


SELECT FIRST_NAME, REPLACE(PHONE_NUMBER,'.',' ')
FROM EMPLOYEES;

 

숫자와 관련된 함수

종류 의미
abs(숫자)  숫자의 절대값 구하는 함수
 ceil(숫자) 올림. 가장 가까운 양의 방향의 정수를 반환
floor(숫자) 버림. 가장 가까운 음의 방향의 정수를 반환
round(숫자,자릿수) 지정한 위치에서 반올림
trunc(숫자, 자릿수) 지정한 위치에서 절삭
mod(값 1, 값 2) 첫번째 숫자를 두 번째 숫자로 나눴을때 나머지
power(값1, 값 2) 첫번째 숫자를 두 번째 숫자만큼 곱한 값
sign(숫자) 숫자가 음수이면 -1, 0이면 0, 양수이면 1을 반환

 

abs()

SELECT ABS(-15.6) FROM DUAL;
SELECT ABS(15.6) FROM DUAL;

 

ceil()

SELECT CEIL(15.3) , CEIL(-15.3) FROM DUAL;

 

floor()

SELECT FLOOR(15.7), FLOOR(-15.7) FROM DUAL;

 

round(m,n)

- '-1' 은 소수점 바깥자리
- 방향이랑 상관 없다.

SELECT ROUND(15.195, 1), ROUND(15.195, 2), ROUND(15.195, 0), ROUND(15.195, -1)
FROM DUAL;  
-- 소숫점 이하 첫째자리까지 살리겠다


SELECT ROUND(- 15.195, 1), ROUND(-15.195, 2), ROUND(-15.195, 0), ROUND(-15.195, -1)
FROM DUAL;

 

trunc(m,n)

SELECT TRUNC(- 15.195, 1), TRUNC(-15.195, 2), TRUNC(-15.195, 0), TRUNC(-15.195, -1)
FROM DUAL;

 

mod(m,n)

SELECT MOD(10,3), POWER(10, 3), SIGN(10), SIGN(-10)
FROM DUAL;

 

 

 

 

 

 

 

 

 

'국비 교육 > SQL(Oracle)' 카테고리의 다른 글

[오라클] 함수 function - 3  (0) 2024.02.04
[오라클] 조인 JOIN  (0) 2024.02.04
[오라클] 함수 function - 2  (0) 2024.02.01
[오라클] SQL  (0) 2024.01.31