SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
위 쿼리는 어떤 순서로 계산될까?
먼저 FROM절이 해석된다.
이후 WHERE절이 해석되어 조건에 맞지 않는 것들을 탈락시킨다.
이후 SELECT절에 없는 속성들도 탈락시킨다.
만약 DISTINCT가 있다면 중복을 제거한다.
쿼리를 최적화 한다는 것은 같은 결과에 대해서 더 효율적으로 결과를 가져오는 것이다.
예를 들어 아래와 같은 쿼리문이 있다고 하자.
SELECT S1.sname
FROM Sailors S1, Reserves R1
WHERE R1.bid = 103 AND S1.sid = R1.sid
위 쿼리는 아래와 같이 최적화가 될 수 있다.
SELECT S1.sname
FROM Sailors S1
JOIN Reserves R1 ON S1.sid = R1.sid
WHERE R1.bid = 103;
더 최적화를 해 본다면
SELECT S1.sname
FROM Sailors S1
JOIN (SELECT * FROM Reserves WHERE bid = 103) AS R1
ON S1.sid = R1.sid;
중첩 쿼리란?
서브 쿼리라고 부르기도 한다. 엄밀하게 따지면 서브 쿼리와 중첩 쿼리는 구분이 가능하지만 동일한 개념을 나타날 때도 사용되기도 한다.
질의 내부에 또 다른 질의가 존재하는 것이다.
SELECT S.sname
FROM Silors S
WHERE S.sid IN
(SELECT R.sid
FROM Reserves R
WHERE R.bid = 103)
IN 연산자를 이용해 부분집합들을 구하고 있다.
여기서 (...) 부분이 중첩 쿼리이다.
위 쿼리는 아래처럼 바꿀 수도 있다.
SELECT S.sname
FROM Silors S
WHERE EXISTS
(SELECT *
FROM Reserves R
WHERE R.bid = 103 AND S.sid = R.sid)
Division연산은 SQL 연산자가 없다. 그렇기 때문에 이중 부정문을 통해 Division연산을 수행한다.
SELECT S.sname
FROM Sailor S
WHERE NOT EXIST
(SELECT B.bid
FROM Boats B
WHERE NOT EXISTS
(SELECT R.bid
FROM Reserves R
WHERE R.bid = B.bid
AND R.sid = S.sid))
집합 비교 연산자로 SQL에는 ANY와 ALL이 있다.
ANY는 집합 내에 어느 하나라도 비교에서 만족하면 TRUE를 반환한다.
SELECT *
FROM Sailors S
WHERE S.rating > ANY
(SELECT S.rating
FROM Sailors S
WHERE S.sname='Horatio')
ALL은 집합 내 모든 비교에서 만족하면 TRUE를 반환한다.
SELECT *
FROM Sailors S
WHERE S.rating > ALL
(SELECT S.rating
FROM Sailors S
WHERE S.sname='Horatio')
COUNT, SUM, AVG, MAX, MIN이 집계 함수에 해당한다.
SELECT S.sname, S.age
FROM Sailors S
WHERE S.age = (SELECT MAX(S.age) FROM Sailors S)
SELECT COUNT(*)
FROM Sailors
집계 함수를 적용함에 있어서 특정 그룹으로 묶어서 적용하기를 원할 수 있음 이때 사용하는 것이 GROPU BY와 HAVING이다.
SELECT [DISTINCT] target-list
FROM relation-list
[WHERE] qualification
[GROUP BY] grouping-list
[HAVING] group-qualification
WHERE절이 GROUP 보다 먼저 일어난다. HAVING은 GROUP다음에 일어난다.
정렬을 할 때 사용한다. 기본적으로 오름차순이다.
SELECT S.rating, MIN (S.age)
FROM Sailors S
GROUP BY S.rating
ORDER BY S.rating
Outer Join의 예는 아래와 같습니다.
SELECT sid, bid
FROM Sailors NATURAL LEFT OUTER JOIN Reserves;
----------------------------------------------
SELECT S.sid, R.bid
FROM Sailors S LEFT OUTER JOIN Reserves R ON S.SID = R.SID
-----------------------------------------------------------
SELECT S.sid, R.bid
FROM Sailors S, Reserves R
WHERE S.sid = R.sid(+)
사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된 이름을 가진 가상테이블
저장 장치 내에 물리적으로 존재하지 않음. 논리적으로만 존재
뷰는 튜플들을 저장하는 것이 아니라 뷰에 대한 정의만을 저장한다.
CREATE VIEW B-Students (name, sid, course)
AS SELECT S.name, S.sid, E.cid
FROM Students S, Enrolled E
WHERE S.sid = E.studid and E.grade = 'B'
하나의 뷰를 삭제하면 그 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제된다.
DROP VIEW를 통해 뷰를 삭제 할 수 있다.
뷰는 편리하게 사용하기 위해 사용하기도 하지만 릴레이션의 세부내용을 숨겨 보안을 확보하기 사용할 수 있다.
데이터베이스에 포함된 다양한 데이터 객체에 대한 정보들을 유지, 관리하기 위한 시스템 데이터베이스
DDL로 구성되는 기본 테이블, 뷰, 인덱스, 제약조건 등의 데이터베이스 구조 및 통계 정보를 저장함.
데이터 사전이라고도 부름
카탈로그에 저장된 정보를 메타 데이터라고도 한다.
시스템 테이블로 구성되어 있어 일반 이용자도 SQL을 이용하여 내용을 검색해 볼 수 있다.
DMBS가 스스로 생성하고 유지한다.
아래는 오라클 기준 설명입니다.
SELECT * FROM USER_OBJECTS;
테이블, 뷰, 제약조건, 인덱스, 프로시져, 트리거 등 검색
SELECT * FROM USER_TABLES;
생성된 테이블 검색
SLECT * FROM USER_VIEWS;
뷰 이름, 검색범위(칼럼들), 칼럼이 참조한 테이블 검색
SELECT * FROM USER_CONSTRAINTS;
제약조건 이름, 적용된 테이블, 상태(비)활성화 유무 검색
SELECT * FROM USER_INDEXES;
인덱스 이름, 적용된 테이블 검색
데이터베이스에 읽기, 쓰기, 갱신, 삭제에 대해 권한을 줄 수 있다.
권한을 통해 접근 할 수 있는 것은 인덱스, 릴레이션, 애트리뷰트 등이 있다.
SQL명령어로 grant가 권한 부여 revoke가 권한 제거이다.
권한은 그래프로 나타낼 수 있다.

