[DB] 관계형 데이터베이스와 SQL 명령어

somin·2021년 8월 25일
0

Database

목록 보기
1/8

Database

1. 데이터 저장 방법

  • In-memory : 서버 프로그램이 실행중일 때 변수에 값을 할당하여 저장하는 방식으로, 서버 프로그램을 재실행하거나 종료하면 변수에 저장한 값이 휘발됨
  • File I/O : 파일을 읽는 방식으로 작동하는 방식으로, 원하는 데이터만을 가져올 수 없고 항상 모든 데이터를 가져온 후 서버에서 필터링
  • Database : 필터링 외에도 File I/O로 구현이 힘든, 데이터 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버

Database에서의 필터링

SELECT * // *(모든 열)을 선택해라
FROM employee // employee에서
WHERE gender = 'M' // gender = 'M'인 데이터들을
  • 위와 같은 query문을 Database에 보내면 해당 데이터들을 응답으로 보내줌

2. Database의 필요성

  • 기존 데이터 저장 방법들의 단점 때문

File-based System의 단점

  • Data redundancy(데이터 중복)
  • Data Iconsistency(데이터 불일치)
  • Difficult data access
  • Security problems(unauthorized access)
  • Difficult concurrent access(동시 접근 어려움)
    *파일이 열려있으면 locked

3. 데이터베이스 트랜젝션(Transaction)

1) 개념

  • 데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위, 즉 여러 개의 작업을 하나로 묶은 실행 유닛을 의미
  • 각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료
  • 데이터베이스 트랜잭션은 ACID라는 특성을 지님

2) 특성 : ACID

  • ACID : 데이터베이스 트랜젝션이 발생할 때, 그 안정성을 보장할 수 있는 성질

Atomicity(원자성)

: 하나의 트랜젝션 내에서는 모든 연산이 성공하거나 모두 실패해야 함

Consistency(일관성)

: 하나의 트랜젝션 전후에 데이터베이스의 일관된 상태가 유지되어야 함

Isolation(격리성, 고립성)

: 각각의 트랜젝션은 독립적이기에 서로의 연산을 확인받거나 영향을 줄 수 없음

Durability(지속성)

: 하나의 성공된 트랜젝션에 대한 로그가 기록되고 영구적으로 남음

SQL(Structured Query Language)

1. 개념

SQL 기반 관계형 데이터베이스

: 데이터가 구조화된(structured) 테이블을 사용하는 데이터베이스
: 데이터의 구조가 고정되어 있어 SQL을 사용할 수 있음
: MySQL, Oracle, SQLite, PostgreSQL

NoSQL 기반 비관계형 데이터베이스

: SQL을 사용할 수 있는 데이터베이스와 달리 데이터의 구조가 고정되어 있지 않음
: 테이블을 사용하지 않고 데이터를 다른 형태로 저장
: MongoDB와 같은 문서 지향 데이터베이스

  • 구조화된 Query 언어로, query란 저장되어 있는 정보를 필터하기 위한 질문을 의미(검색어 등의 질의문)
  • 데이터베이스 용 프로그래밍 언어로 데이터베이스에 query를 보내 원하는 데이터를 가져오거나 삽입할 수 있음
  • 데이터베이스 종류를 SQL이라는 언어 단위로 분류할 정도로 중요

2. 데이터베이스 관련 명령어

1) 데이터베이스 생성

CREATE DATABASE 데이터베이스_이름;

2) 데이터베이스 사용

USE 데이터베이스_이름;
  • 데이터베이스를 이용해 테이블을 만들거나 수정, 삭제하는 등의 작업을 하기 전에 USE를 이용해 사용할 데이터베이스를 선택해야 함

3) 테이블 생성

// 아래 표에 적힌 필드 조건에 따라 작성
CREATE TABLE user (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(255),
  email varchar(255)
);
  • 테이블은 필드(표의 열)와 함께 만들어야 함
  • SQL 콘솔에서 Enter 키를 이용해 여러 줄의 코드를 입력할 수 있음
  • PRIMARY KEY AUTO_INCREMENT : 값을 default로 입력하면 자동으로 증가된 기본 키가 입력됨

4) 테이블 정보 확인

DESCRIBE user;

// 위 명령어 수행시 출력되는 테이블
mysql> describe user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| email | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

3. 자주 사용하는 SQL 명령어

  • MySQL에서 자주 사용하는 명령어

예시

: 다음은 Brazil에서 온 고객을 도시별로 묶은 뒤에, 각 도시 수에 따라 내름차순 정렬한 후 CustomerId에 따라 오름차순으로 정렬한 3개의 결과만 요청

