'SQL 전문가 가이드'에 해당되는 글 44건

  1. 2013.11.18 3개 이상 TABLE JOIN
  2. 2013.11.18 Non EQUI JOIN
  3. 2013.11.15 EQUI JOIN
  4. 2013.10.08 Top N 쿼리 1

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제9절 조인 (JOIN)

4. 3개 이상 TABLE JOIN

 

 

[예제] 앞의 예제에서 보았듯이 선수 테이블의 소속팀코드(TEAM_ID)가 팀 테이블의 팀코드(TEAM_ID)와 PK-FK의 관계가 있다는 것을 알 수 있고, 운동장 테이블의 운동장코드(STADIUM_ID)와 팀 테이블의 전용구장코드(STADIUM_ID)가 PK-FK 관계인 것을 생각하며 다음 SQL을 작성한다. 세 개의 테이블에 대한 JOIN이므로 WHERE 절에 2개 이상의 JOIN 조건이 필요하다.

 SELECT P.PLAYER_NAME 선수명, P.POSITION 포지션,

              T.REGION_NAME 연고지, T.TEAM_NAME 팀명,

              S.STADIUM_NAME 구장명
 FROM PLAYER P, TEAM T, STADIUM S
 WHERE P.TEAM_ID = T.TEAM_ID

 AND T.STADIUM_ID = S.STADIUM_ID
 ORDER BY 선수명;

 또는 INNER JOIN을 명시하여 사용할 수도 있다.  
 SELECT P.PLAYER_NAME 선수명, P.POSITION 포지션,

              T.REGION_NAME 연고지, T.TEAM_NAME 팀명,

              S.STADIUM_NAME 구장명
 FROM PLAYER P INNER JOIN TEAM T

      ON P.TEAM_ID = T.TEAM_ID

           INNER JOIN STADIUM S

      ON T.STADIUM_ID = S.STADIUM_ID
 ORDER BY 선수명;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

'SQL 전문가 가이드' 카테고리의 다른 글

Non EQUI JOIN  (0) 2013.11.18
EQUI JOIN  (0) 2013.11.15
Top N 쿼리  (1) 2013.10.08
SELECT 문장 실행 순서  (0) 2013.10.08
ORDER BY 정렬  (0) 2013.10.07
Posted by G4.
,

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제9절 조인 (JOIN)

3. Non EQUI JOIN

 

 

[준비]

 CREATE TABLE SALGRADE
 (

 GRADE TINYINT,
 LOSAL SMALLINT,
 HISAL SMALLINT

 );

 

 INSERT INTO SALGRADE VALUES ('1','700','1200');
 INSERT INTO SALGRADE VALUES ('2','1201','1400');
 INSERT INTO SALGRADE VALUES ('3','1401','2000');
 INSERT INTO SALGRADE VALUES ('4','2001','3000');
 INSERT INTO SALGRADE VALUES ('5','3001','9999');

급여등급(SALGRADE) 테이블에는 1급(700 이상 ~ 1200 이하), 2급(1201 이상 ~ 1400 이하), 3급(1401 이상 ~ 2000 이하), 4급(2001 이상 ~ 3000 이하), 5급(3001 이상 ~ 9999 이하)으로 구분한 5개의 급여등급이 존재한다고 가정한다.

책에 있는 정보대로 급여등급(SALGRADE) 테이블을 만들고 데이터를 입력한다.

 

 

[예제] Non EQUI JOIN에 대한 샘플은 K-리그 관련 테이블로 구현되지 않으므로, 사원(EMP) 테이블과 가상의 급여등급(SAL_GRADE) 테이블로 설명을 하도록 한다. 어떤 사원이 받고 있는 급여가 어느 등급에 속하는 등급인지 알고 싶다는 요구사항에 대한 Non EQUI JOIN의 사례는 다음과 같다.

 SELECT E.ENAME, E.JOB, E.SAL, S.GRADE

 FROM EMP E, SALGRADE S

 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

 

 

[실행결과]

(14개 행이 영향을 받음)

 

 


 

 

[예제] 사원 14명 모두에 대해 아래 SQL로 급여와 급여등급을 알아본다.

 SELECT E.ENAME 사원명, E.SAL 급여, S.GRADE 급여등급

 FROM EMP E, SALGRADE S

 WHERE E.SAL  BETWEEN S.LOSAL AND S.HISAL;

 

 

