반응형
  1. 수치 연산

SQL은 기본적으로 계산 기능을 포함하고 있습니다. 이번에는 이런 계산하는 기능을 사용하는 방법 중 수치 데이터의 연산에 대해 이야기 하겠습니다. 수치 연산을 하는 산술 연산의 경우는 다른 프로그래밍에서도 사용하는 기본 개념이니 기존에 프로그래밍을 하셨던 분들은 익숙하실 수 있고, 처음 접하시는 분은 이번에 잘 알아두길 바랍니다.

    1. 사칙 연산

사칙 연산은 우리가 알고 있는 덧셈, 뺄셈, 곱셈, 나눗셈에 한가지 더 있다면 나눗셈의 나머지를 구하는 것 입니다. 연산자는 기호로 표기하고 아래 표로 정리해 보겠습니다.


연산자

연산

+

덧셈

1+2 → 3

-

뺄셈

1-2 → -1

*

곱셈

1*2 → 2

/

나눗셈

½ → 0.5

%

나머지

1%2 → 1

[표 9. 산술 연산자]


[표 9]의 연산자들은 여러 데이터베이스에서 동일하게 사용합니다. 하지만 나머지를 구하는 %는 데이터베이스 제품마다 차이가 있을 수 있습니다. 보통은 % 또는 MOD 함수를 사용하는 경우도 있습니다.


산술 연산자는 우선 순위가 있습니다. 하지만 이미 산수를 다 알고 계실 것이라 생각합니다. 간단하게 표로 정리하고 넘어 가겠습니다.



우선순위

연산자

1

* / %

2

+ -

[표 10. 산술 연산자 우선순위]


지금까지 SQL에서 사용하는 산술 연산자에 대해 간단히 알아 보았습니다. 그러면 쿼리에서 산술 연산자는 어디서 사용하는지 알아 보겠습니다.

    1. SELECT 구에서 연산

SELECT 구에는 컬럼명을 지정할 수도 있지만 여러가지 식을 기술할 수 있습니다. 여기서 사용하는 식은 컬럼명, 연산자, 상수로 구성됩니다.



1

SELECT *, 컬럼명1 * 상수 FROM 테이블명;

[표 11. SELECT 구에서 식의 사용]


스크린샷 2017-02-20 오후 5.27.00.png

[그림 8. SELECT 구에서 식을 사용한 결과]


위 예제의 결과를 보면 사용한 식의 내용이 결과의 컬럼명이 사용한 식의 내용으로 들어가 있는것을 볼 수 있습니다. 식이 그대로 보이면 이름이 길고 사용하기도 불편하고 알아보기도 어렵습니다. 이것을 바꾸는 방법을 알아 보겠습니다.

    1. 컬럼 별명 설정

SELECT에서 사용한 식의 결과에서 결과 컬럼명을 내가 원하는 이름으로 재지정할 수 있습니다. 바로 예약어 AS를 사용하는 것입니다.


1

SELECT *, 컬럼명1 * 상수 AS 별명 FROM 테이블명;

[표 12. AS를 사용한 컬럼 별명 지정]


스크린샷 2017-02-20 오후 5.27.52.png

[그림 9. AS를 사용하여 별명을 지정한 결과]


SELECT 구에서는 콤마(,)로 구분한 복수의 식을 지정할 수 있고 각각의 식에 별명을 붙일 수 있습니다. 중복의 이름을 사용할 수는 있지만 결과의 처리가 불분명해집니다. 중복되지 않게 사용해야 합니다.


예약어 AS는 생략할 수 있습니다. 그리고 별명을 지정할 때 한글로 지정하는 경우에는 더블쿼트로 감싸야 합니다. 감싸지 않아도 동작을 하는 경우가 있을 수 있으나 오작동하는 경우들이 많이 발생합니다. 그렇기 때문에 감싸주는것이 좋습니다.


1

SELECT *, 컬럼명1 * 상수 “별명” FROM 테이블명;

[표 13. AS의 생략과 한글의 더블쿼드 사용]


스크린샷 2017-02-20 오후 5.29.45.png

[그림 10. AS를 제외하고 한글 별명을 사용한 결과]


또한 별명을 붙일 때는 숫자로 시작할 수 없습니다. 이름이 숫자로 시작한다면 그것이 수치형 상수를 의미하는 것인지 데이터베이스 객체명을 의미하는지 구별할 수 없습니다. 그래서 데이터베이스명은 ‘숫자로 시작하면 안된다'라는 제약이 생겼습니다. 더블쿼트로 묶는다면 사용할 수는 있지만 추천하지는 않습니다.

    1. WHERE 구에서 연산

SELECT 구에서 연산을 할 수 있지만 WHERE에서도 연산이 가능합니다.


1

SELECT *, 컬럼명 * 상수 AS “별명" FROM 테이블명 WHERE 컬럼명 * 상수 >= 비교값;

[표 14. WHERE 구에서 식의 사용]


[표 14]와 같이 WHERE 구에서 식을 사용할 수 있습니다. 여기서 WHERE 구의 컬럼명 * 상수 부분을 SELECT 구에서 정의한 별명인 “별명"으로 사용하면 안되는지 궁굼할 수 있습니다. 결론은 안된다 입니다. 그 이유는 쿼리의 내부 처리 순서가 다르기 때문입니다.

데이터베이스 서버 내부에서는 WHERE 구를 먼저 처리하고 SELECT 구를 처리합니다. 그래서 SELECT 구에서 지정한 별명은 WHERE 구 안에서 사용할 수 없습니다.

    1. NULL 값의 연산

NULL을 이용해서 연산을 어떻게 결과가 나올지 한번 보겠습니다.

‘NULL + 1’을 했을 때 결과가 어떻게 나올까요?

많은 분들이 1이라고 대답을 합니다. 왜 그럴까요? 아마도 다른 언어의 프로그래밍에서는  NULL을 0으로 간주해서 계산을 했기 때문입니다.


SQL에서 NULL은 유효한 값이 없는 상태입니다. NULL은 0이 아닙니다. 그래서 NULL에 어떤 연산을 하더라도 결과는 NULL입니다.

    1. ORDER BY에서 연산

ORDER BY에서 연산은 다른것은 아니고 SELECT 구에서 지정한 식의 결과를 ORDER BY에서 정렬이 가능합니다.


1

SELECT *, 컬럼명 * 상수 AS “별명" FROM 테이블명 ORDER BY “별명”;

[표 15. 식의 결과로 정렬하기]


스크린샷 2017-02-20 오후 5.34.01.png

[그림 11. order by에서 별명을 지정한 결과]


[표 15]를 보면 조금 이상한 부분 없으신가요?

WHERE 구를 설명할 때는 SELECT에서 지정한 별명을 WHERE 구에서 사용할 수 없다고 설명했습니다. 근데 ORDER BY에서는 별명을 사용하고 있습니다. 무엇이 다른것일까요?

네. 쿼리의 처리 순서가 여기서도 나옵니다. ORDER BY는 서버 내부에서 가장 나중에 처리됩니다. 그래서 SELECT 구에서 지정한 별명을 ORDER BY에서도 사용할 수 있는 것입니다.

    1. 함수

