'전체 글'에 해당되는 글 256건

  1. 2013.11.15 EQUI JOIN
  2. 2013.10.08 Top N 쿼리 1
  3. 2013.10.08 SELECT 문장 실행 순서
  4. 2013.10.07 ORDER BY 정렬

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.
,

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제8절 ORDER BY 절

2. SELECT 문장 실행 순서

 

 

[예제] SELECT 절에 없는 EMP 칼럼을 ORDER BY 절에 사용한다.

 SELECT EMPNO, ENAME

 FROM EMP

 ORDER BY MGR;

문제가 틀렸습니다.

[SELECT 절에 없는 MGR 칼럼을 ORDER BY 절에 사용한다.] 라고 해석해야 됩니다.

EMP 는 테이블입니다.

 

[실행결과] 

(14개 행이 영향을 받음)

 

 


 

 

 

[예제] 인라인 뷰에 정의된 SELECT 칼럼을 메인쿼리에서 사용한다.

 SELECT EMPNO
 FROM (SELECT EMPNO, MGR FROM EMP) A
 ORDER BY MGR;

서브쿼리에서는 ORDER BY 를 사용하지 못합니다.

ORDER BY 절은 SELECT 절에서 오직 한 개만 올 수 있기 때문에 ORDER BY 절은 메인쿼리의 마지막 문장에 위치해야 합니다.

이 부분은 2장 4절 서브쿼리 부분에 나와있습니다.

따라서 ORDER BY 를 서브쿼리에서 빼고 메인쿼리의 마지막에 입력했습니다.

또한 서브쿼리를 A 라는 ALIAS 를 부여했습니다.

 

 

[실행결과]

(14개 행이 영향을 받음)

 

 


 

 

 

 

[예제] 인라인 뷰에 미정의된 칼럼을 메인쿼리에서 사용해본다.

 SELECT MGR
 FROM (SELECT EMPNO, ENAME FROM EMP) A;

위의 예제와 마찬가지로 서브쿼리에서는 ORDER BY 를 사용하지 못합니다.

 

 

[실행결과]

메시지 207, 수준 16, 상태 1, 줄 1
열 이름 'MGR'이(가) 잘못되었습니다.

 

 


 

 

 

[예제] GROUP BY 절 사용시 SELECT 절에 일반 칼럼을 사용해본다.

 SELECT JOB, SAL
 FROM EMP
 GROUP BY JOB
 HAVING COUNT(*) > 0
 ORDER BY SAL;

 

 

[실행결과]

메시지 8120, 수준 16, 상태 1, 줄 1
열 'EMP.SAL'이(가) 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다.

 


 

 

[예제] GROUP BY 절 사용시 ORDER BY 절에 집계 칼럼을 사용해본다.

 SELECT JOB
 FROM EMP
 GROUP BY JOB HAVING COUNT(*) > 0
 ORDER BY MAX(EMPNO), MAX(MGR), SUM(SAL), COUNT(DEPTNO), MAX(HIREDATE);

 

 

[실행결과]

경고: 집계 또는 다른 SET 작업에 의해 Null 값이 제거되었습니다.

(5개 행이 영향을 받음)

 

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

EQUI JOIN  (0) 2013.11.15
Top N 쿼리  (1) 2013.10.08
ORDER BY 정렬  (0) 2013.10.07
집계 함수와 NULL  (0) 2013.10.01
CASE 표현을 활용한 월별 데이터 집계  (0) 2013.10.01
Posted by G4.
,

 

과목 II SQL 기본 및 활용

제1장 SQL 기본

제8절 ORDER BY 절

1. ORDER BY 정렬

 

 

[예제] ORDER BY 절의 예로 선수 테이블에서 선수들의 이름, 포지션, 백넘버를 출력하는데 사람 이름을 내림차순으로 정렬하여 출력한다.

 SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버

 FROM PLAYER

 ORDER BY PLAYER_NAME DESC;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

 


 

 

[예제] ORDER BY 절의 예로 선수 테이블에서 선수들의 이름, 포지션, 백넘버를 출력하는데 선수들의 포지션 내림차순으로 출력한다. 칼럼명이 아닌 ALIAS를 이용한다.

 SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버

 FROM PLAYER

 ORDER BY 포지션 DESC;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

 


 

 

[예제] 한 개의 칼럼이 아닌 여러 가지 칼럼(Column)을 기준으로 정렬해본다. 먼저 키가 큰 순서대로, 키가 같은 경우 백넘버 순으로 ORDER BY 절을 적용하여 SQL 문장을 작성하는데, 키가 NULL인 데이터는 제외한다. 

 SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키

 FROM PLAYER

 WHERE HEIGHT IS NOT NULL

 ORDER BY HEIGHT DESC, BACK_NO;

 

 

[실행결과]

(447개 행이 영향을 받음)

 

 


 

 

[예제] ORDER BY 절의 예로 선수 테이블에서 선수들의 이름, 포지션, 백넘버를 출력하는데 선수들의 백넘버 내림차순, 백넘버가 같은 경우 포지션, 포지션까지 같은 경우 선수명 순서로 출력한다. BACK_NO가 NULL인 경우는 제외하고, 칼럼명이나 ALIAS가 아닌 칼럼 순서를 매핑하여 사용한다. 

 SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버

 FROM PLAYER

 WHERE BACK_NO IS NOT NULL

 ORDER BY 3 DESC, 2, 1;

 

 

[실행결과]

(480개 행이 영향을 받음)

 

 


 

 

[예제] DEPT 테이블 정보를 부서명, 지역, 부서번호 내림차순으로 정렬해서 출력한다. 아래의 SQL 문장은 출력되는 칼럼 레이블은 다를 수 있지만 결과는 모두 같다.

 

Case1. 칼럼명 사용 ORDER BY 절 사용

 SELECT DNAME, LOC, DEPTNO

 FROM DEPT

 ORDER BY DNAME, LOC, DEPTNO DESC;

 

 

[실행결과]

(4개 행이 영향을 받음)

 

 


 

 

Case2. 칼럼명 + ALIAS 명 사용 ORDER BY 절 사용

 SELECT DNAME DEPT, LOC AREA, DEPTNO
 FROM DEPT
 ORDER BY DNAME, AREA, DEPTNO DESC;

 

 

[실행결과]

(4개 행이 영향을 받음)

 

 


 

 

Case3. 칼럼 순서번호 + ALIAS 명 사용 ORDER BY 절 사용

 SELECT DNAME, LOC AREA, DEPTNO
 FROM DEPT
 ORDER BY 1, AREA, 3 DESC;

 

 

[실행결과] 

(4개 행이 영향을 받음)

 

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

Top N 쿼리  (1) 2013.10.08
SELECT 문장 실행 순서  (0) 2013.10.08
집계 함수와 NULL  (0) 2013.10.01
CASE 표현을 활용한 월별 데이터 집계  (0) 2013.10.01
HAVING 절  (0) 2013.09.30
Posted by G4.
,