06SQL 실전: 측정 지점 데이터로 표준 조인 확인하기
보충 실습예시 데이터를 만들고 INNER·OUTER·CROSS, NATURAL·USING·ON, ON과 WHERE, Oracle (+)를 모두 실행해 행 수를 확인합니다. ON에 A.STATUS = 'READY'를 두면 3행(서천 포함), WHERE에 두면 2행, WHERE A.AGENT_ID IS NULL이면 서천 1행입니다.
CREATE TABLE WATER_STATION (
STATION_ID VARCHAR2(3 CHAR) PRIMARY KEY,
STATION_NAME VARCHAR2(30 CHAR) NOT NULL,
STATUS VARCHAR2(10 CHAR) NOT NULL
);
CREATE TABLE FIELD_AGENT (
AGENT_ID NUMBER(3) PRIMARY KEY,
AGENT_NAME VARCHAR2(30 CHAR) NOT NULL,
STATION_ID VARCHAR2(3 CHAR),
STATUS VARCHAR2(10 CHAR) NOT NULL,
CONSTRAINT FK_FA_STATION FOREIGN KEY (STATION_ID)
REFERENCES WATER_STATION (STATION_ID)
);
INSERT INTO WATER_STATION VALUES ('R10', '북천', 'READY');
INSERT INTO WATER_STATION VALUES ('R20', '남천', 'READY');
INSERT INTO WATER_STATION VALUES ('R30', '서천', 'CLOSED');
INSERT INTO FIELD_AGENT VALUES (301, '하윤', 'R10', 'READY');
INSERT INTO FIELD_AGENT VALUES (302, '지수', 'R10', 'OFF');
INSERT INTO FIELD_AGENT VALUES (303, '민재', 'R20', 'READY');
INSERT INTO FIELD_AGENT VALUES (304, '다온', NULL, 'READY');
COMMIT;
SELECT A.AGENT_ID, A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
JOIN WATER_STATION S ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A CROSS JOIN WATER_STATION S
ORDER BY A.AGENT_ID, S.STATION_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
INNER JOIN WATER_STATION S ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
LEFT OUTER JOIN WATER_STATION S ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
RIGHT JOIN WATER_STATION S ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID NULLS LAST, S.STATION_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
FULL OUTER JOIN WATER_STATION S ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID NULLS LAST, S.STATION_ID;
SELECT STATION_ID, STATUS, A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A NATURAL JOIN WATER_STATION S
ORDER BY A.AGENT_ID;
SELECT STATION_ID, A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A JOIN WATER_STATION S USING (STATION_ID)
ORDER BY A.AGENT_ID;
SELECT A.STATION_ID, A.AGENT_NAME, S.STATION_NAME,
A.STATUS AS AGENT_STATUS, S.STATUS AS STATION_STATUS
FROM FIELD_AGENT A JOIN WATER_STATION S
ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID;
SELECT STATION_ID, A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A FULL OUTER JOIN WATER_STATION S
USING (STATION_ID)
ORDER BY STATION_ID NULLS LAST, A.AGENT_ID;
SELECT S.STATION_NAME, A.AGENT_NAME
FROM WATER_STATION S
LEFT JOIN FIELD_AGENT A
ON S.STATION_ID = A.STATION_ID
AND A.STATUS = 'READY'
ORDER BY S.STATION_ID, A.AGENT_ID;
SELECT S.STATION_NAME, A.AGENT_NAME
FROM WATER_STATION S
LEFT JOIN FIELD_AGENT A
ON S.STATION_ID = A.STATION_ID
WHERE A.STATUS = 'READY'
ORDER BY S.STATION_ID, A.AGENT_ID;
SELECT S.STATION_NAME
FROM WATER_STATION S
LEFT JOIN FIELD_AGENT A ON S.STATION_ID = A.STATION_ID
WHERE A.AGENT_ID IS NULL
ORDER BY S.STATION_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A, WATER_STATION S
WHERE A.STATION_ID = S.STATION_ID(+)
ORDER BY A.AGENT_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
LEFT OUTER JOIN WATER_STATION S
ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID;
SELECT A.AGENT_NAME, S.STATION_NAME
FROM FIELD_AGENT A
RIGHT JOIN WATER_STATION S
ON A.STATION_ID = S.STATION_ID
ORDER BY A.AGENT_ID NULLS LAST, S.STATION_ID;