ch0nny_log

[빅데이터분석] SQL_TIL4 본문

빅데이터 분석(with 아이티윌)/SQL

[빅데이터분석] SQL_TIL4

chonny 2024. 5. 14. 18:04

 

** DAY3 복습

 

[빅데이터분석] SQL_TIL3

※* 개인정보는 모자이크 & 자르기 처리했습니다.** 복습1. select 문의 4가지 절2024.05.10 - [sqld] - [빅데이터분석]SQL_TIL2실행순서코딩순서 3select보고싶은 컬럼1from테이블명2where검색조건4order by정렬

chonny1210.tistory.com

 

 


[TIL 4] 240514

문제10. 아산병원 SQL에서 이름이 두글자인 데이터도 개인정보 보호법에 따를 수 있도록 SQL을 작성하시오.

예제 23. 반올림해서 출력하기(ROUND)
숫자 4 5 3 . 2 0 0
자리 -3 -2 -1 0 1 2 3

 

문제 1. 768.867 을  소수점 자리 2번째 자리 기준으로 두고 바로 뒤에서 반올림하시오.
select round(768.867,2)
    from dual;


 

예제 24. 숫자를 버리고 출력하기 (TRUNC)
숫자 8 7 6 . 5 6 7
자리 -3 -2 -1 0 1 2 3
문제1. 768.792를 소수점 이후 첫번째 자리만 남기고 뒷쪽 숫자를 다 버리고 출력하시오.
select trunc(768.792,1)
    from dual;

 

문제2. 사원 이름과 월급 *1247을 출력하는데 100의 자리까지만 출력 될 수 있도록 십의 자리에서 반올림해서 출력하시오.
select ename, sal*1247, trunc(round(sal*1247,-1),-2)
    from emp;
문제3. 이름과 연봉을 출력하는데 연봉이 높은 사원부터 연봉이 50,000이상인 사원들만 추출하고 연봉이 높은 사원부터 출력하시오.
select ename, sal*12 as 연봉
    from emp
    where sal*12 >=50000
    order by sal*12 desc;​

** 오라클 실습용 테이블만들기

 

오라클에서 제공하는 교육용 테이블 여러개를 xe버전에서 생성하는 방법

■ 오라클에서 제공하는 교육용 테이블 여러개를 xe버전에서 생성하는 방법 오라클 xe 버전은 oracle enterprise 버전과 다르게 실습용 대용량 테이블이 없습니다.oracle xe 가 enterprise edition 보다는 설

cafe.daum.net

 

 

예제 25. 나눈 나머지 값 출력하기 (MOD)

 

문제 1. 10을 3으로 나눈 나머지 값을 출력하시오.
select mod(10,3)
    from dual;
문제 2. 우리반 테이블에서 이름, 나이, 나이를 2로 나눈 나머지 값을 추출하시오.
 select ename, age, mod(age,2)
    from emp19;
문제 3. 우리반 테이블에서 이름과 나이를 출력하는데 나이가 홀수인 학생들의 이름과 나이를 출력하시오
select ename, age
    from emp19
    where mod(age,2)=1;

 

예제 26. 날짜 간 개월 수 출력하기 (MONTHS_BETWEEN)
= months_between: 두 날짜간의 월 수 
= months_between( 최신날짜, 컬럼)

# 현재 DB에 설정되어 있는 날짜 형식 확인하는 명령어

# 현재 DB에 설정되어 있는 날짜 형식 확인하는 명령어

select *
	from nls_session_parameters;​

 

* nls : national language support
** NLS_DATE_FORMAT  = RR/MM/DD <- 년도/월/일


** 연도의 형식: RRRR / RR / YYYY / YY


 

문제 1. 81년11월17 에 입사한 사원의 이름과 입사일을 출력하시오.
select ename, hiredate
	from emp
    where hiredate = '81/11/17';

 

문제 2. 위 문제를 미국 버전으로 작성하시오.
select ename, hiredate
	from emp
    where hiredate = '17/11/81';​
문제3. 현재 날짜 형식을 RR/MM/DD가 아니라 YY/MM/DD로 변경하시오.
select ename, hiredate
	from emp
    where hiredate = '17/11/81';
      nls_date_format YY/MM/DD
    alter session set nls_date_format='YY/MM/DD';
    select * from nls_session_parameters;​
문제4. 81/11/17 에 입사한 사원의 이름과 입사일을 출력하시오.
 select ename, hiredate
        from emp
        where hiredate='81/11/17';
        
        # 검색되지않음​