지금까지는 연산자를 사용해 보았습니다. 그렇지만 연산자만 사용하는 것은 아닙니다. 연산자외에도 함수를 사용할 수도 있습니다.


1

SELECT 함수명(파라미터 1, 파라미터 2) AS “별명" FROM 테이블명;

[표 16. 함수의 사용법]


데이터베이스 종류마다 제공하는 함수는 차이가 날 수 있습니다. 하지만 구조는 다 비슷합니다. 그러면 한가지 함수를 다음에서 설명해보겠습니다.

    1. ROUND 함수

데이터가 소수점을 가지고 있을 경우 거래되는 단위를 고려해 반올림을 하는데 이때 사용하는 것이 ROUND 함수입니다.


1

SELECT ROUND(컬럼명 또는 식) FROM 테이블;

[표 17. ROUND 함수의 사용]


ROUND 함수는 기본적으로 소수점 첫째 자리를 기준으로 반올림한 값을 반환합니다. 첫째 자리를 기준으로 반올림할 수도 있지만 두번째 파라미터를 지정하여 반올림할 자릿수를 지정할 수 있습니다. 두번째 파라미터를 생략하는 경우는 0으로 간주해서 처째 자리를 반올림합니다. 만약 두번째 파라미터를 음수로 지정할 경우 정수부의 반올림할 자릿수도 지정할 수 있습니다.


반올림이 아니라 버림을 할때는 TRUNCATE을 사용할 수 있습니다.


이것 외에도 여러가지 함수들이 많이 있습니다. 그런것들은 사용하시는 데이터베이스의 메뉴얼을 참고해주세요.

  1. 문자열 연산

지금까지 수치형 데이터의 연산을 알아봤다면 지금은 문자열형 데이터의 연산에 대해 알아보겠습니다. 문자열형 데이터 연산은 연산자가 그렇게 많지가 않습니다. 그래서 자주 사용하는 몇가지 함수에 대해 표로 정리하겠습니다.


연산자/함수

설명

+/||/CONCAT

문자열을 결합한다.

SQL Server는 +

Oracl, DB2, PostgreSQL 은 ||

MySQL 은 CONCAT 함수를 사용한다.

SUBSTRING

SUBSTR

문자열의 일부분을 계산하여 반환해주는 함수

TRIM

문자열의 앞뒤로 공백이 있을 경우 제거해주는 함수.

문자열 중간의 스페이스는 제거되지 않은다.

CHARACTER_LENGTH

문자열의 길이를 계산하는 함수

OCTET_LENGTH

문자열의 길이를 바이트 단위로 계산하는 함수

문자 인코딩 설정에 따라 길이가 다를 수 있다.

[표 18. 문자열 연산]

  1. 날짜 연산

날짜, 시간 데이터를 저장하는 방법은 데이터베이스마다 크게 다릅니다. 사용하는 데이터베이스의 날짜 저장 방식을 먼저 살펴 보시길 바랍니다.

실제 시스템에서 날짜 연산은 빈번하게 일어납니다. 날짜 정보를 유용하게 사용하는 법을 알아보겠습니다.

    1. 덧셈과 뺄셈

날짜형 데이터는 기간 형식의 수치 데이터와 덧셈, 뺄셈을 할 수 있습니다.날짜 데이터에서 기간 형식의 수치 데이터를 더하거나 빼면 됩니다.

예를 들기에는 기간형 상수의 기술 방법이 데이터베이스마다 다르고 세세한 부분까지 표준화가 이루어지지 않아서 어렵고 자세한 내용은 데이터베이스의 매뉴얼을 참고하길 바랍니다.

  1. CASE 문으로 데이터 변환하기

CASE 문을 이용할 경우 데이터를 변환할 수 있습니다.

이미 준비된 함수를 사용해서 데이터를 특정한 형태로 변환하는 경우도 있지만 임의의 조건에 따라서 데이터를 변환하고 싶을 때 CASE 문을 사용합니다.

    1. CASE 문이란?

먼저 CASE 문의 사용법을 보겠습니다.


1

CASE WHEN 조건식 1 THEN 식 1

[ WHEN 조건식 2 THEN 식 2 ... ]

[ ELSE 식3 ]

END

[표 19. CASE문의 사용]


WHEN 절에는 참과 거짓을 반환하는 조건식을 기술합니다. 조건을 만족하는 경우 THEN 절에 기술에 식을 처리합니다. 다수의 WHEN … THEN ...을 사용했을때 순차적으로 조건식을 실행하게 되고 어떤 조건식도 만족하지 않을때는 ELSE에 기술한 식을 처리합니다.


만약 NULL 값을 변환할 때 CASE를 사용해서 0으로 변환할 수 있습니다. 하지만 이때 CASE를 사용하는 것보단 COALESCE 함수를 사용하는 것이 더 쉽습니다.


1

SELECT COALESCE(컬럼명, 0) FROM 테이블;

[표 20. COALESCE 함수의 사용]


컬럼의 값이 NULL일 경우 0을 반환하고 아닐경우는 컬럼의 값을 그대로 반환합니다.

    1. CASE의 다른 사용법

위에서는 CASE에서 식을 실행하는 것이었다면 여기서 설명할 내용은 숫자로 이루어진 코드를 알아보기 쉽게 문자열로 변환하는 것입니다.


예를 들어 1은 남자 2는 여자라는 코드 체계가 있다면 모르는 사람이 봤을 때 1, 2 코드를 보여주면 이해가 안되지만 남자, 여자라고 표시하면 이해하기 쉬울것입니다.


코드를 문자와 하는것은 ‘디코드', 문자를 수치화 하는것을 ‘인코드'라고 합니다.


1

WHEN a=1 THEN ‘남자'

WHEN a=2 THEN ‘여자'

[표 21. CASE 문을 사용한 디코드]

    1. 주의 사항

      • ELSE를 생략하게 되면 ELSE NULL이 되는것에 주의해야 합니다. 조건에 만족하는 WHEN 절이 하나도 없을경우 ELSE가 사용되며 NULL을 반환합니다. 그렇기 때문에 NULL이 반환되지 않도록 ELSE로 반환될 값을 지정하는것이 좋습니다.

      • WHEN에서 NULL인지 확인하기 위해서는 = 연산자를 사용하는 것이 아닌 IS NULL을 사용합니다. 단순한 비교 연산자 만으로는 NULL 값을 비교할 수 없습니다.


반응형
반응형
  1. 정렬 - ORDER BY

SELECT 쿼리에서 ORDER BY를 지정하면 검색 결과의 행 순서를 바꿀 수 있습니다.

    1. 검색 결과 정렬

SELECT 쿼리의 ORDER BY 뒤에 정렬하고 싶은 컬럼을 지정하면 지정된 컬럼을 기준으로 레코드를 정렬합니다.

ORDER BY는 아래 표와 같이 두가 방법으로 사용이 가능합니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명

2

SELECT * FROM 테이블 WHERE 조건식 ORDER BY 컬럼명

[표 1. ORDER BY 의 사용 위치]


[표 1]에서 보듯이 별도 검색 조건이 없을 경우에는 테이블명 바로 뒤에 지정하면 됩니다.

    1. 내림차순 정렬

