SQL: 두 판 사이의 차이

youngwiki
 
(같은 사용자의 중간 판 87개는 보이지 않습니다)
2번째 줄: 2번째 줄:


==개요==
==개요==
'''SQL'''(Stuctured Query Language)은 가장 널리 자용되는 데이터베이스 질의(query) 언어이다. SQL은 SQL query language라고 많이 불리지만, 단순히 데이터베이스의 질의를 하는 것 이상의 일, 데이터의 구조를 정의하고, 데이터베이스의 데이터를 수정하며, 보안 제약 조건을 명시할 수 있다.  
'''SQL(Stuctured Query Language)'''은 가장 널리 자용되는 데이터베이스 질의(query) 언어이다. SQL은 SQL query language라고 많이 불리지만, 단순히 데이터베이스의 질의를 하는 것 이상의 일, 데이터의 구조를 정의하고, 데이터베이스의 데이터를 수정하며, 보안 제약 조건을 명시할 수 있다.  


==SQL의 구성==
===SQL의 구성===
SQL은 아래와 같은 여러 부분으로 구성된다:
SQL은 아래와 같은 여러 부분으로 구성된다:
* DDL(Data Definition Language): SQL DDL은 관계 스키마를 정의하고, 관계를 삭제하며, 관계 스키마를 수정하는 명령어들을 제공한다.
* DDL(Data Definition Language): SQL DDL은 관계 스키마를 정의하고, 관계를 삭제하며, 관계 스키마를 수정하는 명령어들을 제공한다.
14번째 줄: 14번째 줄:
* 권한 부여(Authorization): SQL DDL은 관계와 뷰에 대한 접근 권한을 명시하는 명령어들을 포함한다.
* 권한 부여(Authorization): SQL DDL은 관계와 뷰에 대한 접근 권한을 명시하는 명령어들을 포함한다.


==SQL data definition==
==[[SQL data definition]]==
SQL DDL은 relation들에 대한 정보를 구체화한다. 이때 구체화되는 항목은 아래와 같다:
자세한 내용은 [[SQL data definition]] 문서를 참조하십시오.
* 각 관계의 스키마(schema)
* 각 속성(attribute)에 연결된 값들의 자료형
* 무결성 제약 조건(The integrity constraints)
* 각 관계에 대해 유지되는 인덱스들의 집합
* 각 관계에 대한 보안 및 권한 부여 정보
* disk 상에서 각 관계의 physical storage structure


===Basic types for SQL===
==[[Structure of SQL Queries]]==
SQL 표준은 여러 가지 내장 타입들을 지원하며 다음이 포함된다:
자세한 내용은 [[Structure of SQL Queries]] 문서를 참조하십시오.
* 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 타입 값을 비교할 때, 길이가 다르다면 짧은 쪽에 자동으로 공백이 덧붙여져 비교 전에 길이가 동일해진다.<ref>char 타입과 varchar 타입을 비교할 경우, 비교 전에 varchar 값에 공백이 덧붙여져 길이를 맞출 것이라고 기대할 수 있지만, 이 작업이 실제로 수행되는지는 데이터베이스 시스템에 따라 다르다. 따라서 varchar를 권장한다.</ref>


===Basic Schema Definition===
==[[Additional Operation]]==
자세한 내용은 [[Additional Operation]] 문서를 참조하십시오.
 
==Set Operation==
SQL은 '''union''', '''intersect''', 그리고 '''except''' 연산자는 릴레이션에 대해 동작하며, 수학적인 집합 연산인 ∪(합집합), ∩(교집합), −(차집합)과 대응된다. 이 세 연산자는 아래와 같이 사용된다.
<syntaxhighlight lang="sql">
-- Fall 2017 또는 Spring 2018에 운영되었던 course를 찾기
(select course_id from section where sem = 'Fall' and year = 2017)
union
(select course_id from section where sem = 'Spring' and year = 2018)
</syntaxhighlight>
<syntaxhighlight lang="sql">
-- Fall 2017와 Spring 2018에 모두 운영되었던 course를 찾기
(select course_id from section where sem = 'Fall' and year = 2017)
intersect
(select course_id from section where sem = 'Spring' and year = 2018)
</syntaxhighlight>
<syntaxhighlight lang="sql">
-- Fall 2017에 운영되었지만 Spring 2018에는 운영되지 않았던 course를 찾기
(select course_id from section where sem = 'Fall' and year = 2017)
except
(select course_id from section where sem = 'Spring' and year = 2018)
</syntaxhighlight>
이때  union, intersect, 그리고 except 연산자는 모두 그 결과 테이블에서 중복되는 튜플을 허용하지 않는다. 중복되는 튜플을 허용하기 위해서는, union all, intersect all, 그리고 except all 연산자를 사용해야 한다.
 
