[SQLD] 2과목 SQL 기본및 활용 - 1장 8절 ORDER BY 절


1. ORDER BY 절

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

- ORDER BY 절에 칼럼명 대신에 SELECT 절에서 사용한 ALIAS명이나 칼럼 순서를 나타내는 정수도 사용한다.


SELECT 칼럼명

FROM  테이블명

[WHERE 조건식]

[GROUP BY 칼럼이나 표현식]

[HAVING 그룹조건식]

[ORDER BY 칼럼이나 표현식 [ASC 또는 DESC] ;

 


* ASC : 오름차순정렬( DEFAULT)

* DESC : 내림차순 정렬


* ORDER BY 절 사용 특징.

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

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

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

(2015/01/01 -> 2015/01/02 ->2015/01/03 ....)

- 오라클은 NULL값을 사용할 경우 가장 큰 값으로 간주하며, SQL server는 가장 작은값으로 간주한다.

- ORDER BY 절에 칼럼의 순서로 명시할 수 있다

(EX. ORDER BY 3 DESC, 2,1)



EX1.) 컬럼기준 정렬

SELECT DEPTNO, AVG(SAL)

FROM EMP

GROUP BY DEPTNO

HAVING MAX(SAL) >=3000

ORDER BY DEPTNO ;


결과
DEPTNO   AVG(SAL)

---------- ----------

10         2916.66667

20         2175


* 정렬안한 결과

DEPTNO   AVG(SAL)

---------- ----------

20          2175

10          2916.66667


EX2.) ALIAS 기준 정렬

SELECT DEPTNO DEP_AS, AVG(SAL)

FROM EMP

GROUP BY DEPTNO

HAVING MAX(SAL) >=3000

ORDER BY DEP_AS;


결과
DEPTNO   AVG(SAL)

---------- ----------

10         2916.66667

20         2175


EX3) NULL 값에 대한 정렬
SELECT ENANE, COMM
FROM EMP
ORDER BY COMM;

* 오라클에서는 NULL 값을 가장 큰 값으로 취급한다.

* SQL Server에서는 NULL 값을 가장 작은 값으로 취급.

ENAME COMM

---------- ----------

TURNER     0

ALLEN   300

WARD   500

MARTIN 1400

SCOTT

KING

ADAMS

JAMES

FORD

MILLER

BLAKE

JONES

GOODBOY

CLARK


EX4)여러가지 컬럼을 기준으로 정렬

연봉이 높은 순서대로, 연봉이 같은경우 커미션이 높은 순서대로 정렬


SELECT ENAME, SAL, NVL(COMM,0) NVL_COMM

FROM EMP

ORDER BY SAL, NVL_COMM;




EX5) 칼럼 순서로 정렬.

SELECT ENAME, SAL, NVL(COMM,0) NVL_COMM

FROM EMP

ORDER BY 2,3,1;



 예제. DEPT 테이블 정보를 부서명, 지역별, 부서번호 내림차순으로 정렬하여 출력.


EX1) 칼럼명사용.

SELECT DNAME, LOC, DEPTNO

FROM DEPT

ORDER BY DNAME, LOC, DEPTNO;


EX2) 칼럼명 + ALIAS 사용 

SELECT DNAME, LOC LOC_AS, DEPTNO

FROM DEPT

ORDER BY DNAME, LOC_AS, DEPTNO;


EX3) 칼럼순서번호 + ALIAS 사용

SELECT DNAME, LOC LOC_AS, DEPTNO

FROM DEPT

ORDER BY 1, LOC_AS, 3;


-결과는 모두 같다.
 


 



2. SELECT 문장 실행 순서.

- GROUP BY 절과 ORDER BY 절이 같이 사용될 때 SELECT 문장은 6개의 절로 구성된다.


1. SELECT

2. FROM

3. WHERE

4. GROUP BY

5. HAVING

6. ORDER BY


=> 문장 실행 순서.(옵티마이저가 SYNTAX 및 SEMANTIC 에러를 점검하는 순서) 

1. 발췌대상 테이블 참조.( FROM )

2. 발췌대상 데이터가 아닌것은 제거 ( WHERE)

3. 행들을 소그룹화 (GROUP BY)

4. 그룹핑된 값의 조건에 맞는 것만을 출력 (HAVING)

5. 데이터값을 출력 및 계산 (SELECT)

6. 데이터를 정렬(ORDER BY)