ORDER BY는 별도 옵션 지정이 없다면 오름차순 정렬을 기본으로 합니다.

내림차순으로 정렬해야 할때는 “ORDER BY 열명” 뒤에 DESC를 붙여서 지정합니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명 DESC

2

SELECT * FROM 테이블 WHERE 조건식 ORDER BY 컬럼명 DESC

[표 2. DESC의 사용 위치]


DESC는 descendant(하강), ASC는 ascendant(상승)의 약자입니다.

쉽게 예를 들면 오름차순은 첫번째 레코드가 가장 작은 값을 가지고 레코드가 아래로 내려갈수록 값이 커지는 것이고, 내림차순은 첫번째 레코드가 가장큰값을 가지고 아래로 내려갈수록 값이 작아지는 것입니다.


스크린샷 2017-02-17 오후 5.45.06.png

[그림 1. 오름차순 내림차순을 사용한 쿼리]


위 [그림 1]에서 보는 것과 같이 오름차순과 내림차순의 결과가 다릅니다. 예제 쿼리에서는 오름차순 쿼리 호출 시 별도로 오름차순 예약어를 명시하지 않았는데 평소에 오름차순으로 지정할 일이 있으면 ASC로 지정해 주는것이 좋습니다.

    1. 대소관계

ORDER BY로 정렬할 때는 값의 대소관계가 중요합니다.

수치형 데이터의 경우는 대소관계를 판별하는것이 어렵지 않습니다. 문제는 문자열형 데이터입니다.

문자열형 데이터의 경우는 알파벳이나 한글 자모음 배열 순서를 사용하면 문자를 차례대로 나열할 수 있습니다.

한마디로 문자열형 데이터는 사전식 순서에 의해 정렬이 결정됩니다.


스크린샷 2017-02-17 오후 5.53.55.png

[그림 2. 문자열형 데이터를 오름차순한 결과]


[그림 2]에서 a 컬럼의 경우 자료형이 문장열형이기 때문에 오름차순으로 정렬할 경우 1 다음 2가 나오지 않고 10이 나온것입니다. 해당 쿼리에서 b 컬럼으로 오름차순으로 정렬한다면 원하는 결과인 1, 2, 10, 11의 순서로 보일것입니다.


지금까지 ORDER BY를 사용해서 데이터 검색 시 레코드의 정렬 순서를 변경하는 것을 보았습니다. 하지만 이것은 어디까지나 검색한 결과의 레코드 순서를 바꿔서 보여주는 것이지 테이블 자체의 레코드 순서를 변경하는 것은 아닙니다.

  1. 복수의 레코드 정렬

데이터의 양이 많을 경우 하나의 컬럼만으로는 레코드를 특정짓기 어려운 때가 많습니다. 이런 경우 복수의 컬럼을 지정하여 정렬을 합니다.

    1. 복수 컬럼으로 정렬 지정

ORDER BY에 1개의 컬럼을 지정하는 것으로는 정확히 순서를 결정할 수 없는 경우가 있습니다. 예를 들어 같은 값이 들어가 있을 경우가 그렇습니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명1, 컬럼명2 ...

[표 3. 복수의 컬럼으로 정렬]


복수의 컬럼을 지정하면 정렬 결과가 바뀝니다.

정렬의 순서는 지정한 컬럼명의 순서를 따릅니다. 만약 이때 값이 같을 경우 다음으로 지정한 컬럼명을 기준으로 정렬을 합니다.


스크린샷 2017-02-17 오후 5.59.11.png

[그림 3. 복수의 컬럼으로 실행한 결과]

    1. 정렬 방법 지정

복수의 컬럼을 지정해도 각 컬럼에 개별적으로 정렬 방법을 지정할 수 있습니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명1[ASC|DESC], 컬럼명2[ASC|DESC], ...

[표 4. 복수의 컬럼에 정렬 방식 지정]


스크린샷 2017-02-17 오후 6.07.26.png

[그림 4. 복수의 컬럼에 정렬방식을 지정한 결과]

    1. NULL값의 정렬

지금까지는 값이 저장된 컬럼의 정렬 방법을 설명했습니다. 그러면 컬럼의 값이 NULL일 때는 어떻게 정렬을 하는지 보겠습니다.

NULL은 특성상 대소비교를 할 수 없어 정렬 시에는 별도의 방법으로 취급합니다.

간단히 설명하면 ORDER BY로 지정한 컬럼에서에서 NULL값을 가지는 레코드는 가장 먼저 표시되거나 가장 나중에 표시됩니다. 하지만 NULL에 대한 대소비교 방법은 표준 SQL에도 규정되어 있지 않아 데이터베이스 제품에 따라 기준이 다릅니다.

제가 예제를 실행하는 MySQL의 경우는 NULL은 가장 작은 값으로 취급합니다.

  1. 결과의 레코드 수 제한 - LIMIT

검색한 데이터의 레코드 갯수가 많을 때는 한번에 보기 어렵기 때문에 LIMIT을 사용해서 표시할 레코드의 수를 제한할 수 있습니다.

LIMIT은 표준 SQL은 아닙니다. MySQL과 PostgreSQL에서 사용할 수 있습니다.

    1. 레코드 수 제한

LIMIT은 SELECT 쿼리의 마지막에 지정합니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명 LIMIT 레코드수

[표 5.  LIMIT을 지정한 쿼리]


LIMIT은 최대 레코드 수를 수치로 지정합니다. 예를 들어 LIMIT 10으로 지정하면 최대 10개의 레코드가 결과로 표시됩니다.


스크린샷 2017-02-17 오후 6.11.00.png

[그림 5. LIMIT을 사용한 결과]


만약에 LIMIT을 사용하지 않고 조건식을 지정하여 동일한 결과를 얻을 수 있을 수 있습니다. 하지만 LIMIT과 WHERE은 기능과 내부처리 순서가 전혀 다릅니다.

LIMIT은 반환할 레코드 수를 제한하는 기능으로 WHERE로 검색한 후 제일 마지막에 처리됩니다.


스크린샷 2017-02-17 오후 6.14.37.png

[그림 6. WHERE, ORDER BY 와 함께 LIMIT을 사용한 결과]


LIMIT의 처음 설명에서 이것은 MySQL과 PostgreSQL에서만 사용이 가능하다고 했습니다. 그러면 두 데이터베이스를 제외한 나머지에서는 이런 기능이 없을까요?

다른 데이터베이스에도 비슷한 기능이 존재합니다. 대표적인 데이터베이스인 Oracle과 SQL Server를 예로 들어 보겠습니다.


SQL Server에서는 TOP을 사용하여 최대 레코드 수를 제한할 수 있습니다. 아래 쿼리는 SQL Server에서 TOP의 사용하는 방법입니다.


1

SELECT TOP 3 * FROM 테이블

[표 6. SQL Server의 TOP 사용]


Oracle에는 LIMIT이나 TOP이 없습니다. 대신 ROWNUM을 사용해서 레코드 수를 제한 할 수 있습니다. 단, ROWNUM으로 행을 제한할 때는 WHERE 에서 지정합니다. 그래서 LIMIT이나 TOP과 결과가 다릅니다. 자세한 설명은 향후 준비해 보겠습니다.


