설 연수
하하호홓
설 연수
전체 방문자
오늘
어제
  • 분류 전체보기 (231)
    • Back-End (2)
      • Java (20)
      • JSP (13)
      • Spring (18)
      • Kotlin (0)
      • node.js (0)
    • Front-End (68)
      • JavaScript (19)
      • jQuery (39)
      • Angular (4)
      • HTML (5)
    • Dev-Ops (12)
      • Linux, Cloud (5)
      • docker, k8s (5)
      • ElasticSeach (2)
    • Other (33)
      • OOP (3)
      • 알고리즘 (2)
      • DB (12)
      • Git (1)
      • Swift (4)
    • Backup (65)

블로그 메뉴

    공지사항

    인기 글

    태그

    • jOOQ
    • flex
    • MYSQL
    • 크로스도메인
    • INVALID
    • mongodb
    • Redis
    • Kafka
    • Angular
    • CORS
    • 패스트캠퍼스
    • RESTful
    • jquery invalid
    • docker
    • angular callback
    • angular2
    • angular 콜백
    • angular4
    • 404 error
    • page not found

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    설 연수

    하하호홓

    Other/DB

    JOIN함수

    2012. 2. 28. 16:52

    오라클은 쿼리를 날리면 테이블을 램으로 가져와서 램에서 작업을 한다.
    평소에는 하드에 저장하고 모든 테이블을 통으로 램으로 복사해와서 작업테이블 순서와 구조파악이 힘듦
     

    조인할시 철칙은 앞테이블이 작아야 한다. 한 테이블이 널값이 들어 있으면 데이타는 나오지 않는다.

    조건 where을 빼먹었다...조건을 걸지 않으면 카티션 곱이 된다.
    카티션곱은 큰데이타를 필요실 할때 시험적으로 만들어서 사용한다.

     


    1. 조인의 개념
    두 개 이상의 테이블을 결합하여 필요한 데이터를 조회하게 하는 기능
    예를 들어 학번이 10101인 학생의 이름과 소속 학과 이름을 출력하려 할 때
    student table 과 department table을 두 번 조회 해야 하지만 조인을 이용하면 한번에 조회가 가능하다.

     

    2. 조인의 종류
     카티션 곱(cartesian product, cross join), EQUI JOIN, NON-EQUI JOIN OUTER JOIN, SELF JOIN 등이 있다.

     

    3. 조인 문법
    SELECT table1.column, table2.column
    FROM  table1, table2
    WHERE condition;

     

    1) 카티션 곱 (Cartesian Product)
      두개 이상의 테이블에 대해 연결 가능한 행을 모두 결합하는 조인방법.
    WHERE 절에서 조인 조건절을 생략하거나 조인 조건을 잘못 설정하여 양쪽테이블을 연결하는 조건을 만족하는 행이
    하나도 없는 경우에 발생한다.

    예제)
    학생 테이블과 부서 테이블을 카티션 곱을 한 결과를 출력하여라.

    SQL>   SELECT name, student.deptno, dname, loc
                FROM student, department;


    위 문장을 실행하면 112개의 행이 나온다.
    위 쿼리문에서 WHERE 조건이 없어서생긴 문제이며 항상 이런 상황이 발생하지 않도록 주의해야 한다.

     

    2) EQUI JOIN
    SQL 문에서 가장 많이 사용되는 조인으로 조인 대상 테이블에서 공통칼럼을  ‘=‘ 비교를 통해 같은 값을 갖는 행을 연결하여 결과를 생성하는 조인 방법임.

    문법)
     SELECT    table1.column, table2.column
     FROM       table1, table2
     WHERE     table1.column = table2.column;

     

    EQUI JOIN 사용 예)
    학생 테이블과 부서 테이블을 EQUI JOIN 하여 학번, 이름, 학과번호, 소속학과 이름, 학과 위치를 출력하여라.

    SQL>    SELECT s.studno, s.name, s.deptno, d.dname, d.loc
                FROM  student s, department d
                WHERE s.deptno = d.deptno;

    출력결과)
    STUDNO   NAME     DEPTNO    DNAME         LOC
    -------  ------  -------  ----------  -----
       10101    전인하      101        컴퓨터공학과    1호관
    …..(이하중략)

    16개의 행이 선택되었습니다.

    문제 1

    Student 테이블과 department 테이블을 사용하여 학생명과 학과명을 출력하세요


      select student.name, department.dname
      from student, department
      where student.deptno=department.deptno
    SQL> /

     

    NAME       DNAME
    ---------- ----------------
    전인하     컴퓨터공학과
    이동훈     전자공학과
    박미경     컴퓨터공학과
    김영균     컴퓨터공학과
    박동진     전자공학과
    김진영     멀티미디어학과
    지은경     컴퓨터공학과
    오유석     멀티미디어학과
    하나리     멀티미디어학과
    임유진     컴퓨터공학과
    서재진     컴퓨터공학과
    윤진욱     멀티미디어학과
    이광훈     컴퓨터공학과
    김진경     전자공학과
    조명훈     전자공학과
    류민정     컴퓨터공학과 

     

    문제 2

    Student , department , professor 테이블을 사용하여 학생이름,학과이름,지도교수이름을 아래와 같이 출력하세요.

     

    select s.name, d.dname, p.name
    from student s, department d, professor p
    where s.deptno=d.deptno and s.profno=p.profno
    SQL> /

    NAME       DNAME            NAME
    ---------- ---------------- ----------
    김진경     전자공학과       이재우
    이광훈     컴퓨터공학과     성연희
    전인하     컴퓨터공학과     성연희
    윤진욱     멀티미디어학과   권혁일
    오유석     멀티미디어학과   권혁일
    김진영     멀티미디어학과   권혁일
    김영균     컴퓨터공학과     이만식
    류민정     컴퓨터공학과     전은지
    임유진     컴퓨터공학과     전은지
    지은경     컴퓨터공학과     전은지

     

    3) NON-EQUI JOIN
     조인 조건에서 ‘<‘,BETWEEN a AND b 와 같이 ‘=‘ 조건이 아닌 다른 종류의 연산자를 사용하는 조인 방법이다. 많이 사용된다.

    사용예)
    교수 테이블과 급여 등급 테이블을 NON-EQUI JOIN 하여 교수별로 급여등급을 출력하여라.

    SQL>  SELECT     p.profno ,  p.name ,  p.sal,  s.grade
              FROM        professor  p , salgrade  s
              WHERE      p.sal  BETWEEN  s.losal  AND  s.hisal;

     

    문제 1

    Test13 , test14 테이블을 사용하여
     1)고객별로 받을 수 있는 상품을 출력하고
     2)각 상품이 몇 개가 필요한지 출력하세요.

     

    select b.cust, a.gift
    from test13 a, test14 b
    where b.point between a.fpoint and a.tpoint
    SQL> /

    CUST           GIFT
    -------------- ----------------------------------------
    771201-2233445 COMPUTER
    620908-2121232 COMPUTER
    500823-1132762 AUDIO
    672102-2123452 의류교환권
    650207-1765152 굴비세트
    680801-1234455 갈비세트
    701212-1143211 PCS무료가입권
    710125-1144951 구두상품권
    721109-2144952 녹차세트
    721101-2144952 도서상품권

     

    문제 2

    Test13 , test14 테이블을 참조하여
    고객의 포인트보다 낮은 모든 모든 등급의 상품을 선택할 수 있다고 할때
    갈비세트를 상품으로 받을 수 있는 고객의 고객번호, 포인트 , 선물을 보여주는 쿼리를 작성하시오.

    select a.gift, count(a.gift)
    from test13 a, test14 b
    where b.point between a.fpoint and a.tpoint
    group by a.gift
    SQL> /

    GIFT                                     COUNT(S.GIFT)
    ---------------------------------------- -------------
    COMPUTER                                         2
    의류교환권                                           1
    굴비세트                                              1
    갈비세트                                              1
    PCS무료가입권                                     1
    구두상품권                                           1
    AUDIO                                                 1
    녹차세트                                              1
    도서상품권                                           1

     

    문제 3

    temp 테이블의 사람 중 emp_level 테이블에서의 부장직급을 받아야 할 나이를 가지고 있는 사람의
    사번,성명,생일,현재나이,현재 직급을 출력하세요.

    select t.emp_id "사번", t.emp_name "이름", t.birth_date "생년월일",
    to_char(round((sysdate-t.birth_date)/365,1),'99')||'   ' "나이", e.lev "직급"
    from temp t, emp_level e
    where e.from_age between e.from_age and e.to_age
    and e.lev='부장'
    SQL> /

          사번 이름       생년월일     나이   직급
    ---------- ---------- ------------ ------ ----------
      19970101 김길동     25-JAN-74     38    부장
      19960101 홍길동     22-MAR-73     39    부장
      19970201 박문수     15-APR-75     37    부장
      19930331 정도령     25-MAY-76     36    부장
      19950303 이순신     15-JUN-73     39    부장
      19966102 지문덕     05-JUL-72     40    부장
      19930402 강감찬     15-AUG-72     39    부장
      19960303 설까치     25-SEP-71     40    부장
      19970112 연흥부     05-NOV-76     35    부장
      19960212 배뱅이     15-DEC-72     39    부장
      20000101 이태백     25-JAN-80     32    부장
      20000102 김설악     22-MAR-80     32    부장
      20000203 최오대     15-APR-80     32    부장
      20000334 박지리     25-MAY-80     32    부장
      20000305 정북악     15-JUN-80     32    부장
      20006106 유도봉     05-JUL-80     32    부장
      20000407 윤주왕     15-AUG-80     31    부장
      20000308 강월악     25-SEP-80     31    부장
      20000119 장금강     05-NOV-80     31    부장
      20000210 나한라     15-DEC-80     31    부장


    4) OUTER JOIN
    NULL에 어떤 연산을 적용시켜도 결과는 null 이 된다.
    따라서 조인조건중 하나의 값이 NULL일 경우 값이 NULL이 되어 출력되지 않는다.
    하지만 결과가 NULL 일지라도 출력해야 할 경우가 발생하는데 이때 사용되는 것이 OUTER JOIN 이다.

     

    기호를 사용한 OUTER JOIN
    NULL이 출력되는 칼럼에 (+) 기호를 추가하면 된다.
    예를 들어 학생 테이블과 교수 테이블을 조인할 때 지도 교수가 배정되지 않은 학생의 명단(즉, 지도교수 값이 NULL인 명단)도
    출력해야 할 경우 교수 테이블에 (+) 기호를 추가한다. 하지만 (+) 기호를 양쪽 테이블에 동시에 사용할 수 없다.
     

    OUTER JOIN 사용 예)
    학생 테이블과 교수 테이블을 조인하여 이름, 학년, 지도 교수의 이름, 직급을 출력하여라.
    단, 지도 교수가 배정되지 않은 학생이름도 함께 출력하여라.

    SQL>   SELECT       s.name sname, s.grade, p.name pname, p.position
               FROM         student s, professor p
               WHERE       s.profno = p.profno(+)
               ORDER BY  p.profno;

    출력결과)
    SNAME    GRADE  PNAME   POSITION
    ------  ------  ------  --------
    김진경            2    이재우    조교수
    전인하            4    성연희    조교수
    ……..
    이동훈            1
    박동진            1
    하나리            1
    ………

    16개의 행이 선택되었습니다.    

     OUTER JOIN 제약 사항
     * OUTER JOIN 연산자 (+)는 NULL이 존재하는 칼럼 쪽에 표시한다. 
    예) 지도교수가 없는 학생을 출력 하려 할 때는 지도 교수값이 NULL 임

     * OUTER JOIN 에서는 IN 연산자를 사용할 수 없다. 
     * 다른 조건과 OR 연산자로 결합 할 수 없다.

    문제 1

    학생테이블과 교수테이블을 조인하여 이름, 학년,지도교수 이름,직급을 출력하세요.
    단 지도학생을 배정받지 않은 교수이름도 함께 출력하세요.

    select s.name SNAME, s.grade, p.name PNAME, p.position
    from student s, professor p
    where s.profno(+)=p.profno;

    SNAME      G PNAME      POSITION
    ---------- - ---------- --------------------
    전인하     4 성연희     조교수
    김영균     3 이만식     부교수
    김진영     2 권혁일     교수
    지은경     2 전은지     전임강사
    오유석     4 권혁일     교수
    임유진     2 전은지     전임강사
    윤진욱     3 권혁일     교수
    이광훈     4 성연희     조교수
    김진경     2 이재우     조교수
    류민정     2 전은지     전임강사
                    김도훈     교수
                    염일웅     전임강사
                    남은혁     부교수 

     

    문제 2

    Temp 테이블과 emp_level 테이블을 조인하여
    각 사원의 사번,이름,직급,현재연봉,해당 직급의 연봉의 상,하한금액을 보고자 한다.
    단 연봉의 상,하한이 결정 안 된 수습사원은 사번,이름,직급,현재연봉만 나오면 된다.
    쿼리를 만들어보세요.

    select t.emp_id "사번", t.emp_name "이름", t.lev "직급", t.salary "연봉",
    e.from_sal "하한금", e.to_sal "상한금"
    from temp t, emp_level e
    where t.lev=e.lev(+)
    SQL> /

          사번 이름       직급       연봉     하한금     상한금
    ---------- ---------- ---- ---------- ---------- ----------
      19960303 설까치     사원   35000000   30000000   40000000
      19970112 연흥부     대리   45000000   35000000   60000000
      19950303 이순신     대리   56000000   35000000   60000000
      19960212 배뱅이     과장   39000000   37000000   75000000
      19966102 지문덕     과장   45000000   37000000   75000000
      19970201 박문수     과장   50000000   37000000   75000000
      19960101 홍길동     과장   72000000   37000000   75000000
      19930402 강감찬     차장   64000000   40000000   80000000
      19930331 정도령     차장   70000000   40000000   80000000
      19970101 김길동     부장  100000000   60000000  100000000
      20000210 나한라     수습   30000000
      20000119 장금강     수습   30000000
      20000308 강월악     수습   30000000
      20000407 윤주왕     수습   30000000
      20006106 유도봉     수습   30000000
      20000305 정북악     수습   30000000
      20000334 박지리     수습   30000000
      20000203 최오대     수습   30000000
      20000102 김설악     수습   30000000
      20000101 이태백     수습   30000000

     

    WHERE 절을 사용한 SELF JOIN
     하나의 테이블에서 두 개의 칼럼을 연결하여 EQUI JOIN 을 하는 조인

    사용예)
    부서번호가 201 이상인 부서 이름과 해당 부서가 소속된 상위 부서의 이름을 출력하여라.

    SQL>    SELECT dept.dname || ‘ is belong to ’ || org.dname
     FROM    department dept, department org
     WHERE   dept.college = org.deptno
     AND    dept.deptno >= 201;

     

    문제 1

    학번이 10101 인 학생의 학번, 이름, 학과이름 과 학과 위치를 출력하세요

    select a.studno "학번", a.name "이름", b.dname "학과", b.loc "위치"
    from student a, department b
    where a.studno=10101 and a.deptno=b.deptno(+)
               검색조건            join조건

          학번 이름       학과             위치
    ---------- ---------- ---------------- ----------
         10101 전인하     컴퓨터공학과     1호관

    문제 2

    몸무게가 80kg 이상인 학생의 학번, 이름,체중,학과이름,학과위치를 출력하여라
    select a.studno "학번", a.name "이름", a.weight "체중", b.dname "학과", b.loc "위치"
    from student a, department b
    where a.weight>=80 and a.deptno=b.deptno(+)
     ;

          학번 이름             체중 학과             위치
    ---------- ---------- ---------- ---------------- ----------
         10107 이광훈             92 컴퓨터공학과     1호관
         10103 김영균             88 컴퓨터공학과     1호관
         10202 오유석             92 멀티미디어학과   2호관
      

    문제 3

    Self join, outer join , non-equi join을 이용하여 temp 테이블을 이용하여 아래 조건의 쿼리를 작성해 보세요
    Temp 테이블을 사용해 사번, 성명, 생일, 자신보다 생일이 빠른 사람수를 조회하여 자신보다 생일이 빠른 사람수 순서대로
    오름차순으로 정렬해서 출력

    select a.emp_id "사번", a.emp_name "성명", a.birth_date "생일",
    count(b.birth_date) "빠른 사람수"
    from temp a, temp b
    where a.birth_date > b.birth_date(+)
    group by a.emp_id, a.emp_name, a.birth_date
    order by count(b.birth_date)
    SQL> /

          사번 성명       생일         빠른 사람수
    ---------- ---------- ------------ -----------
      19960303 설까치     25-SEP-71              0
      19966102 지문덕     05-JUL-72              1
      19930402 강감찬     15-AUG-72              2
      19960212 배뱅이     15-DEC-72              3
      19960101 홍길동     22-MAR-73              4
      19950303 이순신     15-JUN-73              5
      19970101 김길동     25-JAN-74              6
      19970201 박문수     15-APR-75              7
      19930331 정도령     25-MAY-76              8
      19970112 연흥부     05-NOV-76              9
      20000101 이태백     25-JAN-80             10
      20000102 김설악     22-MAR-80             11
      20000203 최오대     15-APR-80             12
      20000334 박지리     25-MAY-80             13
      20000305 정북악     15-JUN-80             14
      20006106 유도봉     05-JUL-80             15
      20000407 윤주왕     15-AUG-80             16
      20000308 강월악     25-SEP-80             17
      20000119 장금강     05-NOV-80             18
      20000210 나한라     15-DEC-80             19

    'Other > DB' 카테고리의 다른 글

    MySQL - auto_increment 1부터 시작  (0) 2012.05.15
    MySQL - innoDB & auto_increment 적용시키기(alter)  (0) 2012.05.08
    에러) Several ports (8080) required by Tomcat v6.0 Server at localhost are already in use.  (0) 2012.03.06
    서브쿼리  (0) 2012.02.28
    JOIN문 용어  (0) 2012.02.23
      'Other/DB' 카테고리의 다른 글
      • MySQL - innoDB & auto_increment 적용시키기(alter)
      • 에러) Several ports (8080) required by Tomcat v6.0 Server at localhost are already in use.
      • 서브쿼리
      • JOIN문 용어
      설 연수
      설 연수

      티스토리툴바