1408

" 중1함수 "에 해당되는 글 1건

  1. 리눅스 공부 - MYSQL(8)

리눅스 공부 - MYSQL(8)


안녕하세요, 저는 길당이라 합니다.

오늘은 DISTINCT와 Calculation 등에 관한 내용을 올리게 되는군요.

공부를 하면서 느낀 것이지만, 공부를 할 때 자신이 한 내용을 어떤 형태로든

메모와 기록을 남겨 두고 다른 자료 등과 함께 기억하기 쉽도록 유사성과 연관성을

지니고 저장하면, 나중에 무엇을 하든 재차 반복을 하건 간에

도움이 되더군요...^^*

===============================================================================

[MySQL 고급 데이터 처리]

앞에서 MySQL 서버의 기본적인 개념과 기본 SQL 문에 대해서 공부를 하였다.

이 장에서는 고급 SQL 문과 데이터 처리에 대해서 공부해보도록 하자. 앞에서 설명한 부분만 이해하였다면 MySQL 서버를 사용하는데는 별 문제가 없다.

하지만 앞의 내용만을 알아서는 효과적인 어플리케이션을 작성하는데는 무리가 있다. 조금만 더 안다면 MySQL 서버가 알아서 해주기 때문에 그만큼 개발자는 쉽게 개발할 수 있게 된다.

[DISTINCT]

DISTINCT의 한국어 의미는 '구별된'의 의미이다.

SELECT를 사용하여 조회할 때 DIS-TINCT를 적어주면 중복된 데이터를 자동으로 없애 준다.

아래 예는 전체 모든 컬럼을 선택했을 경우에 orderid가 중복된 것이라도 productname이 중복되지 않기 때문에 모든 행을 리턴해준다.

사칙 연산(덧셈, 뺄샘, 곱샘, 나눗샘) 및 기타 계산을 프로그램적으로 처리할 수 있지만 SQL 문 자체로 기본적인 계산을 처리할 수 있다면

개발자 입장에서는 불필요한 계산에 대한 코딩을 하지 안해도 되기 때문에 프로그램이 간단해질 수 있다. 급여 테이블이 있다고 하자.

급여에 대한 세금이 10%라고 한다면 SQL 문을 통해서 쉽게 세금 총액과 실급여액을 계산해 낼 수 있다.

다음 예는 실습을 위해서 급여 테이블을 생성하고 세금과 실지급액을 계산해 내는 SQL 문이다.

=================================================================================================

[NOTE]

[Web Application Server(WAS)]


요즈음 IT 세계에서 WAS를 모르면 바보 취급을 받을 정도로 WAS 시장이 호황을 누리고 있다. WAS는 비즈니스 로직에 대한 처리를 DB나 웹 서버에서 처리하는 것이 아니라 DB와 웹 서버 사이에 따로 서버를 마련해두고 비즈니스 로직을 처리해준다는 개념이다.


SQL 문에 계산 로직을 넣으면 편리하기는 하지만 DB 서버는 부담을 느끼지 않을 수 없다. 또한 웹 서버에 계산 로직을 두면 파일 처리에도 버거운 웹 서버가 부담을 느끼게 된다.

이러한 딜레마 때문에 WAS가 등장한 것이다. 비즈니스 로직은 재사용될 수 있다. 비즈니스 처리를 위해서 컨포넌트가 항상 시스템 메모리에 있다면 훨씬 더 빠른 처리를 기대할 수 있다.

또한 WAS는 데이터베이스 처리를 할 때 트랜잭션 처리를 자동으로 해주기 때문에 개발자 입장에서는 트랜잭션과 같은 불필요한 곳에 신경을 쓰지 않아도 된다.

따라서 대형 웹 사이트를 구축하고자 하는 독자는 WAS라는 것에 관심을 가지고 공부하기 바란다. 현재 WAS는 IBM WebSphere, MS COM+를 포함해 ORACLE, HP에서도 경쟁적으로 제품을 판매하고 있다.

=================================================================================================

[날짜, 시간 처리]

날짜 또는 시간에 대한 처리는 데이터 처리에 있어서 가장 짜증나는 부분이다.

문자 또는 숫자와 달리 직접 데이터를 핸들링 하기가 어렵고 입력 포맷이 있기 때문에 날짜, 시간 타입에 대해서 거부감을 느낄 수 있다.

이제 MySQL 서버의 날짜, 시간 타입에 대해서 마음대로 조작해 보도록 하자. 다음은 MySQL이 제공하는 날짜, 시간 관련 함수이다.