1

SELECT * FROM 테이블 WHERE ROWNUM <= 3

[표 7. Oracle에서 ROWNUM 사용]

    1. 오프셋 지정

대량의 데이터를 하나의 페이지에 표시하는 것은 기능적으로도 속도 측면에서도 효율적이지 못하므로 일번적으로 페이지 나누기를 합니다. 페이지 나누기 기능은 LIMIT을 사용해서 간단히 구현할 수 있습니다.


1

SELECT * FROM 테이블 LIMIT 레코드 수 OFFSET 위치

[표 8. LIMIT에서 OFFSET 지정]


스크린샷 2017-02-17 오후 6.17.25.png

[그림 7. OFFSET을 지정하여 시작위치 조정 결과]


OFFSET의 시작 위치 지정은 LIMIT 뒤에 기술합니다. 위치 지정은 0부터 시작합니다. 배열의 인덱스를 생각하면 쉽습니다. ‘시작할 레코드 -1’이 시작 위치가 되는겁니다.

예를 들면 첫번째 레코드부터 5건의 데이터를 취득하기 위해서는 LIMIT 5 OFFSET 0 이 되는 겁니다.


반응형
반응형
  1. 검색 조건 조합

SELECT 쿼리를 사용하여 검색 시 실제로는 하나의 조건만 사용하는 경우보다 2개 이상의 조건식을 조합해 검색하는 경우가 많이 있습니다. 이렇게 조건식을 조합할 때 사용하는 AND, OR, NOT 3가지에 대해서 알아 보겠습니다.

    1. AND 조건

복수 조건을 조합할 때 AND를 많이 사용합니다.

AND는 논리 연산자의 하나로 좌우에 항목이 필요한 이항 연산자입니다.

좌우의 조건식이 모두 참일 경우 AND는 참을 반환합니다. 그래서 좌우 조건식, 즉, 모든 조건을 만족할 경우 조건식은 참이된다라고 할 때 AND를 사용합니다.


“SELECT * FROM 테이블명 WHERE 조건식1 AND 조건식2;”


AND는 위와 같은 문법으로 사용합니다.


AND 연산은 조건을 만족하는 레코드을 집합으로 표현했을 때 이들 집합이  겹쳐지는 부분, 즉 교집합으로 계산 할 수 있습니다. 그렇기 때문에 AND로 조건식을 연결하면 모든 조건을 만족하는 레코드를 검색할 수 있습니다.

    1. OR 조건

OR는 어느 쪽이든 하나만 참이 되면 조건식은 참이된다라고 할 경우에 사용합니다.

OR도 AND와 마찬가지로 좌우 항목이 모두 필요한 이항 연산자입니다. AND와 달리 어느 쪽이든 조건을 만족하면 결과는 참이 됩니다. 대신 모든 조건이 거짓일 경우 결과는 거짓이 됩니다.


“SELECT * FROM 테이블명 WHERE 조건식1 OR 조건식2;”


OR는 위와 같은 문법으로 사용합니다.


조건을 만족하는 레코드를 집합으로 표현했을 때 AND 연산과는 다르게 합집합으로 계산할 수 있습니다. 그래서 어느 쪽이든 조건을 만족하는 레코드를 모두 검색할 수 있습니다.

    1. AND와 OR 사용 시 주의점

조건식을 조합을 하다보면 AND와 OR를 혼합하여 사용하는 경우가 있습니다. 그렇게 사용했을 때 자신이 생각했던 결과와 다른 결과를 보고 당황한 경우들이 있을겁니다.

그 이유는 AND와 OR의 경우 연산 우선 순위가 있기 때문입니다.

결론을 먼저 얘기하면 AND가 OR보다 연산 우선 순위가 높습니다.

만약 이런 조건이 있다고 생각해 보겠습니다.

“WHERE 조건1 OR 조건2 AND 조건3 OR 조건4”

위 조건식을 우선순위를 쉽게 보기 위해서 아래와 같이 생각할 수 있습니다.


“WHERE 조건1 OR (조건2 AND 조건3) OR 조건4”


즉, 3개의 조건식이 OR로 연결된 것과 같다고 생각하면 됩니다.

만약 두개의  OR연산은 AND로 연산하고 싶다면 아래와 같이 괄호로 우선 순위를 변경하면 됩니다.

“WHERE (조건1 OR 조건2) AND (조건3 OR 조건4)”

    1. NOT 조건

NOT 연산자는 오른쪽에만 항목을 지정하는 단항 연산자입니다.

오른쪽에 지정한 조건식의 반대값을 반환합니다. 만약 참을 반환하는 조건식에 NOT을 사용하면 거짓을 반환하게 됩니다.


레코드를 집합으로 표현 했을 때 합집합 영역을 제외한 그 나머지 부분을 나타낼 수 있습니다.

  1. 패턴매칭

= 연산자를 사용할 경우 셀의 데이터 값이 완전하게 동일한 것들을 검색합니다. 하지만 특정 문자나 문자열이 포함되어 있는지 검색할 경우가 있습니다. 이런 경우 사용하는 것이 패턴 매칭 또는 부분 검색입니다. LIKE 를 사용하면 문자열의 부분 검색이 가능합니다.

간단한 패턴 매칭이라면 LIKE로 충분하지만 조금 더 복잡한 패턴을 매칭하는 경우에는 정규 표현식을 사용하는 것을 추천합니다.

    1. LIKE로 패턴 매칭

LIKE 연산자는 아래와 같이 사용이 가능합니다.


“컬럼명 LIKE ‘패턴' ”


왼쪽에는 매칭 대상을 지정하고 오른쪽에는 패턴을 문자열로 지정합니다. 대신 수치형 상수는 사용할 수 없고 메타문자 (%, _)는 사용할 수 있습니다.

와일드카드라고도 불리는 메타문자는 패턴 매칭 시 임의의 문자 또는 문자열에 매치하는 부분을 지정하기 위해 쓰이는 특수 문자입니다.

또한 와일드카드로 자주 쓰이는 애스터리스크(*)는 LIKE에서는 사용할 수 없습니다.



%

임의의 문자열을 의미

_

임의의 문자 하나를 의미

[표 7. LIKE 연산자의 패턴에서 특수 문자의 의미]


패턴 매칭을 사용하여 검색시 3가지 방법을 이용할 수 있습니다. 전방 일치, 중간 일치, 후방 일치 이렇게 3가지에 대해 간략하게 아래 표에서 설명하겠습니다.



전방 일치

문자열의 시작이 일치할 경우

WHERE 컬럼명 LIKE ‘패턴%’

중간 일치

문자열에 패턴이 포함된 경우

WHERE 컬럼명 LIKE ‘%패턴%’

후방 일치

문자열의 마지막이 일치

WHERE 컬럼명 LIKE ‘%패턴’

[표 8. 패턴 매칭 방법]

    1. LIKE로 % 검색

위에서 LIKE 사용시 패턴에는 %와 _를 사용할 수 있다고 했습니다. 그렇다면 메타 문자와 동일한 문자를 검색할 경우는 어떻게 해야할까요?