SELECT c.CustomerId, c.FirstName, count(c.City) as 'City Count'
FROM customers AS c
JOIN employees AS e ON c.SupportRepId = e.EmployeeId
WHERE c.Country = 'Brazil'
GROUP BY c.City
ORDER BY 3 DESC, c.CustomerId ASC
LIMIT 3

1) SELECT

SELECT 'hello world' // 일반 문자열

SELECT 2 // 숫자

SELECT 15 + 3 // 간단한 연산
  • 데이터셋에 포함될 특성을 특정

2) FROM

// 특정 특성을 테이블에서 사용
SELECT 특성_1
FROM 테이블_이름

// 여러 특성을 테이블에서 사용
SELECT 특성_1, 특성_2
FROM 테이블_이름

// 테이블의 모든 특성을 선택
SELECT *
FROM 테이블_이름
  • 테이블과 관련한 작업을 할 경우 반드시 입력
  • FROM 뒤에는 결과를 도출해낼 데이터베이스 테이블을 명시

3) WHERE

// 특정 값과 동일한 데이터 찾기
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값"

// 특정 값을 제외한 값 찾기
WHERE 특성_2 <> "특정 값"

// 특정 값보다 작거나 같은 값 찾기
WHERE 특성_1 <= "특정 값"

// 문자열에서 특정 값과 비슷한 값들을 필터할 때에는 'LIKE'와 '\%' 혹은 '\*' 사용
WHERE 특성_2 LIKE "특정 문자열%" // 특정 문자열로 시작
WHERE 특성_2 LIKE "%특정 문자열" // 특정 문자열로 끝
WHERE 특성_2 LIKE "%특정 문자열%" // 특정 문자열로 포함

// 리스트의 값들과 일치하는 데이터를 필터할 때에는 'IN' 사용
WHERE 특성_2 IN ("특정값_1", "특정값_2")

// 값이 없는 경우, 'NULL' 을 찾을 때에는 'IS'와 같이 사용
// 값이 없는 경우를 제외할 때에는 'NOT' 을 추가해 이용
WHERE 특성_1 IS NULL
WHERE 특성_1 IS NOT NULL
  • 필터 역할을 하는 쿼리문(선택적 사용)

4) ORDER BY

// 기본 정렬은 오름차순
SELECT *
FROM 테이블_이름
ORDER BY 특성_1

// 내림차순으로 정렬
ORDER BY 특성_1 DESC
  • 돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정(선택적 사용)

5) LIMIT

// 데이터 결과를 200개만 출력
SELECT *
FROM 테이블_이름
LIMIT 200
  • 결과로 출력할 데이터의 개수를 정할 수 있음(선택적 사용)
  • 쿼리문에서 사용할 때에는 가장 마지막에 추가

6) SELECT DISTINCT

// 특성_1을 기준으로 유니크한 값들만 선택
SELECT DISTINCT 특성_1
FROM 테이블_이름

// 특성_1, 특성_2, 특성_3의 유니크한 '조합' 값들을 선택
SELECT
  DISTINCT
    특성_1
    ,특성_2
    ,특성_3
FROM 테이블_이름
  • 유니크한 값을 받고 싶을 때 사용

7) JOIN

  • 다양한 선택지 존재

(1) INNER JOIN

// 둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결
SELECT *
FROM 테이블_1
INNER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B
  • INNER JOIN이나 JOIN으로 실행

(2) OUTER JOIN

// 'LEFT OUTER JOIN'으로 LEFT INCLUSIVE을 실행
SELECT *
FROM 테이블_1
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

// 'RIGHT OUTER JOIN'으로 RIGHT INCLUSIVE을 실행
SELECT *
FROM 테이블_1
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

8) INSERT INTO

INSERT INTO 테이블 (필드_1, 필드_2, 필드_3, 필드_4)
VALUES (데이터_1, 데이터_2, 데이터_3, 데이터_4);
  • 새로운 레코드를 추가하는 명령어
  • 테이블의 필드와 VALUES의 데이터의 수가 일치하면 (필드_1, 필드_2, 필드_3, 필드_4) 생략 가능
  • 원하는 필드만 지정시 원하는 값만 VALUES에 지정할 수 있음
    *지정하지 않는 필드의 데이터는 default 값이 할당

4. SQL 실습

1) SQL Quiz

2) SQL Exercises

3) MySQL Practice

  • TCP School
    *다양한 명령어 및 내장함수
profile
✏️

0개의 댓글