Oracle SQL - Select 개발일지(3)

Nam-Soomin·2022년 8월 26일

Oracle SQL

목록 보기
3/7

📝 Oracle SQL


3장 단일 항 함수

📌 함수

이름이 Smith인 사람을 찾는다고 해보자.
데이터베이스에 저장된것이 대문자로 되어있는 정보라면, 스미스 이름을 대문자로 바꾸어 찾으면 된다.

소문자 : LOWER()
대문자 : UPPER()

select employee_id, last_name, department_id
from employees
where LOWER(last_name) = 'higgins';

  • initcap

📌 문자열 잘라내기

  • concat : 값을 결정. 파타미터는 두 개만 사용가능
concat('hello','world')

-> helloworld

  • substr : 지정한 길이의 문자열을 추출
substr('helloworld', 1,5)

-> hello

  • length : 문자열의 길이를 숫자 값으로 표시
  • instr ('HelloWorld', 'W') | 결과 : 6(번째)
    자바에서는 첫글자가 0부터지만 sql에서는 1부터 시작함
  • lpad : 남는거 왼쪽에서 별표로 채워라
  • rpad : 남는거 오른쪽에서 별표로 채워라
  • trim : 문자열에서 접두어나 접미어 또는 두 가지 모두를 자름.
  • 오라클이 해결해주는 명령어는 15개
    명령프롬프트에 바로 concat이라고 작성하는 것이 아니라 'select'를 같이 써줄것. 당연히 셀럭트가 나왔으면 from도 작성해줄것!
    from 다음은 dual(가짜 테이블 : 간단한 계산 등 할 수 있음)


    (오타시 ed로 에디터창을 열고 수정&저장 후 / +enter 하면 수정한 문으로 실행해준다.)

📌 문자 조작 함수 사용

A부터 B까지 잘라라.
어디까지인지 명시되어있지 않다면 끝까지이다.

select employee_id, CONCAT(first_name, last_name) NAME, 
job_id, LENGTH(last_name), INSTR(last_name, 'a') "Contains 'a'?"
from employees
where substr(job_id, 4) = 'REP';


📌 숫자 함수

  • ROUND : 지정한 소수점 자리로 값을 반올림.
  • TRUNC : 지정한 소수점 자리까지 남기고 값을 버림.
  • MOD : (자바에서는 %) 나눗셈의 나머지를 반환합니다.

(* DUAL : 함수 및 계산 결과를 볼 수 있는 더미 테이블)


📌 날짜 함수

  • 기본 날짜 표시 형식은 dd-mon-rr
  • 한국은 RR/MM/DD
    (rr은 y2k가 적용안됨, yy는 y2k 적용됨)

RR/MM/DD
RR : Y2K가 적용된 숫자연도 두 자리
MM : 숫자 월 두 자리
DD : 숫자 날짜 두 자리

MON : 월이름(축약된) -> Jan
MONTH : 월이름(전체) -> January

대한민국 오라클에서는 날짜는 기본적으로 rr/mm/dd

  • 오늘 날짜 보기
select sysdate from dual;


날짜 계산(날짜에 산술 연산자 사용)

  • 오늘 - 입사일 /7 (몇번째 주가 흘러갔느냐)

  • MONTHS_BETWEEN : 두 날짜 간의 달 수
  • ADD_MONTHS : 날짜에 달 수 더하기
  • NEXT_DAY : '특정한 날짜 이후로 금요일이 언제인가?' 를 찾을 때 사용
  • LAST_DAY : '8월의 마지막 날은?'
  • ROUND : 날짜 반올림
  • TRUNC : 날짜 버릴때

-8월 1일에서 가장 가까운 금요일은 언제인가?

SELECT next_day('22/8/1','금') from dual;

-입사한지 3년이 안된 사원들의 사원번호, 입사일, 근무한 달 수, 6개월 검토일(6개월이 지난 다음에 정직원으로 채용할지, 임시직원으로 채용할지, 해고할지에 해당하는 날이 언제인가?), 입사 후 첫번째 금요일, 입사한 달의 마지막 날을 표시하라.