내장 SQL 혹은 삽입 SQL이라고도 불린다.
일반 응용 프로그램에 SQL을 삽입하여 데이터베이스 자료를 이용하고 다양한 조작을 할 수 있도록 한 것이다.
EXEC SQL 문으로 시작해서 세미콜론(;)으로 종료한다.
일반 SQL문은 다양한 자료(튜플)를 얻을 수 있지만 내장 SQL은 하나의 자료(튜플)만 얻을 수 있다.
-> 커서: 튜플들의 집합을 처리하는데 사용되는 포인터 역할
호스트 언어에 데이터베이스의 자료를 불러와 기억하기 위한 호스트 변수가 필요
호스트 변수를 사용하려면 BEGIN DECLARE SECTION ~ END DECLARE SECTION을 통해 변수가 선언되어야 한다.
호스트 변수는 구분을 위해 콜론(;)을 변수명 앞에 붙인다.
무결성 제약조건이랑 릴레이션의 인스턴스가 무조건 만족해야 하는 조건들을 말합니다.
무결성 제약조건을 무시하는 삽입/삭제/갱신은 무시됩니다.
이미 만들어진 제약조건을 삭제하거나 새로운 제약조건을 부여 가능합니다.
DB에 변경이 감지되었을때 자동적으로 호출되는 프로세스입니다.
DBA가 정의합니다.
DB를 모니터하는 데몬이라 생각하면 됩니다.
Active Database는 트리거를 포함하는 데이터베이스를 말합니다.
Triggers는 이벤트, 조건, 동작으로 구분됩니다.
Event
트리거를 작동시키는 DB 변경입니다.
Condition
트리거가 작동하는 조건입니다.
Action
트리거가 작동하였을 때 하는 작업입니다.
쿼리를 파싱한다.
최적화 한다.
평가한다.