SQL
2개 테이블 조인
- WHERE 절에서 테이블끼리 참조하는 외래키를 기준으로 연결해준다.
- WHERE 절에서 A, B 테이블 각가에 대해 추가 조건을 걸어줄 수 있다.
select A.*, B.email, B.reg_day
from order_list A, cust_info B
where A.cust_id = B.cust_id -- JOIN (참조하는 키를 기준으로 연결)
and A.price < 3000 -- 조건(A테이블)
and B.role = 'MEMBER' -- 조건(B테이블)
3개 테이블 조인
- WHERE 절에서 테이블끼리 참조하는 외래키를 기준으로 연결해준다.
- WHERE 절에서 A, B, C 테이블 각가에 대해 추가 조건을 걸어줄 수 있다.
select A.*, B.email, B.reg_day, C.kind
from order_list A, cust_info B, coffee_menu C
where A.cust_id = B.cust_id -- A, B 테이블 JOIN (참조하는 키를 기준으로 연결)
and A.coffee_no = C.no -- A, C 테이블 JOIN
and A.price < 3000 -- 조건(A테이블)
and B.role = 'MEMBER' -- 조건(B테이블)
and C.kind = '에이드' -- 조건(C테이블)
Subquery
위의 쿼리를 서브쿼리를 활용한 아래 형태로 바꿀 수 있음
[AS-IS]
select A.*,
B.email,
C.kind
from order_list A, cust_info B, coffee_menu C
where A.cust_id = B.cust_id -- A, B 테이블 JOIN
and A.coffee_no = C.no -- B, C 테이블 JOIN
and C.kind = '에이드' -- 조건(C테이블)
① B 테이블을 FROM 절에서 join하지 않고, SELECT 절에서 join할 수도 있음
다만, join한 테이블에서 여러 컬럼을 읽을 때에는 적절한 방법 X
② WHERE 절의 조건을 FROM 절에서 join할 때 적용할 수도 있음
[TO-BE①②]
select A.*,
(select B.email from cust_info B where A.cust_id = B.cust_id) as email,
C.kind
from order_list A,
(select * from coffee_menu where kind = '에이드') C
where 1 = 1
and A.coffee_no = C.no -- A, C 테이블 JOIN
-- and C.kind = '에이드'
③ FROM 절에는 테이블 A만 남기도록 할 수도 있음
데이터 정합성 문제로 FROM 절에 테이블 하나만 남기는 것이 좋을 수도!!
[TO-BE③]
select A.*,
(select B.email from cust_info B where A.cust_id = B.cust_id) as email,
-- C.kind
(select x.kind from coffee_menu x where A.coffee_no = x.no) as kind
from order_list A
where 1 = 1
-- and A.coffee_no = C.no -- A, C 테이블 JOIN
-- and C.kind = '에이드'
and (select kind from coffee_menu C where kind = '에이드' and A.coffee_no = C.no) = '에이드'