날아라쩡글이의 블로그입니다.
상호연관서브쿼리, 분석함수, 계층, 권한분석 본문
728x90
반응형
상호연관 서브쿼리
- 쿼리내에 있는 쿼리
- 메인쿼리의 컬럼을 참조하는 서브쿼리
- 메인 쿼리의 조회된 각 행마다 한번씩 실행된다.
- 메인쿼리의 행의 결과가 10인 경우 서브쿼리도 10번 실행된다.
- 각 행마다 조건식이 실행된다.
- WHERE조건식의 연산결과가 TRUE로 판정되는 행만 최종적으로 조회된다.
- SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY
FROM EMPLOYEES X--사원을 조회, 행이 107개가 존재
WHERE SALARY > (SELECT AVG(SALARY)
FROM EMPLOYEES Y
WHERE Y.JOB_ID = X.JOB_ID--여기에 직종아이디가 들어가야함 , 외부 행의 107를 사용하고 싶음
--JOB_ID 의 평균에 대해서 계산을 각기 진행하는 것, 각 행마다 실행되는 것이 중요함
); - 원래는 TABLE만 가지고 쿼리가 실행된다. 그러나 상호연관의 서브쿼리는 외부의 테이블의 쿼리가 서브쿼리내에 사용되는 것을 뜻한다.
- 바깥쪽의 쿼리문의 처리 결과로 사용된다.
- 일반서브쿼리는 딱 1번만 실행된다.
-
많이 사용되는 곳
- 게시글의 댓글을 표시할 때 사용이된다.
- 그러나 게시글 테이블을 만들 때부터 댓글, 평점에 대한 칸을 추가해서 연산하여 반영시키는 것이 좋다.
- 게시글 테이블에 좋아요, COLUMN을 생성시켜서 INSERT시 변경될 수 있도록 변경하는 것이 중요하다.
- 상호연관쿼리는 쉽게 사용할 것이 아니다.
- 게시글의 댓글을 표시할 때 사용이된다.
TOP-N분석
- 테이블의 행을 특정 컬럼의 값을 기준으로 정렬했을 때 지정된 순위에 포함되는 행을 조회하는 것
- 급여를 많이 받는 사람 3명, 급여를 제일 적게 받는 사람 3명을 조회할 때 사용한다.
- 조건에 맞는 최상위 레코드 n개 혹은 최하위 n개를 조회한다.
- ROWNUM(의사 컬럼 : Pseudo column)
- 조회된 결과에 대해서 순번을 붙이는 가상의 컬럼
- SELECT ROWNUM, EMPLOYEE_ID, FIRST_NAME, SALARY
--ROWNUM으로 숫자가 부여됨을 확인, 숫자순위를 찾으면됨
FROM
(SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC) --내림차순으로 인라인뷰로 정렬함, 분석대상컬럼의 정렬기준이 된다.
WHERE ROWNUM <= 5;- ROWNUM은 가상의 테이블로 WHERE절에서 조회를 하는 것이 아니다.
- 순번이 매겨진 곳에서 가져오는 것이 아닌 가상의 테이블에서 순번이 IF문으로 매겨지면 5개까지만 가져오라는 WHERE절이다.
- SELECT절에서 ROWNUM은 제외해도 된다. 단지 보여주기 위함으로 작성된 부분이다.
- 상위를 ROWNUM으로 작성하면 2위가 5그룹으로 중복이 된다면 나머지 3그룹이 누락될 수 있다.
- 이부분을 극복하기 위해서 RANK가 등장했다.
- ROWNUM은 가상의 테이블로 WHERE절에서 조회를 하는 것이 아니다.
분석함수
- 테이블의 데이터를 특정 용도로 분석하여 결과를 반환하는 함수이다.
- 종류
- 순위함수 : RANK, DENSE_RANK, ROW NUMBER
- 집계함수 : SUM, MIN, MAX, AVG,COUNT
- 급여를 기준으로 내림차순으로 정렬한 다음 조회된 행에 순위 혹은 순번을 부여한다.
- SELECT SALARY,
RANK() OVER (ORDER BY SALARY DESC) "RANK",
DENSE_RANK() OVER(ORDER BY SALARY DESC) "DENSC_RANK",
ROW_NUMBER() OVER(ORDER BY SALARY DESC) "ROW_NUMBER"
FROM EMPLOYEES; -
RANC()
- 중간에 중복이 있으면 1,2,2,4 처럼 순위가 빠질 수 있다.
- 3등까지 출력시 3개가 출력된다.
- DENSE_RANK()
- 중복이 있어도 순위가 빠지지 않는다.
- 1,2,2,3,4,5처럼 연속적인 출력이 된다. 3등까지 출력시 4개가 출력된다.
- ROW_NUMBER()
- 중복과 순위가 상관없이 1부터 쭉 출력된다.
- 같은 값이 나오지는 않는다.
- 분석함수() OVER (PARITITION BY 컬럼명 ORDER BY 컬럼명 DESC ) "분석함수 별칭"
- PARTITION BY를 사용하면 지정된 컬럼명내에서 급여를 기준으로
내림차순으로 정렬한 다음 다음 조회된 행에 순번 혹은 순위를 부여한다. - SELECT DEPARTMENT_ID, SALARY,
RANK() OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) "RANK",
DENSE_RANK() OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) "DENSC_RANK",
ROW_NUMBER() OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) "ROW_NUMBER"
FROM EMPLOYEES; - ROW_NUMBER()을 사용한다면, PAGING처리시에 이 함수를 많이 사용한다.
- PARTITION BY를 사용하면 지정된 컬럼명내에서 급여를 기준으로
계층검색
- 계층형 쿼리를 이용해서 상/ 하 관계에 있는 데이터를 조회한다.
- 계층형 쿼리를 이용해서 트리구조의 형태로 결과를 조회할 수 있다.
- 일반적으로 조직도나 카테고리, 메뉴등의 정보는 트리구조가 가지고 있다.
- 특정 데이터의 하위데이터들을 조회한다.
- 상위 데이터에서 하위데이터로 검색할 경우
- EMPLOYEE _ ID = MANAGER_ID
- 부모님의 기본키 = 자식키의 외래키
- 특정 데이터의 상위데이터들을 조회한다.
- 자식키의 외래키 = 부모키의 기본키를 입력한다.
- 특정 데이터의 하위데이터들을 조회한다.
- SELECT LEVEL , EMPLOYEE_ID, FIRST_NAME
FROM EMPLOYEES
START WITH EMPLOYEE_ID = 205
CONNECT BY PRIOR MANAGER_ID = EMPLOYEE_ID;- 205번 직원의 상위에 위치하고 있는 매니저를 조회하기
- 좌측에 있는 컬럼명이 주 식별자이다.
- 주 식별자의 데이터를 우측에있는 컬럼명의 데이터를 조회하는 것이다.
- LEVEL
- 반환되는 행에서 최상위행을 의미한다.
- 부모행이 1, 자식행이 2,3,4..으로 값을 정한다.
- 상위로 올라갈 경우 자신이 1 부모의 수도 2,3,4로 올라간다.
- START WITH
- 계층검색의 시작지점을 의미한다.
- CONNECT BY PRIOR
- 부모행과 자식행과의 관계가 있다는 의미이다.
- 어떻게 연결할지 재정의하는 부분이다. 상위를 찾아간다.
- 하위로 한번에 가지 않고, 상위로 찾아가는 경우가 대다수이다.
- 브래드크럼
- 헨젤과 그레텔에서 길에 흔적을 남기기 위해 빵조각을 남긴 것을 유래한 것으로 UI의 기능을 이용하여 자신의 원래 자리로 돌아가는 것이다.
- 역순을 이용하여 상위로 돌아갈 수 있는 DATE를 표시할 수 이싿.
- 브래드크럼
- LEVEL과 CONNECT BY로 연속된 숫자/ 날짜를 생성할 수 있다.
- START WITH없이 CONNECT BY와 LEVEL이 존재한다.
- 이 방법을 이용하여 중간에 빠진 데이터의 날짜를 생성하여, 연속된 그래프, 매출확인, 일자별 매출확인,연속된 부분을 체크할 때 사용한다. -->GOOGLE CHART를 이용하여 그래프를 이용하자
- 연속된 숫자를 출력하기 (달)
- SELECT LPAD(LEVEL,2,'0') MONTH
FROM DUAL
CONNECT BY LEVEL <= 31;
- SELECT LPAD(LEVEL,2,'0') MONTH
- 특정날짜를 출력하기
- SELECT TO_DATE('2021/10/01','YYYY/MM/DD') + LEVEL -1
FROM DUAL
CONNECT BY LEVEL <= TO_DATE('2021/10/31') - TO_DATE('2021/10/01')+1;
- SELECT TO_DATE('2021/10/01','YYYY/MM/DD') + LEVEL -1
- 직원 급여1000달러 단위로 구분해서 급여별 인원수를 조회하기
- SELECT Y.SALARY, NVL(CNT, 0) NVL
FROM (SELECT TRUNC(SALARY,-3) SALARY , COUNT(*) CNT
FROM EMPLOYEES
GROUP BY TRUNC(SALARY, -3)) X,
--직원급여 구하는 공식
(SELECT LEVEL*1000 SALARY
FROM DUAL
--1000부터 24000까지나오는 공식을 LEVEL *1000으로 1을 1000부터로 만들었다.
CONNECT BY LEVEL <= 24 ) Y
WHERE X.SALARY(+) = Y.SALARY
ORDER BY 1;
- SELECT Y.SALARY, NVL(CNT, 0) NVL
사용자의 생성 및 권한 관리
- 권한
- 특정 SQL을 실행할 수 있는 권리이다.
- 시스템권한
- 데이터베이스, 테이블, 시퀀스, SELECT등을 엑세스 할 수 있는 권한이다.
- 데이터베이스의 관리자만 시스템 권한을 부여/ 회수 할 수 있다.
- 대표적인 시스템권한
- 시스템 권한은 200가지가 넘는다.
- SYSTEM계정 -> 다른 사용자 -> HR ->사용자 편집
- CREATE SESSION
- 데이터베이스의 연결할 수 있는 권한이다.
- CREATE TABLE
- 테이블을 생성할 수 있는 권한이다.
- 시스템 권한은 200가지가 넘는다.
- 객체 권한
- 데이터 베이스 객체의 내용을 조작할 수 있는 권한
- 사용자가 소유하고 있는 데이터 베이스 객체를 다른 사용자들이 엑세스 하거나 조작할 수 있게하는 권한을 의미한다.
- 사용자는 시스템 권한과 객체 권한이 필요하다.
- ROLE (롤)권한
- 사용자가 사용할 수 있는 시스템권한을 그룹화해놓은 것.
- 사용자가 부여할 수 있는 관련 권한을 하나로 묶어서 그룹화하고 이름을 부여한 것
- 롤을 사용하면 권한의 부여, 회수 , 유지관리가 쉬워진다.
- 시스템의 권한은 200여가지인 반면 롤권한은 20가지가 된다.
- GRANT 시스템권한,시스템권한,....TO 사용자;
- GRANT 롤,롤,롤, TO 사용자
- 일반 사용자에게 부여되는 필수적인 롤
- CONNECT ROLE
- 오라클에 접속할 수 있는 세션의 생성 권한
- 데이터 베이스와 연결하는 세션을 생성할 수 있는 시스템권한을 포함하고 있는 롤
- RESOURCE ROLE
- DML/DDL/DCL의 사용권한
- PL/SQL을 사용할 수 있는 권한
- 테이블, 뷰, 시퀀스, 인덱스를 생성하거나 조회할 수 있는 권한
- 가장 일반적인 권한들을 가지고 있다.
- 데이터베이스의 객체 (테이블, 뷰, 시퀀스, 인덱스 등 )의 생성/변경/삭제,
PL/SQL을 사용할 수 있는 권한등을 포함하고 있는 롤,
데이터베이스 사용자에게 필수적으로 필요한 시스템권한이 포함되어 있는 롤이다. - 일반 사용자를 생성하면 보통 connect,resource롤을 부여한다
- 일반적인 작업이 가능하기 때문
- DBA ROLE
- 모든 시스템의 권한이 부여된 롤
- 데이터 베이스 관리자에게만 부여해야한다.
- 세미프로젝트시 새로운 객체를 만들어서 깨끗한 계정에서 사용하도록하면 좋다.
- ROLE단위로 부여, 회수가 가능하다.
- CONNECT ROLE
- 스키마
- 테이블, 뷰, 시퀀스 등의 여러객체의 집합이다.
- 사용자의 이름을 말하기도 한다.
- 데이터베이스 사용자가 스키마를 소유하고 있으며, 사용자의 이름과 동일한 이름을 갖는다.
- 사용자의 이름으로 관리되고 있다
- 사용자의 이름으로 구분하기 때문에 집합의 구분이다.
- 다른 사용자가 소유하고 있는 객체를 엑세스할 때는 반드시 스키마를 명시해야한다.
- JAVA 클래스를 사용할 때처럼
- SELECT *
FROM HR.EMPLOYEES; - DB의 객체 구분이름 : 내가 만든 스키마 , 다른사람이 만든 스키마로 구분한다.
- 다른사용자가 소유하고 있는 객체로 스키마를 명시해야한다.
- 일반적으로 다른사용자의 DB객체를 엑세스권한을 부여해야 접근이 가능하다
- 소유자가 엑세스 허락으로 접근시 그 테이블의 소유자를 명시해야한다.
- 생략시 내 객체에서 찾기 때문에 다른 소유자의 이름을 꼭 명시해주어야한다.
- 스키마의 이름은
- 집합의 이름
- 사용자의 이름
- DB생성하는 쿼리 자체
- 생성하는 SQL문
- CREATE쿼리
- TABLE의 구조
- 인덱스의 구조
- 시퀀스의 구조
- CREATE쿼리
- 을 일컬어서 의미한다.
- 신규 사용자 생성하기
- 오라클 12버젼의 사용자 생성방식을 사용하도록 설정함
- ALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;
- CREATE USER 사용자명 IDENTIFIED BY 비밀번호; ---비밀번호는 대소문자를 구분한다.
동의어 (SYNONYN)
- 데이터 베이스 객체에 대한 별칭을 정의하는 것
- 다른 사용자의 데이터베이스 객체를 사용할 때 동의어를 정의해서 사용한다.
- HR에서 DB객체명을 변경할 경우
- 동의어 설정 부분만 변경하면 된다.
- 다른사람의 TABLE로 어떤상황이 올지 모르기 때문에 동의어로 사용한 부분을 바꿀 필요없이
동의어 부분만 변경해주면 된다. - DB LINK접근시 소유주, 서버명,SYNONYM을 작성하여, DB객체 사용시에 편리하다.
- 동의어를 사용하는 목적
- 복잡한 데이터베이스 객체명을 짧은 이름으로 대체할 수 있어서, SQL이 간단해진다.
- 참조하는 객체에 대한 SQL을 동의어로 사용해서 작성했다면, 참조하는 데이터베이스 객체명이 변경되더라도 동의어만 변경하면 사용중인 SQL문을 수정할 필요가 없다.
- 동의어가 정의되어 있으면, 데이터베이스 객체에 대한 소유주, 서버명, 데이터베이스 객체의 실제 이름등을 모르더라도 사용할 수 있다.
- 정의하는 방법
- CREATE SYNONYM 별칭
FOR 데이터베이스 객체;
- CREATE SYNONYM 별칭
반응형
'중앙 HTA (2106기) story > JDBC story' 카테고리의 다른 글
데이터 건수가 0건 일때, null이라도 1건의 값이 나오게 하는 방법 (2) | 2024.01.26 |
---|---|
트랜잭션, 에러찾기 tip,select문 tip (0) | 2021.11.02 |
VIEW,인덱스, 서브쿼리 (0) | 2021.10.29 |
DDL (0) | 2021.10.27 |
join, 정규화 간단 (0) | 2021.10.27 |
Comments