전체 방문자
오늘
어제
21종
종이의 코딩 공부방
21종
  • 분류 전체보기 (171)
    • JAVA (64)
    • Springboot (46)
      • 블로그만들기 (45)
    • Database (60)
      • Oracle (60)
    • 프로젝트 3 (CELOVER) (0)
    • 개발서버 구축 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
21종

종이의 코딩 공부방

Database/Oracle

[Oracle] 종합(~JOIN)_실습문제

2023. 7. 12. 19:55

-- 1. 사원 테이블의 모든열 출력

SELECT * FROM EMP;



-- 2. 사원테이블의 사원번호, 이름, 월급 출력 (별칭 지어서)

SELECT EMPNO AS "사원번호", ENAME AS "이름", SAL AS "월급"
FROM EMP;



-- 3. 사원테이블의 이름과 월급을 서로 붙여서 출력 (출력예시 ) KING5000)

SELECT ENAME || SAL
FROM EMP;



-- 4. 사원테이블의 이름과 월급을 서로 붙여서 출력 (출력예시) KING의 월급은 5000입니다.)

SELECT ENAME || '의 월급은 ' || SAL || '입니다.'
FROM EMP;



-- 5. 사원테이블의 이름과 직업을 서로 붙여서 출력 (출력예시) KING의 직업은 PRESIDENT 입니다.)

SELECT ENAME || '의 직업은 ' || JOB || '입니다.'
FROM EMP;



-- 6. 사원테이블에서 직업을 출력하는데 중복된 데이터를 제외하고 출력해보기 (두가지 버전)
-- 한가지 방법은 수업시간에 했지만, 다른방법은 수업시간에 안함 => 검색해서 찾아보기 

 

--1. DISTINCT

SELECT DISTINCT JOB
FROM EMP;


--2. GROUP BY

SELECT JOB
FROM EMP
GROUP BY JOB;



-- 7. 이름과 월급을 출력하는데 월급이 낮은 사원부터 출력  


-- 7-1. 별칭붙이지 않은 버전

SELECT ENAME, SAL
FROM EMP
ORDER BY SAL;


-- 7_2. 별칭붙인버전 (ORDER BY 절에)

SELECT ENAME AS "이름", SAL AS "월급"
FROM EMP
ORDER BY SAL;


-- 7_3. 컬럼순서로 정렬한 버전

SELECT ENAME, SAL
FROM EMP
ORDER BY ROWNUM;


-- 8. 월급이 3000인 사원의 이름과, 월급, 직업 출력

SELECT ENAME, SAL, JOB
FROM EMP
WHERE SAL = 3000;


-- 9. 월급이 3000이상인 사원의 이름과, 월급, 직업 출력

SELECT ENAME, SAL, JOB
FROM EMP
WHERE SAL >= 3000;


-- 10. 이름이 SCOTT인 사원의 이름, 월급, 직업, 입사일, 부서번호 출력

SELECT ENAME, SAL, JOB, HIREDATE, DEPTNO
FROM EMP
WHERE ENAME = 'SCOTT';


-- 11. 연봉이 3600 이상인 사원들의 이름과 연봉 출력

SELECT ENAME, SAL * 12
FROM EMP
WHERE SAL * 12 >= 36000;


-- 12. 부서번호가 10번인 사원들의 이름, 월급, 커미션, 월급 + 커미션 출력

SELECT ENAME, SAL, NVL(COMM,0), SAL + NVL(COMM,0)
FROM EMP
WHERE DEPTNO = 10;


-- 13. 월급이 1000에서 3000 사이인 사원들의 이름과 월급 출력 (비교연산자, BETWEEN AND 구문 두가지 버전 다 작성)


--1. 비교연산자

SELECT ENAME, SAL
FROM EMP
WHERE SAL >= 1000 AND SAL <= 3000;


--2. BETWEEN A AND B

SELECT ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 3000;


-- 14. 이름의 첫글자가 S로 시작하는 사원들의 이름과 월급 출력

SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE 'S%';


-- 15. 이름의 두번째 철자가 M인 사원의 이름을 출력

SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE '_M%';


-- 16. 이름의 끝 글자가 T로 끝나는 사원들의 이름을 출력

SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE '%T';


-- 17. 이름에 A를 포함하고 있는 사원들의 이름 출력

SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE '%A%';


-- 18. 커미션이 NULL인 사원들의 이름과 커미션 출력

SELECT ENAME, COMM
FROM EMP
WHERE COMM IS NULL;


-- 19. 직업이 SALESMAN, ANALYST, MANAGER인 사원들의 이름, 월급,직업 출력 => (OR, IN 사용 두가지버전으로)

