728x90
반응형
- JOIN(테이블을 가로로 합침)
- 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현
- 크게는 INNER JOIN, OUTER JOIN으로 구분
- INNER JOIN(교집합)
- 두 테이블 사이에 지정된 조건에 맞는 레코드만을 반환. 양쪽 테이블에 모두 해당 조건에 맞는 값이 있어야 결과에 포함
- tableA의 ID와 tableB의 a_id가 일치하는 ON 조건을 만족하는 데이터만 JOIN
- SELECT * FROM tableA INNER JOIN tableB ON tableA.ID = tableB.A_ID
- SELECT * FROM tableA AS a INNER JOIN tableB AS b on a.ID = b.a_id; →AS 생략 가능
- 출력결과
- TableA의 모든컬럼 + TableB의 모든컬럼
- 그 중에 ON조건을 만족하는 row만 출력
- ex)author와 post를 inner조인하면 글을 작성한적이 있는 author와 해당 author가 작성한 post정보를 결합하여 조회 (author의 id와 post의 author_id가 같은 값만 조회)
select * from author a inner join post p on a.id = p.author_id;
→ author id에 해당하는 post의 데이터가 합쳐짐(null은 조회되지 않고, 두번 쓴 사람은 두행으로 조회됨)
- 가장 일반적인 형태
- 컬럼을 선택하여 조회 시 중복된 컬럼명엔 테이블. 으로 붙여서 구분해줘야 함
select a.id, name author, title, contents, author_id from author a inner join post p on a.id = p.author_id;
- OUTER JOIN
- 하나의 테이블을 기준으로 모든 레코드와 그에 JOIN된 다른 테이블의 일치하는 레코드를 반환
- 왼쪽테이블이 기준이면 LEFT (OUTER) JOIN, 오른쪽 기준이면 RIGHT (OUTER) JOIN
- LEFT JOIN이 더 일반적으로 많이 사용되는 JOIN(왼쪽의 데이터는 다나오고 join되는 테이블의 데이터는 해당하는 부분만 조회)
- LEFT OUTER JOIN
- 문법
- SELECT * FROM tableA a LEFT JOIN tableB b ON a.id = b.a_id
- 출력결과
- TableA의 모든컬럼 + TableB의 모든컬럼
- A테이블 데이터는 row는 모두 출력 B데이터는 ON 조건에 맞는 데이터만 출력
- ON조건에 맞지 않는 B데이터는 null로 출력
- A테이블의 데이터를 기준으로 B테이블의 데이터를 정렬
- 문법
- ex)author의 테이블은 일단 다 조회하고 author가 작성한 글정보를 join하여 추가적으로 조회 → author테이블에 post테이블을 left join
select * from author a LEFT JOIN post p on a.id = p.author_id;
- INNER JOIN(교집합)
- JOIN 특이사항
- JOIN된 데이터에 WHERE조건
- where조건을 걸게 되면, ON 조건을 만족하는 데이터중에서도 WHERE문을 만족하는 데이터만 출력
- SELECT * FROM tableA AS a INNER JOIN tableB AS b on a.ID = b.a_id where a.name like ‘kim%’;
- RIGHT JOIN의 경우 LEFT JOIN과 동일
- 다만, 기준이 되는 테이블이 왼쪽 테이블에서 오른쪽으로 변경
- JOIN된 데이터에 WHERE조건
- 실습
- author 테이블과 post테이블을 JOIN하여, 글을 작성한 모든 저자의 이름(name)과 해당 글의 제목(title)을 조회하시오. author는 alias a, post는 alias p를 쓰시오
SELECT name, title from author a inner join post p on a.id = p.author_id;
- author 테이블을 기준으로 post 테이블과 JOIN하여, 모든 저자의 이름과 해당 저자가 작성한 글의 제목을 조회하시오. 글을 작성하지 않은 저자의 경우, 글 제목은 NULL로 표시
select name, title from author a left join post p on a.id = p.author_id;
- 위 예제와 동일하게 모든 저자의 이름과 해당 저자가 작성한 글의 제목을 조회. 단, 저자의 나이가 25세 이상인 저자만 조회
select name, title from author a left join post p on a.id = p.author_id where a.age >= 25;
- *프로그래머스 SQL문제 풀기
- LEFT JOIN - 없어진 기록 찾기
https://school.programmers.co.kr/learn/courses/30/lessons/59042
ANUNAL_OUT에 INS를 LEFT JOIN한 상태로 INS가 NULL인 데이터를 찾으면 됨
SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_OUTS A LEFT JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID WHERE B.DATETIME IS NULL;
또는 NOT IN 과 INNER JOIN을 사용해서도 가능
SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS WHERE ANIMAL_ID NOT IN ( SELECT A.ANIMAL_ID FROM ANIMAL_OUTS A INNER JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID );
- INNER JOIN - 조건에 맞는 도서와 저자 리스트 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/144854
SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE FROM BOOK A INNER JOIN AUTHOR B ON A.AUTHOR_ID = B.AUTHOR_ID WHERE A.CATEGORY='경제' ORDER BY PUBLISHED_DATE;
- UNION(테이블을 아래로 합침)
- 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현
- 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 일치해야함
- UNION은 DISTINCT 키워드를 따로 명시하지 않아도 중복되는 레코드를 제거
- 중복되는 레코드까지 모두 출력하고 싶다면 UNION ALL
- SELECT 컬럼1, 컬럼2 FROM TABLE1 UNION SELECT 컬럼1, 컬럼2 FROM TABLE2;
- author 테이블에서 NAME, EMAIL조회한 결과와 POST테이블에서 TITLE, CONTENTS를 조회한 결과를 UNION
SELECT name, email FROM author UNION SELECT title, contents FROM POST;
- 서브쿼리
- 서브쿼리(subquery)란 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미
- JOIN대신 서브쿼리를 써보자
- SELECT a.* FROM author a INNER JOIN post p ON a.id = p.author_id;
- SELECT a.* FROM author a WHERE a.ID IN (SELECT p.author_id FROM post p);
- IN과 NOT IN을 많이 사용
- SELECT * FROM tableA WHERE id IN (SELECT a_id FROM tableB);
- 서브쿼리는 반드시 괄호(())로 감싸져 있어야 한다
- 대부분의 서브쿼리는 join으로 대체가능하고 join을 쓰는것이 성능이 더 좋음
- 단, 매우 복잡한 쿼리는 join으로 대체하는 것이 불가능
과거 업무는 쿼리기반 프로젝트가 주요했지만 현재는 ORM기반 데이터베이스 기술을 쓰고있다.
→ 프로그램으로 쿼리문을 생성해주고 데이터베이스를 관리
→ 쿼리작성 능력보다 자바 프로그램의 활용 능력이 더 중요
Uploaded by N2T
728x90
반응형
'Database' 카테고리의 다른 글
[MariaDB] INDEX (0) | 2023.11.24 |
---|---|
[MariaDB] GROUP BY (0) | 2023.11.24 |
[MariaDB] 동시성 이슈 (1) | 2023.11.22 |
[MariaDB] 흐름제어 (0) | 2023.11.22 |
[MariaDB] 제약조건 (0) | 2023.11.22 |