복잡한 SQL Queries
Views in SQL
Schema Modification in SQL
Triggers와 Constraints As Assertions
Nested Queries (중첩 질의)
Joined Tables (일반적인 Join)
Outer joins in the FROM clause
Views (derived Tables), Assertions, Triggers
Aggregate functions (집계 함수)
Grouping
삼치논리 : SQL은 3개의 논리 상태를 가진다.
각 연산에 대한 값은 위와 같다.
또한 NULL에 대해선 IS 를 통해 NULL 여부를 판단한다.
2중 for문에 비유해서 생각해보자
이때 바깥쪽에 위치한 For을 Outer Query라고 하고, 안에 위치한 Query를 Inner Query라고 한다.
Where 절 안에 IN에 의해서 묶여진다.
Pnumber가 Inner Query1 이나 Inner Query2 둘 중 하나라도 만족한다면 추출한다.
위와 같이 복수 개의 Multiset에 대해서도 IN을 적용할 수 있다.
ALL : SELECT문을 만족하는 모든 요소들 -> MAX 와 비슷한 의미를 지닌다.
Dno이 5인 모든 Employee의 Salary보다 높은 Salary를 가진 Employee의 Lname과 Fname을 추출
(NOT)EXISTS : 상호 연관된 중첩 질의가 'Not Empty' 혹은 'Empty'인지 판별하는 함수.
중첩 질의에서 No Tuple을 Return 하면 EXISTS는 FALSE, NOT EXISTS는 TRUE를 Return 한다.
5번 부서에 의해서 관리되는 프로젝트에 모두 참가하는 EMPLOYEE를 추출하시오
WHERE 절
→ {1,2,3}
→ {1,2}
{1,2,3} MINUS {1,2} = {3}
NOT EXISTS {3} => 3이 존재함으로 FALSE
어떠한 tuple도 선택되지 않는다.
이는 아래와 같이도 표현이 된다.
NOT EXISTS 절
첫번째 NOT EXISTS
- Poject.Dnum = 5 인 Project의 Pnum이 SELECT문에서 추출
- WORKS_ON의 Pno이 위 Pnum인 모든 요소를 추출
두번째 NOT EXISTS
- WORKS_ON과 EPLOYEE join
IN에는 특정 값을 넣어줄 수 도 있다.
FROM절에 JOIN과 ON을 통해서 직접 join을 해줄 수 있다.
OUTER JOIN : ON문에 성립되지 않는 값은 NULL로 비워놓고 출력에 포함 시키는 것.
위 예시는 LEFT OUTER JOIN이므로, LEFT의 E 테이블의 모든 값을 출력하고
성립되지못한 Borg의 우측 값은 NULL로 나타낸 것이다.
FULL OUTER JOIN : LEFT와 RIGHT OUTER를 합친 것.
사진에서 보듯이 왼쪽과 오른쪽 모두 공백(NULL)이 존재함을 확인할 수 있다.
여러 튜플의 정보를 그룹별로 하나의 튜플을 생성하기 위한 함수이다
COUNT, SUM, MAX, MIN, AVG ...
GROUP BY 절을 사용해서 엮는다.
HAVING 은 Condition 설정에 쓰인다.
GROUP BY
Dno를 기준으로 묶인 것을 확인할 수 있다.
GROUPING 되는 속성은 SELECT에 필수적으로 포함되어 있어야 한다.
HAVING
HAVING은 그룹의 Condition을 설정한다.
사원수가 2명 이상인 Departmentem들에 대해서 Salary가 40000보다 큰 근로자의 수는?
특정 질의 안에서만 자주 사용될 질의를 임시 VIEW로 만드는 것
CASE는 특정 상황으로 분류될때 활용한다.
한 테이블에 의해서 유도되는 Table
물리적으로 존재하지 않는 가상의 Table이다.
자주 참조될 Table을 임의로 지정하는 것
생성된 VIEWS는 FROM절에서 호출하여 사용이 가능하다.
특정 질의를 간략화한다
시간과 Cost의 절약
보안성 제공
VIEWS는 UP-TO-DATE 해야한다.
즉, VIEW가 정의된 relation에 변화가 생기면 자동적으로 변화를 적용해야한다.
DBMS는 VIEW가 UP-TO-DATE 하는 것에 책임이 있다.
VIEW의 UPDATE
INSERT/DELETE/UPDATE command로 VIEW TABLE 수정하는 것은 불가하다
여러 가지 의미로 해석될 수 있기에 Reject 됨.
VIEW TABLE은 Only READ만.
Table, domain, constraint 같은 Schema element 제거에 이용됨
CASCADE, RESTRICT와 함꼐 사용
1) DROP SCHEMA COMPANY CASCADE;
CASCADE : Schema와 그 안의 모든 Elements 함께 제거
RESTRICT : Schema 내에 아무 Elements 도 들어있지 않은 경우에만 제거
2) DROP TABLE DEPENDENT CASCADE;
CASCADE : Relation(Table)을 제거하고 해당 Relation(table)의 Definition 또한 제거
RESTRICT : 어떠한 참조도 존재하지 않는 경우만 제거
포함하는 actions
column(attribute) 추가 또는 제거
column definition 변경
table constraints 추가 또는 제거
CASCADE : 모든 제약조건과 참조하는 VIEWS를 제거
RESTRICT : Column을 참조하는 어떠한 VIEWS/Constraints가 없는 경우 제거
Assertion : 주장하다.
유저로 하여금 Declarative Assertions(선언 주장)으로 일반적인 제약조건을 기술할 수 있게 한다.
유저에 의해 설정된 특정 Condition을 위반하는 Tuple을 찾아내는 Query를 명시합니다.
특정 사건이 발생했거나, 특정 Condition(조건)이 충족 되었을때,
Type of Action을 수행하도록 한다.
TRIGGER를 설정하는 문구이다.
EMPLOYEE절에 INSERT나 UPDATE가 있기 전 (Before)
:NEW - 바인드 변수, 새롭게 들어오는 튜플의 샐러리가 크다면 일단 에러메세지를 띄우는 Trigger이다.
하지만, 위 Query는 Oracle에서 수행되지 않음으로 아래와 같이 바꿔준다.
CREATE OR REPLACE TRIGGER SALARY_VIOLATION
BEFORE INSERT OR UPDATE ON EMPLOYEE
FOR EACH ROW
BEGIN
IF :new.salary > 80000 THEN
DBMS_OUTPUT.PUT_LINE('no');
END IF;
END;
BEGIN - 액션
IF - Condition 판별
END IF;
보완해야할 내용 - NOT EXISTS 부분