* ORDER BY절에는 SELECT 목록에 없는 문자형 항목이 포함될 수 있다.

단, SELET DISTINCT를 지정하거나 SQL 문장에 GROUP BY 절이 있거나 또는 SELECT문에 UNION 연산자가 있으면 열정의가 SELECT 목록에 표시되어야 한다.

(관계형 DB에서 데이터를 메모리로 올릴 때 행단위로 모든 컬럼을 가져오게되므로 SELECT절에서는 일부만 선택하더라도 ORDER BY 절에서 메모리에 올라온 다른 컬럼데이터를 사용할 수 있다.)


ex) SELECT 절에 없는 EMP 칼럼을 ORDER BY 절에 사용.

SELECT EMPNO, ENAME

FROM EMP

ORDER BY MGR ;


     EMPNO ENAME

---------- ----------

      7902 FORD

      7788 SCOTT

      7900 JAMES

      7499 ALLEN

      7521 WARD

      7844 TURNER

      7654 MARTIN

      7934 MILLER

      7876 ADAMS

      7698 BLAKE

      7566 JONES

      7782 CLARK

      7369 GOODBOY

      7839 KING





ex) 인라인 뷰에 정의된 SELECT 칼럼을 메인쿼리에서 사용.

SELECT EMPNO

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


     EMPNO

----------

      7902

      7788

      7900

      7499

      7521

      7844

      7654

      7934

      7876

      7698

      7566

      7782

      7369

      7839



ex) 인라인 뷰에 미정의된 SELECT 칼럼을 메인쿼리에서 사용.

SELECT MGR

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


결과

ERROR at line 1:

ORA-00904: "MGR": invalid identifier

=> MGR이 인라인뷰를 통해 조회되지않음.


- 서브쿼리절에서 선택되지 않은 컬럼들은 계속 유지가 되는것이 아니라 서브쿼리 범위를 벗어나면 더이상 하용할 수 없다.



-GROUP BY 절에서 그룹핑 기준을 정의하게 되면 데이터베이스는 일반적인 SELECT 문장처럼 FROM 절에 정의된 테이블 구조를 그대로 가지고 가는 것이 아니라 GROUP BY 절의 그룹핑 기준에 사용된 칼럼과 집계 함수에

사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만든다.

GROUP BY 절을 사용하게 되면 그룹핑 기준에 사용된 칼럼과 집계함수에 사용될 수 있는 숫자형 데이터 컬럼들의 집합을 새로 마드는데 개별 데이터는 필요 없으므로 저장되지 않는다. GROUP BY 이후 수행 절인 SELECT 절이나 ORDER BY 절에서 개별 데이터를 사용할 경우 에러가 발생한다.

* SELECT 절에서는 그룹핑 기준과 숫자 형식 칼럼의 집계함수를 사용할 수 있지만 그룹핑 기준 외의 문자 형식 칼럼은 정할 수 없다.


- GROUP BY 절 사용 시 SELECT 절에 일반 칼럼을 사용

SELECT JOB, SAL

FROM EMP

GROUP BY JOB

HAVING COUNT(*) > 0

ORDER BY SAL;

 


ERROR at line 1:

ORA-00979: not a GROUP BY expression

 


=> 에러발생.


- GROUP BY 절 사용시 ORDER BY 절에 일반 칼럼을 사용해본다.

SELECT JOB

FROM EMP

GROUP BY JOB

HAVING COUNT(*) > 0

ORDER BY SAL;


ORA-00979: not a GROUP BY expression

 

=> 에러발생


- 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);



JOB

---------

singer

people

actor

MANAGER

PRESIDENT

SALESMAN

ANALYST

CLERK

 



3. TOP N 쿼리

- ROWNUM

오라클에서 우선순위가 높은 N개의 로우를 추출하기 위해 ORDER BY 절과 WHERE 절의 ROWNUM조건을 같이 사용하는 경우가 있는데 이 두조건으로는 원하는 값을 얻을 수 없다.

오라클의 경우 정렬이 완료된 후 데이터의 일부가 출력되는 것이 아니라 데이터의 일부가 추출된 후 데이터에 대한 정렬작업을 수행한다.


예제. 사원테이블에서 급여가 높은 3명만 내림차순으로 출력


SELECT ENAME, SAL

FROM EMP

WHERE ROWNUM < = 3

ORDER BY SAL DESC;


ENAME   SAL

---------- ----------

ALLEN 1600

WARD 1250

 

