KH정보교육원_웹 프로그래머 과정/Oracle DB
Database 기본6
calvin9150
2021. 3. 9. 21:24
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | ------------------ 2021-03-09 -- 스칼라 서브쿼리 : 상관서브쿼리, RESULTSET이 무조건 단일행인 것 -- 컬럼 작성하는 곳에 사용가능. WHERE절에서 사용 가능 -- 모든 사원의 매니저 이름 조회 SELECT EMP_ID, EMP_NAME, MANAGER_ID, NVL((SELECT EMP_NAME FROM EMPLOYEE M WHERE E.MANAGER_ID=M.EMP_ID ), '없음') AS 매니저이름 FROM EMPLOYEE E; -- 사원명, 부서코드, 부서별 평균임금 조회 SELECT EMP_NAME, DEPT_CODE, TO_CHAR(FLOOR((SELECT AVG(SALARY) FROM EMPLOYEE WHERE DEPT_CODE=E.DEPT_CODE)),'L999,999,999') FROM EMPLOYEE E; -- 자신의 부서의 평균급여보다 많이 받는 사원을 조회 SELECT EMP_NAME, DEPT_TITLE, SALARY FROM EMPLOYEE E JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID) WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEE EE WHERE EE.DEPT_CODE=E.DEPT_CODE); -- 인라인 뷰 : FROM절에 서브쿼리 사용한 것 -- 실제 물리적테이블에 있는 값이 아닌 가상의 테이블 값 -- INLINE VIEW : 1번만 사용할 수 이쓴 테이블로 쓰이는 서브 쿼리문 -- STORED VIEW : 테이블로 쓰이는 서브쿼리문을 저장하고 이름을 부여해서 재호출 가능 -> VIEW -- 여사원의 사번, 사원명, 부서코드, 성별 조회 SELECT EMP_ID, EMP_NAME, DEPT_CODE, DECODE(SUBSTR(EMP_NO,8,1),'1','남',2,'여') AS 성별 FROM EMPLOYEE WHERE DECODE(SUBSTR(EMP_NO,8,1),'1','남',2,'여')='여'; -- INLINE VIEW로 처리 SELECT * FROM (SELECT EMP_ID, EMP_NAME, DEPT_CODE, DECODE(SUBSTR(EMP_NO,8,1),'1','남',2,'여') AS 성별 FROM EMPLOYEE) WHERE 성별='여'; -- TOP-N 분석 : 순위를 부여하는 것 -- 급여를 많이 받는 사원 1~3위 조회 SELECT EMP_NAME, SALARY FROM EMPLOYEE ORDER BY SALARY DESC; -- 이건 순위컷 불가 -- 순위컷 SELECT ROWNUM, EMP_NAME, SALARY FROM EMPLOYEE WHERE ROWNUM <= 3; -- 급여 5~10위 조회 SELECT * FROM ( SELECT ROWNUM AS RNUM, E.* FROM (SELECT EMP_NAME, SALARY FROM EMPLOYEE ORDER BY SALARY DESC) E ) WHERE RNUM BETWEEN 5 AND 10; -- ROWNUM으로 비교하면 1부터 시작함. -- 위에건 게시판 구성할 때, PAGING 처리에 사용하는 SQL문이다. -- D5부서 고연봉 3명 조회 SELECT * FROM ( SELECT ROWNUM AS RNUM, E.* FROM ( SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE, SALARY, (SALARY + (SALARY * NVL(BONUS, 0))) * 12 AS 연봉 FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID WHERE DEPT_CODE='D5' ORDER BY 4 DESC ) E ) WHERE RNUM BETWEEN 1 AND 3; -- 함수 이용해서 순위 매기기 -- RANK() OVER : 각 ROW에 순서 부여 SELECT * FROM ( SELECT EMP_NAME, SALARY, RANK() OVER (ORDER BY SALARY DESC) AS 순위 FROM EMPLOYEE ) WHERE 순위 BETWEEN 1 AND 3; -- DENSE_RANK() : 중복값이 있을 때 번호 뛰어넘지 않음 SELECT RANK() OVER (ORDER BY SALARY) AS 순위, EMP_NAME, SALARY, DENSE_RANK() OVER (ORDER BY SALARY) AS DENSE순위 FROM EMPLOYEE; -- 계층형 쿼리 : 각 ROW별 연결할 수 있는 컬럼 필요 -- 댓글, 대댓글 사용할 때 이용하는 쿼리문이다. SELECT EMP_ID, EMP_NAME, MANAGER_ID FROM EMPLOYEE; SELECT EMP_ID, EMP_NAME, MANAGER_ID FROM EMPLOYEE START WITH EMP_ID=200 CONNECT BY PRIOR EMP_ID=MANAGER_ID; SELECT LEVEL ||''||LPAD('',(LEVEL-1)*5,'' )||EMP_NAME|| NVL2(MANAGER_ID,'('||MANAGER_ID||')','') AS 조직도 FROM EMPLOYEE --START WITH EMP_ID=200 START WITH MANAGER_ID IS NULL CONNECT BY PRIOR EMP_ID=MANAGER_ID; -- ORACLE 의 데이터형 -- VARCHAR2 : 가변형 문자열 타입으로, 대입된 데이터만큼 공간 확보 -- CHAR : 고정형 문자열 타입으로 길이만큼 공간을 확보 CREATE TABLE TBL_STR( A CHAR(6), B VARCHAR2(6) ); SELECT * FROM TBL_STR; INSERT INTO TBL_STR VALUES ('ABC','AAA'); SELECT LENGTHB(A), LENGTHB(B) FROM TBL_STR; -- NUMBER : 모든 숫자형 -- NUMBER([PRECISION, SCALE]) -- PRECISON : 표현할 수 있는 전체 자리수 -- SCALE : 소수점 이하 자리수 CREATE TABLE TBL_NUM( A NUMBER, B NUMBER(5), C NUMBER(5,1), D NUMBER(5,-2) ); SELECT*FROM TBL_NUM; INSERT INTO TBL_NUM VALUES(123.1123,213.1123,123.3144,213.1231); CREATE TABLE TBL_DATE( BIRTHDAY DATE, DAY TIMESTAMP ); INSERT INTO TBL_DATE VALUES (SYSDATE, SYSTIMESTAMP); SELECT*FROM TBL_DATE; INSERT INTO TBL_DATE VALUES ('1920/11/23', '1999/11/12'); -- 기본 테이블 생성 -- CREATE TABLE 테이블명 (컬럼명 자료형, 컬럼명 자료형.............); CREATE TABLE MEMBER( MEMBER_ID VARCHAR2(20), MEMBER_PWD VARCHAR2(20), MEMBER_NAME VARCHAR2(20) ); -- 테이블 컬럼에 COMMENTS 설정하기 -- COMMENT ON COLUMN 테이블.컬럼명 IS 코멘트내용 COMMENT ON COLUMN MEMBER.MEMBER_ID IS '회원아이디'; COMMENT ON COLUMN MEMBER.MEMBER_PWD IS '회원비번'; -- 코멘트 포함 테이블 조회 SELECT * FROM USER_COL_COMMENTS WHERE TABLE_NAME='MEMBER'; DROP TABLE TBL_STR; -- 테이블 삭제 SELECT*FROM MEMBER; | cs |