LazarusCompleteGuide:12.5

From 흡혈양파의 번역工房
Jump to: navigation, search

SQL에 관한 특강

SQL는 관계형 데이터베이스를 조작하는 데에 사용되는 표준화된 언어이다. 대부분 관계형 데이터베이스 엔진은 SQL을 지원한다. 표준은 다양하게 존재하며 (SQL 92, SQL 99 또는 2003), 더 많은 언어 기능을 설명한다는 점에서 다르다. 보통은 SQL 92 표준으로 사용을 제한할 경우 SQL 문이 어떤 데이터베이스에서든 작동할 것이다.


SQL은 두 가지 종류의 구문(statement)을 가진다:

  1. DDL 문 (데이터 정의 언어). 해당 문은 데이터베이스에 테이블, 색인, 기타 구조를 생성 시에 사용할 수 있다.
  2. DML 문 (데이터 조작 언어). 해당 문은 데이터의 읽기, 쓰기 또는 업데이트에 사용된다.


SQL에 테이블 생성하기

SQL에서 테이블의 생성은 CREATE TABLE 문의 사용을 통해 이루어지며, 보통은 아래와 같은 모습을 한다:

CREATE TABLE TableName (
  FieldDef1,
  ...
  FieldDefN
);


FieldDef1...FieldDefN 은 테이블에 존재해야 하는 필드의 정의이다.

FieldName FieldType [default value] [Not Null]


FieldName은 유효한 식별자여야 한다 (SQL 식별자와 파스칼 식별자에 거의 동일한 규칙이 적용된다). 가능한 필드 값을 표 12.24에 열거하였다.

이름 설명
VARCHAR(N) 문자열, 최대 N개 문자 길이
CHAR(N) 문자열, 항상 N개 문자 길이
INT 32-비트 정수
DATA 일자 값
TIME 시간 값
DATETIME 일자/시간 값
BOOLEAN 부울 값
FLOAT 부동 소수점 값
SMALLINT 16-비트 정수 값
BLOB 임의 크기로 된 값, 타입이 정해지지 않음 (untyped)
표 12.24: FieldType 식별자


필드 정의에서 Not Null 절은 해당 필드가 값을 필요로 함을 의미한다. 새 레코드를 생성 시 값이 명시되지 않은 경우, Default 절을 이용해 필드에 대해 기본 값을 명시할 수 있다. 명시된 값이 올바른 데이터 타입이어야 함은 분명하다. 아래를 이용 시 사용자 정의로 된 간단한 테이블을 생성할 것이다:

CREATE TABLE USERS (
  ID INT NOT NULL,
  NAME VARCHAR(50) NOT NULL,
  PASSWORD VARCHAR (50),
  LASTLOGIN DATETIME,
  FULLNAME VARCHAR(80),
  EMAIL VARCHAR(100)
);


데이터베이스로부터 데이터 읽기

데이터베이스로부터 데이터를 읽기 위해서는 SELECT문을 사용한다:

SELECT [DISTINCT]
  Field1, Field2, ... FieldN
FROM
  TABLE
WHERE
  Condition1 [[AND|OR] Condition2 [[AND|OR] Condition3]]
ORDER BY
  Field1, Field2


첫 번째 부분은 어떤 필드를 리턴해야 하는지 선택한다: Field1, Field2...FieldN 은 Table1의 필드들이다 (또는 이러한 필드들을 이용하는 표현식 – 추가, 제거, 문자연결(concatenate) 등이 가능하다). FROM 절에 나타나지 않는 테이블의 필드는 명시할 수 없다.


WHERE 절에 하나 이상의 테이블을 명시하는 것도 가능하다. 테이블은 콤마나 JOIN 절을 이용해 구분할 수 있다. 예를 들어, 아래의 JOIN 절은,

CUSTOMER
  INNER JOIN ORDERS ON (CUSTOMER.ID = ORDERS.CUSTOMERID)


CUSTOMERS TABLE의 모든 레코드를 리턴하고, 각각은 CUSTOMERS 테이블의 ID 필드와 ORDERS 테이블의 CUSTOMERID 필드가 일치하는 모든 레코드를 ORDERS 테이블에 리턴할 것이다.


WHERE 절 조건은 리턴된 데이터를 제한하는 데에 사용된다. 조건을 만족 시 레코드는 쿼리에 의해 리턴될 것이다:

  FieldName = SomeValue
