251020 TIL

2025. 10. 20. 17:44Courses/아이티윌 오라클 DBA 과정

문제

-- [문제9] employees 테이블에 있는 데이터 중에 job_id가 SA로 시작되고 salary 값은 10000이상 받고 2005년도에 입사한(hire_date)
-- 사원들의 정보를 출력해주세요.
SELECT *
FROM hr.employees
WHERE job_id LIKE 'SA%'
AND salary >= 10000
AND hire_date BETWEEN TO_DATE('20050101', 'yyyymmdd') AND TO_DATE('20060101', 'yyyymmdd') - 1/24/60/60;

-- [문제10] employees테이블에서 job_id 가 SA_REP 또는 AD_PRES 사원들 중에 salary값이 10000 초과한 사원들의 정보를 출력해주세요.
SELECT *
FROM hr.employees
WHERE job_id in ('SA_REP', 'AD_PRES')
AND salary > 10000;

SORT(정렬)

  • ORDER BY 절을 이용해서 정렬
  • 기본값은 오름차순으로 정렬. ASC(ASCending)
  • 내림차순 DESC(DESCending)
  • ORDER BY 절은 SELECT문의 가장 마지막 절에 기술해야 한다.
-- 오름차순 정렬
SELECT employee_id, last_name, salary
FROM hr.employees
ORDER BY salary;

SELECT employee_id, last_name, salary
FROM hr.employees
ORDER BY salary ASC;

-- 내림차순 정렬
SELECT employee_id, last_name, salary
FROM hr.employees
ORDER BY salary DESC;

-- 표현식 사용 가능
SELECT employee_id, last_name, salary, salary * 12
FROM hr.employees
ORDER BY salary * 12;

-- 열 별칭 사용 가능
SELECT employee_id, last_name, salary, salary * 12 annual_salary
FROM hr.employees
ORDER BY annual_salary;

-- 열 별칭 사용시 주의점 : 큰 따옴표 사용한 경우 동일하게 큰 따옴표 사용해야 함
SELECT employee_id, last_name, salary, salary * 12 "annual_salary"
FROM hr.employees
ORDER BY "annual_salary";

-- 위치 표기법 사용
SELECT employee_id, last_name, salary, salary * 12 annual_salary
FROM hr.employees
ORDER BY 4;

문제

-- [문제11] 2006년도 입사한 사원의 employee_id, last_name, hire_date를 출력해주세요 단 last_name 이름을 기준으로 오름차순정렬 해주세요.
SELECT employee_id, last_name, hire_date
FROM hr.employees
WHERE hire_date BETWEEN TO_DATE('20060101', 'yyyymmdd') AND TO_DATE('20070101', 'yyyymmdd') - 1/24/60/60
ORDER BY last_name;

-- [문제12] 80번 department_id 사원중에 commission_pct 값이 0.2 이고 job_id는 SA_MAN인 사원의 employee_id, last_name, salary를 출력해주세요.
-- 단 last_name 이름을 기준으로 오름차순정렬해 주세요.
SELECT employee_id, last_name, salary
FROM hr.employees
WHERE department_id = 80
AND commission_pct = 0.2
AND job_id = 'SA_MAN'
ORDER BY last_name;

-- [문제13] salary가 5000 ~ 12000의 범위에 속하지 않는 모든 사원의 last_name 및 salary를 출력해주세요. 단 salary을 기준으로 내림차순 정렬하세요.
SELECT last_name, salary
FROM hr.employees
WHERE salary < 5000
OR salary > 12000
ORDER BY salary DESC;

함수

  • 함수는 데이터 항목을 조작하고 결과를 반환하는 프로그램
  • 단일행함수
    • 행당 조작하는 함수
    • 입력 값으로 한 행의 필드 값이 들어가서 출력 값으로는 하나가 리턴된다.
    • 문자함수, 숫자함수, 날짜함수, 형변환함수, 일반함수
  • 그룹함수
  • 함수는 중첩 가능

문자 함수

대소문자 변환 함수

  • upper : 대문자로 변환하는 함수
  • lower : 소문자로 변환하는 함수
  • initcap : 첫 글자 대문자 나머지 글자는 소문자로 변환하는 함수
SELECT last_name, upper(last_name), lower(last_name), initcap(last_name)
FROM hr.employees;

