중첩질의(nested query)에 대해서 알아보자.
중첩질의는 관계해석과 연관이 있는 SQL문이다. 관계해석은 명제를 통해서 테이블을 표현한다. 그래서 명제의 변수가 되는 튜플의 범위를 서술해주어야한다. 중첩질의는 SQL문을 중첩시켜, 출력되는 레코드(튜플)의 범위를 지정하는데 주로 사용되므로 관계해석을 기반으로 한 SQL문이다.
IN, NOT IN
SELECT title
FROM course
WHERE course_id
IN
( SELECT distinct course_id
FROM class
WHERE classroom = '301호' );
IN 뒤에 나오는 SQL문을 부질의(subquery)라고 한다. IN 앞에 나오는 SQL문을 외부질의(Outer query)라고 한다. 외부 질의는 부질의에서 추출된 레코드 안에서(IN) SELECT 추출이 이루어져야한다.
이를 동일하게 표현하면
SELECT title
FROM course, class
WHERE course.course_id = class.course_id AND classroom = '301호';
이렇게 AND를 통해 표현할 수 있다. IN 을 사용한 SQL문은 추출 가능한 레코드(튜플)의 범위를 지정해준다는 의미가 있다. NOT IN은 IN의 반대 개념이다.
SOME, ALL
WHERE 조건절은 비교연산을 자주한다. 비교 연산은 두 개의 피연산자를 갖는다. 여기서 한 개의 피연산자를 SOME과 ALL로 정의하는 것이다.
SELECT course_name
FROM course c
WHERE c.enrollcount >= ALL ( SELECT enrollcount FROM course);
비교연산을 하려면 서로 같은 도메인을 가진 필드여야 한다.(enrollcount) WHERE 절의 조건은 course의 enrollcount가 모든 enrollcount 데이터 보다 크거나 같다를 의미한다. 다시 말하면, 가장 큰 enrollcount를 의미한다. ALL은 c.enrollcount가 모든 레코드와 비교 연산에서 참이 되어야 하지만 SOME은 전체 중 단 하나의 레코드랑 비교연산이 성립되면 참이 된다.
EXISTS, NOT EXIST
EXISTS, NOT EXIST도 관계해석의 존재 정량자를 사용한 SQL문이다. SOME과 차이가 있다면, SOME은 튜플을 SELECT로 추출하여 부등호를 통해 명제의 참과 거짓 여부를 판단했다면 EXITST, NOT EXIST는 단순히 명제가 참인 레코드가 존재하는지 여부만 생각한다. .
SELECT title
FROM course
WHERE EXISTS ( SELECT * FROM class WHERE classroom = '301호' AND course.courser_id = class.course_id );
SELECT * FROM class WHERE classroom = '301호' AND course.courser_id = class.course_id
EXISTS의 괄호 안에 나오는 위의 SQL문이 명제다. 이 명제가 참이라면 해당하는 튜플들은 외부질의의 튜플의 범위가 된다.
NULL 처리
WHERE절에서 NULL인지 아닌지를 확인하는 조건은 관계대수가 아닌 관계해석에 기반을 둔다.
SELECT stu_id FROM score WHERE grade IS NULL;
grade IS NULL 명제를 참으로 하는 레코드들만 SELECT로 추출되는 명령이다. 반대는 IS NOT NULL이다.
그 밖의 SQL명령어들
DESC <테이블 명> : 테이블 스키마 확인
LIST : 바로 직전에 실행시켰던 명령을 출력
RUN : 직전에 실행시켰던 명령문 다시 입력하지 않고 다시 실행
SAVE <파일이름> : 직전에 실행시킨 명령문을 주어진 파일이름으로 종류에 상관없이 SQL파일로 저장
GET <파일이름> :SAVE로 저장된 명령문 불러오기
HOST : 운영체제 명령어 실행시키기, 복귀는 EXIT (SQLPLUS-> CMD)
QUIT, EXIT : SQLPLUS 종료
참고자료
Understanding of Database
저자 : 이상구, 장재영, 김한준, 정재헌
출판 : 이한미디어발매2012.08.20.
'DB > DB Basic' 카테고리의 다른 글
[DB] 데이터베이스 권한(GRANT, REVOKE) [Oracle] (0) | 2021.06.25 |
---|---|
[DB] 무결성 (Integrity)이란? (0) | 2021.06.25 |
[DB] SQL2 (Oracle) (0) | 2021.06.25 |
[DB] SQL1 (Oracle) (0) | 2021.06.25 |
[DB] Oracle의 구조 (0) | 2021.06.24 |