DB

Growing_HJ·2024년 6월 13일

일기장

목록 보기
26/51

2024.06.13. THU. JOIN, Subquery
A.JOIN
1. equal join (등가조인 , 교집합)

select c.first_name, c.last_name ,
       r.rental_date, r.return_date
    from customer c
        inner join rental r
        on c.customer_id = r.customer_id
    where c.first_name = 'MARY'
        and date(r.rental_date = '2005-05-25');
  • 문자열 함수를 이용한 등가조인
select last_name, left(last_name,1)
    from customer
where left (last_name, 1) = 'Q';
  1. ANSI JOIN , (표준 SQL)
  • 표준 SQL장점
    -> 조인 조건과 추가적인 필터 조건이 구분이 되어 가독성이 높음.
    -> 조인 조건에 대한 누락될 가능성이 낮음
    -> 표준 sql 다른 벤더의 데이터베이스로의 이식성이 높음.
select c.first_name, c.last_name, a.address
from customer c join address a on c.address_id = a.address_id
where a.postal_code = 52137;
  1. SELF JOIN
  • 테이블 하나로 마치 두 개의 테이블처럼 조인해서 사용하는 경우.
select e1.empno , e1.ename, e1.mgr,
       e2.empno as mgr_emono, e2.ename as mgr_ename
    from emp e1 inner join emp e2
        on (e1.mgr = e2.EMPNO);
  1. OUTER JOIN (외부 조인)
  • 누락된 데이터 조회하기.
  • 동일한 테이블 간의 조인 수행에서 어느 한쪽이 Null이어도 강제로 출력하는 join 방식
    4-1. LEFT OUTER JOIN (왼쪽 외부 조인)
  • 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력하라는 의미.
    (왼쪽 테이블의 정보는 다 나오게 출력하는 방식)
select e1.empno, e1.ename, e1.mgr,
       e2.empno as mgr_emono, e2.ename as mgr_ename
from emp e1 left outer join emp e2
    on (e1.mgr = e2.empno);

B. 필터링.
1. 동등 조건

SELECT rental_date
    FROM rental
where date(rental_date) = '2005-06-14';
  1. 비동등 조건
SELECT rental.rental_date
    FROM rental
where date(rental_date) <> '2005-06-14';
  1. 범위 조건
SELECT rental_date
    FROM rental
where date(rental_date)  < '2005-05-28';

SELECT rental_date
    FROM rental
where rental_date <= '2005-06-16'
    and rental_date >= '2005-06-14';

SELECT rental_date
    FROM rental
where rental_date between '2005-16-14' and '2005-06-16';

C. 데카르트 곱.

select count(*) from customer; /* 599건 */
select count(*) from address;  /* 603건 */
select count(*) from customer c join address a; /*361,197*/

select customer_cnt.cnt ,address_cnt.cnt, cartesian_cnt.cnt
from
    (select count(*) cnt from customer) customer_cnt,
    (select count(*) cnt from address) address_cnt,
    (select count(*) cnt
     from customer c join address ) cartesian_cnt;

0개의 댓글