함수 이름

설명

DATOFWEEK(date)

일주일에서 각각의 날을 index로 리턴한다.

(1 = Sunday, 2 = Monday, 7 = Saturday)

DAYOFMONTH(date)

1에서 31까지 날짜를 리턴한다.

MONTH(date)

1에서 12까지 몇 월인지 리턴한다.

DAYNAME(date)

요일의 이름을 리턴한다(ex Monday).

MONTHNAME(date)

달의 이름을 리턴한다(ex May)

QUARTER(date)

1에서 4까지 분기를 리턴한다.

YEAR(date)

날짜에서 연도를 리턴한다.

HOUR(time)

시간에서 몇 시인지 리턴한다. DATETIME에는 적용할 수 없다.

MINUTE(time)

시간에서 몇 분인지 리턴한다. DATETIME에는 적용할 수 없다.

SECOND(time)

시간에서 몇 초인지 리턴한다. DATETIME에는 적응할 수 없다.

DATE_ADD(date, INTERVAL expr type)

어떤 날짜에서 특정 시간 간격을 더한다.

DATE_SUB(date, INTERVAL expr type)

어떤 날짜에서 특정 시간 간격을 뺀다.

TO_DAYS(date)

날짜를 서기 0년부터 시작한 숫자로 바꾼다.

FROM_DAYS(N)

TO_DAYS 함수와 반대의 역할을 하는 함수로 숫자를 날짜로 바꾼다.

DATE_FORMAT(date, format)

날짜를 특정 포맷으로 바꾼다.

CURDATE()

현재 날짜를 리턴한다.

CURTIME()

현재 시간을 리턴한다.

NOW()

현재 날짜, 시간을 리턴한다.

날짜 시간에 대한 함수는 다양하다. 위의 표에서 빠진 날짜, 시간 함수는 대단히 많기 때문에 MySQL 매뉴얼을 참고하기 바란다. 하지만 위 표에 있는 정도면 날짜, 시간에 대한 대부분의 처리는 가능할 것이다.

우선 데이트 타임 컬럼을 가진 테이블을 생성한 다음, 실습을 통해서 각각의 함수에 대해서 익혀보도록 하자. 우선 DATE 타입과 DATETIME 타입 2개의 컬럼을 가진 테이블을 생성한다.

날짜, 시간 컬럼 중에서 가장 많이 사용하는 컬럼은 이 두 가지 타입이다. 앞에서 컬럼 타입에 대해서 설명할 때에 언급했지만 DATE 타입은 년, 월, 일까지이고 DATETIME은 년, 월, 일에 시간까지 표현할 수 있다.

실습에서 두 개의 함수씩 테스트를 해보기 위해서 두 개의 컬럼 타입을 한 테이블에 생성하였다.

아래 두 함수는 다른 컬럼에 서로 바꾸어 적용해도 똑 같은 결과를 얻을 수 있다.
즉 DAYOFWEEK(datetimetype), DAYOFMONTH(datetype) 해도 똑 같은 결과를 얻을 수 있다는 말이다.

마지막으로 설명할 것은 DATE_FORMAT(date,format) 함수다. 이 함수는 날짜 타입에 대해서 원하는 모양으로 출력할 수 있다. 어떤 곳은 날짜를 출력할 때 'YYYY-MM-DD'와 같은 형식을 원하고 어떤 곳은'YYYY/MM/DD'와 같은 형식을 원할 때 DATE_FORMAT 함수를 통해서 날짜 표시에 대한 다양한 요구 사항을 SQL으로 처리할 수 있다.

치환문자

설명

%M

달의 이름(ex May)

%W

요일의 이름(ex Monday)

%Y

4자리의 년도 표시(ex 2002)

%a

요일의 축약형(ex Mon, Tue)

%m

01~12까지의 달의 수

%b

달의 축약형(ex Jan)

%j

001부터 366일까지의 날짜 수

%H

00부터 23까지의 시간

%i

00부터 59까지의 분

%T

24시간을 hh:mm:ss로 표시

$S

00부터 59까지 초를 표시

위 표는 DATE_FORMAT 함수에서 사용할 수 있는 다양한 치환 문자이다.

다음 예를 통해서 DATE_FORMAT 함수에서 어떻게 치환 문자를 사용하는지를 이해할 수 있을 것이다. 다음 예에 없는 다양한 치환 문자도 테스트해보기 바란다.

[정렬]

