개발/교육

(데이터베이스)23일차

kakk789 2022. 4. 27. 18:01

ROWNUM

  • 오라클 내부적으로 생성되는 가상 컬럼으로 SQL 조회 결과의 순번을 나타냄
  • SELECT 결과에 행 번호를 매겨주는 키워드
1. ROWNUM 단일로만 사용 -- 행번호가 같이 출력됨

2. ROWNUM ..... WHERE ROWNUM <=3 -- 행번호와 3행만 출력됨

3. WHERE ROWNUM <=3 -- 속성에 ROWNUM 안쓰면 행번호는 출력 안되고 3행만 출력됨

2줄만 출력하는 예씨

  • ROWNUM과 ORDER BY를 같이 사용할 때에는 order by 결과를 먼저 동작하도록 하기 위하여 서브쿼리를 사용해야함

예시1

	SELECT rownum, custid, NAME 
	FROM (SELECT custid,NAME FROM customer ORDER BY CUSTID DESC);

예시2

1. 1번은 SELECT가 선 진행하여 5줄 뽑아 온 후에 ORDER BY 가 실행

2. 2번은 ORDER BY 선 진행 후에 정렬된 데이터 기준으로 5줄을 출력

부속질의 (서브쿼리)

스칼라 부속질의 

1. SELECT 절

  • 단일 행이 오도록 해야함
  • 상관/비상관 서브쿼리를 사용하여 진행 (서브 쿼리의 where 절로 상관서브쿼리임을 나타내는 것임)
  • 당연한 건데, 상관서브쿼리를 이용한 이유는 단일 값을 리턴 받기 위함.

상관 서브쿼리 사용

(해당 예시의 경우 join을 해도 되지만 상관서브쿼리를 이요하여 진행하였음)

	SELECT custid , 
		(SELECT NAME FROM customer c WHERE c.custid= o.CUSTID) "name",
	SUM(saleprice) FROM orders o GROUP BY custid;

2. UPDATE 절

	UPDATE orders 
	SET bookname = 
	(SELECT bookname FROM book WHERE book.BOOKID = orders.BOOKID)

인라인 뷰 ( FROM 절 )

  • FROM 절에서 결과를 뷰(view)로 반환하기 때문에 인라인 뷰라고 함.

중첩질의 ( WHERE 절 )

  • 결과를 한정시 키기 위해 사용

중첩 질의 연산자

비교 = , > , < , >=, <=, <>
집합  IN, NOT IN
한정  ALL, SOME(ANY)
존재  exists, not exists

다중행 연산자란?

  • 서브쿼리가 where절에 사용될 때에 서브쿼리의 건수가 여러 건 일 때 사용하는 연산자로 in, not, in all some, any 등이 존재
  • all, any(some) 서브쿼리의 개수가 여러개 일 때 사용 (>, <, >=, <=)

all

  • 3번 고객의 반환 'saleprice' 반환 값이 6개 나오고 all 연산자를 사용함으로써 해당 반환 값을 모두 검사

예시 - 3번고객이 주문한 금액보다 큰 금액을 표현

EXISTS, NOT EXISTS

  • 서브쿼리에 데이터의 존재 유무를 확인
  • EXISTS 서브쿼리에 데이터가 있으면 메인쿼리 동작
  • NOT EXISTS 서브쿼리에 데이터가 없으면 메인쿼리 동작

뷰(VIEW)

  • 하나 이상의 테이블을 합하여 만든 가상의 테이블
  • 자주 사용하는 복잡한 SQL문을 미리 VIEW로 만들어서 사용
CREATE VIEW 뷰이름[(열이름 [ ,....n])]
AS SELECT 문

장점

  • 편리성 및 재사용성 : 자주 사용하는 복잡한 SQL문을 미리 VIEW로 만들어서 사용
  • 보안성 : 각 사용자 별로 필요한 데이터만 선별하여 보여줄 수 있음. 중요한 질의의 경우 질의 내용을 암호화 할 수 있음 (개인정보, 급여,건강 같은 민감 정보를 제외한 테이블을 만들어 사용)
  • 독립성 제공 : 미리 정의된 뷰를 일반 테이블처럼 사용할 수 있음

뷰 (VIEW) 생성화면

VIEW로 INSERT, UPDATE, DELETE

  • VIEW 로 레코드를 INSERT, UPDATE, DELETE 를 하게 되면 부모 테이블로 추가/수정/삭제가 된다.
  • 만약,  VIEW 생성 시에 조건에 맞지않는 레코드를 추가하게 되면 모테이블에는 추가는 되는데, VIEW 에는 조건식이 맞지 않기 때문에 당연히 나타나지 않는다.

조건에 맞지 않는 VIEW 생성
실제 뷰테이블에 '문재인' 추가 X

WITH CHECK OPTION

  • 뷰 생성시에 사용한 조건식에 맞는 레코드만 추가 /수정 하도록 하기 위한 옵션
CREATE VIEW 뷰이름 AS SELECT ~~ 조건식 WITH CHECK OPTION;

WITH READ ONLY

  • 읽기만 가능한 뷰 생성 하는 옵션
CREATE VIEW 뷰이름 AS SELECT ~~ 조건식 WITH READ ONLY;

읽기 전용 VIEW에 데이터 추가 할 경우 에러 발생함

쿼리문 실행 순서

FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 
반응형