이러한 문제를 ‘이스케이프'라는 방법으로 처리할 수 있습니다. LIKE로 %를 검색하는 경우 ‘\%’와 같이 \를 % 앞에 붙이면 됩니다. 이것을 조건식으로 표현하면 다음과 같습니다.


“WHERE 컬럼명 LIKE ‘%\%%’ ”


%가 연속으로 나열되어 있어 보기 힘들수도 있지만 순서를 따라 확인하면 쉽게 이해할 수 있습니다. 예를 들지 않은 _도 %와 동일하게 검색하면 됩니다.

    1. 문자열 상수 ‘ 이스케이프

메타 문자를 검색할 때와 같이 문자열 상수를 검색할 때도 같은 문제가 발생합니다.

문자열 상수는 ‘문자열'과 같이 ‘로 둘러싸 표기합니다. 문자열 상수 안에 ‘를 포함하고 싶을 때는 어떻게 해야 할까요?

표준 SQL에서는 ‘를 2개를 연속해서 기술하는 것으로 이스케이프 처리를 할 수 있습니다. 예를 들어 보겠습니다.

‘It’s’라는 문자열을 문자열 상수로 표기하면 ‘It’’s’로 표기할 수 있습니다.

한가지 더 예를 들면 ‘하나만 문자열 데이터라면 어떻게 해야 할까요? ‘’’’로 쓰면 됩니다. ‘를 총 4번 쓰면됩니다.



반응형
반응형
  1. 검색 조건 지정

데이터베이스의 테이블에는 컬럼이 많이 있습니다. 

한번에 화면에 표시하여 확인할 수 있는 데이터의 양은 한정되어 있습니다. 

컬럼이나 레코드를 선택해서 데이터를 읽어오는 검색이 빈번하게 일어 납니다.

이번에는 컬럼이나 열을 선택해서 테이블의 데이터를 조회하는 방법에 대해 알아보겠습니다.


    1. SELECT 구에서 컬럼 지정

여기서는 데이터베이스의 테이블에서 자신이 원하는 컬럼들을 한정하여 검색하는 방법에 대해 알아보겠습니다.


결과로 표시하고 싶은 컬럼을 지정할 수 있습니다.


“SELECT 컬럼1, 컬럼2, 컬럼3, … FROM  테이블 명;


이전에 제가 올렸던 글에서 보면 샘플 데이터에서 컬럼의 정보들을 가져올때는 애스터리스크(*)를 사용하여 모든 컬럼을 표시하였습니다.

컬럼을 한정하기 위해서는 * 부분을 위의 쿼리처럼 “컬럼1, 컬럼2” 원하는 컬럼을 명시하고 구분은 콤마(,)를 이용하면 지정한 컬럼만 결과 값에 보여집니다.


스크린샷 2017-02-15 오전 11.09.34.png

[그림 3. 컬럼을 한정하여 데이터 조회]


만약 테이블에 존재하지 않는 컬럼이나 아무 컬럼도 지정하지 않을 경우 구문 에러가 발생합니다. 또한 컬럼을 지정할 때 지정 순서는 임의로 지정하거나 중복이 되어도 무관합니다. 지정한 컬럼의 순서에 따라 결과가 보여집니다.

    1. WHERE 구에서 레코드 지정

테이블의 컬럼은 많아야 몇십개지만 레코드는 컬럼에 비해 훨씬 많을 수 있습니다. 적으면 수백개 많으면 수천만건의 레코드가 있을 수 있습니다. 이렇게 많은 레코드에서 내가 필요한 데이터만 검색하기 위해서는 WHERE 구를 사용해야 합니다.


“SELECT 컬럼 FROM 테이블명 WHERE 조건식;


WHERE 구는 FROM 구의 뒤에 표기되며 WHERE 뒤에 검색 조건을 사용합니다.


위에서 보듯이 SQL에서는 구의 순서가 정해져 있어 바꿔서 적을 수가 없습니다. 만약에 위의 쿼리를 “select 컬럼 where 조건식 from 테이블명;” 순으로 적으면 에러가 발생합니다. 또한 WHERE 구처럼 생략 가능한 것도 있습니다.


WHERE 구에는 조건식이 들어갑니다.


스크린샷 2017-02-15 오전 11.29.55.png

[그림 4. 조건식을 적용하여 검색]


위 [그림 4]는 WHERE 구에 조건식을 적용하여 테이블의 데이터를 검색한 것입니다. 이렇게 조건식만 주어서 레코드를 검색할 수도 있지만 SELECT 구에 원하는 컬럼 지정을 동시에 사용할 수 있습니다.


스크린샷 2017-02-15 오전 11.29.07.png

[그림 5. 조건식과 컬럼 지정 동시 사용]


조건식을 간단히 살펴보면 id = 1 이것이 의미하는 것은 컬럼 명 id의 값이 1인 레코드를 검색하겠다는 것입니다. 조건식의 컬럼명은 상황에 맞는 것을 사용하면 되고 조건식이 참이 되는 결과 값만 반환을 하게 될것입니다.

조건식은 참 또는 거짓의 진리값을 반환하는 식으로 비교 연산자를 사용해 표현합니다.


만약 값이 서로 다른 경우를 검색하기 위해서는 어떻게 해야 할까요?

연산자로 ‘<>’을 사용하면 됩니다.


스크린샷 2017-02-15 오전 11.40.32.png

[그림 6. 연산자 <>을 사용하여 검색]


연산자 ‘<>’은 서로 다른 값인지를 비교하는 연산자입니다.

<> 연산자를 통해 ‘값이 서로 다른 경우’ 참이 되는 조건식으로 변경할 수 있습니다.


[그림 6]에서도 알 수 있듯이 복수의 레코드가 출력될 수도 있고 하나 또는 아무것도 반환되지 않을 수 있습니다.

    1. 문자열 상수

위에서 검색했던 조건식의 경우는 id가 수치형 데이터였습니다. 그러면 수치형 데이터가 아닌 문자열 데이터의 경우는 어떻게 검색을 해야할까요?


수치형 조건식의 경우는 “id = 1”과 같이 비교할 숫자를 그대로 조건식에 표기합니다. 하지만 문자열의 경우는 ‘김이빵'처럼 싱글 쿼트를 사용하여 둘러싸 표기해야 합니다. 날짜 또한 마찬가지입니다.


스크린샷 2017-02-15 오전 11.50.48.png

[그림 7. 싱글 쿼드없이 검색 시 에러]


스크린샷 2017-02-15 오전 11.53.17.png

[그림 8. 싱글 쿼트로 감싸서 검색한 결과]


한편 자료형에 맞게 표기한 상수값을 ‘리터럴(literal)’이라고 합니다.

문자열 리터럴은 싱글 쿼트로 둘러싸 표기합니다.

    1. NULL 검색

데이터 검색 시 NULL 값을 검색할 경우에는 조금 주의해야 합니다.

조건식을 birthday = NULL 과같은 식으로는 검색할 수 없습니다. 한마디로 = 연산자로는 검색이 안됩니다.


스크린샷 2017-02-15 오전 11.57.44.png

