[SQL] SQL

Minit88·2023년 3월 28일

SQL

목록 보기
2/4
post-thumbnail

Lab_01 : 데이터베이스의 필요성

1.In-Memory

JavaScript에서 데이터를 다룰 때에는 프로그램이 실행될 때만 존재하는 데이터가 있다. 변수를 마들어 저장한 경우 프로그램이 종료될 때 해당 프로그램이 사용하던 데이터도 사라진다.
즉, 에기치 못한 상황으로부터 데이터를 보호할 수 없고, 프로그램이 종료된 상태라면 데이터를 원하는 시간에 받아올 수 없으며, 데이터의 수명이 프로그램의 수명에 의존하게 된다.

2.File I/O

파일을 읽는 방식으로 작동하는 형태를 칭한다. 엑셀이나 csv 같은 파일의 형태는 In Memory에서 보다 데이터 저장이 적절해 보이지만 한계가 존재한다.

  • 데이터가 필요할 때마다 전체 파일을 매번 읽어야한다.
  • 파일이 손상되거나 여러 개의 파일들을 동시에 다뤄야 하거나 하는 등 복잡하고 데이터량이 많아질수록 데이터를 불러들이는 작업이 힘들어짐

관계형 데이터베이스에는 하나의 CSV파일이나 엑셀 시트를 한 개의 테이블로 저장이 가능해져 위와 같은 단점을 해결 가능.

Lab_02 : SQL 소개

하나의 언어인 Structured Query Language(SQL)은 데이터베이스 언어로, 주로 관계형 데이터베이스에서 사용한다.

SQL은 구조화된 쿼리 언어이다.

쿼리란?

쿼리는 '질의문' 이라는 뜻을 가지고 있다. 예를 들면 검색을 할 때 입력하는 검색어가 일종의 쿼리이다.

SQL이란 데이터베이스 용 프로그래밍 언어이다. 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다.

또 SQL은 구조화된 SQL과 구조화가 되지 않은 NoSQL으로 나뉘게 되고 NoSQL의 대표적인 예시는 MongoDB와 같은 문서 지향 데이터베이스이다.
SQL을 사용하기 위해서는 데이터가 구조가 고정되어 있어야한다.

Lab_03 : 데이터베이스 관련 명령어

데이터베이스 생성

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

  • 데이터베이스를 생성한다.

데이터베이스 사용

USE 데이터베이스_이름;
데이터베이스를 이용해 테이블을 만들거나 수정하거나 삭제하는 등의 작업을 하려면, 먼저 데이터베이스를 사용해야 하는 명령을 전달해야 한다.

테이블 생성

아래는 user라는 테이블을 만드는 예제이다.

CREATE TABLE user(
	id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(255),
    email varchar(255)
);

CRE인TE TABLE 테이블명() 을 이용해 테이블을 생성할 수 있었다. 필드 선언부는 int,varchar을 이용해 각 조건을 충족시켜서 생성할 수 있었다.

테이블 정보 확인

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 rows in set (0.00 sec)

MySQL 명령어

SELECT

  • SELECT는 데이터셋에 포함될 특성을 특정한다.

SELECT 'hello world'
일반 문자열

SELECT 2
숫자

SERLECT 15+3
연산

FROM

  • 테이블과 관련한 작업을 할 경우 반드시 입력해야 한다. FROM 뒤에는 결과를 도출해낼 데이터베이스 테이블을 명시한다.
SELECT 특성_1
FROM 테이블_이름

-> 특성_1을 테이블에서 사용

SELECT 특성_1,특성2
FROM 테이블_이름

->특성 1,2을 테이블에서 사용

SELECT *
FROM 테이블_이름

-> 테이블의 모든 특성을 선택

WHERE

  • 필터 역할을 하는 쿼리문이다. WHERE은 선택적으로 사용이 가능하다.
SELECT 특성_1,특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정_값"

-> 특성_1,특성_2를 사용하여 테이블에서 특성_1의 특정 값과 동일한 데이터 찾기

SELECT 특성_1,특성_2
FROM 테이블_이름
WHERE 특성_2 <> "특정_값"

-> 특성_1,특성_2를 사용하여 테이블에서 특성_2의 특정 값을 제외한 데이터 찾기

SELECT 특성_1,특성_2
FROM 테이블_이름
WHERE 특성_1>"특정 값"

