복합 쿼리 예제 - 2
여러 테이블을 연결하는 복합 쿼리를 하나 살펴본다. 이 예제에서는 도서관 대출시스템에서 도서별로 처음 기록된 대출의 도서명, 출판사, 대출시작일자, 대출종료일자를 조회하는 쿼리를 살펴본다.
도서 테이블 생성 :
CREATE TABLE 도서 (
도서ID NUMBER CONSTRAINT PK_도서 PRIMARY KEY,
도서명 NVARCHAR2(100)
);
… 예시 데이터 입력 …
데이터가 입력된 테이블 :
도서ID | 도서명 |
---|---|
12001 | SQLD 모든 것 |
12002 | 자료구조 |
12003 | 운영체제 |
출판사 테이블 생성 :
CREATE TABLE 출판사 (
출판사ID NUMBER CONSTRAINT PK_출판사 PRIMARY KEY,
출판사명 NVARCHAR2(100)
);
… 예시 데이터 입력 …
데이터가 입력된 테이블 :
출판사ID | 출판사명 |
---|---|
1001 | 아이리포 |
1002 | 생능 |
1003 | 한빛 |
대출 테이블 생성 :
CREATE TABLE 대출 (
대출번호 NUMBER CONSTRAINT PK_대출 PRIMARY KEY,
도서ID NUMBER CONSTRAINT FK_도서_대출_REL11 FOREIGN KEY
REFERENCES 도서(도서ID),
출판사ID NUMBER NOT NULL CONSTRAINT FK_출판사_대출_REL21 FOREIGN KEY
REFERENCES 출판사(출판사ID),
대출시작일자 DATE,
대출종료일자 DATE
);
… 예시 데이터 입력 …
데이터가 입력된 테이블 :
대출번호 | 도서ID | 출판사ID | 대출시작일자 | 대출종료일자 |
---|---|---|---|---|
101 | 12001 | 1001 | 2025-06-03 | 2025-06-13 |
102 | 12001 | 1001 | 2025-07-11 | 2025-07-21 |
103 | 12002 | 1002 | 2025-08-02 | 2025-08-12 |
104 | 12002 | 1002 | 2025-07-15 | 2025-07-25 |
105 | 12003 | 1003 | 2025-07-16 | 2025-07-26 |
106 | 12003 | 1003 | 2025-06-29 | 2025-07-08 |
쿼리 전문 :
SELECT B.도서명, C.출판사명,
TO_CHAR(A.대출시작일자, ‘YYYY-MM-DD’) AS 대출시작일자,
TO_CHAR(A.대출종료일자, ‘YYYY-MM-DD’) AS 대출종료일자
FROM 대출 A, 도서 B, 출판사 C,
(SELECT 도서ID, MIN(대출시작일자) AS 대출시작일자
FROM 대출
GROUP BY 도서ID) D
WHERE A.대출시작일자 = D.대출시작일자
AND B.도서ID = D.도서ID
AND A.도서ID = B.도서ID
AND A.출판사ID = C.출판사ID
ORDER BY B.도서명;
실행 순서 :
① SELECT(서브쿼리) -> ② WHERE -> ③ SELECT -> ④ ORDER BY
도서명 | 출판사명 | 대출시작일자 | 대출종료일자 |
---|---|---|---|
SQLD 모든 것 | 아이리포 | 2025-06-03 | 2025-06-13 |
운영체제 | 한빛 | 2025-06-29 | 2025-07-08 |
자료구조 | 생능 | 2025-07-15 | 2025-07-25 |