or
  Field1 = Field2
or, a special case to test whether a field is empty:
  (Field1 is NULL)
or whether it is in a series of values:
  Field1 in (a, b, c)


ORDER BY 절을 이용해 필드를 정렬한다. 결과에서 레코드는 먼저 첫 번째 필드에서 정렬되고, 다음으로 두 번째 필드에서 정렬될 것이다. 예를 들어:

SELECT
  LOGIN
FROM
  USERS
WHERE
  (PASSWORD IS NULL)
ORDER BY
  FULLNAME


위의 코드는 USERS 테이블과 레코드에 비밀번호가 없는 사용자로부터 모든 LOGIN 이름을 FULLNAME으로 정렬할 것이다. ORDER BY절의 파일명 다음에 DESC를 붙이면 정렬은 내림차순으로 이루어진다:

SELECT
  LOGIN
FROM
  USERS
WHERE
  not (LASTLOGIN IS NULL)
ORDER BY
  LASTLOGIN DESC


이는 모든 LOGIN 이름을 마지막 로긴 시간의 내림차순으로 리턴할 것이다.


테이블에 새 레코드 생성하기

테이블에 새 레코드를 삽입하려면 INSERT 문을 사용하는데, 보통 아래와 같은 모습이다:

INSERT INTO TableName
  (Field1, ... , FieldN)
VALUES
  (Value1, ... , ValueN);


위를 이용 시 'TableName' 테이블에 하나의 새 레코드가 삽입되고, 레코드가 이동될 것이다: INSERT 절에 명시된 각 필드는 구문의 'VALUES' 부분에서 동일한 위치의 값을 얻을 것이다.


값의 수가 필드 수와 일치하고, 각 값의 타입은 필드의 타입과 호환되어야 한다는 규칙을 따른다.


INSERT 문은 테이블 내 모든 필드를 포함하지 않아도 된다. INSERT 문에 필드가 누락되면 NULL 값을 얻을 것이다 (테이블 생성문에 해당 필드에 대한 DEFAULT 절에 값이 명시되지 않은 이상. 만일 명시되었다면 NULL이 아닌 기본 값을 가질 것이다).


필드가 NOT NULL로 선언되었는데 NULL 값을 얻을 경우, 데이터베이스 엔진은 오류를 발생시킬 것이다.


다음을 이용 시 users 테이블에 새로운 사용자 계정이 생성될 것이다:

INSERT INTO USERS
  (ID, LOGIN,FULLNAME)
VALUES
  (1,'michael','Micahel Van Canneyt')


테이블에서 레코드 삭제하기

테이블에서 레코드를 제거할 때는 DELETE문을 사용하면 되는데, 일반적으로 아래와 같은 모습을 띤다:

DELETE FROM TableName [WHERE condition1 [[AND|OR] condition2]]


WHERE 절이 없는 경우 모든 레코드가 삭제될 것이다. 보통 WHERE 절은 삭제해야 할 레코드를 유일하게 결정하는 조건을 명시한다.


예를 들자면:

DELETE FROM USERS WHERE LOGIN = 'micahel'

위의 SQL문은 사용자의 테이블에서 'michael'이란 사용자에 해당하는 레코드를 삭제할 것이다.


데이터베이스에서 레코드 업데이트하기

데이터베이스에서 레코드 내 필드를 변경하려면 UPDATE 문을 사용하며, 일반적인 모습은 아래와 같다:

UPDATE TableName SET
  Field1 = Value1,
  ...
  FieldN = ValueN
[WHERE condition1 [[AND|OR] condition2]]


이는 Field1을 Value1으로, Field2는 Value2로 업데이트할 것이다. WHERE 절이 존재하지 않는 경우, 테이블 내의 모든 레코드의 필드가 업데이트될 것이다.


DELETE 문에서와 마찬가지로 WHERE 절은 일반적으로 새 값으로 업데이트해야 하는 레코드를 유일하게 결정하는 조건을 명시한다.


예를 들어:

UPDATE USERS SET
  PASSWORD = 'Secret',
  EMAIL = 'michael@freepascal.org'
WHERE
  LOGIN  = 'michael';

위의 문은 'michael' 이란 사용자의 비밀번호와 이메일 주소를 업데이트할 것이다.