IT/SQLD(SQL개발자)

[SQLD] ORDER BY 와 JOIN

pandada 2019. 6. 30. 16:12
반응형

Order by 와 Join

 

 

ORDER BY 절 

  - SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는데 사용 

 

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

 

ODER BY 칼럼명 [ASC 또는 DESC]

  -> ASC : 조회한 데이터를 오름차순으로 정렬한다.(기본 값이므로 생략 가능)

  -> DESC : 조회한 데이터를 내림차순으로 정렬한다.

  Caution.

    - Oracle에서는 NULL값을 가장 큰 값으로 취급하지만 SQL에서는 가장 작은 값으로 취급한다.

    - 기본적인 정렬 순서는 오름차순(ASC)이다.

    - 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다.

    - 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 빠른 값이 먼저 출력된다.

 

 

ORDER BY 절에서 칼럼 순서도 같이 사용가능하다.

ex) select PLAYER_NAME as 선수이름, POSITION as 포지션, BACK_NO as 백넘버 from PLAYER ORDER BY 1;

이런식으로 사용가능.

 

 

SELECT

문장 실행 순서

  5. select 칼럼명 [ALIAS명]

  1. from 테이블명

  2. where 조건식

  3. group by column OR 표현식

  4. having 그룹조건식

  6. order by column OR 표현식

 

 

     * SQLD 10년도 테이블을 SQL버전에 맞게 수정한 파일을 올립니다. 

        Birthdate 가 입력이 잘못되고 사원테이블도 CREATE 부분이 잘 못 되어있으므로 이것 또한 정확하게

되게끔 만들어서 첨부파일 올려놓겠습니다.

------- 첨부파일 --------

1.축구_k리그_sqlserver용_2010년.sql
0.06MB
2.부서_사원_sqlserver용_2010년.sql
0.00MB
a.erd_축구_부서_2010년.ppt
0.22MB

 

JOIN 

  -> 두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것.

  -> 관계형 데이터베이스의 가장 큰 장점이면서 대표적인 핵심 기능이라고 할 수 있다. 

  Caution.

    FROM 절에 여러 테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어난다.

    예를 들면 FROM A,B,C,D 라고 하면

    ((A join D) join C) join B

    이렇게 된다. 이 테이블의 조인 순서는 옵티마이저에 의해서 결정된다.

 

 

Join 예제를 위한 테이블 소개.

 

테이블 소스는 첨부파일에 등록해두겠습니다.

(이거 420개 데이터 birth_date 자료가 잘못입력되있어서 일일이 하나하나 수정했다는..)

 

 

EQUI JOIN(등가 조인)

  - 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법으로 PK <-> FK의 관계를 기반으로 함.

SELECT 테이블1.칼럼명, 테이블2.칼럼명.......

FROM 테이블1, 테이블2 INNER JOIN

WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2;

 ->where 절에 join 조건이 들어간다. 

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

(일부분만 캡쳐했습니다. 데이터가 420개라...)

 

Caution.

  테이블.칼럼명 이렇게 하는 이유

  1. 모든 테이블에 칼럼들이 유일한 이름을 가진다면 상관없지만, JOIN에 사용되는 두 개의 테이블에 같은 칼럼명이 존재하는 경우에는 DBMS의 옵티마이저는 어떤 칼럼을 사용해야 할지 모르기 때문에 파싱단계에서 에러가 발생된다.

  2. 개발자나 사용자가 조회할 데이터가 어느 테이블에 있는 칼럼을 말하는 것인지 쉽게 알 수 있게하므로 SQL에 대한 가독성이나 유지보수성을 높이는 효과가 있다. 

 

   * Join 조건에 맞는 데이터만 출력하는 INNER JOIN에 참여하는 대상 테이블이 N개라고 했을 때, N개의 테이블로부터 필요한 데이터를 조회하기 위해 필요한 JOIN 조건은 대상 테이블의 개수에서 하나를 뺀 N-1개 이상이 필요하다.

   * FROM 절에 테이블이 3개가 표시되어 있다면 JOIN 조건은 2개 이상이 필요하다.

 

 

 선수의 이름과 등번호 소속팀 코드, 소속팀 이름, 소속팀의 연고지를 알고싶다.

 select PLAYER.PLAYER_NAME as 선수이름, PLAYER.BACK_NO as 등번호,
PLAYER.TEAM_ID as 팀_코드, TEAM.TEAM_NAME as 팀명, TEAM.REGION_NAME as 연고지
from PLAYER inner join TEAM ON PLAYER.TEAM_ID=TEAM.TEAM_ID ORDER BY 선수이름;

 

 

 포지션이 골키퍼인 선수들에 대한 데이터만을 등번호 순으로 출력하는 SQL문장을 만들어보시오.

 select PLAYER.PLAYER_NAME as 선수이름, PLAYER.BACK_NO as 등번호,
TEAM.TEAM_NAME as 팀명, TEAM.REGION_NAME as 연고지
from PLAYER inner join TEAM ON PLAYER.TEAM_ID=TEAM.TEAM_ID
where PLAYER.POSITION='GK' ORDER BY 등번호;

 

 팀 테이블과 구장 테이블의 관계를 이용해서 소속팀이 가지고 있는 전용구장의 정보를 팀의 정보와 함께 출력하고 싶음.

 select TEAM.REGION_NAME as 연고지, TEAM.TEAM_NAME as 팀명,
TEAM.STADIUM_ID as 구장_ID, STADIUM.STADIUM_NAME as 구장이름,
STADIUM.SEAT_COUNT as 좌석표
from TEAM inner join STADIUM ON TEAM.STADIUM_ID=STADIUM.STADIUM_ID
ORDER BY 연고지;

 

 

Non EQUI JOIN(비등가 조인)

- 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용

- "=" 연산자가 아닌 다른(BETWEEN, >, >=, <, <= 등) 연산자들을 사용하여 JOIN을 수행

 

3개 이상 TABLE

 선수명, 포지션, 연고지, 팀명, 구장명 이 자료들을 한번에 보고싶다.

 (정렬은 선수명으로.)

 select PLAYER.PLAYER_NAME as 선수명, PLAYER.POSITION as 포지션,
TEAM.REGION_NAME as 연고지, TEAM.TEAM_NAME as 팀명, STADIUM.STADIUM_NAME as 구장명
from PLAYER,TEAM,STADIUM 
where PLAYER.TEAM_ID=TEAM.TEAM_ID and TEAM.STADIUM_ID=STADIUM.STADIUM_ID
ORDER BY 선수명;

 

Arrangement.

- Join이 필요한 기본적인 이유는 정규화를 하기 위해서.

- 정규화란 불필요한 데이터의 정합성을 확보하고 이상현상(Anomaly) 발생을 피하기 위해, 테이블을 분할하여 생성하는 것.- 테이블간의 관계성을 통해서 다양한 데이터들을 출력할 수 있기 때문에 JOIN 사용.

 

 

반응형