--1. OR

SELECT ENAME, SAL, JOB
FROM EMP
WHERE JOB = 'SALESMAN' OR JOB = 'ANALYST' OR JOB = 'MANAGER';


--2. IN

SELECT ENAME, SAL, JOB
FROM EMP
WHERE JOB IN ('SALESMAN', 'ANALYST', 'MANAGER');


-- 20. 직업이 SALESMAN이고 월급이 1200 이상인 사원들의 이름, 월급, 직업 출력

SELECT ENAME, SAL, JOB
FROM EMP
WHERE JOB = 'SALESMAN';


-- 21. 사원테이블의 이름 출력시 첫번째 컬럼은 이름을 대문자로 출력하고, 두번째 컬럼은 이름을 소문자로 출력하고, 세번째 컬럼은 이름의 첫 번째 철자는 대문자로 하고 나머지는 소문자로 출력

SELECT UPPER(ENAME), LOWER(ENAME), INITCAP(ENAME)
FROM EMP;


-- 22. 이름이 scott 인 사원의 이름과 월급을 조회하는 쿼리 => where절에 scott 글자를 소문자로 작성할 것! 1행 나와야함

SELECT * FROM EMP;
SELECT ENAME, SAL
FROM EMP
WHERE ENAME = UPPER('scott');


-- 23. 영어단어 SMITH에서 SMI만 잘라서 추출

SELECT SUBSTR('SMITH',1,3) FROM DUAL;


-- 24. 사원들의 이름과 이름의 철자개수를 출력

SELECT ENAME, LENGTH(ENAME)
FROM EMP;


-- 25. 가나다라마 의 글자수 출력

SELECT LENGTH('가나다라마') FROM DUAL;


-- 26. 가나다라마의 바이트 수 출력

SELECT LENGTHB('가나다라마') FROM DUAL;


-- 27. 사원이름 SMITH에서 알파벳 철자 M이 몇번째 자리에 있는지 출력

SELECT INSTR(ENAME,'M')
FROM EMP
WHERE ENAME = 'SMITH';


-- 28. abcdefg@naver.com 이메일에서 naver.com만 출력 (INSTR , SUBSTR 두가지 버전)

--1. INSTR

SELECT SUBSTR('abcdefg@naver.com',INSTR('abcdefg@naver.com', 'naver.com')) FROM DUAL;


--2. SUBSTR

SELECT SUBSTR('abcdefg@naver.com',9,9) FROM DUAL;


-- 29. 이름과 월급을 출력하는데, 월급을 출력할 때 숫자 0을 *(별표)로 출력 (KING, 5***) 

SELECT ENAME, REPLACE(SAL,0,'*')
FROM EMP;


-- 30. TEST_ENAME 이라는 테이블 생성 (컬럼 1개 : ENAME VARCHAR2(10) )

CREATE TABLE TEST_ENAME(
ENAME VARCHAR2(10)
);


-- 31. TEST_ENAME 이라는 테이블에 3개의 샘플데이터 넣기 (김시연, 차은우, 주지훈)

INSERT INTO TEST_ENAME VALUES ('김시연');
INSERT INTO TEST_ENAME VALUES ('차은우');
INSERT INTO TEST_ENAME VALUES ('주지훈');


-- 32. COMMIT; 실행

COMMIT;


-- 33. 이름의 두번째 자리의 한글을 *로 출력 (김*연, 차*우, 주*훈)

SELECT CONCAT(SUBSTR(ENAME,1,1),'*' || SUBSTR(ENAME,3,1)) FROM TEST_ENAME;


-- 34. 이름과 월급을 출력하는데 월급컬럼의 자리수를 10자리로 하여 월급 출력하고, 남은자리는 *로 채워서 출력

SELECT ENAME, RPAD(SAL,10,'*')
FROM EMP;


-- 35. 첫번째 컬럼은 smith 철자를 출력하고, 두번째 컬럼은 영어단어 smith에서 s를 잘라서 출력하고, 세번째 컬럼은 smith에서 h잘라서 출력하고, 네번째 컬럼은 영어단어 smiths의 양쪽 s를 제거하여 출력 ( smith, mith, smit, mith ) =>  배웠던 함수 활용

SELECT 'smith', REPLACE('smith','s'),REPLACE('smith','h'),REPLACE('smiths','s') FROM DUAL;


-- 36. 이름이 JACK인 사원의 이름과 월급을 조회 = >안나옴.. 왜안나올까? 공백이있음 => 나오게 출력 

SELECT ENAME, SAL
FROM EMP
WHERE TRIM(ENAME) ='JACK';