==Null Values==
'''Null''' 값은 존재하지 않거나 알려지지 않은 값을 나타내는데 사용된다. '''is null''' 연산자는 null 값을 가지는 튜플들을 찾는데 사용된다.<ref>반대의 연산을 실행하는 is not null 또한 존재한다.</ref> 이는 아래와 같다.
<syntaxhighlight lang="sql">
select name
from instructor where salary is null
</syntaxhighlight>
이때 null 값은 산술 연산, 비교 연산, 집합 연산을 포함한 릴레이션 연산들에서 특별한 문제를 유발한다. 산술 표현식(+, −, ∗, ∕ 등을 포함하는 표현식)의 결과는, 입력값 중 하나라도 null이면 결과도 null이 된다.
 
===Comparison with Null===
null이 포함된 비교는 더 까다로운 문제를 만든다. 예를 들어, 비교식 "1 < null" 을 생각해 보자. 이 표현식이 true라고 말하는 것은 옳지 않다. 왜냐하면 null 값이 무엇을 의미하는지 모르기 때문이다. 그렇다고 해서 이 표현식이 false라고 단정짓는 것도 옳지 않다. 만약 그렇게 한다면 "not (1 < null)"은 true가 되어버리는데, 이것도 말이 되지 않는다.<br>
그렇기 때문에 SQL은 널이 포함된 모든 비교 연산의 결과를 “'''unknown'''”으로 처리한다.<ref>단, 이 절의 뒤에서 설명할 is null, is not null 조건은 예외이다.</ref> 이를 구현하기 위해서 SQL은 true, false 외에 '''세 번째 논리 값'''인 unknown이 을 정의하였다.<ref>SQL은 비교 결과가 true 또는 false가 아니라 unknown인지를 테스트하도록, is unknown과 is not unknown 절을 제공한다.</ref>
 
===Unknown with Logical Operator===
where 절의 조건(predicate)은 and, or, not 등의 boolean operation을 포함할 수 있기 때문에, 이들 연산도 unknown 값을 처리할 수 있도록 확장되며, 다음과 같이 정의된다.
* and 연산:
** true and unknown → unknown
** false and unknown → false
** unknown and unknown → unknown
* or 연산:
** true or unknown → true
** false or unknown → unknown
** unknown or unknown → unknown
* not 연산:
** not unknown → unknown
where 절의 계산된 조건의 결과값이 false이거나 unknown으로 평가되는 튜플은 select 절에서 선택되지 않는다.
 
==[[Aggregate Functions]]==
자세한 내용은 [[Aggregate Functions]] 문서를 참조하십시오.
 
==[[Nested Subquery]]==
자세한 내용은 [[Nested Subquery]] 문서를 참조하십시오.
 
==[[Modification of the Database]]==
자세한 내용은 [[Modification of the Database]] 문서를 참조하십시오.
 
==[[Join Expression]]==
자세한 내용은 [[Join Expression]] 문서를 참조하십시오.
 
==[[View]]==
자세한 내용은 [[View]] 문서를 참조하십시오.
 
==[[Transaction]]==
자세한 내용은 [[Transaction]] 문서를 참조하십시오.
 
==[[Integrity Constraints]]==
자세한 내용은 [[Integrity Constraints]] 문서를 참조하십시오.
 
==[[SQL Data Types and Schemas]]==
자세한 내용은 [[SQL Data Types and Schemas]] 문서를 참조하십시오.
 