[실행결과]

(14개 행이 영향을 받음)

 

'SQL 전문가 가이드' 카테고리의 다른 글

3개 이상 TABLE JOIN  (0) 2013.11.18
EQUI JOIN  (0) 2013.11.15
Top N 쿼리  (1) 2013.10.08
SELECT 문장 실행 순서  (0) 2013.10.08
ORDER BY 정렬  (0) 2013.10.07
Posted by G4.
,

EQUI JOIN

SQL 전문가 가이드 2013. 11. 15. 09:59

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제9절 조인 (JOIN)

2. EQUI JOIN

 

 

[예제] 선수 테이블과 팀 테이블에서 선수 이름과 소속된 팀의 이름을 출력하시오.

 SELECT PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
 FROM PLAYER, TEAM
 WHERE PLAYER.TEAM_ID = TEAM.TEAM_ID;

 SELECT PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
 FROM PLAYER INNER JOIN TEAM

 ON PLAYER.TEAM_ID = TEAM.TEAM_ID;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

 


 

 

가. 선수-팀 EQUI JOIN 사례

 

[예제] [그림 Ⅱ-1-14]의 데이터를 출력하기 위한 SELECT SQL 문장을 작성한다.

 SELECT PLAYER.PLAYER_NAME, PLAYER.BACK_NO, PLAYER.TEAM_ID,

              TEAM.TEAM_NAME, TEAM.REGION_NAME
 FROM PLAYER, TEAM
 WHERE PLAYER.TEAM_ID = TEAM.TEAM_ID;

 SELECT PLAYER.PLAYER_NAME, PLAYER.BACK_NO, PLAYER.TEAM_ID,

              TEAM.TEAM_NAME, TEAM.REGION_NAME
 FROM PLAYER INNER JOIN TEAM
 ON PLAYER.TEAM_ID = TEAM.TEAM_ID;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

 


 

 

[예제] 칼럼과 테이블에 ALIAS를 적용하여 위 SQL을 수정한다. 실행 결과는 ALIAS 적용 전과 같음을 확인 할 수 있다. 

 SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, P.TEAM_ID 팀코드,

              T.TEAM_NAME 팀명, T.REGION_NAME 연고지
 FROM PLAYER P, TEAM T
 WHERE P.TEAM_ID = T.TEAM_ID;

 SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, P.TEAM_ID 팀코드,

              T.TEAM_NAME 팀명, T.REGION_NAME 연고지
 FROM PLAYER P INNER JOIN TEAM T

 ON P.TEAM_ID = T.TEAM_ID;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

 


 

 

나. 선수-팀 WHERE 절 검색 조건 사례

 

[예제] 위 SQL 문장의 WHERE 절에 포지션이 골키퍼인(골키퍼에 대한 포지션 코드는 ‘GK’임) 선수들에 대한 데이터만을 백넘버 순으로 출력하는 SQL문을 만들어 본다.

 SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, T.REGION_NAME 연고지, T.TEAM_NAME 팀명
 FROM PLAYER P, TEAM T
 WHERE P.TEAM_ID = T.TEAM_ID AND P.POSITION = 'GK'
 ORDER BY P.BACK_NO;

 SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, T.REGION_NAME 연고지, T.TEAM_NAME 팀명
 FROM PLAYER P INNER JOIN TEAM T
 ON P.TEAM_ID = T.TEAM_ID
 WHERE P.POSITION = 'GK'
 ORDER BY P.BACK_NO;

 

 

[실행결과]

(43개 행이 영향을 받음)

 

 


 

 

[예제] 위 SQL 문장에서 FROM 절에서 테이블에 대한 ALIAS를 정의했는데, SELECT 절이나 WHERE 절에서 테이블명을 사용한다면 DBMS의 옵티마이저가 칼럼명이 부적합하다는 에러를 파싱 단계에서 발생시킨다. (SQL 문장의 파싱 순서는 FROM 절, WHERE 절, SELECT 절, ORDER BY 절 순서이다.) 

  SELECT PLAYER.PLAYER_NAME 선수명, P.BACK_NO 백넘버,

               T.REGION_NAME 연고지, T.TEAM_NAME 팀명
 FROM PLAYER P, TEAM T
 WHERE P.TEAM_ID = T.TEAM_ID AND P.POSITION = 'GK'
 ORDER BY P.BACK_NO;

 

 