concat

  • 연결 연산자와 동일한 함수
  • concat은 인자를 2개까지 밖에 못 받기 때문에 여러 개 연결하려면 중첩해서 사용해야 함
  • 여러 개를 연결하려면 || (연결 연산자)가 편리
SELECT last_name, first_name, last_name || ' ' || first_name, concat(concat(last_name,' '), first_name)
FROM hr.employees;

length

  • length : 문자의 길이를 리턴하는 함수
  • lengthb : 문자의 바이트 값을 리턴하는 함수
    • 한 글자 당 영어는 1byte, 한글은 3byte
SELECT last_name, length(last_name), lengthb(last_name)
FROM hr.employees;

현재 데이터베이스에 저장된 국가별 언어 지원 정보 뷰 조회

SELECT *
FROM nls_database_parameters;

  • NLS_CHARACTERSET
    • AL32UTF8 ⇒ 데이터베이스에 설정된 문자 characterset, 유니코드(unicode)
      • 전세계 출판되는 글자들을 char, varchar2 타입의 컬럼에 입력 가능
      • 1byte ~ 4byte, 영어 1byte, 한글 3byte
    • K016MSWIN949 : 한글, 한자, 영어, 일어 글자들을 char, varchar2 타입의 컬럼에 입력 가능
      • 2byte
  • NLS_NCHAR_CHARACTERSET
    • AL16UTF16 : 전세계 출판되는 글자들을 nchar, nvarchar2 타입의 컬럼에 입력 가능
    • 1byte ~ 4 byte, 영어 1byte, 한글 3byte
    • National Characterset

instr

  • 문자의 위치를 리턴하는 함수
  • instr(컬럼(문자열), ‘찾는문자열’, 시작위치(1), 몇번째로 찾는 위치(1))
SELECT last_name, instr(last_name, 'a'), instr(last_name, 'a', 1, 1),instr(last_name, 'a', 1, 2)
FROM hr.employees;

SELECT last_name
FROM hr.employees
WHERE last_name LIKE '%a%a%';

SELECT last_name
FROM hr.employees
WHERE instr(last_name, 'a', 1, 2) > 0; -- 인덱스 사용 가능

substr

  • substr: 문자를 추출하는 함수, substr(컬럼(문자열), 시작점, 추출개수)
SELECT last_name, substr(last_name, 1, 1), substr(last_name, 2, 1), substr(last_name, -2, 2)
FROM hr.employees;

  • substrb: 문자를 바이트만큼 추출하는 함수
SELECT substr('abcdef', 1, 2), substrb('abcdef', 1, 2), substr('가나다라마바', 1, 2), substrb('가나다라마바', 1, 6)
FROM dual;

trim

  • trim : 왼쪽(접두), 오른쪽(접미) 부분에 연속되는 문자를 제거하는 함수
  • ltrim : 왼쪽(접두) 부분에 연속되는 문자를 제거하는 함수
  • rtrim : 오른쪽(접미) 부분에 연속되는 문자를 제거하는 함수
SELECT 'aabbcaa', trim('a' from 'aabbcaa'), ltrim('aabbcaa', 'a'), rtrim('aabbcaa', 'a')
FROM dual;

  • 문자 지정 안 하면 기본적으로 공백 제거
SELECT '  oracle  ', length('  oracle  '), trim('  oracle  '), length(trim('  oracle  ')), ltrim('  oracle  '), length(ltrim('  oracle  ')), rtrim('  oracle  '), length(rtrim('  oracle  '))
FROM dual;

문제

-- [문제14] employees 테이블에 last_name 컬럼의 값 중에  "J" 또는 "A" 또는 "M"으로 시작하는 
-- 사원들의 last_name, last_name의 길이를 표시하는 query(select문) 를 작성합니다.
-- 사원들의 last_name 기준으로 내림차순 정렬해 주세요.
SELECT last_name, length(last_name)
FROM hr.employees
WHERE last_name LIKE 'J%'
OR last_name LIKE 'A%'
OR last_name LIKE 'M%'
ORDER BY last_name desc;

SELECT last_name, length(last_name)
FROM hr.employees
WHERE SUBSTR(last_name, 1, 1) = 'J'
OR SUBSTR(last_name, 1, 1) = 'A'
OR SUBSTR(last_name, 1, 1) = 'M'
ORDER BY last_name desc;

SELECT last_name, length(last_name)
FROM hr.employees
WHERE SUBSTR(last_name, 1, 1) IN ('J', 'A', 'M')
ORDER BY last_name desc;