==Index Definition in SQL==
많은 질의들은 파일 내의 레코드들 중 일부분만을 참조한다. 예를 들어, 아래와 같은 질의들은:
* “물리학과(Physics) 소속의 모든 교수들을 찾기”
* “ID가 22201인 교수의 salary 값을 찾기”와
instructor 테이블 전체가 아니라 그 중 일부만 참조한다. 이때 시스템이 모든 레코드를 읽고 해당 질의에 대해서 판단하는 것은 비효율적이다. 릴레이션의 어떤 '''속성에 대한 인덱스(index) 는 특정 속성 값을 가진 튜플들을 릴레이션 전체를 탐색하지 않고도 효율적으로 찾을 수 있도록 하는 자료 구조(data structure)''' 이다. 예를 들어 instructor 릴레이션의 dept_name 속성에 인덱스를 생성하면, 데이터베이스 시스템은 "Physics"나 "Music"과 같은 dept_name 값을 가진 레코드를 instructor 릴레이션 전체를 읽지 않고도 직접적으로 찾아낼 수 있다.
 
===Index Creation===
인덱스를 만들기 위해서는 <code>create index</code> 명령어를 사용한다. 형식은 다음과 같다:
<syntaxhighlight lang="sql">
create index <index-name> on <relation-name> (<attribute-list>);
</syntaxhighlight>
<attribute-list>는 인덱스를 만들기 위한 검색 키(search key) 를 구성하는 릴레이션의 속성들의 리스트이다. 예를 들어, instructor 릴레이션에서 dept_name 속성에 대해 dept_index라는 인덱스를 만들려면 다음과 같이 작성한다:
<syntaxhighlight lang="sql">
create index dept_index on instructor (dept_name);
</syntaxhighlight>
이제 사용자가 dept_name = 'Music'인 튜플을 찾는 SQL 질의를 제출하면, SQL 쿼리 처리기(query processor)는 위에서 정의한 dept_index 인덱스를 자동으로 사용하여 전체 릴레이션을 읽지 않고도 해당 튜플을 찾는다.
 
==[[Authorization]]==
자세한 내용은 [[Authorization]] 문서를 참조하십시오.


==각주==
==각주==
[[분류:데이터베이스 시스템]]
[[분류:데이터베이스 시스템]]

2025년 4월 20일 (일) 06:32 기준 최신판

상위 문서: 데이터베이스 시스템

개요

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 data definition 문서를 참조하십시오.

Structure of SQL Queries

자세한 내용은 Structure of SQL Queries 문서를 참조하십시오.

Additional Operation

자세한 내용은 Additional Operation 문서를 참조하십시오.

Set Operation

SQL은 union, intersect, 그리고 except 연산자는 릴레이션에 대해 동작하며, 수학적인 집합 연산인 ∪(합집합), ∩(교집합), −(차집합)과 대응된다. 이 세 연산자는 아래와 같이 사용된다.

-- Fall 2017 또는 Spring 2018에 운영되었던 course를 찾기
(select course_id from section where sem = 'Fall' and year = 2017) 
union
(select course_id from section where sem = 'Spring' and year = 2018)
-- Fall 2017와 Spring 2018에 모두 운영되었던 course를 찾기
(select course_id from section where sem = 'Fall' and year = 2017) 
intersect
(select course_id from section where sem = 'Spring' and year = 2018)
-- Fall 2017에 운영되었지만 Spring 2018에는 운영되지 않았던 course를 찾기
(select course_id from section where sem = 'Fall' and year = 2017) 
except
(select course_id from section where sem = 'Spring' and year = 2018)

이때 union, intersect, 그리고 except 연산자는 모두 그 결과 테이블에서 중복되는 튜플을 허용하지 않는다. 중복되는 튜플을 허용하기 위해서는, union all, intersect all, 그리고 except all 연산자를 사용해야 한다.

Null Values

Null 값은 존재하지 않거나 알려지지 않은 값을 나타내는데 사용된다. is null 연산자는 null 값을 가지는 튜플들을 찾는데 사용된다.[1] 이는 아래와 같다.

select name
from instructor where salary is null

이때 null 값은 산술 연산, 비교 연산, 집합 연산을 포함한 릴레이션 연산들에서 특별한 문제를 유발한다. 산술 표현식(+, −, ∗, ∕ 등을 포함하는 표현식)의 결과는, 입력값 중 하나라도 null이면 결과도 null이 된다.

Comparison with Null

