본문 바로가기

학교/데이터베이스

[데이터베이스] 6강 SQL


JOIN

둘 이상의 테이블로부터 연관된 행들의 결합을 통해 검색 결과 생성

//SUBQUERY와 많은 부분 유사한 기능 => 거의 서로 바꿀 수 있는 듯

[조인 명세 방법 1]
SELECT 열_리스트
FROM 조인테이블_리스트
WHERE <조인 조건식> AND <검색_조건식>

[조인 명세 방법 2]
SELECT 열+리스트
FROM 테이블이름1 {[INNER] JOIN 테이블이름2 ON <조인_조건식> }+
WHERE <검색_조건식>

-CROSS JOIN (크로스 조인)

: '조인_조건식'없이 이루어진 조인

: 관계 대수의 카디션 프로덕트 연산을 적용한 결과를 반환 //대부분의 행이 의미 없는 기계적 결합

CROSS JOIN
의미 없는 기계적 결합 출력됨

 

-EQUI JOIN (동등 조인)

: 조인_조건식에 = 연산자 사용

: 두 테이블 행 사이의 의미 있는 조합만 검색 //크로스 조인 결과 중 의미 없는 조합 제외

+ 자연조인

EQUI JOIN
의미있는 조합 검색됨

 

JOIN 결합SELECT문에 있는 이름이 두 테이블 모두에 있을 경우 주의**

=> 어느 테이블인지 명시 필요

 

 

 

두 개 초과의 여러 테이블을 엮을 경우, INNER JOIN으로 엮여줘야함

 

 

 

 

 

 

JOIN 테이블 별칭 사용 (AS) //대신 별칭 사용 시 모든 부분에 별칭으로 작성!

 

셀프 조인(self join)

특정 테이블에 속하는 행을 같은 테이블에 속하는 행들과 조인하는 것

하나의 테이블은 테이블 별칭을 다르게 해 마치 복제된 두 테이블이 존재하는 것처럼 JOIN 가능

 

외부 조인(OUTER JOIN)

조인하는 여러 테이블 중 한쪽에만 데이터가 있는 경우,데이터가 있는 쪽의 테이블 내용 출력

즉, 조건에 맞지 않아도 해당하는 행 출력 가능

LEFT OUTER JOIN : JOIN문의 왼쪽에 있는 테이블의 모든 결과를 가져온 후,

                                  오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없으면 NULL로 채움

SELECE 검색 COLUMN

FROM 테이블1 LEFT OUTER JOIN 테이블2 ON 테이블1.COLUMN=테이블2.COLUMN;

 

 

왼쪽 테이블 = TEST

=> 1.TEST 테이블에 있는 데이터 모두 가져와서 

     2.오른쪽 테이블 데이터와 매칭

     3.매칭되는 데이터 없으면 NULL

 

 

 

 

RIGHT OUTER JOIN : 조건문의 오른쪽에 있는 테이블의 데이터를 기준으로 왼쪽 테이블 데이터와 매칭,

                                     매칭되는 데이터 없으면 NULL로 채운다

 

EX) 과목 수강하지 않은 학생 포함하여 모든 학생의 학번, 이름, 학생이 수강한 교과의 평가학점 출력

=> 학생 테이블과 수강 테이블의 조인

      + 과목 수강하지 않은 학생 포함 => 더 큰 범위가 학생 테이블, 학생 테이블 기준으로 수강 테이블 데이터와 매칭**

FULL OUTER JOIN : 조인 연산자의 왼쪽과 오른쪽의 테이블의 모든 행들이 빠짐없니 조인 최종 결과에 포함

 

+실습 예제 [EXISTS와 IN] 추가 설명 (5장에 이미 설명 있음) => JOIN과 더불어 조금 헷갈리기에.. 한 번 더,,

EXISTS : 한 테이블이 다른 테이블과 외래키와 같은 관계가 있을 때 유용

                조건에 해당하는 ROW 존재 유무만 확인 //내용은 확인하지 않음

                SELECT 절까지 가지 않아 속도나 성능 측면에서 IN보다 유리

                MAIN 쿼리-> EXISTS 쿼리 //메인 쿼리 결과값을 서브 쿼리에 대입

IN : 조건에 해당하는 ROW의 culumn 비교

      SELECT절에서 조회한 이후 칼럼 값으로 비교 => EXISTS에 비해 성능 불리

     IN 쿼리-> MAIN 쿼리//서브 쿼리의 결과값을 메인 쿼리에 대입하여 조건 비교 후 결과 출력

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

exists 지금 굉장히 헷갈리는 이해 안되는 부분,,,

음 약간 아직 완벽히 이해는 안되는데 다른 티스토리에서 본 글이 도움되는 거 같아서 써두자면 EXISTS 는 서브쿼리에서 모든 정보를 처리해준다고 생각하면 된다고 한다. IN은 메인 쿼리를 먼저 거쳐오기에 서브쿼리에서 모든 정보를 다 가지고 있음,  EXISTS는 서브쿼리가 먼저 실행되기 때문에 모든 정보는 서브 쿼리에서 설정!!

=> 일단 이렇게 하면 좀 이해 되는 듯

IN은 =과 동일하다고 생각하면 된다.

 

#IN : 부질의문 결과 중 하나라도 '일치'하면 참 = 메인 쿼리를 먼저 돌고 오기에 일치 여부 판단 가능
#EXISTS : 부질의문 결과가 하나라도 '존재'하면 TRUE = 부 질의문 먼저 판단하기 떄문에 부질의문 조건만으로 일단 반환

                                                                                        => 그러므로 부질의문에 일치 조건들까지 모두 작성해야함


INSERT

//행 삽입

INSERT INTO table_name[(열_리스트)]
values(열_값_리스트);

//TABLE_NAME 다음에 열 리스트 입력해주면 해당 열 리스트 순서대로 정보 입력해주면 됨

UPDATE 

//행 수정 => SUBQUERY + IN/EXISTS로도 가능

UPDATE table_name
SET 열_이름=산술식[,{열_이름=산술식}*]
[WHERE 수정_조건식];

=> 단일 행/ 단일 열 수정

=> 복수 행/ 복수 열 수정 

UPDATE
UPDATE+SUBQUERY로 수정하기

 

DELETE 

//행 삭제

DELETE FROM table_이름
[WHERE 삭제_조건식];

-단일 행 삭제

-복수 행 삭제