2025-03-26
NATURAL JOIN
은 두 테이블에서 동일한 이름을 가진 모든 컬럼을 기준으로 자동 동등 조인을 수행한다.ON
절 없이도 자동으로 조인 조건이 생성된다.SELECT 컬럼1, 컬럼2, ...
FROM 테이블A
NATURAL JOIN 테이블B;
-- userTbl과 buyTbl의 userID 컬럼을 자동으로 기준으로 잡아 조인
SELECT *
FROM userTbl u
NATURAL JOIN buyTbl b;
🔁 아래와 동일한 결과:
SELECT *
FROM userTbl u
JOIN buyTbl b
ON u.userID = b.userID;
USING(공통컬럼)
구문은 JOIN ON A.col = B.col의 축약형으로, 동일한 이름을 가진 컬럼을 명시적으로 지정하여 조인할 수 있다.SELECT 컬럼1, 컬럼2, ...
FROM 테이블A
JOIN 테이블B USING (공통컬럼);
-- userID 컬럼을 기준으로 userTbl과 buyTbl을 조인
SELECT *
FROM userTbl u
JOIN buyTbl b USING (userID);
🔁 동일 결과 (일반 ON 사용):
SELECT *
FROM userTbl u
JOIN buyTbl b
ON u.userID = b.userID;
()
괄호로 감싼다.-- '김경호'보다 키가 큰 사용자 조회
SELECT userID, name, height
FROM userTbl
WHERE height > (
SELECT height FROM userTbl WHERE name = '김경호'
);
📌 설명:
>
연산자와 함께 사용 가능-- 경남 지역 사용자와 같은 키를 가진 사용자 조회 (IN)
SELECT userID, name, addr, height
FROM userTbl
WHERE height IN (
SELECT height FROM userTbl WHERE addr = '경남'
);
-- ANY: 경남 중 아무나보다 크면 OK (OR 연산자처럼 작동)
SELECT userID, name, addr, height
FROM userTbl
WHERE height >= ANY (
SELECT height FROM userTbl WHERE addr = '경남'
);
-- ALL: 경남 모두보다 커야 OK (AND 연산자처럼 작동)
SELECT userID, name, addr, height
FROM userTbl
WHERE height >= ALL (
SELECT height FROM userTbl WHERE addr = '경남'
);
-- 주소별로 키가 가장 큰 사람 조회
SELECT *
FROM userTbl
WHERE (addr, height) IN (
SELECT addr, MAX(height)
FROM userTbl
GROUP BY addr
);
-- 각 사용자의 총 구매 금액 조회
SELECT u.userID, u.name,
(SELECT SUM(price * amount)
FROM buyTbl b
WHERE b.userID = u.userID) AS 총구매액
FROM userTbl u;
📌 설명:
항목 | 설명 |
---|---|
NATURAL JOIN | 공통 컬럼으로 자동 조인 (명시적 조건 없음) |
USING 절 JOIN | 공통 컬럼을 명시적으로 지정하여 조인 |
서브쿼리 | SQL 내부에 포함된 또 다른 쿼리 |
서브쿼리 유형 | 단일/다중 행, 다중 컬럼, 스칼라 서브쿼리 등 |
주의점 | 결과 개수와 위치에 따라 사용 가능 연산자가 달라짐 |
이번 학습을 통해 NATURAL JOIN
과 USING
은 조건 지정 방식에 따라 결과가 완전히 달라질 수 있음을 알게 되었다.
또한 서브쿼리는 WHERE 조건뿐 아니라 SELECT 절 안에서도 활용 가능한 매우 강력한 도구이며,
서브쿼리의 위치와 결과 형식(단일/다중)에 따라 적절한 연산자를 선택하는 것이 핵심임을 확실히 깨달았다.