[그림 9. = 연산자를 사용하여 NULL 검색 결과]


NULL 값을 검색할 때는 = 연산자가 아닌 “IS NULL”을 사용하면 됩니다.


스크린샷 2017-02-15 오전 11.58.21.png

[그림 10. IS NULL을 사용하여 NULL 검색 결과]


반대로 NULL 값이 아닌 값을 검색하고 싶다면 “IS NOT NULL”을 사용하면 됩니다.


스크린샷 2017-02-15 오전 11.58.42.png

[그림 11. IS NOT NULL을 사용하여 검색한 결과]


    1. 비교 연산자

지금까지 =, <>, IS NULL, IS NOT NULL을 사용해서 검색하는 방법을 알아봤습니다. 

이것들과 같이 대표적으로 많이 사용하는 연산자를 알아보겠습니다.


연산자

설명

=

좌변 우변의 값이 같을 경우 참

<>

좌변과 우변이 같지 않을 경우 참

>

좌변의 값이 우변의 값보다 클 경우 참.

같거나 작을 경우 거짓

<

좌변의 값이 우변의 값보다 작을 경우 참

같거나 클 경우 거짓

>=

좌변의 값이 우변의 값보다 크거나 같을 경우 참

작을 경우 거짓

<=

좌변의 값이 우변의 값보다 작거나 같을 경우 참

클 경우 거짓

[표 6. 연산자 정의]


위 연산자들을 정의할 때 <=, >=, <> 사이에 스페이스를 넣으면 안됩니다. 

스페이스를 넣을 경우 별도의 연산자라고 판단하여 에러가 발생합니다.

반응형
반응형
  1. 테이블 구조 참조


여기서부터는 지금까지 열이라고 했던것을 컬럼이라고하겠습니다.

자꾸 열로 쓰다보니 글을 정리하면서도 헷갈려서 지금부터는 컬럼으로 하겠습니다.


SELECT 명령으로 테이블의 데이터를 읽어봤습니다. 테이블은 여러개의 컬럼으로 구성 됩니다. 뒤에서 설명하겠지만 SELECT 쿼리는 조건을 지정하여 특정 컬럼의 값을 불러올 수 있습니다. 그래서 테이블에 어떤 컬럼들이 있는지 참조할 수 있다면 SELECT 쿼리를 작성하기 수월해 집니다. 그럼 테이블의 구조는 어떻게 참조하는지 알아보겠습니다.

    1. DESC 명령

DESC 쿼리를 사용하면 테이블에 어떤 컬럼이 정의되어 있는지 확인할 수 있습니다.


스크린샷 2017-02-14 오후 3.10.02.png

[그림 2. DESC 쿼리 실행 화면]


DESC쿼리를 실행했을 때 위 [그림 2]와 같은 결과를 볼 수 있습니다. 실행 결과에 대해 아래 표에서 간단히 설명해 보겠습니다.


Field

컬럼의 이름

Type

컬럼의 자료형

Null

Null 값을 허용할 것인지 아닌지를 나타내는 제약사항

YES : Null 허용

NO :  Null 허용 안됨

Key

해당 컬럼이 key로 지정되어 있는지 표시

Default

컬럼의 기본값.

데이터 입력시 생략되거나 null이 들어올 경우 들어가는 기본값

[표 4. DESC 실행 결과 항목 설명]

    1. 자료형

DESC 쿼리로 봤듯이 컬럼들은 각각 자료형이 정해져 있습니다. 여기서 몇몇 중요한 자료형에 대해 표로 설명해 보겠습니다. 아래 표의 설명한 자료형 외에도 많은 자료형이 있습니다.


자료형

설명

INTEGER

수치형의 하나로 정수값을 저장할 수 있는 자료형.

소수점은 포함할 수 없다.

CHAR

문자열을 저장할 수 있는 자료형

문자열의 최대길이를 지정해야 한다.

언제나 고정된 길이로 데이터가 저장되고 설정한 최대 길이보다 긴 문자열은 저장할 수 없다.

‘고정 길이 문자열' 자료형.

VARCHAR

문자열을 저장할 수 있는 자료형

최대 길이를 지정하는 점은 CHAR와 같다.

하지만 데이터 크기에 맞춰 저장공간의 크기도 변경된다.

‘가변 길이 문자열' 자료형

DATE

날짜값을 저장할 수 있는 자료형

날짜값이란 연월일의 데이터를 저장할 수 있는 형

ex) 2017년 2월 14일

TIME

시간을 저장할 수 있는 자료형

시분초의 데이터를 저장할 수 있는 형

ex) 12시 30분 20초

[표 5. 자료형]

반응형
반응형

이번에는 Select 명령을 이용한 데이터 검색에 대해 설명해 보겠습니다.

이제부터 모든것은 Mysql을 기준으로 설명하겠습니다.


  1. Select 명령

SQL에서는 아래와 같이 기본적인 구조의 Select 명령어를 사용할 수 있습니다.


“SELECT * FROM 테이블명;"


이 구조를 가지고 계속 설명을 하겠습니다.

위 명령문을 가지고 mysql에서 실행시  테이블명에 해당하는 테이블에서 데이터를 검색하여 결과를 보여줍니다.

스크린샷 2017-02-14 오후 1.44.47.png

[그림 1. 명령어 실행 화면]


명령어들은 우리가 흔히 ‘질의' 또는 ‘쿼리'라고 부릅니다. 앞으로는 쿼리라는 명칭으로 통일하겠습니다. 그러면 위 그림에서 실행한 쿼리를 한번 살펴 보겠습니다.



예약어

테이블명


SELECT

*

FROM

exam01

;

쿼리의 종류

모든 컬럼

~테이블로부터

테이블 명

쿼리의 마지막

[표 1. select 쿼리 구조]


  • SELECT는 SQL 명령 중 하나로 SELECT 쿼리를 실행하겠다는 의미입니다.

  • 애스터리스크(*) 는 테이블의 모든 컬럼을 의미하는 메타 문자입니다.

  • FROM은 처리 대상 테이블을 지정하는 키워드입니다.

  • 조회할 테이블 명을 입력합니다.

  • 세미콜론 (;) 중요합니다. 쿼리의 마지막에 꼭 들어가야하며 세미콜론이 없이 쿼리를 실행할 경우 쿼리 작성 중으로 인식하여 실행이 되지 않거나 다른 쿼리와 구분이 되지 않아 에러가 발생할 수 있습니다.


SELECT 와 FROM은 데이터베이스의 예약어입니다.

또한 데이터베이스 객체는 이름을 붙여서 관리를 합니다. 예를 들어보면 [그림 1]에서 보는 것처럼 exam01이라는 테이블이 데이터베이스에 존재합니다. 여기서 동일한 이름의 테이블을 생성하면 ‘이미 테이블이 정의되어 있다.’는 에러가 발생합니다.

통상적으로 데이터베이스 객체명에는 예약어나 동일한 이름을 사용할 수 없습니다.


SQL에서는 예약어와 데이터베이스 객체명을 대소문자를 구별하지 않습니다. 예를 들면 아래의 표와 같은데 모두 동일하게 결과를 보여주는 쿼리입니다.


select * from exam01;