null이 포함된 비교는 더 까다로운 문제를 만든다. 예를 들어, 비교식 "1 < null" 을 생각해 보자. 이 표현식이 true라고 말하는 것은 옳지 않다. 왜냐하면 null 값이 무엇을 의미하는지 모르기 때문이다. 그렇다고 해서 이 표현식이 false라고 단정짓는 것도 옳지 않다. 만약 그렇게 한다면 "not (1 < null)"은 true가 되어버리는데, 이것도 말이 되지 않는다.
그렇기 때문에 SQL은 널이 포함된 모든 비교 연산의 결과를 “unknown”으로 처리한다.[2] 이를 구현하기 위해서 SQL은 true, false 외에 세 번째 논리 값인 unknown이 을 정의하였다.[3]

Unknown with Logical Operator

where 절의 조건(predicate)은 and, or, not 등의 boolean operation을 포함할 수 있기 때문에, 이들 연산도 unknown 값을 처리할 수 있도록 확장되며, 다음과 같이 정의된다.

  • and 연산:
    • true and unknown → unknown
    • false and unknown → false
    • unknown and unknown → unknown
  • or 연산:
    • true or unknown → true
    • false or unknown → unknown
    • unknown or unknown → unknown
  • not 연산:
    • not unknown → unknown

where 절의 계산된 조건의 결과값이 false이거나 unknown으로 평가되는 튜플은 select 절에서 선택되지 않는다.

Aggregate Functions

자세한 내용은 Aggregate Functions 문서를 참조하십시오.

Nested Subquery

자세한 내용은 Nested Subquery 문서를 참조하십시오.

Modification of the Database

자세한 내용은 Modification of the Database 문서를 참조하십시오.

Join Expression

자세한 내용은 Join Expression 문서를 참조하십시오.

View

자세한 내용은 View 문서를 참조하십시오.

Transaction

자세한 내용은 Transaction 문서를 참조하십시오.

Integrity Constraints

자세한 내용은 Integrity Constraints 문서를 참조하십시오.

SQL Data Types and Schemas

자세한 내용은 SQL Data Types and Schemas 문서를 참조하십시오.

Index Definition in SQL

많은 질의들은 파일 내의 레코드들 중 일부분만을 참조한다. 예를 들어, 아래와 같은 질의들은:

  • “물리학과(Physics) 소속의 모든 교수들을 찾기”
  • “ID가 22201인 교수의 salary 값을 찾기”와

instructor 테이블 전체가 아니라 그 중 일부만 참조한다. 이때 시스템이 모든 레코드를 읽고 해당 질의에 대해서 판단하는 것은 비효율적이다. 릴레이션의 어떤 속성에 대한 인덱스(index) 는 특정 속성 값을 가진 튜플들을 릴레이션 전체를 탐색하지 않고도 효율적으로 찾을 수 있도록 하는 자료 구조(data structure) 이다. 예를 들어 instructor 릴레이션의 dept_name 속성에 인덱스를 생성하면, 데이터베이스 시스템은 "Physics"나 "Music"과 같은 dept_name 값을 가진 레코드를 instructor 릴레이션 전체를 읽지 않고도 직접적으로 찾아낼 수 있다.

Index Creation

인덱스를 만들기 위해서는 create index 명령어를 사용한다. 형식은 다음과 같다:

create index <index-name> on <relation-name> (<attribute-list>);

<attribute-list>는 인덱스를 만들기 위한 검색 키(search key) 를 구성하는 릴레이션의 속성들의 리스트이다. 예를 들어, instructor 릴레이션에서 dept_name 속성에 대해 dept_index라는 인덱스를 만들려면 다음과 같이 작성한다:

create index dept_index on instructor (dept_name);

이제 사용자가 dept_name = 'Music'인 튜플을 찾는 SQL 질의를 제출하면, SQL 쿼리 처리기(query processor)는 위에서 정의한 dept_index 인덱스를 자동으로 사용하여 전체 릴레이션을 읽지 않고도 해당 튜플을 찾는다.

Authorization

자세한 내용은 Authorization 문서를 참조하십시오.

각주

  1. 반대의 연산을 실행하는 is not null 또한 존재한다.
  2. 단, 이 절의 뒤에서 설명할 is null, is not null 조건은 예외이다.
  3. SQL은 비교 결과가 true 또는 false가 아니라 unknown인지를 테스트하도록, is unknown과 is not unknown 절을 제공한다.