07SQL 실전: 스터디센터 데이터로 조인 확인하기
보충 실습테이블 4개(센터·직원·급여 구간·시간대)를 만들고 앞의 조인을 모두 실행해 행 수를 확인합니다. 직원의 관리자가 같은 테이블을 참조하므로 상위 관리자(현우)부터 입력합니다.
CREATE TABLE STUDY_CENTER (
CENTER_ID VARCHAR2(3 CHAR) PRIMARY KEY,
CENTER_NAME VARCHAR2(30 CHAR) NOT NULL
);
CREATE TABLE CENTER_STAFF (
STAFF_ID NUMBER(3) PRIMARY KEY,
STAFF_NAME VARCHAR2(30 CHAR) NOT NULL,
CENTER_ID VARCHAR2(3 CHAR),
MONTHLY_PAY NUMBER(8) NOT NULL,
MANAGER_ID NUMBER(3),
CONSTRAINT FK_CS_CENTER FOREIGN KEY (CENTER_ID)
REFERENCES STUDY_CENTER (CENTER_ID),
CONSTRAINT FK_CS_MANAGER FOREIGN KEY (MANAGER_ID)
REFERENCES CENTER_STAFF (STAFF_ID)
);
CREATE TABLE PAY_BAND (
BAND_CODE VARCHAR2(2 CHAR) PRIMARY KEY,
MIN_PAY NUMBER(8) NOT NULL,
MAX_PAY NUMBER(8) NOT NULL,
CONSTRAINT CK_PAY_BAND CHECK (MIN_PAY <= MAX_PAY)
);
CREATE TABLE SHIFT_SLOT (
SLOT_CODE VARCHAR2(2 CHAR) PRIMARY KEY,
SLOT_NAME VARCHAR2(20 CHAR) NOT NULL
);
INSERT INTO STUDY_CENTER VALUES ('C10', '꿈빛');
INSERT INTO STUDY_CENTER VALUES ('C20', '파란');
INSERT INTO STUDY_CENTER VALUES ('C30', '온유');
INSERT INTO CENTER_STAFF VALUES (104, '현우', NULL, 5300, NULL);
INSERT INTO CENTER_STAFF VALUES (103, '유빈', 'C10', 3900, 104);
INSERT INTO CENTER_STAFF VALUES (101, '서아', 'C10', 2500, 103);
INSERT INTO CENTER_STAFF VALUES (102, '도현', 'C20', 3300, 104);
INSERT INTO PAY_BAND VALUES ('G1', 2000, 2999);
INSERT INTO PAY_BAND VALUES ('G2', 3000, 3999);
INSERT INTO PAY_BAND VALUES ('G3', 4000, 6000);
INSERT INTO SHIFT_SLOT VALUES ('AM', '오전');
INSERT INTO SHIFT_SLOT VALUES ('PM', '오후');
COMMIT;
SELECT S.STAFF_ID, S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S
INNER JOIN STUDY_CENTER C
ON S.CENTER_ID = C.CENTER_ID
ORDER BY S.STAFF_ID;
SELECT S.STAFF_ID, S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S, STUDY_CENTER C
WHERE S.CENTER_ID = C.CENTER_ID
ORDER BY S.STAFF_ID;
SELECT S.STAFF_ID, S.STAFF_NAME, S.MONTHLY_PAY, B.BAND_CODE
FROM CENTER_STAFF S
JOIN PAY_BAND B
ON S.MONTHLY_PAY BETWEEN B.MIN_PAY AND B.MAX_PAY
ORDER BY S.STAFF_ID;
SELECT S.STAFF_NAME AS STAFF_NAME, M.STAFF_NAME AS MANAGER_NAME
FROM CENTER_STAFF S
JOIN CENTER_STAFF M
ON S.MANAGER_ID = M.STAFF_ID
ORDER BY S.STAFF_ID;
SELECT S.STAFF_ID, S.STAFF_NAME, S.MONTHLY_PAY,
B.BAND_CODE, M.STAFF_NAME AS MANAGER_NAME
FROM CENTER_STAFF S
JOIN PAY_BAND B
ON S.MONTHLY_PAY BETWEEN B.MIN_PAY AND B.MAX_PAY
LEFT JOIN CENTER_STAFF M
ON S.MANAGER_ID = M.STAFF_ID
ORDER BY S.STAFF_ID;
SELECT S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S
INNER JOIN STUDY_CENTER C ON S.CENTER_ID = C.CENTER_ID
ORDER BY S.STAFF_ID;
SELECT S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S
LEFT OUTER JOIN STUDY_CENTER C ON S.CENTER_ID = C.CENTER_ID
ORDER BY S.STAFF_ID;
SELECT S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S
RIGHT OUTER JOIN STUDY_CENTER C ON S.CENTER_ID = C.CENTER_ID
ORDER BY S.STAFF_ID NULLS LAST, C.CENTER_ID;
SELECT S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S
FULL OUTER JOIN STUDY_CENTER C ON S.CENTER_ID = C.CENTER_ID
ORDER BY S.STAFF_ID NULLS LAST, C.CENTER_ID;
SELECT C.CENTER_NAME, S.STAFF_NAME
FROM STUDY_CENTER C
LEFT JOIN CENTER_STAFF S
ON C.CENTER_ID = S.CENTER_ID
AND S.MONTHLY_PAY >= 3000
ORDER BY C.CENTER_ID, S.STAFF_ID;
SELECT C.CENTER_NAME, S.STAFF_NAME
FROM STUDY_CENTER C
LEFT JOIN CENTER_STAFF S
ON C.CENTER_ID = S.CENTER_ID
WHERE S.MONTHLY_PAY >= 3000
ORDER BY C.CENTER_ID, S.STAFF_ID;
SELECT C.CENTER_NAME
FROM STUDY_CENTER C
LEFT JOIN CENTER_STAFF S ON C.CENTER_ID = S.CENTER_ID
WHERE S.STAFF_ID IS NULL
ORDER BY C.CENTER_ID;
SELECT S.STAFF_NAME, C.CENTER_NAME
FROM CENTER_STAFF S, STUDY_CENTER C
WHERE S.CENTER_ID = C.CENTER_ID(+)
ORDER BY S.STAFF_ID;
SELECT C.CENTER_ID, C.CENTER_NAME, T.SLOT_CODE, T.SLOT_NAME
FROM STUDY_CENTER C CROSS JOIN SHIFT_SLOT T
ORDER BY C.CENTER_ID, T.SLOT_CODE;
SELECT S.STAFF_NAME, C.CENTER_NAME, B.BAND_CODE
FROM CENTER_STAFF S
JOIN STUDY_CENTER C ON S.CENTER_ID = C.CENTER_ID
JOIN PAY_BAND B ON S.MONTHLY_PAY BETWEEN B.MIN_PAY AND B.MAX_PAY
ORDER BY S.STAFF_ID;
SELECT COUNT(*) AS ROW_COUNT
FROM CENTER_STAFF S, STUDY_CENTER C;