윈도우 서버에 대해서/서버 만들기

게임 서버 프로그래밍 입문 (9) - MS-SQL, SQL 문법

중년 플머 김씨 2015. 3. 28. 01:26

보통 게임 서버에서는 클라이언트 데이터를 직접 저장 하지 않고 DataBase라는 프로그램에 데이터를 저장 합니다.

 

그런 의미에서 저도 DB에 데이터를 저장하고 로드 하는 방법을 알려드리려 합니다.

우선 무료로 설치 할 수 있는 MS-SQL Express 2014를 설치해 봅시다.  (가능하면 다른 PC나 가상PC에서 설치하세요)


 http://msdn.microsoft.com/ko-kr/evalcenter/dn434042.aspx
 

 

설치하면 중간에 기능 선택 기능이 있는데 관리 도구는 반드시 체크합시다.
그리고 인스턴스 루트 디렉터리는 DB가 IO 문제가 민감해서 웬만하면 OS가 설치 안된 다른 하드 디스크를 선택하는 것이 좋습니다.


 

특별히 설치하는 데는 큰 어려움이 없다고 생각합니다.
가끔 설치했는데, Management Studio가 없는 경우도 있는데, 이는 설치 파일을 잘 못 받은 것입니다. 설치 파일을 확인하시고 다시 설치하시기 바랍니다.
여기까지 설치되면 DB를 사용할 준비는 완료된 것입니다.


 

 

그럼 여기에 데이터를 어떻게 넣고 조회는 어떻게 할까요?

데이터베이스에는 이런 데이터를 조회하고 넣는등의 스크립트들을 정립해서 표준화 시켰습니다.

이를 SQL이라고 하죠.

게임 서버에서 자주 사용되는 SQL문법은 아래와 같습니다.

 

1. Use
Database를 선택할 때 사용합니다.
ex: > USE [데이터 베이스 이름];


2. GO
쿼리 문 실행을 끝냄을 의미합니다. 즉 GO가 나오기 전까지는 일종의 {}에 묶여 있는 형태로 보시면 좋을 것 같습니다.


3. Create
DB, 테이블, 프로시저, 트리거등을 만드는 문입니다.
ex: > CREATE TABLE [테이블 명] (칼럼 명, 데이터 타입 및 제약 조건 ……)


4. Alter
DB, 테이블, 프로시저 등을 수정할 때 사용합니다.
ex: > ALTER PROC [프로세서 이름]


5. Insert
레코드를 테이블에 넣을 때 사용합니다.
ex: > INSERT INTO [테이블 명] (칼럼1, 칼럼2, ……) VALUES(값1, 값2……)


6. Select
테이블 검색에 사용합니다.
ex: > SELECT * FROM [테이블] WHERE [조건식] ORDER BY [정렬 방법]
ex2: > SELECT TOP 10 FROM [테이블]            -- 테이블 항중 10개만 출력
ex3: > SELECT DISTINCT [칼럼A] FROM [테이블]   -- 칼럼A의 중복 값 제거한 레코드 출력


7. Update
레코드 수정에 사용합니다.
ex: > UPDATE [테이블] SET [칼럼] = [값], …… WHERE [조건식]


8. Delete
레코드를 삭제 합니다.
ex: > DELETE [테이블] WHERE [조건식]


9. Truncate
레코드를 비웁니다. Delete와 다른 점은 트렌젝션 로그를 남기지 않습니다.
즉, DELETE [테이블A]; ROLLBACK 하면 롤백이 가능합니다만,
TRUNCATE TABLE [테이블A]; ROLLBACK 하면 롤백이 불가능합니다.


10. Drop
테이블, 프로시저, DB를 완전히 삭제 합니다.
DELETE, TRUNCATE 는 데이터를 삭제하는데, Drop은 객체 자체를 지웁니다.
ex: > DROP TABLE [테이블A]
    > DROP DB [DB이름]
    > DROP PROC [프로시저 이름]


11. Join
테이블과 테이블을 어느 조건에 맞춰 합치게 합니다.
예를 들어 아래와 같은 것을 생각할 수 있습니다.


<User Table>
userOid name job level money
1 롱스틱 마법사 280 10034
2 사과크림 전사 100 592
3 포도크림 소환사 39 110
… … … … …
<Item Table>
itemOid name lv userOid
1 절대반지 50 3
2 엑스칼리버 120 2
3 파멸의 손짓 240 1
… … … …
여기서 userOid로 묶을 수 있으니까 아래와 같이 입력하면
> SELECT * FROM UserTable AS A1
  INNER JOIN ItemTable AS A2.
  ON A1.userOid = A2.userOid

 