보통 여러 개의 항목을 보고자 할 때, 사용자는 정렬이 되어서 나타나기를 바란다.

정렬이 되어 있지 않으면 데이터를 확인하기 어렵기 때문에 정렬은 반드시 데이터 선택에 있어서 필요한 요소이다. 그러나 정렬은 대단히 비용이 많이 드는 작업이다.

데이터베이스는 조건에 해당되는 데이터를 모두 가져온 다음에 오름차순 또는 내림차순으로 정렬해야 한다. 따라서 정렬할 때는 많은 비용을 지불해야 한다는 생각을 항상 해야 한다.

============================================================================================

[TIP]


[CLUSTERED INDEX를 이용한 작업]

인덱스는 크게 두 가지가 있다. 물리적인 인덱스의 구성 방법으로 나누면 클러스터 인덱스(clustered index)와 넌클러스터 인덱스(nonclustered index)로 나눌 수 있다.

클러스터 인덱스는 물리적으로 데이터를 정렬해 놓는다. 하지만 넌클러스터 인덱스를 사용하면 물리적으로 데이터가 정렬되지 않고 색인만을 정려해 놓는다.

따라서 넌클러스터 인덱스를 사용하면 색인을 찾은 다음 물리적인 위치를 얻어야 하기 때문에 정렬에 비효율적이다. 차라리 테이블 스캔을 하는 것이 효율적일 수 있다.

클러스터 인덱스를 만들어 놓을 때는 '오름차순' 또는 '내림차순'으로 데이터를 정렬해 놓을 수 있다. 따라서 정렬을 자주 하는 컬럼을 클러스터 인덱스로 잡아 놓으면 가져온 데이터가 정렬이 되어 있기 때문에 굳이 SQL로 정렬할 필요가 없다.

하지만 클러스터 인덱스는 테이블에 하나밖에 만들 수 없기 때문에 클러스터 인덱스를 사용할 때에는 주의해서 사용해야 한다. MySQL의 경우 Primary Key로 인덱스를 잡으면 자동으로 클러스터 인덱스가 잡힌다.

================================================================================================

정렬할 때 사용하는 구문은 ORDER BY 구문이다. 오름차순으로 정렬하고 싶으면, 'ASC' 옵션을 붙여주면 되고 내림차순으로 정렬하고 싶으면 'DESC' 옵션을 붙여주면 된다. 다음 예는 고객 테이블에서 고객 아이디를 정렬해서 가져오는 SQL 문이다.

제약 조건에 대해서는 FOREIGN KEY 제약 조건을 설명하면서 언급하였다. 일상적으로 제약조건이라면 어떤 상황에는 특정 행동을 못하는 것을 의미한다.

제약 조건에 걸리면 컬럼은 에러 메시지를 내거나 정해진 방법으로 행동을 하게 된다. 제약 조건은 다음과 같이 정리할 수 있다.

제약조건

설명

PRIMARY KEY

행을 유일하게 구별할 수 있는 값이 들어가야 한다. 행을 유일하게 구별해야 하기 때문에 NULL 값은 들어갈 수 없다.

NOT NULL

NULL 값을 입력할 수 없다. NOT NULL 제약 조건을 주면 무의미한 데이터가 들어가는 것을 막을 수 있다.

DEFAULT

데이터를 입력할 때 아무 값도 입력하지 않으면 지정된 기본 값이 들어가게 된다.

AUTO_INCREMENT

데이터를 입력할 때 아무 값도 입력하지 않으면 자동으로 숫자가 늘어난다.

다른 제약 조건은 앞에서 언급했기 때문에 DEFAULT와 NOT NULL 제약 조건에 대해서만 조금 더 알아보도록 하자.

일단 샘플 테이블을 constest을 만들어 보도록 하자.


NULL이라는 값을 혹시 '0'이나 빈문자열 ""로 생각하는 독자가 있을지 모르겠다. 하지만 NULL 값의 정의는 '현재 정해지지 않아 알 수 없는 값'이라는 특별한 값이다. 따라서 SQL 문으로 '0'이나 ""로 조회를 하면 NULL 값이 있는 행을 선택할 수 있다.

=======================================================================================

다음에는 테이블간의 관계, 조인(JOIN)에 대해서 올릴 것 입니다.....

=======================================================================================











 


행복의 집™ 감알 S러버 에코랜드 바이콘 러시아 사랑 코리아sr 기러기짱 수♥란♥현의 house 근적외선
2009/09/03 11:53 2009/09/03 11:53
top

Leave a comment..