-- 37. 876.567 숫자 출력시 소수점 두 번째 자리인 6에서 반올림해서 출력

SELECT ROUND(876.567,1) FROM DUAL;


-- 38. 876.567 숫자 출력시 소수점 두 번째 자리인 6과 그 이후의 숫자들을 모두 버리고 출력

SELECT TRUNC(876.567,1) FROM DUAL;


-- 39. 숫자 10을 3으로 나눈 나머지값 구하기

SELECT MOD(10,3) FROM DUAL;


-- 40. 이름을 출력하고 입사한 날짜부터 오늘까지 총 몇달을 근무했는지 출력

SELECT ENAME, FLOOR(MONTHS_BETWEEN(SYSDATE, HIREDATE))
FROM EMP;


-- 50. 2023년 6월 30일로부터 100달 뒤의 날짜는 어떻게 되는지 출력

SELECT ADD_MONTHS(TO_DATE(20230630),100) FROM DUAL;


-- 51. 2023년 1월 1일 부터 바로 돌아올 월요일의 날짜가 어떻게 되는지 출력

SELECT NEXT_DAY(TO_DATE(20230101), '월') FROM DUAL;


-- 52. 오늘부터 앞으로 돌아올 화요일의 날짜를 출력

SELECT NEXT_DAY(SYSDATE, '화') FROM DUAL;


-- 53. 오늘부터 100달 뒤에 돌아오는 월요일의 날짜를 출력

SELECT NEXT_DAY(ADD_MONTHS(SYSDATE,100),'화') FROM DUAL;


-- 54. 1990년 5월 22일 해당 달의 마지막 날짜가 어떻게 되는지 출력

SELECT LAST_DAY(TO_DATE(19900522)) FROM DUAL;


-- 55. 오늘부터 이번달 말일까지 총 며칠 남았는지 출력

SELECT LAST_DAY(SYSDATE) - SYSDATE FROM DUAL;


-- 56. 이름이 KING인 사원의 이름, 입사일, 입사한 달의 마지막 날짜 출력

SELECT ENAME, HIREDATE, LAST_DAY(HIREDATE) 
FROM EMP
WHERE ENAME = 'KING';


-- 57. 이름이 SCOTT인 사원의 이름과 입사한 요일을 출력하고 SCOTT의 월급에 천 단위를 구분할 수 있는 콤마(,) 붙여서 출력

SELECT ENAME, TO_CHAR(HIREDATE,'DAY'),TO_CHAR(SAL,'9,999') 
FROM EMP
WHERE ENAME = 'SCOTT';


-- 58. 1981년도에 입사한 사원의 이름과 입사일 출력 => TO_CHAR 이용하여

SELECT ENAME, HIREDATE
FROM EMP
WHERE TO_CHAR(HIREDATE,'YYYY') = 1981;


-- 59. 전체사원의 이름과, 입사연도, 입사달, 입사요일 출력

SELECT ENAME, HIREDATE, EXTRACT(MONTH FROM HIREDATE), TO_CHAR(HIREDATE,'DAY')
FROM EMP;


-- 60. 전체사원의 이름과, 월급*200 출력 => 콤마찍어서

SELECT ENAME, TO_CHAR(SAL * 200,'999,999,999') FROM EMP;


-- 61. 위의 예제에다가 원화붙여서 출력

SELECT ENAME, TO_CHAR(SAL * 200,'L999,999,999') FROM EMP;


-- 62. 이름과 커미션 출력. 커미션 NULL일 경우 0으로 출력

SELECT ENAME, NVL(COMM,0) FROM EMP;


-- 63. 사원번호와 사원번호가 짝수인지 홀수인지 출력 (7839, 홀수)

SELECT EMPNO, DECODE(MOD(EMPNO,2),1,'홀수',0,'짝수') FROM EMP;


-- 64. 사원의 이름과 직업과 보너스를 출력. 직업이 SALESMAN이면 보너스를 5000이라고 출력하고 그 외는 2000이라고 출력 

SELECT ENAME, JOB, DECODE(JOB,'SALESMAN',5000,2000) AS "보너스" FROM EMP;


-- 65. 이름, 직업,월급, 보너스 출력. 보너스는 월급이 3000이상이면 500. 2000이상~3000 보다 작으면 300. 월급이 1000이상~2000 보다 작으면 200 나머지는 0 => CASE WHEN THEN 구문

SELECT ENAME, SAL, 
CASE WHEN SAL >= 3000 THEN 500
     WHEN SAL >= 2000 THEN 300
     WHEN SAL >= 1000 THEN 200
     ELSE 0 END AS 보너스