[실행결과]

메시지 4104, 수준 16, 상태 1, 줄 1
여러 부분으로 구성된 식별자 "PLAYER.PLAYER_NAME"은(는) 바인딩할 수 없습니다.

 

 


 

 

다. 팀-구장 EQUI JOIN 사례

 

[예제] 이번에는 [그림 Ⅱ-1-15]에 나와 있는 팀(TEAM) 테이블과 구장(STADIUM) 테이블의 관계를 이용해서 소속팀이 가지고 있는 전용구장의 정보를 팀의 정보와 함께 출력하는 SQL문을 작성한다.  

 SELECT TEAM.REGION_NAME, TEAM.TEAM_NAME, TEAM.STADIUM_ID,
              STADIUM.STADIUM_NAME, STADIUM.SEAT_COUNT
 FROM TEAM, STADIUM
 WHERE TEAM.STADIUM_ID = STADIUM.STADIUM_ID;

 또는 INNER JOIN을 명시하여 사용할 수도 있다.

 SELECT TEAM.REGION_NAME, TEAM.TEAM_NAME, TEAM.STADIUM_ID,
              STADIUM.STADIUM_NAME, STADIUM.SEAT_COUNT
 FROM TEAM INNER JOIN STADIUM
 ON TEAM.STADIUM_ID = STADIUM.STADIUM_ID;

 위 SQL문과 ALIAS를 사용한 아래 SQL문은 같은 결과를 얻을 수 있다.

 SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID,
              S.STADIUM_NAME, S.SEAT_COUNT
 FROM TEAM T, STADIUM S
 WHERE T.STADIUM_ID = S.STADIUM_ID;

 또는 INNER JOIN을 명시하여 사용할 수도 있다.

 SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID,
              S.STADIUM_NAME, S.SEAT_COUNT
 FROM TEAM T INNER JOIN STADIUM S
 ON T.STADIUM_ID = S.STADIUM_ID;

 중복이 되지 않는 칼럼의 경우 ALIAS를 사용하지 않아도 되므로,
 아래 SQL 문은 위 SQL문과 같은 결과를 얻을 수 있다.
 그러나 같은 이름을 가진 중복 칼럼의 경우는 테이블명이나 ALIAS가 필수 조건이다.

 SELECT REGION_NAME, TEAM_NAME, T.STADIUM_ID,
              STADIUM_NAME, SEAT_COUNT
 FROM TEAM T, STADIUM S
 WHERE T.STADIUM_ID = S.STADIUM_ID;

 

 

[실행결과] 

(15개 행이 영향을 받음)

 

'SQL 전문가 가이드' 카테고리의 다른 글

3개 이상 TABLE JOIN  (0) 2013.11.18
Non EQUI JOIN  (0) 2013.11.18
Top N 쿼리  (1) 2013.10.08
SELECT 문장 실행 순서  (0) 2013.10.08
ORDER BY 정렬  (0) 2013.10.07
Posted by G4.
,

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제8절 ORDER BY 절

3. Top N 쿼리

 

 

* TOP ( )

 

[예제] 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력하고자 한다.

 SELECT TOP(2) ENAME, SAL

 FROM EMP

 ORDER BY SAL DESC; 

 

 

[실행결과]

(2개 행이 영향을 받음)

 

 


 

 

[예제] 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원이 있으면 같이 출력한다.

 SELECT TOP(2) WITH TIES ENAME, SAL

 FROM EMP

 ORDER BY SAL DESC;

 

 

[실행결과]

(3개 행이 영향을 받음)

 

'SQL 전문가 가이드' 카테고리의 다른 글

Non EQUI JOIN  (0) 2013.11.18
EQUI JOIN  (0) 2013.11.15
SELECT 문장 실행 순서  (0) 2013.10.08
ORDER BY 정렬  (0) 2013.10.07
집계 함수와 NULL  (0) 2013.10.01
Posted by G4.
,