본문 바로가기

데이터베이스

02. 데이터베이스 - SQL

SQL (Structured Query Language)

SQL은 DBMS와 사용자들이 상호작용할 수 있도록 해주는 인터페이스입니다. 

즉, SQL은 데이터베이스의 데이터를 관리하기 위한 프로그래밍 언어입니다.

  • DML (Data Manipulation Language) : Insert, Delete, Update 와 같은 데이터를 조회하거나 조작하는 등의 명령어
  • DDL (Data Definition Language) : 관계형 스키마를 정의하는데 사용되는 명령어 (테이블 혹은 테이블 내 attribute 에 대한 생성/삭제/변경)
  • DCL (Data Control Language) : 데이터베이스에 접근할 수 있는 권한을 제어하는 명령어

Relation / Table : tuple들의 multiset

Multiset : 중복된 값을 허용하는 순서가 없는 리스트

Attribute (Column) : 테이블에서 열을 의미하는 것으로, entry의 최소구성요소

Tuple (Row) : 테이블에서 행을 의미하는 것으로, 테이블 내에 있는 하나의 entry (스키마에 정의된 attribute들을 포함)

Table의 Cardinality : Tuple의 개수

Table의 Arity : Attribute의 개수

Schema : 테이블의 이름, Attributes의 이름과 타입으로 이루어짐 (ex. Student(Name: string, Id: Int, Age: int, Gpa: float))

Primary Key : table에서 튜플을 구별할 수 있도록 하는 Attribute들의 최소한의 subset. 밑줄을 쳐서 나타냄 (ex. Student(Name: string, Id: Int, Age: int, Gpa: float))

Foreign Key : 다른 테이블의 primary key를 참조하는 Key (참조한 key의 이름을 꼭 사용할 필요는 없음)

NULL : 테이블의 어떤 attribute에 대한 값이 NULL 이라면, 그것은 해당 값을 알지 못한다는 뜻

 

SQL에는 CHAR, INT, LONG, FLOAT .. 등의 Atomic 데이터 타입이 있고, 테이블의 attribute들은 모두 atomic type이어야 합니다.

 

관계형 데이터베이스 용어

데이터베이스 : 테이블들의 집합

테이블 (Relation) : 스키마와 스키마를 만족하는 데이터들의 집합인 Instance로 이루어짐

Attribute (Column, Field) / Tuple (Row, Record)

 

SQL 쿼리

기본적인 형식 : SFW Query

SELECT attributes

FROM    tables

WHERE conditions

 

예제 (Student 테이블)

Name Id Age Gpa
Tom 1 24 3.1
Amily 2 24 4.3
Terry 3 21 3.6
Selection 연산
특정 조건에 따라 tuple들을 필터링하는 연산
SELECT * FROM Student WHERE Age = 24
Name Id Age Gpa
Tom 1 24 3.1
Amily 2 24 4.3
Projection 연산
필요한 attribute들만 필터링된 튜플들로 이루어진 테이블을 생성하는 연산
SELECT Name, Age FROM Student WHERE Age = 24
Name Age
Tom 24
Amily 24

SQL 명령어는 대소문자 구별이 없고, (WHERE == Where)

테이블 내의 값들은 대소문자를 구별합니다. (Tom != tom)

 

LIKE
string LIKE pattern : 패턴에 맞는 문자열을 필터링
패턴은 다음과 같은 심볼로 이루어진다.
1. % : 임의의 문자열
2. _ : 하나의 문자

SELECT * FROM Students WHERE Name LIKE 'T%'
DISTINCT
중복된 값을 제거
SELECT DISTINCT Age From Student
Age
24
21
ORDER BY
특정 기준에 의해 결과 튜플들을 정렬
기준을 여러개 설정하면, 앞선 기준이 같은 경우 뒤의 기준으로 정렬
기본적으로 오름차순으로 정렬되고, DESC 키워드를 사용하여 내림차순으로 정렬 가능
SELECT * FROM Student ORDER BY Gpa, Age
Name Id Age Gpa
Tom 1 24 3.1
Terry 3 21 3.6
Amily 2 24 4.3

 

여러 개의 테이블에서의 SQL 쿼리

Student 테이블

Name Id Age Gpa University
Tom 1 24 3.1 Hanyang
Amily 2 24 4.3 Incheon
Terry 3 21 3.6 Hanyang

Enrolled 테이블

sid cid
2 2
2 1

Class 테이블

Name cid
Database 1
Network 2
Java 3

University 테이블

Uname uid
Hanyang 1
Incheon 2
Foreign Key Constraints
위 예시에서 Enrolled 테이블의 sid와 cid는 Student의 id와 Class의 id를 참조한 Foreign Key이다.
CREATE TABLE Enrolled (
    sid int,
    cid int,
    PRIMARY KEY (sid, cid),
    FOREIGN KEY (sid) REFERENCES Student.id,
    FOREIGN KEY (cid) REFERENCES Class.id
)

Foreign Key는 constraint이기 때문에, Student id나 Class id에 없는 값으로는 튜플을 만들 수 없다.
Join
두개 이상의 테이블에서 연관된 Attribute를 기반으로 여러 테이블들을 합치는 것
조건에 맞는 튜플들의 모든 조합들의 테이블을 결과테이블로 리턴한다.
SELECT * FROM Student, University WHERE University = Uname AND Age > 23
Name Id Age Gpa University uid
Tom 1 24 3.1 Hanyang 1
Amily 2 24 4.3 Incheon 2
SELECT * FROM Student JOIN University ON University = Uname WHERE Age > 23 으로 나타낼 수도 있음.

위 예제에서 Student와 Class에 모두 Name Attribute가 존재하는데, 이렇게 되면 WHERE Name = ~ 등에서 Name이 어떤 테이블의 속성인지 구별할 수 없습니다.

이를 해소하기 위해서는 attribute 앞에 테이블의 이름을 추가적으로 적어주면 됩니다.

Ex) Student.Name, Class.Name