SELECT last_name, length(last_name)
FROM hr.employees
WHERE INSTR(last_name, 'J', 1, 1) = 1
OR INSTR(last_name, 'A', 1, 1) = 1
OR INSTR(last_name, 'M', 1, 1) = 1
ORDER BY last_name desc;

SELECT last_name, length(last_name)
FROM hr.employees
WHERE REGEXP_LIKE(last_name, '^[AJM]')
ORDER BY last_name desc;

-- [문제15] employees테이블에서 department_id(부서코드)가 50번 사원들 중에 
-- last_name에 두번째 위치에 "a"글자가 있는 사원들을 조회하세요.
SELECT *
FROM hr.employees
WHERE department_id = 50
AND instr(last_name, 'a') = 2;

SELECT *
FROM hr.employees
WHERE department_id = 50
AND substr(last_name, 2, 1) = 'a';

SELECT *
FROM hr.employees
WHERE department_id = 50
AND last_name LIKE '_a%';

replace

  • 문자를 다른 문자로 치환하는 함수
  • replace(컬럼(문자열), 이전문자, 새로운문자)
SELECT 
    replace('100-001', '-', '%'),
    replace('100-001', '-', ''),
    replace('  100 001  ',' ', '')
FROM dual;

lpad, rpad

  • lpad : 문자의 자리를 고정시킨 후 문자 값을 오른쪽 기준으로 채우고, 빈 왼쪽 공백을 다른 값으로 채우는 함수
  • rpad : 문자의 자리를 고정시킨 후 문자 값을 왼쪽 기준으로 채우고, 빈 오른쪽 공백을 다른 값으로 채우는 함수
SELECT 
    salary, 
    lpad(salary, 10, '*'),
    rpad(salary, 10, '*')
FROM hr.employees;

문제

-- [문제16] salary에 있는 값을 1000당 * 출력해주세요.
SELECT salary, lpad('*', (salary/1000), '*') STAR
FROM hr.employees;

/*
SALARY    STAR
-------   -------
6000      ****** 
4800      **** 
4800      **** 
...
*/

숫자 함수

round

  • 지정된 소수점 자릿수 값을 반올림하는 함수
SELECT 
    45.926,
    ROUND(45.926),
    ROUND(45.926, 0),
    ROUND(45.926, 1),
    ROUND(45.926, 2),
    ROUND(45.926, -1),
    ROUND(45.926, -2),
    ROUND(55.926, -2)
FROM dual;

trunc

  • 지정된 소수점 자릿수 값을 truncate(버리는) 함수
SELECT 
    45.926,
    TRUNC(45.926),
    TRUNC(45.926, 0),
    TRUNC(45.926, 1),
    TRUNC(45.926, 2),
    TRUNC(45.926, -1),
    TRUNC(45.926, -2),
    TRUNC(55.926, -2)
FROM dual;

ceil

  • 숫자 값을 가장 큰 정수로 반환하는 함수
SELECT 
    round(10.1),
    ceil(10.1),
    ceil(10.00000001)
FROM dual;

floor

  • 숫자 값을 가장 작은 정수로 반환하는 함수
SELECT 
    trunc(10.1),
    floor(10.1),
    floor(10.00000001),
    floor(-10.00000001)
FROM dual;

몫, mod(나머지)

SELECT
    10/3,
    TRUNC(10/3),
    MOD(10,3)
FROM dual;

  • mod : 어떤 값을 나눈 나머지를 반환하는 함수

power(거듭 제곱)

SELECT
    2 * 2 * 2,
    POWER(2, 3)
FROM dual;

abs(절대값)

SELECT
    abs(-100)
FROM dual;

sqrt(제곱근)

SELECT
    sqrt(9)
FROM dual;

문제

-- [문제17] employees 테이블에 있는 employee_id, last_name, salary, 
-- salary를 10% 인상된 급여를 계산하면서 계산된 급여는 소수점은 반올림해서 정수값으로 표현하고 
-- 열별칭은 New Salary로 표시하세요.
SELECT employee_id, last_name, salary, round(salary * 1.1) "New Salary"
FROM hr.employees;

'Courses > 아이티윌 오라클 DBA 과정' 카테고리의 다른 글

251022 TIL  (0) 2025.10.22
251021 TIL  (0) 2025.10.21
251017 TIL  (0) 2025.10.17
251016 TIL  (0) 2025.10.16
251015 TIL  (0) 2025.10.15