일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 총과 카드만들기
- max
- 빅데이터
- count
- %in%
- 여러 데이터 검색
- 막대그래프
- Sum
- 정보획득량
- 팀스파르타
- 빅데이터분석
- 데이터분석
- 그래프시각화
- 단순회귀 분석
- 불순도제거
- 그래프 생성 문법
- 회귀분석 알고리즘
- merge
- if문 작성법
- 히스토그램 그리기
- 순위출력
- Intersect
- 상관관계
- Dense_Rank
- sql
- 회귀분석
- difftime
- sqld
- loop 문
- 데이터분석가
- Today
- Total
ch0nny_log
[빅데이터분석] SQL_TIL4 본문
** DAY3 복습
[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;
** 오라클 실습용 테이블만들기
예제 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 |