RR YY
81 81
1981 2081 1981 2081
2024 2024
현재 연도를 기준으로 가장 가까운 연도 현재 세기로  연도를 선택
alter session set nls_date_format='RR/MM/DD';
    
select ename, hiredate
    	from emp
        where hiredate='81/11/17';
        
  # 현업 날짜 TIP
  # 날짜를 검색할 때 검색이 안되어지면 반드시 현재 점속된 세션의 날짜 형식을 다음과 같이 확인 해야함
  
  select * from nls_session_parameters;​

 

 

** select * from nls_session_parameters;

- session(세션) : 현재 접속된 창

** 오늘 날짜 확인하는 SQL

   select sysdate     
            from dual;

** oracle sql developer 에서는 날짜만나오고 dbeaver 에서는 날짜 시간 둘다 나온다.

**  날짜 연산 3가지
1) 날짜 - 날짜 = 숫자
2) 날짜 + 숫자=  날짜
3) 날짜 - 숫자= 날짜

문제 1. 내가 태어난 날짜부터 오늘까지 총 몇일 살았는지 출력하시오
select ename, sysdate- birth
	from emp19
    where ename='조혜정';
문제 2. 위에 출력되는 숫자를 소숫점이 안나오게 반올림하시오
  select ename, round(sysdate- birth,0)
	from emp19
    where ename='조혜정';

 

문제 3. 내가 태어난 날짜부터 총 몇주 살았는지 출력하시오.
  select ename, round(sysdate- birth,0)/7
	from emp19
    where ename='조혜정';
    
    # 반올림하시오
    
     select ename, round(round(sysdate- birth,0)/7)
	from emp19
    where ename='조혜정';

 

문제 4. 내가 태어난 날짜부터 총 몇 살았는지 출력하시오. (months_between)
 select ename, round(months_between(sysdate, birth))
	from emp19
    where ename='조혜정';​
문제 5. 사원 테이블에서 이름, 입사한 날짜부터 오늘까지 총 몇달 근무했는지 출력하시오.
select ename, months_between(sysdate,hiredate)
	from emp;
    
    
 # 반올림
  select ename, round(months_between(sysdate,hiredate))
	from emp;
문제 6. 위의 결과를 아래와 같이 출력하시오.
select ename || ' 은' || round(months_between(sysdate,hiredate)) || ' 달 근무했습니다.'
    from emp;

ADD_MONTHS

예제 27. 개월 수 더한 날짜 출력하기(ADD_MONTHS)
1) 오늘 날짜에서 100일 후의 날짜를 출력하시오,
select sysdate+100
        from dual;​

2) 오늘 날짜에서 100달 후의 날짜를 출력하시오.

select add_months(sysdate,100)
        from dual;


※ 더 간편한 날짜 더하는 함수 사용법
-  interval '숫자' year 
-  interval '숫자' month
-  interval '숫자' day

-  interval '숫자' hour 
-  interval '숫자' minute 
-  interval '숫자' second 

 

문제 1. 오늘 날짜에서 10년 뒤의 날짜를 출력하시오.
   select sysdate+ (interval'10' year)
        from dual;

예제 28. 특정 날짜 뒤에 오는 요일 날짜 출력하기 (NEXT_DAY) 
= next_day(특정날짜, '요일')
= 특정날짜 뒤에 돌아오는 요일의 날짜 출력
1) 오늘 날짜에서 앞으로 돌아올 금요일의 날짜를 출력하시오.
  select sysdate,next_day(sysdate, '금요일')
        from dual;​

 

문제 1. 오늘부터 앞으로 돌아올 월요일의 날짜를 출력하시오,
 select next_day(sysdate, '월요일')
        from dual;
문제 2. (오라클 정규 난이도 상) 오늘부터 100달뒤에 돌아오는 월요일의 날짜를 출력하시오.
SELECT NEXT_DAY( SYSDATE + INTERVAL '100' MONTH   , '월요일')
FROM DUAL;

last_day

예제 29. 특정 날짜가 있는 달의 마지막 날짜 출력하기(last_day)
1.  오늘 날짜, 요번달의 마지막 날짜를 출력하시오.
select sysdate, last_day(sysdate)
    from dual;

 

문제1. 오늘부터 요번달 말 까지는 총 ?일이 남았습니다. 를 출력하시오.
select '오늘부터 요번달 말 까지는' || '총' ||(last_day(sysdate)-sysdate) ||'일이 남았습니다.'
    from dual;
    
    
    # 문자와 날짜를 연결할 수 없기 때문에 날짜를 괄호를 해 숫자화 시킨다.

