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
SELECT * FROM Student JOIN University ON University = Uname WHERE Age > 23 으로 나타낼 수도 있음.
Name Id Age Gpa University uid Tom 1 24 3.1 Hanyang 1 Amily 2 24 4.3 Incheon 2
위 예제에서 Student와 Class에 모두 Name Attribute가 존재하는데, 이렇게 되면 WHERE Name = ~ 등에서 Name이 어떤 테이블의 속성인지 구별할 수 없습니다.
이를 해소하기 위해서는 attribute 앞에 테이블의 이름을 추가적으로 적어주면 됩니다.
Ex) Student.Name, Class.Name
'데이터베이스' 카테고리의 다른 글
| 06. 데이터베이스 - Buffer Management (0) | 2022.08.10 |
|---|---|
| 05. 데이터베이스 - File Management, Index (0) | 2022.08.08 |
| 04. 데이터베이스 - Disk Space Management (0) | 2022.08.06 |
| 03. 데이터베이스 - DBMS Architecture (0) | 2022.08.03 |
| 01. 데이터베이스 Intro (0) | 2022.07.30 |