소문자로만 작성

Select * From Exam01;

대소문자 혼용

SELECT * FROM EXAM01;

대문자로만 작성

[표 2. 쿼리의 대소문자 구별]


하지만 SQL 명령과 달리 많은 데이터베이스 제품들이 대소문자를 구별합니다.

지금 실습하기로한 Mysql 에서도 제가 지금 확인해보니 소문자로만 작성 했을 때 잘 작동하지만

테이블 명을 대문자나 대소문자를 혼용했을 경우 에러가 발생했습니다. 예약어는 대소문자 관계 없이 잘 작동했습니다. 실습에 사용한 버전은 Mysql 5.7입니다.


지금까지 쿼리의 구조와 사용에 대한 설명을 했습니다. 다음으로 실행한 결과 화면에 대한 이야기를 해보겠습니다.


첨부했던 이미지가 이제는 안보인것 같으니 아래 표로 결과를 한번 그려보겠습니다.


열(컬럼/필드)


id

name

birthday

address

컬럼명

1

김일빵

1999-03-01

서울시 구로구

행(레코드)

2

김이빵

NULL

서울시 금천구

3

김삼빵

NULL

서울시 마포구

[표 3. 쿼리의 실행 결과]


SELECT 쿼리 실행 시 위의 [표 3]과 같이 테이블의 조회 결과를 표형식의 데이터로 출력합니다. 요약하면 테이블은 행과 열로 구성된 표 형식의 데이터라는 것입니다.

여기서 설명할 것은 열은 하나의 자료형만 가질 수 있고 데이터는 자료형으로 분류할 수 있다는 것입니다. 또한 데이터에서 NULL로 표시된 부분이 있습니다. NULL은 데이터가 들어있지 않는 것을 의미하는 특별한 값입니다.

반응형
반응형
  1. 데이터베이스란?

데이터 : 컴퓨터 안에 기록되어 있는 숫자

데이터베이스 : 데이터의 집합


넓은 의미에서 컴퓨터 안에 기록되는 모든 것이라고 생각할 수 있고 일반적으로 통용되는 데이터베이스의 개념은 특정 데이터를 확인하고 싶을 때 간단하게 찾아낼 수 있도록 정리된 형태를 가리킵니다.


데이터베이스 내의 데이터는 영구적으로 보존되어야 합니다. 주기억장치에만 데이터를 저장한다면 저장하는 순간 데이터는 날아갑니다. 그러면 영구적이라고 할 수 없습니다. 그래서 데이터베이스의 데이터는 하드디스크와 같은 비휘발성 저장장치에 저장합니다.


 데이터베이스는 데이터센터에 있을 수 있지만 우리의 주변에도 밀접하게 있습니다. 웹서버를 통해서 데이터베이스에 접근할 수 있고, 우리가 사용하는 휴대전화에도 데이터베이스가 사용되고 있습니다. 이처럼 데이터베이스는 다양한 시스템에서 사용되며 일상생활과도 밀접히 관련되어 있습니다.


  1. DBMS가 필요한 이유

DB : Database의 약자

DBMS : 데이터베이스 관리 시스템. DB를 효율적으로 관리하는 소프트웨어를 말한다.


DBMS의 필요 이유는 아래와 같습니다.


  • 생산성

    • 시스템 개발 과정에서의 생산성 향상을 도모할 수 있습니다.

    • 데이터 검색, 추가, 삭제, 갱신과 같은 처리를 기본 기능으로 제공합니다.

  • 기능성

    • 데이터베이스를 다루는 기능을 많이 제공합니다.

    • 복수 유저의 요청에 대응하거나, 대용량의 데이터를 저장하고 고속으으로 검색하는 기능을 제공합니다.

    • 데이터베이스 관리 기능을 사용자가 확장할 수 있어서 유연하게 시스템을 개발할 수 있습니다.

  • 신뢰성

    • 대규모 데이터베이스는 많은 요청에 대응할 수 있도록 하드웨어를 여러 대로 구성하여 신뢰성을 높이는 동시에 성능향상을 도모합니다.

    • DBMS는 컴퓨터를 여러대를 두고, 소프트웨어를 통해 확장성(Scalability)과 부하분산(Load Balancing)을 구현합니다. (클러스터 구성 또는 스케일 아웃 이라고 부른다.)


  1. SQL

DBMS를 이용하면 간접적으로 데이터베이스를 참조하거나 데이터를 추가, 삭제, 갱신을 할 수 있다. 이러한 행위를 위해서는 사용자와 DBMS간에 대화를 해야하는데 이때 이용하는 것이 SQL이다. SQL은 관계형 데이터베이스 관리 시스템(RDBMS)을 조작할 때 사용합니다.

  1. SQL이란?

SQL은 IBM이 개발한 SEQUEL이라는 관계형 데이터베이스 조작용 언어를 기반으로 만들어 졌습니다. ISO 등에 표준화가 진행되어 C언어나 자바와 같이 표준 언어입니다.

  1. SQL 명령의 종류

    • DML(Data Manipulation Language)

      • SQL의 가장 기본이 되는 명령어

      • 추가, 삭제, 갱신 등 데이터를 조작할 때 사용

    • DDL(Data Definition Language)

      • 데이터를 정의하는 명령어

      • 데이터베이스는 ‘데이터베이스 객체’라는 데이터 그릇을 이용하여 데이터를 관리하는데 이러한 객체를 만들거나 삭제하는 명령어

    • DCL(Data Control Language)

      • 트랜잭션을 제어하는 명령과 데이터 접근권한을 제어하는 명령

  2. SQL 방언과 표준화

RDBMS는 처음부터 SQL 명령어를 이용하여 데이터베이스를 조작하도록 설계 되었습니다. 하지만 데이터베이스 종류가 다양해지고 기능을 확장하면서 특정 데이터베이스 제품에만 사용되는 고유방언이 생겨났습니다.

예를 들어 LEFT JOIN의 경우 Oracle에서는 (+)를 이용하여 지정하는데 SQL Server에서는 *= 연산자를 이용합니다.

