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 부분이 잘 못 되어있으므로 이것 또한 정확하게
되게끔 만들어서 첨부파일 올려놓겠습니다.
------- 첨부파일 --------
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 등번호, |
포지션이 골키퍼인 선수들에 대한 데이터만을 등번호 순으로 출력하는 SQL문장을 만들어보시오. |
select PLAYER.PLAYER_NAME as 선수이름, PLAYER.BACK_NO as 등번호, |
팀 테이블과 구장 테이블의 관계를 이용해서 소속팀이 가지고 있는 전용구장의 정보를 팀의 정보와 함께 출력하고 싶음. |
select TEAM.REGION_NAME as 연고지, TEAM.TEAM_NAME as 팀명, |
Non EQUI JOIN(비등가 조인)
- 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용
- "=" 연산자가 아닌 다른(BETWEEN, >, >=, <, <= 등) 연산자들을 사용하여 JOIN을 수행
3개 이상 TABLE
선수명, 포지션, 연고지, 팀명, 구장명 이 자료들을 한번에 보고싶다. (정렬은 선수명으로.) |
select PLAYER.PLAYER_NAME as 선수명, PLAYER.POSITION as 포지션, |
Arrangement.
- Join이 필요한 기본적인 이유는 정규화를 하기 위해서.
- 정규화란 불필요한 데이터의 정합성을 확보하고 이상현상(Anomaly) 발생을 피하기 위해, 테이블을 분할하여 생성하는 것.- 테이블간의 관계성을 통해서 다양한 데이터들을 출력할 수 있기 때문에 JOIN 사용.
'IT > SQLD(SQL개발자)' 카테고리의 다른 글
[SQLD] 집합연산자와 계층형 질의 (0) | 2019.07.02 |
---|---|
[SQLD] SQL 기본 및 활용(SQL 기본) 정리 및 표준조인(Standard Join) (0) | 2019.07.01 |
[SQLD] GRORP BY, HAVING 절 (0) | 2019.06.29 |
[SQLD] 함수(Function) (0) | 2019.06.28 |
[SQLD] WHERE (0) | 2019.06.27 |