열(Column) 합치기
내부 조인
1. FROM/WHERE를 사용
내부 조인은 두 테이블의 키값이 매칭될 경우 선택된 모든 열을 나타냄
SELECT 테이블명1.열 이름1, 테이블명2.열 이름2
FROM 테이블명1, 테이블명2
WHERE 테이블명1.KEY=테이블명2.KEY;
2. FROM/WHERE와 별칭을 사용
오라클을 포함한 몇몇 DBMS는 테이블명 별칭을 줄 때 AS 키워드가 지원되지 않으므로
AS를 빼고 테이블 별칭을 설정해야함!
SELECT 별칭1.열 이름1, 별칭2.열 이름2
FROM 테이블명1(AS) 별칭1, 테이블명2(AS) 별칭2
WHERE 별칭1.KEY=별칭2.KEY;
3. INNER JOIN을 사용
INNER JOIN을 사용하여 두 테이블을 합칠 수 있다
=> ON 뒤에 두 테이블의 연결고리가 되는 키값을 적으면 됨
SELECT 테이블명1.열 이름1, 테이블명2.열 이름2
FROM 테이블명1 INNER JOIN 테이블명2
ON 테이블명1.KEY=테이블명2.KEY;
4. INNER JOIN과 별칭을 사용
오라클을 포함한 몇몇 DBMS는 테이블명 별칭을 줄 때 AS 키워드가 지원되지 않으므로
AS를 빼고 테이블 별칭을 설정해야함!
SELECT 별칭1.열 이름1, 별칭2.열 이름2
FROM 테이블명1(AS) 별칭1 INNER JOIN 테이블명2 (AS) 별칭2
ON 별칭1.KEY=별칭2.KEY;
1. CUSTOMERS와 ORDERS 테이블을 이용하여 주문이력이 있는 고객아이디, 고객이름, 주문번호를 나타내려면?
SELECT TMP1.CUST_ID, TMP1.CUST_NM, TMP2.ORDER_ID
FROM CUSTOMERS TMP1, ORDERS TMP2
WHERE TMP1.CUST_ID = TMP2.CUST_ID;
2. CUSTOMERS, ORDERS, EMPLOYEE 테이블을 이용하여 주문이력이 있는 고객아이디, 고객이름, 주문번호, 판매직원아이디 및 판매직원이름을 나타내려면?
SELECT TMP1.CUST_ID, TMP1.CUST_NM, TMP2.ORDER_ID, TMP2.EMP_ID, TMP3.NM
FROM CUSTOMERS TMP1
INNER JOIN ORDERS TMP2 ON TMP1.CUST_ID = TMP2.CUST_ID
INNER JOIN EMPLOYEE TMP3 ON TMP2.EMP_ID = TMP3.EMP_ID;
1. 조인 조건을 지정하지 않은 채 두 테이블을 조인하면 곱집합이 된다
=> 이 경우 반환 되는 행의 수는 첫 번째 테이블과 두 번째 테이블의 행의 수를 곱한 수가 된다
외부 조인
1. LEFT OUTER JOIN
왼쪽 테이블을 기준으로 조인하는 방법으로, OUTER를 생략해도 무방하다
(만약 왼쪽 테이블에는 존재하지만 오른쪽 테이블에는 존재하지 않는 키값이 있다면 NULL값으로 값이 반환됨)
SELECT 별칭1.열 이름1, 별칭2.열 이름2
FROM 테이블명1 (AS) 별칭1 LEFT (OUTER) JOIN 테이블명2 (AS) 별칭2
ON 별칭1.KEY=별칭2.KEY;
2. RIGHT OUTER JOIN
오른쪽 테이블을 기준으로 조인하는 방법으로, OUTER를 생략해도 무방하다
(만약 오른쪽 테이블에는 존재하지만 왼쪽 테이블에는 존재하지 않는 키값이 있다면 NULL값으로 값이 반환됨)
SELECT 별칭1.열 이름1, 별칭2.열 이름2
FROM 테이블명1 (AS) 별칭1 RIGHT (OUTER) JOIN 테이블명2 (AS) 별칭2
ON 별칭1.KEY=별칭2.KEY;
3. FULL OUTER JOIN
FULL OUTER JOIN 키워드는 왼쪽과 오른쪽 테이블의 모든 행이 반환된다
=> 즉, LEFT JOIN과 RIGHT JOIN을 합쳐놓은 형태라고 볼 수 있음
SELECT 별칭1.열 이름1, 별칭2.열 이름2
FROM 테이블명1 (AS) 별칭1 FULL (OUTER) JOIN 테이블명2 (AS) 별칭2
ON 별칭1.KEY=별칭2.KEY;
1. CUSTOMERS와 ORDERS 테이블을 이용하여 고객아이디, 고객이름, 주문번호를 나타내고 주문이력이 있는 고객은 1, 없는 고객은 0으로 표시한 후 고객아이디를 기준으로 오름차순 정렬하려면?
SELECT TMP1.CUST_ID, TMP1.CUST_NM, TMP2.ORDER_ID,
CASE WHEN TMP2.CUST_ID IS NOT NULL THEN 1 ELSE 0 END AS ORDER_FLG
FROM CUSTOMERS TMP1 LEFT OUTER JOIN ORDERS TMP2
ON TMP1.CUST_ID = TMP2.CUST_ID
ORDER BY 1;
2. EMPLOYEE와 OREDERS, CUSTOMERS 테이블을 이용하여 직원아이디, 이름, 해당 직원이 맡았던 주문번호를 나타내고 해당 주문번호와 고객아이디를 매칭시켜 고객이름을 표기하려면?
SELECT TMP1.EMP_ID, TMP1.NM, TMP2.ORDER_ID, TMP2.CUST_ID, TMP3.CUST_NM
FROM EMPLOYEE TMP1 LEFT OUTER JOIN ORDERS TMP2 ON TMP1.EMP_ID = TMP2.EMP_ID
LEFT OUTER JOIN CUSTOMERS TMP3 ON TMP2.CUST_ID = TMP3.CUST_ID;
ORDER BY 1;
1. 테이블을 통합할 때 기준이 되는 테이블을 가장 먼저 나타내면 데이터 분석이 용이하다
2. LEFT OUTER JOIN은 WHERE 조건절에 *= 연산자를 통해 나타낼 수 있고, RIGHT OUTER JOIN은 WHERE 조건절에 =* 연산자를 사용해서 나타낼 수 있다
3. ACCESS, MY SQL 등 몇몇 DBMS에서는 FULL OUTER JOIN 키워드가 지원되지 X
4. 테이블 대신 SELECT 구문을 사용해서 테이블을 만들 수 있다
=> 테이블 전체를 합칠 수도 있고 테이블 일부만 합칠 수도 있음
ex. FROM EMPLOYEE TMP1 LEFT OUTER JOIN (SELECT ORDER_ID, CUST_ID FROM ORDERS) TMP2
5. 테이블 별칭은 TMP1, TMP2, TMP3 등과 같이 순서 있게 사용하는 것이 좋음
6. SELECT문에 출력할 열 이름을 적을 때 어느 테이블에서 참조되는 열 이름인지 나타내는 것이 좋음
행(Row) 합치기
UNION 연산자
1. UNION 연산자 사용
UNION은 두 개 이상의 SELECT문의 행을 합치는 역할을 함
=> ORDER BY절을 사용하면 데이터가 합쳐진 후 전체에 적용됨!
SELECT 열 이름1, 열 이름2 FROM 테이블명1 WHERE 조건절
UNION
SELECT 열 이름1, 열 이름2 FROM 테이블명2 WHERE 조건절
ORDER BY 1;
2. UNION ALL 연산자 사용
UNION ALL 연산자는 두 개 이상의 SELECT문의 행을 합치는 역할을 한다
=> UNION 연산자와의 차이는 UNION ALL은 중복을 포함한 모든 값을 나타낸다는 점!
SELECT 열 이름1, 열 이름2, FROM 테이블명1 WHERE 조건절
UNION ALL
SELECT 열 이름1, 열 이름2, FROM 테이블명2 WHERE 조건절
ORDER BY 1;
1. CUSTOMERS와 EMPLOYEE 테이블을 이용하여 직원이름과 고객이름을 합쳐서 오름차순으로 정렬하려면?
SELECT CUST_NM AS NM FROM CUSTOMERS
UNION
SELECT NM FROM EMPLOYEE
ORDER BY 1;
2. CUSTOMERS와 ORDERS 테이블을 이용하여 중복값을 허용한 채 고객아이디를 합쳐서 오름차순으로 정렬하려면?
SELECT CUST_ID FROM CUSTOMERS
UNION ALL
SELECT CUST_ID FROM ORDERS
ORDER BY 1;
'Database > SQL' 카테고리의 다른 글
데이터 및 테이블 조작 (0) | 2024.02.29 |
---|---|
하위 쿼리 (2) | 2024.02.29 |
데이터의 그룹화, 필터링 (1) | 2024.02.27 |
SQL 함수 활용하기 (0) | 2024.02.26 |
SQL 기본 함수 배우기 (2) | 2024.02.26 |