GOODBOY   800

=> 해당 결과는 급여에 대한 오름차순 정렬이 아니라 무작위로 추출된 3명에 대해 급여를 내림차순으로 정렬한 결과이므로 원하는 결과가 출력된것이아니다.

( WHERE 절이 ORDER BY 절보다 먼저 수행 되기 때문이다.)



A. 정답. 인라인 뷰를 통해 데이터 정렬을 먼저 수행 후 메인쿼리에서 ROWNUM 사용.


SELECT  ENAME, SAL

FROM (SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC)

WHERE ROWNUM < = 3 ;


ENAME   SAL

---------- ----------

KING 5000

SCOTT 3000

 

FORD 3000


* 인라인뷰를 사용하여 추출하고자 하는 집합을 정렬한 후 ROWNUM을 적용시킴으로써 결과에 참여하는 순서와 추출된는 로우 순서를 일치 시킴으로써 TOP N 쿼리의 결과를 만들었다.


- TOP

반면에, SQL server는 조건을 사용하게 되면 별도의 처리 없이 관련 ORDER BY 절의 데이터 정렬 후 원하는 일부 데이터만 쉽게 출력할 수 있다.


 TOP (EXPRESSION) [PERCENT] [WITH TIES]

 


* TOP 절을 사용해서 결과 집합으로 반환되는 행의 수를 제한할 수 있다. 

- WITH TIES 옵션은 ORDER BY 절의 조건 기준으로 TOP N 의 마지막 행으로 표시되는 추가 행의 데이터가 같을경우 N+ 동일정렬 순서 데이터를 추가 반환하도록 지정하는 옵션이다.


EX) 사원테이블에서 급여가 높은 2명을 내림차순으로 출력.

SELECT TOP(2) ENAME, SAL

FROM EMP

ORDER BY SAL DESC;


ENAME   SAL

---------- ----------

KING 5000

SCOTT 3000

 



EX2) 사원테이블에서 급여가 높은 2명을 내림차순으로 출력하는데, 같은 급여를 받는 사원이 있으면 같이 출력

SELECT TOP(2) WITH TIES ENAME, SAL

FROM EMP

ORDER BY SAL DESC;


ENAME   SAL

---------- ----------

KING 5000

SCOTT 3000

 

FORD 3000


 


[SQLD] 2과목 SQL 기본및 활용 - 1장 3절 DML


1. INSERT

- 테이블에 데이터를 입력하는 방법은 두 가지 유형이 있으며 한 번에 한 건만 입력된다.

* 컬럼명리스트와 입력되는 값은 서로 1:1로 매핑해서 입력하면된다. 해당 칼럼의 데이터유형이 문자형일 경우 ' '로 묶어주며 숫자일 경우 ' '를 붙이지 않는다.


1) INSERT INTO 테이블명 (COLUMN_LIST)

VALUES(COLUMN_LIST에 넣을 VALUE_LIST);

* 테이블의 칼럼을 정으할 수 있는데, 이때 칼럼의 순서는 테이블의 칼럼순서와 매치할 필요는 없으며 정의하지 않은 칼럼은 DEFAULT로 NULL값이 입력된다. NOT NULL제약조건이나 PK 지정된 컬럼은 NULL이 허락되지 않는다.


2) INSERT INTO 테이블명

VALUES (전체 COLUMN에 넣을 VALUE_LIST);

* 모든 칼럼에 데이터를 입력하는 경우 굳이 COLUM_LIST를 언급하지 않아도 되지만 칼럼의 순서대로 빠짐없이 데이터가 입력되어야한다.


ex) player 테이블에 값 추가.

1)

INSERT INTO PLAYER (PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION, HEIGHT, WEIGHT, BACK_NO)

VALUES ('2002007','박지성','K07','MF',178,73,7);

2)

INSERT INTO PLAYER

VALUES('200207','이청용','','BLUEDRAGON',2002',MF',17,NULL,NULL,'1',180,69);


2. UPDATE

-입력한 정보 중 잘못 입력되거나 변경이 발생하여 정보를 수정할 경우 

- 구문

UPDATE 테이블명

SET 수정해야될 컬럼명 = 수정되기 원하는 새로운 값 ;

ex

1) 숫자타입.

UPDATE PLAYER

SET BACK_NO = 99;

2)문자타입

UPDATE PLAYER

SET POSITION = 'MF';


3. DELETE

