그룹질의 : 두개이상의 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 강의.강의번호=수강신청.강의번호;
댓글