예제 30. 문자형으로 데이터 유형 변환하기(TO_CHAR)
데이터 유형 변환 - 1) 문자형 2) 숫자형 3) 날짜형
* 암시적 형변환의 예: 오라클이 알아서 형변환을 하는 것
select ename, sal
    from emp
    where sal = '3000';
    
    # 숫자를 '' 처리하면 문자로 변환되나 오라클에서는 암시적 형변환이 발생하여 인식됨​

숫자가 문자보다 우선순위가 높아서 문자를 숫자로 형 변환을 함

   explain  plan  for 
 select   ename, sal
   from  emp
   where  sal  like  '30%';  

select  * from  table(dbms_xplan.display);

 

   1 - filter(TO_CHAR("SAL") LIKE '30%') <---오라클이 암시적으로 형변환함)

 

명시적 형변환 한수 3가지

1) to_char:숫자나 날짜를 문자형으로 형변황하는 함수

2) to_number:  문자를 숫자로 형변환하는 함수

3) to_date: 문자를 날짜로 형변환하는 함수

문제1. 오늘이 무슨 요일인지 출력하시오.
  select   to_char(sysdate,'day')
   from  dual;​


문법: to_char(날짜,'포멧')  -> 날짜를 문자로 형 변환하면서 해당 '포멧;으로 출력해준다.

   select to_char(sysdate,'RRRR') 2024
   select to_char(sysdate,'RR') 24
   select to_char(sysdate,'YYYY') 2024
   select to_char(sysdate,'YY') 24
   select to_char(sysdate,'MON') 5
   select to_char(sysdate,'MM') 05
   select to_char(sysdate,'DAY') 화요일
   select to_char(sysdate,'DY')
   select to_char(sysdate,'D') 3 (일, 월, 화, 수, 목, 금, 토) / 오늘은 화요일이라 3
문제1. 이름, 입사일 입사한 년도 4자리로 출력하시오
select ename, hiredate, to_char(hiredate,'RRRR')
   from  emp;
문제2. 1981년도에 입사한 사원들의 이름과 입사일을 출력하시오.
   select ename, hiredate
   from  emp
   where to_char(hiredate,'RRRR') = '1981';

 

문제3. 이름,입사일, 입사일에서 월만 추출하서 출력하시오.
   select ename,hiredate,to_char(hiredate,'MM')
   from  emp;

문제4. 사원테이블에 5월달에 입사한 사원들의 이름과 입사일을 출력하시오
   select ename, hiredate
   from  emp
   where to_char(hiredate,'MM') = '05';

 

문제5. 이름, 입사일, 입사한요일을 출력하시오
  select ename, hiredate, to_char(hiredate,'DAY')
   from  emp;
문제6. 우리반 테이블에서 이름, 생일, 태어난요일을 출력하시오.
select ename,birth, to_char(birth,'DAY')
   from  emp19;
   
   
   select ename,birth, to_char(birth,'DAY')
   from  emp19
   where ename ='조혜정';
문제 7. 우리반에서 태어난 요일이 화요일인 학생들의 이름과 생일과 요일을 출력하시오.
  select ename,birth, to_char(birth,'DAY')
   from  emp19
   where to_char(birth,'DAY') ='화요일';
문제 8. 우리반에서 태어난 요일이 월요일, 금요일, 토요일 인 학생들의 이름과  생일과 태어난 요일을 출력하시오,.
 select ename,birth, to_char(birth,'DAY')
   from  emp19
   where to_char(birth,'DAY') in ('화요일','금요일','토요일');​
문제 9. 우리반 테이블에서 이름, 태어난 요일, 요일의 숫자를 출력하시오. 
 select ename, to_char(birth,'DAY'), to_char(birth,'D')
   from  emp19;

 

★ 문제 10. (분석가 요청 SQL) 우리반 테이블에서 이름과 태어난 요일을 출력하는데 월화수목금토일 순으로 정렬하여 출력하시오,
select ename, to_char(birth, 'day')
       from emp19
       where to_char(birth, 'day') is not null
       order by to_char(birth-1, 'd') asc;

 

※ TO_CHAR을 이용해서 날짜에서 특정 포멧만 출력하는 또 다른 방법

1. 기존방법

 

   select  hiredate, to_char(hiredate, 'RRRR') as  년도,
                                        to_char(hiredate, 'MM')  as  달,
                                        to_char(hiredate,'DD')  as  일
                        from   emp;

 