select employee_id, hire_date, 
MONTHS_BETWEEN (Sysdate, hire_date) TENURE,
add_months (hire_date, 6) REVIEW,
next_day (hire_date, '금'), Last_day(hire_date)
from employees
where months_between (sysdate, hire_date) < 240;

개월을 찾아야하므로 MONTHS_BETWEEN사용
(SYSDATE(오늘), hire_date) < 36; : 오늘 날짜부터 입사한 날까지 36개월이 안된)

(여기서잠깐!)
나는 이 코드를 입력하고 아무리 friday며 FRIDAY며 금요일 금 입력해도 안됐었는데, 이 때 윈도우 10cmd한글 깨짐 이라고 검색하여 cmd창에

chcp 949

를 입력하여 해결하였다.(뿌듯)
그리고 friday를 금 으로 입력하여 출력하였다.


✏ 3장 연습문제

183p.
1번 2번 3번은 같은 문제이고,
4번은 2번문제를 수정해서 다음과 같은 결과가 출력되도록 바꿔라
5번은 대문자 j,a,m 이름과 길이를 출력해라
6번 근무달 수 결과는 반올림으로
까지 풀기
(문자,숫자,날짜 함수)

1)현재 날짜를 표시하는 질의를 작성하고 열 레이블을 date로 지정할 것.

select sysdate "date" from dual;


해설.현재 날짜(시간포함)를 출력하는 함수 : sysdate

2-3)각 사원에 대해 사원 번호, 이름, 급여 및 15% 인상된 급여를 정수로 표시하여라. 인상된 급여열의 레이블을 New Salary로 지정하여라.

select employee_id, last_name, salary, round(salary+(salary*1.15),0) "New Salary"
from employees;


해설. 15%인상된 급여를 정수로 출력
1. 15% 인상된 급여(salary1.15)->정수로 출력(반올림, 버림)
2. round(salary
1.15,0)

4)새 급여에서 이전 급열르 빼는 새 열을 추가하고 레이블을 Increase로 지정하여라.

select employee_id, last_name, salary, round(salary * 1.15,0) as "new salary",
round(salary * 1.15,0)-salary as "increase" from employees;

5)이름이 j,a,m으로 시작하는 모든 사원의 이름(첫 글자는 대문자로, 나머지 글자는 소문자로 표시) 및 이름 길이를 표시하는 질의를 작성하고, 각 열에 적합한 레이블을 지정하시오. 결과를 사원의 이름에 따라 정렬하시오.

select first_name as "Name", length(first_name) as "Length"
from employees
where first_name like 'J%' OR first_name like 'A%' or first_name like 'M%'
order by first_name asc;

다른 방식으로는,

select first_name as "Name", length(first_name) as "Length"
from employees
where substr(last_name, 1, 1) in('J','A','M')
order by first_name;


해설. 조건 : 이름이 J,A,M으로 시작하는 사원
->이름이 J로 시작 -> last_name like 'J%'
->이름의 길이 : length(last_name)

p.s.작성자의 한마디)

first name이랑 last name 항상 헷갈리는거 나만그래?
아무튼, first name이 이름이고, last name이 성이야~!😉

XOXO 작성자

6)각 사원의 이름을 표시하고 근무 달 수(입사일로부터 현재가지의 달 수)를 계산하여 열 레이블을 months_worked로 지정하시오. 결과는 정수로 반올림하여 표시하고 근무 달수를 기준으로 정렬하시오.

select last_name, round(months_between(sysdate, hire_date)) "근무 달 수"
from employees
order by round(months_between(sysdate, hire_date));

해설. 근무 달수(입사일 부터 현재까지 달 수) : months_between(A,B)
round(months_between(sysdate, hire_date))


profile
🇰🇷Dreaming Full-Stack WEB Developer

0개의 댓글