FROM EMP;


-- 66. 직업이 SALESMAN인 사원들 중 최대월급 출력

SELECT * FROM EMP;
SELECT * FROM DEPT;
SELECT ENAME,MAX(SAL)
FROM EMP
WHERE JOB = 'SALESMAN'
GROUP BY ENAME;


-- 67. 각 부서별 최대 급여 출력

SELECT DNAME, MAX(SAL)
FROM EMP
JOIN DEPT USING (DEPTNO)
GROUP BY DNAME;


-- 68. 직업, 직업별 최소 월급 출력. 단, SALESMAN은 제외하고, 직업별 최소월급이 높은것 부터 출력

SELECT JOB, MIN(SAL) AS "최소월급"
FROM EMP
GROUP BY JOB
HAVING JOB != 'SALESMAN'
ORDER BY 최소월급 DESC;


-- 69. 직업과 직업별 월급의 총합을 출력. 단, SALESMAN은 제외하고,  총월급이 4000 이상인 직업만 출력

SELECT JOB, SUM(SAL)
FROM EMP
GROUP BY JOB
HAVING JOB != 'SALESMAN'
AND SUM(SAL) >= 4000;


-- 70. 직업이 ANALYST, MANAGER 인 사원들의 이름, 직업, 월급, 월급의 순위 출력 (1위가 2명일시 다음은 바로 3위)

SELECT ENAME, JOB, SAL, RANK() OVER(ORDER BY SAL DESC)
FROM EMP
WHERE JOB IN ('ANALYST','MANAGER');


-- 71. 직업이 ANALYST, MANAGER 인 사원들의 이름, 직업, 월급, 월급의 순위 출력 (1위가 2명일시 다음은 바로 2위)

SELECT ENAME, JOB, SAL, DENSE_RANK() OVER (ORDER BY SAL DESC)
FROM EMP
WHERE JOB IN ('ANALYST','MANAGER');


-- 72. 사원테이블에서 사원번호, 이름, 직업, 월급을 출력. 단, 월급높은 상위 5개의 행만 출력

SELECT EMPNO, ENAME, JOB, SAL
FROM(SELECT *
        FROM EMP
        ORDER BY SAL DESC)
WHERE ROWNUM <= 5;


-- 73. 사원테이블과 급여테이블을 조인하여 사원명, 급여, 급여등급 출력 (ANSI, ORACLE)

SELECT * FROM SALGRADE;
SELECT * FROM EMP;

 

 

--1. ORACLE

SELECT EMPNO, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;


--2. ANSI

SELECT EMPNO, SAL, GRADE
FROM EMP
JOIN SALGRADE ON SAL BETWEEN LOSAL AND HISAL;


-- 74. 사원테이블과 부서테이블을 조인하여 이름과 부서위치 출력(단, BOSTON 도 같이 출력되게 해볼 것)(ANSI, ORACLE)


--1. ORACLE

SELECT ENAME, LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO;


--2. ANSI

SELECT ENAME, LOC
FROM EMP 
RIGHT JOIN DEPT USING (DEPTNO);


-- 75. 사원 테이블을 셀프조인 하여 이름, 직업, 해당사원의 관리자 이름과 관리자의 직업 출력(ANSI, ORACLE)

SELECT * FROM EMP;


-- 1. ANSI

SELECT A.ENAME, A.JOB, B.ENAME AS "관리자 이름", B.JOB AS "관리자 직업"
FROM EMP A, EMP B
WHERE A.MGR = B.EMPNO;


-- 2. ORACLE

SELECT A.ENAME, A.JOB, B.ENAME AS "관리자 이름", B.JOB AS "관리자 직업"
FROM EMP A
JOIN EMP B ON (A.MGR = B.EMPNO);


-- 76. 사원테이블과 부서테이블 조인하여 이름, 직업,월급,부서위치 출력 (단, 사원명 JACK의 데이터와 부서위치 BOSTON의 데이터 둘다 나와야함)

SELECT * FROM EMP;
SELECT * FROM DEPT;
SELECT ENAME, JOB, SAL, LOC
FROM EMP
FULL JOIN DEPT USING(DEPTNO);
    'Database/Oracle' 카테고리의 다른 글
    • [Oracle] 순위를 매기는 함수 (Window Function)
    • [Oracle] 서브쿼리 (Subquery)
    • [Oracle] 함수(FUNCTION)_실습문제
    • [Oracle] JOIN (5) 다중 조인
    21종
    21종
    코딩 공부한 것 정리하려고 만든 블로그

    티스토리툴바