쿼리실습 - 집합, JOIN

imjingu·2023년 8월 27일
0

개발공부

목록 보기
420/481
post-thumbnail

다음 쿼리문은 식품 유형의 상품과 가전 유형의 상품을 각각 조사하여 하나로 합침

SELECT * FROM tItem WHERE category = '식품' UNION SELECT * FROM tItem WHERE category = '가전';


UNION - 조회한 다수의 SELECT문을 하나로 합치고 싶을때, 중복되는 레코드는 제거
data1 data2 UNION data1 data2 >>> data1 data2

두 집합에 공통적으로 존재하는 레코드가 있다면 하나로 합침

SELECT DISTINCT depart FROM tStaff WHERE salary > 400 UNION ALL SELECT DISTINCT depart FROM tStaff WHERE score > 80;

UNION ALL - 조회한 다수의 SELECT문을 하나로 합치고 싶을때, 중복 제거 안함
data1 data2 UNION ALL data1 data2 >>> data1 data2 data1 data2

UNION을 여러번 사용해서 세개 이상의 결과셋에 대한 합집합도 만들 수 있음, 다음은 회원의 이름, 직원의 이름, 종업원의 이름을 모두 합해본것

SELECT member FROM tMember UNION SELECT name FROM tStaff UNION SELECT name FROM tEmployee;


UNION 은 합집합을 구하는데 비해 INTERSECT 연산자는 교집합을 구함
다음 쿼리는 영업부 직원 집합과 여직원 집합의 교집합을 구함

SELECT name FROM tStaff WHERE depart = '영업부' INTERSECT SELECT name FROM tStaff WHERE gender = '여';

MINUS 연산자는 차집합을 구함, MINUS 지원 안함 EXCEPT 를 지원
차집합은 앞쪽 집합의 원소에서 뒤쪽 집합의 원소를 제외한 집합
다음 쿼리문은 영업부에서 여직원을 뺀 집합

SELECT name FROM tStaff WHERE depart = '영업부' EXCEPT SELECT name FROM tStaff WHERE gender = '여';

차집합은 교환법칙이 성립 안됨 결과셋의 순서에 따라 집합이 달라짐
다음 쿼리는 반대로 여직원 집합에서 영업부를 뺌

SELECT name FROM tStaff WHERE gender = '여' EXCEPT SELECT name FROM tStaff WHERE depart = '영업부';

조인(JOIN)은 여러개의 테이블에서 조건에 맞는 데이터를 조회하는 방법, 구문이 길고 처리시간이 오래걸려 정확성과 효율성을 항상 고려해야 함
단순조인은 두개 이상의 테이블을 특별한 조건없이 논리곱(AND)으로 조합
FROM 절에 출력대상 테이블의 목록을 콤마로 구분하여 나열

SELECT * FROM tCar, tMaker WHERE tCar.maker = tMaker.maker;


tCar, tMaker 안에서 tCar.maker = tMaker.maker 같은값을 출력

다음 쿼리는 모두 같은 값을 나타냄

SELECT tCar.car, tCar.price , tMaker.maker, tMaker.factory FROM tCar, tMaker WHERE tCar.maker = tMaker.maker;

SELECT car, price, tCar.maker, factory FROM tCar, tMaker WHERE tCar.maker = tMaker.maker;

SELECT tCar.car, tCar.price, tMaker.maker, tMaker.factory FROM tCar, tMaker WHERE tCar.maker = tMaker.maker;


tCar.car는 tCar테이블 안에 car필드

별명 - 테이블에 짧은 별명을 붙이고 필드명 앞에는 별명을 씀

SELECT C.car, C.price, M.maker, M.factory FROM tCar C, tMaker M WHERE C.maker = M.maker;


내부조인
각 테이블의 필드값을 비교하여 조건에 맞는 레코드만 선택적으로 가져오는 명령
FROM 절의 INNER JOIN 양쪽에 조인할 테이블명을 지정하고 on 다음에 조인 조건을 작성
기본형식
SELECT 필드 FROM A [INNER] JOIN B ON 조건;

SELECT C.car, C.price, M.maker, M.factory FROM tCar C INNER JOIN tMaker M ON C.maker = M.maker;


FROM 절에서 tCar 와 tMaker 를 조인하고 ON 절에 두 테이블의 회사명이 같다는 조건을 지정
단순 조인한 결과에서 ON 조건에 맞는 레코드만 나타남

단순 조인은 조건절을 생략하고 논리곱을 볼수 있지만 내부조인은 ON 절이 필수
조건 없이 출력한 논리곱은 중간 과정일 뿐 별 실용성은 없음
그래서 내부 조인은 ON을 생략하면 에러처리

위 예의 ON C.maker = M.maker 조건절을 보면 제조사와 자동차를 연결하는 외래키가 maker로 이름과 타입이 같음
이 경우 USING 를 사용하면 간결

SELECT C.car, C.price, maker, M.factory FROM tCar c INNER JOIN tMaker M USING(maker);

외부조인
왼쪽 조인 , 오른쪽 조인
조인조건에 맞는 레코드는 당연히 출력하고 이 외에 왼쪽 or 오른쪽테이블인 tCar의 모든 레코드 출력
조건에 맞는 것은 물론 맞지 않는 것도 모두 출력 이때 해당 하지 않는 조건값은 NULL 출력, LEFT는 왼쪽 기준, RIGTH 오른쪽 기준

SELECT C.car, C.price, M.maker, M.factory FROM tCar C LEFT OUTER JOIN tMaker M ON C.maker = M.maker;



SELECT C.car, C.price, M.maker, M.factory FROM tCar C RIGHT OUTER JOIN tMaker M ON C.maker = M.maker;


0개의 댓글