익명 사용자
로그인하지 않음
계정 만들기
로그인
youngwiki
검색
SQL 문서 원본 보기
youngwiki
이름공간
문서
토론
더 보기
더 보기
문서 행위
읽기
원본 보기
역사
←
SQL
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
상위 문서: [[데이터베이스 시스템]] ==개요== '''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 타입 값을 비교할 때, 길이가 다르다면 짧은 쪽에 자동으로 공백이 덧붙여져 비교 전에 길이가 동일해진다.<ref>char 타입과 varchar 타입을 비교할 경우, 비교 전에 varchar 값에 공백이 덧붙여져 길이를 맞출 것이라고 기대할 수 있지만, 이 작업이 실제로 수행되는지는 데이터베이스 시스템에 따라 다르다. 따라서 varchar를 권장한다.</ref> ===Basic Schema Definition=== SQL 관계(relation)는 create table 명령어를 사용하여 정의한다. create table 명령의 일반적인 형식은 다음과 같다: <syntaxhighlight lang="sql"> create table r ( A1 D1, A2 D2, ..., An Dn, ⟨무결성 제약조건1⟩, ..., ⟨무결성 제약조건k⟩ ); </syntaxhighlight> 위에서 r은 관계의 이름이고, 각 Ai는 관계 r의 스키마의 있는 속성의 이름, Di는 Ai에 대한 도메인([[Relational Model#Relational Schema와 Instance|domain]])에 해당한다. 또한 SQL 코드 끝의 세미 콜론은 create table 뿐 아니라 많은 다른 SQL 명령어에 대해서도 선택적으로 사용된다. <br>SQL은 또한 다양한 무결성 제약 조건(integrity constraints)을 지원한다. 이는 아래와 같다: * '''[[Relational Model#Keys|primary key]] (Ap1, Ap2,...Apm)''': 이는 속성 Ap1, Ap2,...Apm이 해당 관계의 primary key임을 의미한다. ** primary key는 널 값을 가질 수 없고, unique해야 한다. 즉, 두 튜플이 기본 키 속성들에 대해 동일한 값을 가질 수 없다. * '''[[Relational Model#Keys|foreign key]] (Af1, Af2,...,Afn)''': 이는 속성 Af1, Af2,...,Afn이 해당 관계의 foreign key임을 의미한다. ** 이때, 어느 튜플의 foreign key에 해당하는 값은 다른 관계 s의 primary key 속성들의 값에 존재해야한 한다. * '''not null''': 속성에 대한 not null 제약 조건은 그 속성에 널 값이 허용되지 않음을 명시한다. 이때 SQL은 무결성 제약 조건을 위반하는 데이터베이스의 갱신은 어떠한 경우에도 허용하지 않는다. 예를 들어, 아래 명령어는 데이터베이스 안에 instructor라는 관계를 생성한다: <syntaxhighlight lang="sql"> 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 ); </syntaxhighlight> ===Updates to tables=== SQL에서 테이블을 업데이트 하기 위해서는 아래와 같은 명령어들을 사용한다.<br> '''Insert''': r 테이블에 새로운 튜플(행)을 추가하는 명령이다. <syntaxhighlight lang="sql"> insert into r values (A1, A2,..., An); </syntaxhighlight> '''Delete''': r 테이블에서 모든 튜플을 삭제한다. <syntaxhighlight lang="sql"> delete from r </syntaxhighlight> '''Drop table''': r 테이블을 완전히 삭제하여 스키마는 물론 모든 데이터를 완전히 삭제한다. <syntaxhighlight lang="sql"> drop table r </syntaxhighlight> '''Alter''': 테이블의 구조를 변경한다.<br> 아래는 테이블 r에 새로운 속성 A를 추가하며, D는 해당 속성의 자료형을 의미한다. 또한 이미 존재하는 모든 튜플은 새로 추가된 속성 A에 null 값을 자동으로 가진다. <syntaxhighlight lang="sql"> alter table r add A D </syntaxhighlight> 아래는 테이블 r에서 속성 A를 제거한다. 하지만 많은 데이터베이스는 에러의 위험성 때문에 이를 지원하지 않는다. <syntaxhighlight lang="sql"> alter table r drop A </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 문법 예제이다. <syntaxhighlight lang="sql"> select distinct dept_name --중복을 제거하려면 select뒤에 distinct 키워드를 사용한다. from instructor </syntaxhighlight> <syntaxhighlight lang="sql"> select all dept_name --중복을 제거하지 않으려면 all 키워드를 사용한다. from instructor </syntaxhighlight> <syntaxhighlight lang="sql"> --instructor table을 그대로 반환한다. select * --"*"은 모든 속성을 의미한다. from instructor </syntaxhighlight> <syntaxhighlight lang="sql"> select '437' --해당 리터럴 값을 출력한다. select '437' as colname --컬럼의 이름을 colname으로 설정한다. </syntaxhighlight> 위 코드의 실행 결과는 아래 테이블과 같다. {| class="wikitable" !437 |- |437 |} {| class="wikitable" !colname |- |437 |} <syntaxhighlight lang="sql"> --select 절에는 산술 연산이 가능하다. select ID, name, salary/12 as monthly_salary --salary를 12로 나눈 결과가 출력, 속성의 별칭을 따로 설정함 from instructor </syntaxhighlight> ===The where Clause=== '''where''' 절은 결과가 만족해야 하는 조건(predicate)을 지정하며, relation algebra의 선택(selection) 연산에 해당한다. 예를 들어서 컴퓨터 공학과 교수의 이름을 구하기 위해서는 아래와 같은 코드를 사용한다. <syntaxhighlight lang="sql"> select name from instructor where dept_name = 'Comp. Sci.' </syntaxhighlight> 위에서 볼 수 있들이 비교 연산자 <, <=, >, >=, =, <>를 사용할 수 있으며, 논리 연산자 and, or, not 또한 사용 가능하다. 예를 들어, 컴퓨터공학 교수 중 연봉이 70000 초과인 사람은 아래와 같은 코드를 사용한다. <syntaxhighlight lang="sql"> select name from instructor where dept_name = 'Comp. Sci.' and salary > 70000 </syntaxhighlight> ==The from Clause== '''From''' 절은 질의에 사용될 관계들(테이블들)을 나열하며, relation algebra의 cartesian product 연산에 해당한다. 예를 들어 모든 instructor와 teaches의 조합이 생성하기 위해서는 아래와 같은 code를 사용한다. <syntaxhighlight lang="sql"> --사실상 Cartesian product 연산 select * from instructor, teaches </syntaxhighlight> 이때 두 table 간에 공통되는 속성(예: ID)이 존재한다면, 결과로 나오는 테이블에서는 instructor.ID, teaches.ID처럼 접두사로 테이블명을 붙여 구분한다. 이때 단독으로 cartesian product를 사용하지는 않지만, where 조건과 함께 join 연산의 기초로 사용됨 ==각주== [[분류:데이터베이스 시스템]]
SQL
문서로 돌아갑니다.
둘러보기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
위키 도구
위키 도구
특수 문서 목록
문서 도구
문서 도구
사용자 문서 도구
더 보기
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
문서 기록