- 테이블의 정보가 필요없게 될 경우 데이터 삭제를 수행한다.

- 구문

DELETE [FROM] 삭제를 원하는 테이블명;

* FROM은 생략 가능하며, WHERE절 없을 경우 테이블의 전체 데이터가 삭제된다.


* DDL명령어와 DML 명령어를 처리하는 방식에 있어서 데이터베이스는 차이가있다.

DDL 명령어의 경우 직접 데이터베이스 테이블에 영향을 미치기 때문에 AUTO COMMIT이 된다.

DML 명령어의 경우 조작하는 테이블을 메모리 버퍼에 올려놓고 작업을 하기 때문에 테이블에 영향을 실시간으로 주지않는다. 실제 반영되기 위해서는 COMMIT명령이 필요하다.

( SQL server경우에는 DML의 경우도 Auto commit으로 처리가된다.)

* TRUNCATE는 삭제된 데이터의 로그가 없으므로 ROLLBACK이 불가능하다.

SQL Server에서는 임의적으로 트랜잭션을 시작한 후 Truncate table을 이용하여 데이터를 삭제한 이후 오류가 발견되어 복구를 원할 경우 ROLLBACK문을 이용하여 데이터를 원상태로 돌릴 수 있다.


4. SELECT 

- 사용자가 입력한 데이터를 조회하는 쿼리.

SELECT [ALL/DISTINCT] 칼럼명 ....

FROM 테이블명

* ALL은 DEFAULT 옵션이므로 표시하지 않아도 된다. 중복된 데이터가 있어도 모두 출력한다.

 DISTINCT 중복된 컬럼은 제거하고 1건으로 표시한다.


ex) 

SELECT PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION, WEIGHT, HEIGHT, BACK_NO

FROM PLAYER;


ex) DISTINCT

SELECT DISTINCT ALL_POSITION

FROM PLAYER;


POSITION

---------------

GK

DF

FW

MF


* WILD CARD 사용하기

SELECT * 

FROM PLAYER;

- 조회결과는 기본적으로 대문자로 보이고, 좌측정렬은 문자 및 날짜데이터 우측 정렬은 숫자데이터이다.


* ALIAS 부여하기

- 조회된 결과에 별명을 부여하여 칼럼 레이블을 변경할 수 있다.

- 컬럼바로뒤에 온다. 컬럼과 ALIAS 사이에 AS, as 키워드를 사용할 수 있다.(옵션)

- 이중부호는 ALIAS가 공백, 특수문자를 포함할 경우 대소문자 구분이 필요할 경우 사용한다.


ex)

SELECT  PLAYER_NAME AS 선수명, POSITION AS 위치, HEIGHT AS 키, WEIGHT AS 몸무게

FROM PLAYER;


* AS는 사용하지 않아도 같은 결과가 출력된다.

SELECT  PLAYER_NAME  선수명, POSITION 위치, HEIGHT 키, WEIGHT 몸무게

FROM PLAYER;


5. 산술 연산자와 합성 연산자.
산술연산자
- NUMBER, DATE 자료형에 대해 적용된다. 우선순위를 위한 괄호 적용이 가능함.

 산술연산자

설명 

 (  ) 

연산자 우선순위를 변경하기 위한 괄호 

 * 

곱하기 

 /

나누기 

 +

더하기 

 - 

빼기 

 


합성연산자

- 문자와 문자를 연결하는 합성 연산자를 이용하면 별도의 프로그램 도움 없이 SQL 만으로 유용한 리포트를 출력할 수 있다.

- 문자와 문자를 연결하는 경우 2개의 수직바 || 를 통해 이루어진다.(ORACLE)

- 문자와 문자를 연결하는 경우 + 표시에 의해 이루어진다 (SQL SERVER)

- 두 벤더는 모두 공통적으로 CONCAT(STRING1, STRING2) 함수를 사용할 수 있다.

- 칼럼과 문자ㄴ 또는 다른 칼럼과 연결시킨다

- 문자 표현식의 결과에 의해 새로운 칼럼을 생성한다.


ex) 출력형태 선수명 선수, 키 cm 몸무게 kg

- 오라클

SELECT PLAYER_NAME || '선수,' || HEIGHT || 'CM ,' || WEIGHT || 'KG' 체격정보

FROM PLAYER;

- SQL server

SELECT PLAYER_NAME + '선수 ,' + HEIGHT + 'CM ,' + WEIGHT + 'KG ' 체격정보