JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여, 하나의 테이블로 표현해준다. 주로 SELECT 문과 함께 사용된다.
INNER JOIN 은 첫 번째 테이블과 두 번째 테이블의 공통되는 데이터들을 모두 가져온다. 즉, 조건을 만족한는 레코드를 전부 가져온다.
1. 첫번째테이블이름
INNER JOIN 두번째테이블이름
ON 조건
2. 첫번째테이블이름
JOIN 두번째테이블이름
ON 조건
SELECT * FROM Reservation
INNER JOIN Customer
ON Reservation.Name= Customer.Name;
// 기본 sql 문법
SELECT * FROM Reservation,Customer
WHERE Reservation.Name = Customer.Name;
// MySQL 문법
SELECT * FROM Reservation AS r, Customer AS c
WHERE r.Name = c.Name;
// 별칭 사용 간략화
LEFT JOIN은 첫 번째 테이블을 기준으로 두 번째 테이블을 조합한다.
즉 첫 번째 테이블은 모두 가져오고, 두 번째 테이블은 조건에 맞는 필드값만 가져오며 나머지는 NULL로 표시된다.
사용방법은 INNER JOIN과 동일하다.
LEFT JOIN의 반대, 두 번째 테이블이 기준이 된다.
UNION은 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용한다.
이때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야 하며, 필드의 순서 또한 같아야 한다.
SELECT 필드이름
FROM 테이블이름
UNION
SELECT 필드이름
FROM 테이블이름
UNION은 자동으로 중복되는 데이터를 제외하는데, 이를 방지하고 싶다면 UNION ALL을 대신 사용한다.
서브쿼리(subquery)란 다른 쿼리 내부에 포함되어 있는 SELETE 문을 의미한다.
EX)
① SELECT ID, ReserveDate, RoomNum
FROM Reservation
② WHERE Name IN (SELECT Name
FROM Customer
WHERE Address = '서울')
이렇게 WHERE 문이나 FROM 문 안에 서브쿼리를 삽입해서 조건을 설정할 수 있다.
SELECT ...
FROM (서브쿼리) [AS] 이름
...
SELECT 문의 FROM 절에서 사용되는 모든 테이블에는 이름이 필요합니다.
따라서 FROM 절에서 사용되는 서브쿼리는 위의 문법처럼 반드시 이름을 정의해야 합니다.
EX)
SELECT Name, ReservedRoom
FROM (SELECT Name, ReserveDate, (RoomNum + 1) AS ReservedRoom
FROM Reservation
WHERE RoomNum > 1001) AS ReservationInfo;
먼저 FROM 문 안에 있는 서브쿼리가 먼저 실행된다.
RoomNum+1 이라는 값에 ReservedRoom이라는 별칭을 부여한다.
Reservation에서 RoomNum>1001을 만족하는 값들을 가져와서 Name, ReserveDate, ReservedRoom 값을 추출한다.
이렇게 추출된 데이터의 집합에 ReservationInfo라는 별칭을 부여하고,
ReservationInfo로부터 Name과 ReservedRoom 데이터를 출력한다.