본문 바로가기
카테고리 없음

mySQL 기본 문법 정리 - JOIN

by solutionmaster 2023. 5. 7.

그룹질의 : 두개이상의 select문을 이용한 질의, 독립적으로 실행될 수 있는 완전한 select질의문이어야 한다.

 컬럼명/순서/데이터타입이 같아야한다.

 

union : 중복된 레코드 제외시킴.
union all :중복된 레코드라도 모두 표시     

select 칼럼,., from테이블 [where 조건]
    union (all)
    select 컬럼... from 테이블[where 조건]

조인질의 : 두개이상의 테이블에서 테이블간의 관련성을 이용하여 임시적으로 레코드를 통합한 후 
데이터를 검색하는 질의기법
            

select 테이블A.컬럼,테이블B.컬럼,,, 
    from 테이블A as a inner join 테이블B as b
    on join조건 where 조건


내부조인 : inner join, 조인조건에 일치하는 레코드만 결합하여 조인결과 생성 
동등조인 : 같은기준을 비교조건으로 해서
비동등조인 : 서로다른 값을 기준으로 결합 .. inner join, cross join 키워드 사용
외부조인 : outer join, 조건에 맞지않는 레코드도 결과에 생성
                 - left join : 왼쪽전체 + 오른쪽조건에 맞는것
                 - right join : 오른쪽전체 + 왼쪽조건에 맞는것
셀프조인 : 한 테이블이 자기 자신과 조인되는 것
                >> 반드시 다른 별칭을 사용해줘야 한다.
 부속질의:  질의문 속의 질의문
            . () 괄호속에 있는 것부터 처리된다.
            . 부속질의는 SELECT문에서 WHERE 또는 FROM절에 위치할 수 있다.
            . 부속질의는 그룹함수나 GROUP BY절의 HAVING절과 함께 사용할수 있다.
            예) where 컬럼 조건연산 (select~~~), from (select~~~)

 

 

 <그룹질의 예제>


# 학생테이블에서 컴퓨터과학과 학생을 검색한 결과와 25세이상의 학생을 검색한 결과의 학생이름, 소속학과, 나이를 통합하여 검색하시오.

select 학생번호, 학생이름, 소속학과, 나이 from 학생 where 소속학과 = '컴퓨터과학과'
union  -- 또는(교집합이 아니여)
select 학생번호, 학생이름, 소속학과, 나이 from 학생 where 나이 >= 25;

 

 <JOIN 예제>


# 강의와 교수 테이블을 활용해서 강의이이름, 강의실, 강의시간, 이수구분 그리고 강의를 담당하는 교수의 교수이름, 소속학과, 전화번호를 검색하시오

select a.강의이름, a.강의실, a.강의시간, a.이수구분, b.교수이름, b.소속학과, b.전화번호
from 강의 a inner join 교수 b
on a.교수번호 = b.교수번호;

#학생과 수강신청 테이블에서 강의번호 "LA01"을 수강신청한 학생들의  학생이름, 소속학과, 전화번호, 신청 시각을 검색하오

select 학생.학생이름, 학생.소속학과, 학생.전화번호, 수강신청.신청시각 
from 학생 
inner join 수강신청 on 학생.학생번호 = 수강신청.학생번호
where 수강신청.강의번호 = 'LA01';


#강의와 교수테이블에서 강의번호, 강의이름, 이수구분 담당교수이름, 직위를 출력하실오.

select a.강의번호, a.강의이름, a.이수구분, b.교수이름, b.직위 
from 강의 as a inner join 교수 as b
on a. 교수번호=b.교수번호;

 

<외부 JOIN 예제>

 

기준테이블것은 모두 출력(조건에 안맞으면 null 처리) + 외부조인 조건에 맞는것만 출력


# 등급 기준표를 조건으로 참조하여 조건에 레코드들의 이름, 취득점수 등급을 검색하시오.

select 이름, 취득점수, 등급
from 학사테이블 a cross join 등급기준표 b
on a.취득점수 between b.하한 and b.상한;


# 학생과 수강신청 테이블에서 모든 학생정보와 각 학생이 수강신청을 한 수강신청 정보를 출력하시오.

select a.*, b.* from 학생 as a left join 수강신청 as b
on a.학생번호 = b.학생번호;


#강의 테이블에 선수과목이 있는 강의 중에서 강의이름, 인원제한, 이수구분과 선수 과목의 강의이름, 이수구분을 각각'선수강의이름'과 '선수이수구분' 이란 이름으로 조화하시오.

select a.강의이름, a.강의시간, a.인원제한, a.이수구분,  a.강의_강의번호, b.강의이름 as 선수강의이름, b.이수구분 as 선수이수구분
from 강의 a inner join 강의 b 
on a.강의_강의번호 = b.강의번호;

 

<부속 질의 예제>


select 컬럼... from 테이블 where 컬럼 조건연산자(select ~~~ where 조건)


# 강의번호가  k031강의를 담당하는 교수의 교수번호 , 교수이름, 연구실 위치, 전화번호를 출력하시오.

select * from 교수;
select 교수번호, 교수이름, 연구실위치, 전화번호 
from 교수
where 교수번호 = (select 교수번호 from 강의 where 강의번호='K031');



# 강의 테이블에서 전공강의를 담당하는 교수의 교수번호, 교수이름 , 연구실위치, 전화번호를 출력하시오

select 교수번호, 교수이름 ,연구실위치, 전화번호 from 교수 
where 교수번호 in (select 교수번호 from 강의 where 이수구분='전공%');
select 강의.이수구분, 교수.교수번호, 교수.교수이름, 교수.연구실위치, 교수.전화번호 
from 교수 inner join 강의 
on 강의.이수구분 like '전공%';


# 학생테이블에서 전체학생 나이의 평균보다 나이가 많은 학생의 학생번호 이름, 나이, 주소?

select 학생번호, 학생이름, 나이, 주소 from 학생 where 나이 > (select avg(나이) from 학생);


#수강신청된 강의의전체 내역을 검색하시오.    
# exits, not exits, 부속질의어

select * from 강의 where exists(select *from 수강신청 where 강의.강의번호=수강신청.강의번호);

 

# join 

select 강의.*,수강신청.*
from 강의 inner join 수강신청 
on 강의.강의번호=수강신청.강의번호;

댓글