Join

miin·2021년 4월 26일
0

DataBase

목록 보기
3/10

join
여러개의 테이블을 합쳐서 하나의 테이블로 만드는과정

예시) b 테이블에 join,
a의 member_no와, b의 member_no가 같고,
현재의 no를 가진 회원의 title과 thumbnail_path을 a테이블에서 조회

SELECT a.title, a.thumbnail_path 
  FROM a
  JOIN b
  ON a.member_no = b.member_no
  WHERE no = :no`;//현재의 no를 가진 회원의 정보

이너조인 (inner join)

  • INNER JOIN은 ON 절과 함께 사용되며, ON 절의 조건을 만족하는 데이터만을 가져온다
  • 문법
    첫번째 테이블 이름
    JOIN 두번째 테이블 이름
    ON 조건
  • select * from 테이블1,테이블2
    where 테이블1.동일컬럼 = 테이블2.동일컬럼;
  • ON절에서는 WHERE절에서 사용할 수 있는 모든 조건을 사용할 수 있다
  • 두 테이블의 동일컬럼이 같은 데이터만 얻을 수 있다
  • where 절에서 '='연산자로 2개이상의 테이블이나 뷰를 연결한다
  • 이때 where절에서 기술한 조건을 조인조건이라 함
  • 조인조건은 컬럼단위로 기술함
  • 일치하는 데이터만 뽑음
  • 관계가 없는 데이터들은 삭제되고 동일 컬럼만큼 반대쪽컬럼에도 그 컬럼 수만큼 생긴다
  • 서로 관계가 있는 레코드들은 inner
  • 서로 관계가 없는 레코드들은 outer
  • MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용된다

LEFT JOIN

  • 첫 번째 테이블을 기준으로, 두 번째 테이블을 조합하는 JOIN
  • ON 절의 조건을 만족하지 않는 경우에는 첫 번째 테이블의 필드 값은 그대로 가져온다
  • 해당 레코드의 두 번째 테이블의 필드 값은 모두 NULL로 표시
  • ON 절에서는 WHERE 절에서 사용할 수 있는 모든 조건을 사용할 수 있다
  • 문법
    첫번째 테이블 이름
    LEFT JOIN 두번째 테이블 이름
    ON 조건
  • 예제
  • Reservation 테이블의 Name 필드를 기준으로 Customer 테이블의 Name 필드와 일치하는 레코드만을 LEFT JOIN으로 가져온 후, 그 중에서 ReserveDate 필드의 값이 2016년 02월 01일 이후인 레코드만을 선택
  • 두 개의 Name 값이 일치하면, INNER JOIN과 같이 두 테이블의 모든 필드를 그대로 가져오지만
    두 개의 Name 값이 일치하지 않는 경우에는 Customer 테이블의 모든 필드를 NULL로 표시
SELECT *
FROM Reservation
LEFT JOIN Customer
ON Reservation.Name = Customer.Name
WHERE ReserveDate > '2016-02-01';

RIGHT JOIN

  • 두 번째 테이블을 기준으로, 첫 번째 테이블을 조합하는 JOIN
    ON 절의 조건을 만족하지 않는 경우에는 두 번째 테이블의 필드 값은 그대로 가져오지만
    해당 레코드의 첫 번째 테이블의 필드 값은 모두 NULL로 표시된다
  • 문법
    첫번째테이블이름
    RIGHT JOIN 두번째테이블이름
    ON 조건

-서브쿼리
쿼리 안에 또 다른 쿼리가 담겨있는 것
괄호 안에있는 쿼리를 sub Query 또는 inner Query,
나머지 괄호 밖에 있는 쿼리를 Main Query 또는 outer Query라고 함
select 테이블1.컬럼,테이블2.컬럼
from 테이블1,테이블2
where 조건 연산자 ( select 컬럼 from 테이블 where 조건);

사원들이 다니는 부서의 이름과 사번출력
select emp.ename, dept.dname from emp, dept;

-세미조인
서브쿼리에 존재하는 데이터만 메인쿼리에서 추출함
in과 exists연잔사를 사용한 조인

-안티조인(anti join)
서브쿼리의 b 테이블에 없는 메인 쿼리의 a 테이블의 데이터만 추출
한쪽 테이블에만 있는 데이터를 추출하는 것이므로 조회조건에서 not in 이나 not exists 연산자를 사용
세미조인과 반대개념

-셀프조인(self join)
서로다른 두 테이블이 아닌 동일한 한 테이블을 두개로 나누는 방법
select e1.컬럼1, e1.컬럼2
from 컬럼1,2의 테이블명 e1
where e1.컬럼=e2.컬럼; (비교할 컬럼 입력)
and 테이블.컬럼=테이블.컬럼; (여러개의 데이터베이스를 조인할때)

select 테이블1.컬럼1,테이블1.컬럼2,테이블2.컬럼3
from 테이블1, 테이블2
where 테이블1.컬럼4=테이블2.컬럼4
and 테이블2.조건(<=1000)
order by 컬럼1;

-외부조인 (outer join)
조인조건에 만족하는 데이터 뿐만 아니라 null까지 출력 즉,모든데이터를 출력
서로 관계가 없는 레코드들만 조인
null이있는 데이터 반대편에 (+)
카다시안 조인
where절에 조인조건이 없는 조인
full outer joind
양쪽에 + 넣어도 실행 안됨
ansi로 기술해야 한다

-Ansi join ***
ansi SQL 문법을 사용한 조인
기존 조인 문법과 ansi조인의 차이점은 조인조건이 where절이 아닌 from절에 들어간다는 점
select 테이블.컬럼,테이블.컬럼,테이블.컬럼
from 테이블 join 테이블
on 테이블.컬럼=테이블.컬럼;(비교할 컬럼)

-exists 검색결과가 존재하면 데이터가 출력됨
selectfrom 테이블명 where exists(select 1 from dual);
->테이블의 모든데이터 출력
not exists 검색결과가 없어야 데이터가 출력됨
select
from 테이블 where not exists(select 1 from dual);
select*from 테이블 where exists(select 1 from dual where 1!=1);
->테이블에 데이터가 있을시 아무것도 출력 안됨

사원이 존재하는 부서정보만 출력
select from 테이블1 d(별명)
where exists(
select
from 테이블2 e(별명) where e.컬럼=d.컬럼); (비교할컬럼)

-any,some은 여러비교 대상중 하나 이상이 일치하면 결과를 출력
all 모두 일치

ex) 부서가 50인 사원들중 한명보다 급여를 적게 받는 사람 출력
select * from 테이블1 where 컬럼1<= any(
select 컬럼1 from 테이블1 where 컬럼2=50);

-non-equl jonin(범위조회)
where절에 범위를 사용하여 해당 테이블을 합치는 방법
마지막 줄에 order by min/max등등;

0개의 댓글