이와 같이 방언을 사용할 경우 호환이 되지 않는 경우가 생기므로 방언대신에 표준 SQL을 사용하는 것이 좋습니다. ISO나 ANSI가 결정한 ‘SQL-92’, ‘SQL-99’, ‘SQL-2003’ 등이 표준 SQL입니다.

  1. 데이터베이스의 종류

    1. 저장 방법에 따른 분류

      • 계층형 데이터베이스

        • 역사가 오래된 데이터베이스

        • 폴더와 파일 등의 계층 구조로 데이터를 저장하는 방식

        • 하드디스크나 DVD 파일시스템을 계층형 데이터베이스라고 볼수 있다.

        • 현재는 DBMS로 사용되지 않음

      • 관계형 데이터베이스

        • 관계 대수(relational algebra)라는 것에 착안하여 고안한 데이터베이스

        • 행과 열을 가지는 표 형식 2차원 데이터를 저장하는 형태의 데이터베이스

        • 2차원 표들을 저장해 놓고 각각의 표에 이름을 붙여서 관리

      • 객체지향 데이터베이스

        • 가능하면 객체 그대로를 데이터베이스의 데이터로 저장하는 것

      • XML 데이터베이스

        • XML 형식으로 기록된 데이터를 저장하는 데이터베이스

        • SQL 명령을 사용할 수 없다.

        • XQuery라는 전용 명령어를 사용

      • 키-밸류 스토어(KVS)

        • 키와 그에 대응하는 값이라는 단순한 형태의 데이터를 저장하는 데이터 베이스

        • NoSQL(Not Only SQL)이라는 슬로건으로부터 생겨난 데이터베이스로, 열지향 데이터 베이스라고고 불림

    2. 데이터베이스 제품(RDBMS)

      • Oracle

        • 오라클에서 개발한 제품

        • 많은 시스템에서 채택해 사용 중

      • DB2

        • IBM이 개발한 제품

        • 발표된 이래 한동안은 IBM 컴퓨터에서만 구동했다.

        • 향후 구동가능한 OS를 확장하였으나 오라클에 밀려서 시장 점유율을 확대 할 수 없었다.

      • SQL Server

        • 마이크로소프트가 개발한 제품

        • 윈도우 플랫폼에서만 동작

      • PostgreSQL

        • 오픈소스 커뮤니티가 개발한 제품

        • 기반이 되는 RDBMS는 캘리포니아 대학교 버클리 캠퍼스에서 탄생

        • 실험적인 기능, 독특한 구조

      • MySQL

        • 오픈소스 커뮤니티가 개발한 제품

        • 최초에 경량 데이터베이스라는 점을 강조하다 보니 필요한 최소한의 기능만을 갖춤

        • 향후 기능이 확장되면서 다른 RDBMS와 비교해도 부족하지 않다.

      • SQLite

        • 오픈소스 커뮤니티가 개발한 제품

        • 임베디드 시스템에서 자주 쓰이는 작은 RDBMS


반응형
반응형

오랜만에 레드마인 설치를 하다보니 이것저것 헷갈리고 다른 사람들도 도움이 될 것이라 생각되어 블로그에 정리를 한다.

일단 보통 레드마인 설치 시 root 계정으로 많이 작업을 하는데 이번에 레드마인 설치 페이지를 참고해보니 별도 계정을 만들어서 설치를 진행한.

01. 설치 항목

1. Redmine 3.1.1

2. MariaDB 5.5

3. Apache2, Passenger

4. Ubuntu 14.04


02. 기본 패키지 설치

$ sudo apt-get update && sudo apt-get upgrade -y

$ sudo apt-get install apache2 curl bison libbison-dev zlib1g-dev libssl-dev sqlite3 libsqlite3-dev autoconf automake build-essential libtool libreadline6-dev libyaml-dev libxml2-dev libcurl4-openssl-dev libssl-dev libgpg-error-dev autotools-dev imagemagick libmagickcore-dev libmagickwand-dev


03. Ruby 설치

$ sudo add-apt-repository ppa:brightbox/ruby-ng 

$ sudo apt-get update

$ sudo apt-get install ruby2.1 ruby-switch ruby2.1-dev libruby2.1

$ sudo ruby-switch --set ruby2.1


04. Redmine 계정 & 그룹 생성

$ sudo adduser --system --shell /bin/bash --gecos 'Redmine Administrator' --group --disabled-password --home /srv/redmine redmine

$ sudo visudo

# temp - *REMOVE* after installation
redmine    ALL=(ALL)      NOPASSWD:ALL  

위의 REMOVE 부분은 레드마인 설치 이후 삭제 또는 주석 처리 부분이니 잘 기억.


*주의 : 여기서 부터는 root 계정과 redmine계정을 번갈아 가며 사용하므로 주의*

05. rvm 설치

$ sudo su - redmine
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
$ curl -sSL https://get.rvm.io | bash -s stable
$ exit 

$ sudo su - redmine
$ rvm install 2.1.4
$ exit 


06. Redmine 다운로드

$ sudo su - redmine 

$ wget http://www.redmine.org/releases/redmine-3.1.1.tar.gz
$ tar zxvf  redmine-3.1.1.tar.gz

$ ln -s /srv/redmine/redmine-3.1.1 redmine

$ exit


07. MariaDB 설치

sudo apt-get install software-properties-common

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db

sudo add-apt-repository 'deb http://ftp.kaist.ac.kr/mariadb/repo/5.5/ubuntu trusty main'

sudo apt-get update

sudo apt-get install mariadb-server

mysql -u root -p

MariaDB [(none)] > CREATE DATABASE redmine CHARACTER SET utf8;

MariaDB [(none)] > CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';

MariaDB [(none)] > GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';

MariaDB [(none)] > exit;

$ sudo su - redmine 

$ cp redmine/config/database.yml.example redmine/config/database.yml

$ nano redmine/config/database.yml

...

production:

    adapter: mysql2

    database: redmine

    host: localhost

    username: redmine

    password: my_password

    encoding: utf8 

    schema_search_path: public

...


$ exit


08. Bundler & Install

$ sudo su - redmine

$ cd ./redmine

$ gem install bundler
$ bundle install --without development test mysql sqlite

$ rake generate_secret_token
$ RAILS_ENV=production rake db:migrate
$ RAILS_ENV=production rake redmine:load_default_data

→ ko (enter)

$ exit

** 주의 여기서 error 나와서 mysql2 설치가 안되고 아래와 같은메세지가 나올수 있다.

An error occurred while installing mysql2 (0.3.15), and Bundler cannot continue.

Make sure that `gem install mysql2 -v '0.3.15'` succeeds before bundling.

이때 해결한 방법은 

$ sudo apt-get install libmysql-ruby libmysqlclient-dev

또는 

$ sudo apt-get install libmysqlclient-dev

설치  

$ bundle install --without development test mysql sqlite 포함 이후 스크립트들을 다시 실행.


09. Redmine 계정 정리

$ sudo visudo

- 아래 부분 제거

...

# temp - *REMOVE* after installation

redmine    ALL=(ALL)      NOPASSWD:ALL

...


10. Passenger 설치

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7

$ sudo apt-get update 

$ sudo apt-get install apt-transport-https ca-certificates 

$ sudo nano /etc/apt/sources.list.d/passenger.list

deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main

$ sudo chown root:root /etc/apt/sources.list.d/passenger.list
$ sudo chmod +r /etc/apt/sources.list.d/passenger.list 

$ sudo apt-get update$ sudo apt-get install libapache2-mod-passenger

$ sudo nano /etc/apache2/mods-available/passenger.conf

... 

PassengerUserSwitching on
PassengerUser redmine
PassengerGroup redmine

...

11. Apache 설정

$ sudo nano /etc/apache2/sites-available/000-default.conf

... 

<Directory /var/www/html/redmine>
    RailsBaseURI /redmine
    PassengerResolveSymlinksInDocumentRoot on
</Directory>

...

$ sudo a2enmod passenger
$ sudo ln -s /srv/redmine/redmine/public /var/www/html/redmine
$ sudo service apache2 restart

여기까지 진행하고 웹브라우저로 localhost/redmine에 접속을 하면 Redmine을 볼 수 있다.

초기 관리자는 admin/admin


반응형

+ Recent posts