SQL: 두 판 사이의 차이
편집 요약 없음 |
|||
| 92번째 줄: | 92번째 줄: | ||
alter table r drop A | alter table r drop A | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Basic Structure of SQL Queries== | |||
일반적인 SQL 질의는 다음 형식을 갖는다. | |||
<syntaxhighlight lang="sql"> | |||
select A1, A2, ..., An | |||
from r1, r2, ..., rm | |||
where P | |||
</syntaxhighlight> | |||
Ai는 속성(attribute)을 나타낸다. Ri는 관계(relation, 즉 테이블)을 나타낸다. P는 조건(predicate)을 나타낸다. 이때 SQL 질의의 결과는 하나의 관계(relation)이다. 즉, "테이블"을 반환한다. | |||
===The select Clause=== | |||
select 절은 질의 결과로 원하는 속성들(attributes)을 나열한다. 이는 관계 대수(relational algebra)의 투영 연산(projection)에 해당한다. 예를 들어 모든 교수의 이름을 구하려면 | |||
<syntaxhighlight lang="sql"> | |||
select name | |||
from instructor | |||
</syntaxhighlight> | |||
위와 같이 작성한다. 이때 SQL에서 이름은 대소문자를 구분하지 않는다. 이때 테이블은 튜플의 집합이기 때문에 원칙적으로는 중복된 튜플이 있을 수 없으나, SQL은 질의의 결과에서 중복된 튜플을 허용한다. 이때 중ㅈ복을 제거하려면 select뒤에 distinct 키워드를 사용한다. 예를 들어 교수들의 학과 이름을 중복없이 구하려면 아래와 같이 쓴다. | |||
<syntaxhighlight lang="sql"> | |||
select distinct dept_name | |||
from instructor | |||
</syntaxhighlight> | |||
중복을 제거하지 않으려면 all 키워드를 사용한다. | |||
<syntaxhighlight lang="sql"> | |||
select all dept_name | |||
from instructor | |||
</syntaxhighlight> | |||
==각주== | ==각주== | ||
[[분류:데이터베이스 시스템]] | [[분류:데이터베이스 시스템]] | ||
2025년 4월 1일 (화) 12:38 판
상위 문서: 데이터베이스 시스템
개요
SQL(Stuctured Query Language)은 가장 널리 자용되는 데이터베이스 질의(query) 언어이다. SQL은 SQL query language라고 많이 불리지만, 단순히 데이터베이스의 질의를 하는 것 이상의 일, 데이터의 구조를 정의하고, 데이터베이스의 데이터를 수정하며, 보안 제약 조건을 명시할 수 있다.
SQL의 구성
SQL은 아래와 같은 여러 부분으로 구성된다:
- DDL(Data Definition Language): SQL DDL은 관계 스키마를 정의하고, 관계를 삭제하며, 관계 스키마를 수정하는 명령어들을 제공한다.
- DML(Data Manipulation Language): SQL DML은 데이터베이스에서 정보를 질의하고, 튜플을 삽입하고, 삭제하고, 수정하는 기능을 제공한다.
- 무결성(Integrity): SQL DDL에는 데이터베이스에 저장된 데이터가 반드시 만족해야 하는 무결성 제약 조건을 명시하는 명령어가 포함되어 있다.
- View definition: SQL DDL에는 뷰를 정의하는 명령어가 포함되어있다.
- Transaction protocol: SQL은 transaction의 시작점과 종료점을 지정하는 명령어들을 포함한다.
- Embedded SQL and dynamic SQL: 임베디드 SQL과 동적 SQL은 SQL 문장이 C, C++, Java와 같은 범용 프로그래밍 언어 안에 어떻게 포함되는지를 정의한다.
- 권한 부여(Authorization): SQL DDL은 관계와 뷰에 대한 접근 권한을 명시하는 명령어들을 포함한다.
SQL data definition
SQL DDL은 relation들에 대한 정보를 구체화한다. 이때 구체화되는 항목은 아래와 같다:
- 각 관계의 스키마(schema)
- 각 속성(attribute)에 연결된 값들의 자료형
- 무결성 제약 조건(The integrity constraints)
- 각 관계에 대해 유지되는 인덱스들의 집합
- 각 관계에 대한 보안 및 권한 부여 정보
- disk 상에서 각 관계의 physical storage structure
Basic types for SQL
SQL 표준은 여러 가지 내장 타입들을 지원하며 다음이 포함된다:
- char(n): 사용자가 지정한 길이 n을 갖는 고정 길이 문자열
- varchar(n): 사용자가 지정한 최대 길이 n을 갖는 가변 길이 문자열
- int: 정수
- smallint: 작은 정수
- numeric(p, d): 사용자가 지정한 정밀도를 갖는 고정 소수점 숫자
- 이 숫자는 p개의 숫자(부호 포함)로 구성되며, 그 중 d개는 소수점 오른쪽에 위치한다.
- 예를 들어 numeric(3,1)은 44.5는 정확히 저장할 수 있지만, 444.5나 0.32는 이 타입의 필드에 정확히 저장할 수 없다.
- real, double precision: 기계 의존적인 정밀도를 갖는 부동 소수점 및 배정밀도 부동 소수점 숫자
- float(n): 정밀도 n자리 이상을 갖는 부동 소수점 숫자
각 자료형은 널(null) 값이라 불리는 특수한 값을 포함할 수 있다. 널 값은 존재할 수는 있으나 알려지지 않았거나, 전혀 존재하지 않을 수도 있는 누락된 값을 나타낸다. 또한, char 데이터 타입은 고정 길이 문자열을 저장한다. 예를 들어, 속성 A의 타입이 char(10)이라고 하자. 만약 이 속성에 문자열 "Avi"를 저장하면, 그 문자열은 길이를 10자로 맞추기 위해 7개의 공백이 문자열 뒤에 덧붙여진다. 반면에 속성 B의 타입이 varchar(10)이고, "Avi"를 저장하면, 공백이 덧붙여지지 않는다. 두 개의 char 타입 값을 비교할 때, 길이가 다르다면 짧은 쪽에 자동으로 공백이 덧붙여져 비교 전에 길이가 동일해진다.[1]
Basic Schema Definition
SQL 관계(relation)는 create table 명령어를 사용하여 정의한다. create table 명령의 일반적인 형식은 다음과 같다:
create table r (
A1 D1,
A2 D2,
...,
An Dn,
⟨무결성 제약조건1⟩,
...,
⟨무결성 제약조건k⟩
);
위에서 r은 관계의 이름이고, 각 Ai는 관계 r의 스키마의 있는 속성의 이름, Di는 Ai에 대한 도메인(domain)에 해당한다. 또한 SQL 코드 끝의 세미 콜론은 create table 뿐 아니라 많은 다른 SQL 명령어에 대해서도 선택적으로 사용된다.
SQL은 또한 다양한 무결성 제약 조건(integrity constraints)을 지원한다. 이는 아래와 같다:
- primary key (Ap1, Ap2,...Apm): 이는 속성 Ap1, Ap2,...Apm이 해당 관계의 primary key임을 의미한다.
- primary key는 널 값을 가질 수 없고, unique해야 한다. 즉, 두 튜플이 기본 키 속성들에 대해 동일한 값을 가질 수 없다.
- foreign key (Af1, Af2,...,Afn): 이는 속성 Af1, Af2,...,Afn이 해당 관계의 foreign key임을 의미한다.
- 이때, 어느 튜플의 foreign key에 해당하는 값은 다른 관계 s의 primary key 속성들의 값에 존재해야한 한다.
- not null: 속성에 대한 not null 제약 조건은 그 속성에 널 값이 허용되지 않음을 명시한다.
이때 SQL은 무결성 제약 조건을 위반하는 데이터베이스의 갱신은 어떠한 경우에도 허용하지 않는다. 예를 들어, 아래 명령어는 데이터베이스 안에 instructor라는 관계를 생성한다:
create table instructor (
ID char(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2),
primary key (ID),
foreign key (dept_name) references department
);
Updates to tables
SQL에서 테이블을 업데이트 하기 위해서는 아래와 같은 명령어들을 사용한다.
Insert: r 테이블에 새로운 튜플(행)을 추가하는 명령이다.
insert into r values (A1, A2,..., An);
Delete: r 테이블에서 모든 튜플을 삭제한다.
delete from r
Drop table: r 테이블을 완전히 삭제하여 스키마는 물론 모든 데이터를 완전히 삭제한다.
drop table r
Alter: 테이블의 구조를 변경한다.
아래는 테이블 r에 새로운 속성 A를 추가하며, D는 해당 속성의 자료형을 의미한다. 또한 이미 존재하는 모든 튜플은 새로 추가된 속성 A에 null 값을 자동으로 가진다.
alter table r add A D
아래는 테이블 r에서 속성 A를 제거한다. 하지만 많은 데이터베이스는 에러의 위험성 때문에 이를 지원하지 않는다.
alter table r drop A
Basic Structure of SQL Queries
일반적인 SQL 질의는 다음 형식을 갖는다.
select A1, A2, ..., An
from r1, r2, ..., rm
where P
Ai는 속성(attribute)을 나타낸다. Ri는 관계(relation, 즉 테이블)을 나타낸다. P는 조건(predicate)을 나타낸다. 이때 SQL 질의의 결과는 하나의 관계(relation)이다. 즉, "테이블"을 반환한다.
The select Clause
select 절은 질의 결과로 원하는 속성들(attributes)을 나열한다. 이는 관계 대수(relational algebra)의 투영 연산(projection)에 해당한다. 예를 들어 모든 교수의 이름을 구하려면
select name
from instructor
위와 같이 작성한다. 이때 SQL에서 이름은 대소문자를 구분하지 않는다. 이때 테이블은 튜플의 집합이기 때문에 원칙적으로는 중복된 튜플이 있을 수 없으나, SQL은 질의의 결과에서 중복된 튜플을 허용한다. 이때 중ㅈ복을 제거하려면 select뒤에 distinct 키워드를 사용한다. 예를 들어 교수들의 학과 이름을 중복없이 구하려면 아래와 같이 쓴다.
select distinct dept_name
from instructor
중복을 제거하지 않으려면 all 키워드를 사용한다.
select all dept_name
from instructor
각주
- ↑ char 타입과 varchar 타입을 비교할 경우, 비교 전에 varchar 값에 공백이 덧붙여져 길이를 맞출 것이라고 기대할 수 있지만, 이 작업이 실제로 수행되는지는 데이터베이스 시스템에 따라 다르다. 따라서 varchar를 권장한다.