2. 새로운방법

select  hiredate, extract(  year   from  hiredate )  as  년도,
                       extract( month  from  hiredate)  as  달,
                       extract(  day   from   hiredate )  as  일
     from  emp;

※ 추출할 수 있는 키워드 :  year, month, day, hour, minute, second

 

* 금융권쪽 데이터 분석 SQL 에서 많이 사용하는 방법.

select ename, to_char( sal ,'999,999')
     from emp;

select ename, to_char(sal, '$999,999')
	from emp;
    
    # 출력되는 자리의 갯수가 포멧에서 충분이 길어야 함-> 안그러면 #이 출력됨

문제 11. (금융권 sql) 이름, 월급 *12000000 을 출력하는데 금액단위를 읽기 편하도록 출력하시오.
 select ename, to_char(sal*12000000 , '999,999,999,999,999,999,999')
	from emp;​

예제 31번. 날짜형으로 데이터 유형 변환하기 (TO_DATE)
- 문자를 날짜로 변환하는 함수

- 어떤 환경에서든 정확하게 검색해내기 위한 함수 (어느 나라에 있든지. 어느 회사에 있던지 상관 없이 81년5월 1일에 입사한 사원의 이름과 입사일을 조회하는 SQL이 오류없이 출력되게 하시오.

select ename, hiredate
	from emp
    where hiredate = to_date('81/05/01','RR/MM/DD');

 

문제1. 여러분들의 데이터 베이스 날짜 형식을 프랑스 날짜 형식으로 변환하시오.
alter  session   set   nls_date_format='DD-MM-RR';

 select  * from  nls_session_parameters;

 NLS_DATE_FORMAT	DD-MM-RR

 select  ename, hiredate  from  emp;

 

문제2. 81년 11월 17일에 입사한 사원의 이름과 입사일을 출력하시오 (프랑스 시간으로)
select ename, hiredate
    from emp
    where hiredate='17-11-81';
    
 
 # 어느나라에 와도 상관없는 공식
select ename, hiredate
	from emp
    where hiredate = to_date('81/11/17','RR/MM/DD');
문제3. (복습문제) 1981년 2월 3일~ 1981년 7월 25일 사이에 입사한 사원들의 이름과 입사일을 출력하시오!
 select ename, hiredate
	from emp
    where hiredate between to_date('81/2/3','RR/MM/DD')
    and to_date('81/7/25','RR/MM/DD')  ;

문제4. 다시 우리나라 날짜 형식으로 되돌려 놓으시오
alter  session   set   nls_date_format='DD-MM-RR';
 select  * from  nls_session_parameters;
 NLS_DATE_FORMAT	RR-MM-DD
 select  ename, hiredate  from  emp;

 

문제5. (복습문제) 커미션이 NULL인사원들의 이름과 커미션을 출력하시오
 
 select ename, comm
    from emp
    where comm is null;
문제6. (복습) 위의 결과를 커미션이 null이 사원들은 0으로 출력하게 끔하시오.
 select ename, nvl(comm,0)
    from emp
    where comm is null;

 

문제7. (복습) 이름과 커미션을 출력하는데 커미션이 높은 사원부터 출력을 하는데 null을 위쪽이 아니라 아래쪽에 나오게 하시오.
 select ename, comm
    from emp
    order by comm nulls last;
문제8 (복습). 직업이 SALESMAN이 아닌 사원들의 이름과 입사일을 출력하는데 최근에 입사한 사원부터 출력하고 NULL은 아래쪽에 나오게 하시오.
 select ename, hiredate
    from emp
    where job!='SALESMAN'
    order by job nulls last;

 

★ 문제9. 이름과 커미션을 출력하는데 커미션이 높은 사원부터 출력을 하고 커미션이 null인사원들은 no comm으로  출력되게하시오.
select ename, replace(nvl(comm,'-1'),-1,'no comm')
from emp
order by comm desc nulls last;

 

'빅데이터 분석(with 아이티윌) > SQL' 카테고리의 다른 글

[빅데이터분석] SQL_TIL6  (0) 2024.05.17
[빅데이터분석] SQL_TIL5  (2) 2024.05.16
[빅데이터분석] SQL_TIL3  (0) 2024.05.13
[빅데이터분석]SQL_TIL2  (0) 2024.05.10
[빅데이터분석]SQL_TIL1  (0) 2024.05.10