SELECT 특성_1,특성_2
FROM 테이블_이름
WHERE 특성_1<="특정 값"

->테이블에서 특성_1에서 특정 값보다 크거나 , 작거나 같은 데이터 값을 출력

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 LIKE "%특정 문자열%"

-> 테이블에서 특성_2와 특정 문자열이 비슷한 값들을 필터하여 데이터로 출력

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 IN ("특정값_1", "특정값_2")

->리스트의 값들과 일치하는 데이터 값들을 출력

SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NULL

->값이 없는 경우 NULL을 찾을 때는 IS 사용

SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NOT NULL

->값이 없는 NULL을 제외할 때에는 NOT을 추가

ORDER BY

  • 돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정
SELECT *
FROM 테이블_이름
ORDER BY 특성_1

-> 테이블에서 특성_1을 기준으로 오름차순하여 출력

SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC

->테이블에서 특성_1을 기준으로 내림차순하여 출력

LIMIT

  • 결과로 출력할 데이터의 갯수를 정할 수 있다. 쿼리문에서 사용할 때에는 가장 마지막에 추가한다.
SELECT *
FROM 테이블_이름
LIMIT 200

데이터 결과를 200개만 출력.

DISTINCT

  • 중복을 제거하여 출력 받고 싶을 때 사용
SELECT DISTINCT 특성_1
FROM 테이블_이름

-> 특성_1을 기준으로 중복을 제거한 데이터들을 출력

INNER JOIN

  • INNER JOIN이나 JOIN으로 실행할 수 있다.
SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

-> 모든 열에서 테이블_1을 선택해 테이블 2와 ON 조건에 해당하는 데이터들을 출력

OUTER JOIN

  • LEFT OUTER JOIN : 왼쪽 테이블의 모든 값이 출력되는 조인
  • RIGHT OUTER JOIN : 오른쪽 테이블의 모든 값이 출력되는 조인
  • FULL OUTER JOIN : 왼쪽또는 오른쪽 테이블의 모든 값이 출력되는 조인

Lab_04 : Transaction,ACID

트랜잭션

트랜잭션은 데이터 베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다.

각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료한다. 성공 또는 실패라는 두 개의 결과만 존재하는 트랜잭션은 미완료된 작업없이 모든 작업을 성공을 해야 성공적인 트랜잭션이라고 볼 수 있다.

ACID

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안정성을 보장하기 위해 필요한 성질이다.

  • Atomicity
  • Consistency
  • Isolation
  • Durability

Atomicity(원자성)

원자성은 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 한다.

예를 들어, A,B 작업을 수행해야 하는데 A트랜잭션은 성공했고 B트랜잭션은 실패했다고 가정하면, 초기 시작인 A트랜잭션부터 다시 실행해야 하는데 이를 원자성이라고 볼 수 있다.

원자성을 충족했다라고 하면, A,B 두 트랜잭션 모두 성공으로 결과가 나타나야 한다.

Consistency(일관성)

일관성은 데이터베이스의 상태가 일관되어야 한다. 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.
즉, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다.

일관성을 위반하는 예시를 들면, '모든 고객은 반드시 이름을 가지고 있어야 한다'는 데이터베이스의 제약이 있다고 가정하면,

  • 이름 없는 새로운 고객을 추가하는 쿼리
  • 기존 고객의 이름을 삭제하는 쿼리

위 예시는 '이름이 있어야한다'라는 데이터베이스의 제약을 위반하여, 일관성을 유지되지 않는 상태가 된다.

Isolation(격리성, 고립성)

격리성은 모든 트랜젹션은 다른 트랜잭션으로부터 독립되어야 한다.
예를 들어 계좌에 만 원이 있다고 가정하면,

  • 이 계좌로부터 계좌 B로 6천 원, 계좌 C로 6천 원을 동시에 계좌 이체하는 경우. 계좌 B에 먼저 송금한 뒤 계좌 C에 보내는 결과와 동일해야 한다.

Durability(지속성)

지속성은 하나의 트랜잭션이 성공적으로 수행되었으면, 해당 트랙잭션에 대한 로그가 남아야 한다.
런타임 오류나 시스템 오류가 발생해도, 해당 기록은 영구적이어야 한다.

profile
" To be BE "

0개의 댓글