userOid name job level money itemOid name lv
1 롱스틱 마법사 280 10034 3 파멸의 손짓 240
2 사과크림 전사 100 592 2 엑스칼리버 120
3 포도크림 소환사 39 110 1 절대반지 50


이런 식으로 조합이 가능합니다.
그리고 눈치채셨겠지만 Oid를 기점으로 데이터를 합칠 수 있으니 Oid가 아닌 것들은 데이터 수정에서 자유로울 수 있는 장점이 있습니다. (캐릭터 이름 변경이라던가……)|
위에서는 교집합인 Inner의 예가 빈번히 사용돼서 설명 드렸고, 그 외의 합집합인 Outer join 문은 물론 Cross Apply도 살펴보시길 바랍니다.


12. Sub Query
일종의 Select 문 안에 Select 를 사용하는 방법입니다.
ex: > SELECT * FROM [테이블A] WHERE [칼럼]
       = (SELECT * FROM [테이블] WHERE [칼럼] = ‘조건’)
조금 변형하면 이런 것들도 가능합니다.


> SELECT [칼럼1], [칼럼2] INTO [테이블B] FROM [테이블A] WHERE [칼럼] = ‘조건’
  -> 테이블A의 조건을 만족하는 칼럼1, 칼럼2의 테이블 B를 생성합니다.
> UPDATE A SET A.[칼럼] = B.[칼럼] + x
 FROM [테이블A] AS A JOIN [테이블B] AS B ON A.[칼럼] = B.[칼럼] WHERE [칼럼] = ‘조건
 -> 특정 A 테이블 중, A와 B의 join한 테이블의 특정 조건의 레코드의 항목만 갱신


13. Set
변수를 설정하는 명령어 입니다.
ex: > DECLARE @tmp1 AS INT
      SET @tmp1 = 1000


14. Print
메시지를 출력합니다. 굉장히 길고 처리 시간이 오래 걸리는 쿼리 문 작성할 때, 중간에 Print 메시지를 넣어서 어디까지 실행 되었는지 파악할 때 사용합니다.
ex: > PRINT ‘쿼리 A까지 완료’


15. PROCEDURE
위의 기본 쿼리 문 (SELECT, INSERT, DELETE, UPDATE) 하나만으로 데이터 넣는 처리를 하는데 어느 정도 한계가 있습니다. 그래서 이 코드들을 하나의 함수처럼 선언 할 수 있는데, 이를 프로시저라고 합니다.
프로시저를 선언하게 되면, 해당 코드들을 MSSQL내부에서 미리 컴파일 해 가지고 있기 때문에 실행 속도가 훨씬 빠릅니다.
그리고 응용단계로 프로시저 안에서 프로시저를 생성해서 실행 할 수 있는데, 이를 동적 프로시저(Dynamic)라고 합니다.


ex: > CREATE PROC [프로시저 명] [@파라 미터], ……
      AS BEGIN
         SELECT * FROM … 쿼리 문
      END


16. BEGIN TRANSACTION / COMMIT TRANSACTION / ROLLBACK TRANSACTION
트렌젝션은 어느 업무 처리 단계를 두는 행위로, 데이터에 어떤 행위(수정, 삭제)를 했고, 이 결과가 실패할 경우 이전 단계로 복구해 주는 기능을 뜻합니다.
만약 성공했다면, COMMIT, 실패해서 이전 단계로 복구하려면 ROLLBACK을 사용합니다.


17. EXEC
프로시저를 실행합니다.
ex: > EXEC [프로시저 명] [값1], [값2] ……

 

이밖에 알아두면 좋은 것은 Index, 트리거, 권한주기, X쿼리나 내부 함수인 DATEADD, COUNT, MAX, MIN, GROUP BY 등을 공부하면 좋겠지만, 위의 17가지 + 알파만 알고 있어도 서버 프로그래머 업무상 큰 지장은 없고 모르면, 누누이 말씀드리지만 그때그때 구글로 찾아도 참고할 자료는 많이 있습니다.

 

위 내용은 제가 집필한 "게임 서버 프로그래밍 입문" 책의 내용중 일부 부분에 대한 내용입니다.

전체 소스 코드와 책 구입에 대해서는 http://rosagigantea.tistory.com/589 에 링크 시켰습니다.