JOIN
- Left join이라고 말하면 Left outer join을 말하는 것.
- ORACLE에서 OUTER JOIN 구문을 + 기호로 사용하여 처리할 수 있음
- JOIN에서 ON을 통해 조건을 걸 수 있음
M*N cartesian product(카티시안곱) => CROSS JOIN
SELF JOIN은 하나의 테이블에서 두개의 칼럼이 연관관계를 가질 때 사용
동일 테이블 조인을 수행하면 테이블과 칼럼이름이 모두 동일하기 때문에 식별을 위해서 반드시 별칭ALIAS를 사용
EXISTS
EXISTS(~~~) : 괄호 안 조건에 충족하는 결과를 반환
NOT EXISTS(~~~) : 괄호 안 조건에 충족하는 결과를 제외한 모든 것을 반환
SELECT A, B FROM TAB1 EXCEPT
SELECT A, B FROM TAB2
=> 묶여있던 SELECT A, B를 NOT IN으로 바꿔서 표현할때 A와 B를 동시에 진행해야 함.
만약, A에서 NOT IN~~ , B에서 NOT IN~~~ 이런식으로 따로따로 NOT IN을 진행하면 값이 달라짐.
IN과 EXISTS의 차이
IN : 모든 값을 확인한 뒤, 수행 중단
EXISTS : 해당 ROW에 조건만족하는 결과의 존재여부를 확인 후, 수행 중단
EXCEPT
- 차집합(LEFT/RIGHT OUTER ONLY와 같은)에서 연산으로 NOT IN 또는 NOT EXISTS로 대체하여 처리 가능
개념정리
UNION : 여러개 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만듦(=중복제거)
UNION ALL : 중복된 행이 포함된 합집합(같은내용 여러개 일 수도)
INTERSECT : 여러 SQL문의 교집합. 중복된 행은 하나의 행(=중복값없음)
EXCEPT : 중복행은 하나로(일부 DB에서는 MINUS를 사용) => SQL가 - SQL나 = SQL가에서 나를뺀 차집합
UNION은 UNION
INTERSECTION은 INTERSECTION
DIFFERENCE는 EXCEPT (ORACLE은 MINUS)
PRODUCT는 CROSS JOIN 으로 기능 구현
UNION ALL
- UNION ALL을 사용하는 경우, ALIAS(표 속성명이나 이름을 나타내는 별칭)은 첫번쨰 SQL모듈 기준으로 표시되고 정렬 기준은 마지막 SQL모듈에 표시
- UNION ALL 이후 UNION을 수행하게되면 UNION이 중복값을 제거하고 정렬이 발생함.
- 중복레코드를 유지하는 UNION ALL은 ORDER BY가 없으면 정렬발생하지 않음.
(UNION은 중복값이 없어서 자동으로 정렬을 하게 됨)
ORACLE 계층형 질의
- START WITH절은 계층구조의 시작점
- 순방향 : 부모기준 자식 정렬
- ORDER SIBLINGS BY : 형제 노드 사이 정렬
- 루트 노드 LEVEL 값은 1
* START WITH에서 부모데이터의 조건을 지정
* ORDER SIBLINGS BY는 형제노드(동일레벨에서)로 수행
PRIOR
- CONNECT BY에서 사용
- PRIOR 부모 = 자식 => 자식 ⊃ 부모 (역방향)
- PRIOR 자식 = 부모 => 자식 ⊂ 부모 (순방향)
계층형질의(Hierachival Query)
계층형 데이터가 존재할 때, 데이터 조회를 위해 계층형질의(Hierachival Query)이용
계층형 데이터? 동일 테이블에 계층적으로 상위/하위 데이터가 포함됨을 말함
- SQL SERVER에서 계층형 질의문은 CTE(Common Table Escpression)을 재귀호출 함으로서 계층 구조를 전개
- 계층형 질의문은 앵커멤버를 실행하여 기본 결과 집합을 만들고, 이후 재귀멤버를 지속적으로 실행
- ORACLE 계층형 질의문에서 where절은 모든 전개를 진행한 이후 필터 조건으로서 조건에 부합하는 데이터만을 추출하는 데 활용
- priror 키워드는 select, where, connect by절에서 사용가능
서브쿼리
SINGLE ROW 단일행 서브쿼리 | - 서브쿼리 실행결과가 항상 1건 이하 - = < <= > >= < > |
MULTI ROW 다중행 서브쿼리 | - 실행결과가 여러건 - 다중행 비교연산자(IN, ALL, ANY, EXISTS, SOME)와 함께 사용 |
MULTI COLUMN 다중 칼럼 서브쿼리 | - 실행결과가 여러칼럼 - 메인 쿼리 조건절에 여러 칼럼을 동시에 비교 - 서브쿼리와 메인쿼리의 비교하고자하는 칼럼 개수와 칼럼 위치가 동일해야 함 |
*다중행 비교연산자는 단일행 서브쿼리에도 사용 가능
- 서브쿼리는 단일행 또는 복수행 비교 연산자와 함께 쓸 수 있음.
- 서브쿼리는 select, from, having, order by 절 등에서 사용 가능
- 서브쿼리에서는 order by를 사용하지 못함. ?????????????????????????????????????????
(order by절은 select 절에서 오직 1개만 올 수 있기 때문에 order by절은 메인쿼리의 마지막 문장에 위치)
- Group by 사용 안하고도 Having절에서 사용 가능
- 서브쿼리의 결과가 복수행 결과를 반환하는 경우, In, All, Any 등의 복수행 비교 연산자와 사용
- 연관(correlated)서브쿼리는 서브쿼리가 메인쿼리 칼럼을 포함하고 있는 형태의 서브쿼리
- 다중 칼럽 서브쿼리는 서브쿼리의 결과로 여러개의 컬럼이 반환되어 메인쿼리의 조건과 비교되는 데,
SQL Server에서는 현재 지원하지 않는 기능/ Oracle가능
- 서브쿼리 사용시, 서브쿼리를 괄호에 감싸서 사용
- 단일행 비교 연산자는 서브쿼리 결과가 반드시 1건 이하, 복수행 비교 연산자는 서브쿼리 결과가 건수와 상관 없음
- 단일형 서브쿼리 비교연산자는 다중행 서브쿼리 비교 연산자로 사용할 수 없지만,
다중행 서브쿼리 연산자가 단일행 서브쿼리 비교 연산자로 사용 가능
- 비연관 서브쿼리가 주로 메인쿼리 값을 제공하기 위한 목적으로 사용됨
- 메인쿼리 결과가 서브쿼리로 제공될 수 있고, 서브쿼리 결과가 메인쿼리로 제공될 수 있으므로
실행순서는 정해지지 않고, 상황에 따라 달라진다.
- From절에서 사용되는 서브쿼리를 인라인뷰
(서브쿼리 결과가 동적으로 생성된 테이블인 것 처럼 사용가능.
SQL실행시에만 임시적으로 생성되는 동적뷰라서 DB에는 정보가 저장되는 것은 아님)
View 뷰
1. 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 됨.
2. 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련질의를 단순하게 작성.
해당 SQL을 자주 사용할 때, 뷰를 이용하면 편리하게 사용 가능
3. 보안성 : 숨기고픈 정보가 존재하면 해당 칼럼을 빼고 생성해서 사용자에게 정보를 감출 수 있음
- 단지 정의민 가지고 있고, 실행시점에 질의를 재작성하여 수행
- 보안 강화 목적도 있음
- 실제 데이터를 저장하고 있는 뷰를 생성하는 기능을 지원하는 DBMS도 있음
- Grouping columns이 가질 수 있는 모든 경우에 대해 subtotal을 생성해야 하는 경우, cube를 사용하는 것이 바람직.
- Rollup에 비해 시스템에 많은 부담을 주므로 사용에 유의
*CUBE : 결합한 모든 값에 대해 다차원 집계를 생성. CUBE도 결과에 대한 정렬이 필요한 경우는 order by절에 명시적으로 정렬 칼럼이 표시되어야 함.
- CUBE, GRUPING SETS, ROLLUP 세가지 그룹함수 모두 일반 그룹함수로 동일 결과 추출 가능
- ROLLUP 그룹 함수는 함수인자로 주어진 컬럼의 순서에 따라 다른 결과를 추출하게 되고, 나열된 컬럼에 대해 계층구조로 집계를 출력
- CUBE, ROLLUP, GROUPING SETS함수들에 의해 집계된 레코드에서 집계대상 컬럼 이외의 GROUP 대상 컬럼 값은 NULL을 반환
- GROUP SETS는 다양한 소계집합을 만들 수 있음
- GROUP SETS에 표시된 인수들에 대한 개별 집계를 구할 수 있으며, 이때 표시된 인수들 간에는 계층 구조인 ROLLUP과 달리 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 같음
- GROUPING SETS 함수는 결과에 대한 정렬이 필요한 경우에는 ORDER BY절에 명시적으로 정렬칼럼이 표시되어야 함
윈도우 함수 (Window Function, Analytic function)
- Group by 절과 함께 사용한다고해서 오류가 나는 것은 아님
- PARTITION과 GROUP BY구문은 의미적으로 유사
- PARTITION 구문이 없으면 전체 집합을 하나의 PARTITION으로 정의한 것과 동일
- 윈도우 함수는 결과에 대한 함수처리로서 결과 건수는 줄지 않음
- 윈도우 함수의 적용범위는 PARTITION을 넘을 수 없음
RANK함수
- ORDER BY를 포함한 QUERY문에서 특정항목(컬럼)에 대한 순위를 구하는 함수
- 동일한 값에 대해서는 동일한 순서를 부여
DENSE_RANK : RANK함수와 흡사하나 동일한 순위를 하나의 건수로 취급하는 것이 다른 점.
ROW- NUMBER : 동일한 값이라도 고유한 순위를 부여
RANK BETWEEN 10000 PRESENDING AND 1000 FOLLOWING
=> -10000~+10000
- LAG함수를 이용해서 파티션별 윈도우에서 이전 몇번째 행의 값을 가져올 수 있음
- 이후 몇 번 째 행의 값을 가져오는 것은 LEAD함수이며 SQL SERVER에서는 지원하지 않음
- DBMS관리자가 사용자 별로 권한을 관리하는 부담을 줄이기 위해 다양한 권한을 그룹으로 묶어 관리할 수 있도록
사용자-권한 사이의 중개역할을 수행하는 ROLE을 제공
GRANT SELECT, INSERT, DELETE ON R TO KIM WITH GRANT OPTION.
=> KIN에게 R테이블의 조회, 삽입, 삭제에 대한 권한을 주면서 해당 권한을 다른사람에게 부여할 수 있는 권한도 줌
REVOKE INSERT ON R FROM KIM CASCADE;
=> KIM에게서 R테이블에 삽입에 대한 권한을 회수하면서 WITH GRANT OPTION을 통해 받은 KIM에게서 다른사람이 받은 권한 까지도 회수를 명령함
PL/SQL
- BLOCK 구조로 되어있어 각 기능별 모듈화 가능
- 변수, 상수 등을 선언하여 SQL문장 간 값을 교환 (예: 일반SQL실행시, WHERE절 조건 등으로 대입 가능)
- IF, LOOP 등의 절차형 언어를 사용하여 절차적인 프로그램이 가능하도록 함
- DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용가능
문제: ROLLBACK 불가능하도록 삭제하기
=> 동적 SQL 또는 DDL문장을 실행할 때, EXECUTE IMMEDITATE를 사용할 것.
- ORACLE에 내장되어 있어 ORACLE과 PL/SQL을 지원하는 어떤 서버로도 프로그램은 옮길 수 있음
- 응용프로그램 성능을 향상
- 프로시저 내부에 작성된 절차적 코드는 PL/SQL 엔진이 처리하고, 일반적 SQL문장은 SQL실행기가 처리
- SQL문장을 블록으로 묶고 한번에 BLOCK 전부를 서버로 보내기 때문에 통신량을 줄일 수 있음
- PROCEDURE, USER DEFINED FUNCTION, TRIGGER 객체를 PL/SQL로 작성 가능
=> 작성자 기준으로 트랜잭션 분할 가
=> 프로시저 내에서 다른 프로시저를 호출할 경우,
호출 프로시저의 트랜잭션과 별도 PRAGMA AUTO NOMOUS TRANSATION을 선언하여 자율 트랜잭션 처리 가능
저장모듈(STORED MODULE)
- SQL문장을 데이터베이스 서버에 저장하여 사용자-어플리케이션 사이에서 공유할 수 있도록 만든 일종의 SQL 컴포넌트 프로그램
- 독립적으로 실행되거나 다른 프로그램으로부터 실행될 수 있는 완전한 실행 프로그램
- ORACLE 저장 모듈에는 PROCEDURE, USER DEFINED FUNCTION, TRIGGER가 있음.
- STORED MODULE에는 PL/SQL, LP/SQL, T-SQL이 있음
- 구현 가능한 기능
* 로직과 함께 DB내에 저장해 놓은 명령문의 집합
* 저장형 함수(사용자 정의 함수)는 단독으로 실행되기 보다는 다른 SQL문을 통해 호출되고 그 결과를 리턴하는 SQL보조 역할
* 트리거는 특정 테이블에 INSERT, UPDATE, DELETE와 같은 DML문이 수행되었을 때, DB에서 자동 동작하도록 작성된 프로그램
트리거?
데이터 무결성과 일관성을 위해 사용자 정의 함수를 사용하는 것은 트리거의 용도
프로시저와 달리 COMMIT 및 ROLLBACK과 같은 TCL 사용 불가
DN에 의해서 자동호출 가능
INSERT, UPDATE, DELETE 수행 시, 호출 되도록 정의 가능
데이터베이스에 로그인하는 작업에도 정의 가능
프로시저 PROCEDURE | 트리거 TRIGGER |
CREATE PROCEDURE 문법 사용 | CREATE TRIGGER 문법 사용 |
EXECUTE 명령어로 실행 | 생성 후, 자동 실행 |
COMMIT, ROLLBACK 실행 가능O | COMMIT, ROLLBACK 실행 불가X |
'셤숌셤 > SQL개발자' 카테고리의 다른 글
2과목(3장: SQL최적화 기능) (0) | 2021.09.04 |
---|---|
2과목:SQL기본 및 활용(1장 : SQL기본) (0) | 2021.08.25 |
과목1: 데이터모델링의 이해 (0) | 2021.08.24 |