id customer_id product_id amount shipping_fee order_date
1 719 1 3 50000 2023-11-01
2 131 2 1 10000 2023-11-02
3 65 4 1 20000 2023-11-05
4 1008 3 2 25000 2023-11-05
5 356 1 1 15000 2023-11-09

 

1. orders 테이블에서 주문 수량(amount)이 2개 이상인 주문을 진행한 소비자의 ID(customer_id)만 선택하는 쿼리를 작성해주세요!

select customer_id

from orders

where amount >= 2

 

2. orders 테이블에서 2023년 11월 2일 이후에 주문된 주문 수량(amount)이 2개 이상인 주문을 선택하는 쿼리를 작성해주세요!

select *

from orders

where order_date > ‘2023-11-02’

and amount >= 2

 

3. orders 테이블에서 주문 수량이 3개 미만이면서 배송비(shipping_fee)가 15000원보다 비싼 주문을 선택하는 쿼리를 작성해주세요!

select *

from orders

where amount < 3

and shipping_fee > 15000

 

4. orders 테이블에서 배송비가 높은 금액 순으로 정렬하는 쿼리를 작성해주세요!

select *

from orders

order by shipping_fee desc

id product_name price category
1 맥북 프로 1200 컴퓨터
2 다이슨 청소기 300 생활가전
3 갤럭시탭 600 컴퓨터
4 드롱기 커피머신 200 주방가전

 

 

1. products 테이블에서 제품 이름(product_name)과 가격(price)만을 선택하는 쿼리를 작성해주세요.

 

     select product_name, price

     from products

 

2. products 테이블에서 제품 이름에 '프로'가 포함된 모든 제품을 선택하는 쿼리를 작성해주세요.

 

      select *

      from products

      where product_name like '%프로%'

 

3. products 테이블에서 제품 이름이 '갤'로 시작하는 모든 제품을 선택하는 쿼리를 작성해주세요.

 

       select *

       from products

       where product_name like '갤%'

 

4. products 테이블에서 모든 제품을 구매하기 위해 필요한 돈을 계산하는 쿼리를 작성해주세요.

 

      select sum(price)

      from products

id name position salary hire_date
1 르탄이 개발자 30000 2022-05-01
2 배캠이 PM 40000 2021-09-25
3 구구이 파트장 35000 2023-06-01
4 이션이 팀장 50000 2021-07-09

 

  1. sparta_employees 테이블에서 모든 직원의 이름(name)과 직급(position)을 선택하는 쿼리를 작성해주세요.
    • select name, position from sparta_employees
  2. sparta_employees 테이블에서 중복 없이 모든 직급(position)을 선택하는 쿼리를 작성해주세요.
    • select distinct position from sparta_employees
  3. sparta_employees 테이블에서 연봉(salary)이 40000과 60000 사이인 직원들을 선택하는 쿼리를 작성해주세요.
    • selectfrom sparta_employees where salary >= 40000 and salary <= 60000
  4. sparta_employees 테이블에서 입사일(hire_date)이 2023년 1월 1일 이전인 모든 직원들을 선택하는 쿼리를 작성해주세요.
    • selectfrom sparta_employees where hire_date < '2023-01-01'

 

 

배운 것

  • distinct
    • 중복 없이 데이터를 조회할 때 사용
    • select할 행 앞에 붙임
    • 여러 컬럼 조합 앞에 두면 해당 조합을 중복없이 조회함
SELECT DISTINCT department_id, job_id
FROM employees;

 

  • 날짜 조건 검색
    • 특정 기간을 포함한 데이터를 조회할 때는 between 사용
select *
from table_name
where hire_date between '2024-01-01' and '2024-05-05';

 

json server

짧은 시간 내에 REST API 서버의 기본적인 기능 대부분을 구축해주는 라이브러리

HTTP 클라이언트 사용 : 웹 애플리케이션에서 HTTP 요청을 보내고 응답을 받을 수 있는 도구

 

REST API

  • REST를 기반으로 만들어진 API
  • REST
    • 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것
    • HTTP URI를 통해 자원(Resource)을 명시하고 HTTP Method를 통해 해당 자원(URI)에 대한 CRUD를 적용하는 것
    • 자원(Resource) : 웝페이지(html), binary data(그림파일, 소리파일 등), db data(json, html로 render된 data)
Create : 데이터 생성(POST)
Read : 데이터 조회(GET)
Update : 데이터 수정(PUT, PATCH)
Delete : 데이터 삭제(DELETE)

 

HTTP Method

GET

  • 서버에게 resource를 보내달라고 요청
  • 서버(혹은 DB)의 resource는 클라이언트로 전달만 될 뿐 변경되지 않음
  • 웹 브라우저에 이미지 url을 입력하면 해당 그림 파일이 표시되는 것

POST

  • 서버에게 resource를 보내면서 생성해 달라고 요청
  • 회원가입을 하면 DB에 새로운 회원정보가 등록되는 것

PUT

  • 서버에게 resource를 업데이트 하도록 요청
  • resource가 없다면 새로운 resource를 생성해 달라고 요청
  • 항상 모든 필드값을 가져와서 필드를 새로운 값으로 교체
  • 회원정보를 수정하는 것

PATCH

  • 서버에게 resource를 업데이트 하도록 요청
  • 주어진 필드만 수정하여 부분 데이터를 업데이트

DELETE

  • 서버에게 resource의 삭제 요청

 

정렬 (sort)

  • DESC : 내림차순
  • ASC : 오름차순
GET /memo?_sort=id&_order=DESC    //내림차순
GET /memo?_sort=id&_order=ASC     //오름차순

 

연산자 (Operators)

  • gte: 크거나 같다
  • lte: 작거나 같다
  • ne: 일치하지 않는다
GET /memo?id_gte=10    
GET /memo?id_lte=10
GET /memo?id_ne=10

 

제한 (limit)

GET /memo?_limit=2

 

 

'DB' 카테고리의 다른 글

인덱스와 B-Tree  (2) 2025.05.16
MySQL (2)  (1) 2024.07.18
MySQL (1)  (0) 2024.07.18
데이터베이스(5)  (0) 2024.05.13
데이터베이스(4)  (1) 2024.05.13

MySQL 데이터베이스 서버 생성, 스키마 생성

 

PERFROMMANCE

  • 데이터 베이스의 성능상의 영향을 보여줌

 

Index 설정

  • 데이터베이스 튜닝 : 데이터베이스의 성능을 향상시키고, SQL의 처리 시간을 줄이는 작업
  • index는 1개만 설정 가능 → 정렬기준이므로
  • PK에 AT걸려 있을 때 주로 사용
  • 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조
  • PK : index가 자동으로 생성됨
  • PK가 아닌 다른 column에 대해서 index를 만들어 주는 작업

 

뷰 : 가상의 테이블

 

Stored procedure

  • 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합
  • 특정 로직의 쿼리를 함수로 만들어 놓은 것

 

데이터베이스 설계 단계

  1. 요구사항 수집 분석
    • 데이터베이스의 사용 용도 파악
    • 요구사항 명세서 작성
  2. 개념 스키마 설계
    • 요구사항 명세서를 바탕으로 entity, relationship으로 분리하여 와 E-R 다이어그램 작성
    • 각각의 entity가 가지는 속성 도출
      • entity : 데이터베이스에 표현되어야 하는 객체
      • relationship : entity를 연결하는 entity간의 관련성
  3. 논리 스키마 설계
    • 데이터를 어떻게 저장할 것인가
    • sql문을 이용하여 entity를 table로 만들고, 속성을 정의함
    • 테이블간의 관계는 FK로 정의
  4. 물리 스키마 설계
    • 실제로 어떻게 저장하고 보관하고 관리할 것인가
    • 데이터베이스 튜닝 : 데이터베이스의 처리 속도를 향상시키고 응답 시간을 최소화하는 작업

 

Trigger

데이터 일관성을 유지하기 위해 INSERT, DELETE, UPDATE 같은 DML이 수행될 때, 데이터베이스에서 자동으로 동작하는 것 → 지울 때는 항상 키값으로 삭제

CREATE DEFINER=`root`@`localhost` TRIGGER `topic_backup_AFTER_DELETE` AFTER DELETE ON `topic_backup` FOR EACH ROW BEGIN
	INSERT INTO removed
		VALUES (OLD.id, OLD.title, now() );
END
DELETE FROM topic_backup WHERE title = 'C' ;
select * from removed;

'DB' 카테고리의 다른 글

인덱스와 B-Tree  (2) 2025.05.16
REST API  (0) 2024.07.18
MySQL (1)  (0) 2024.07.18
데이터베이스(5)  (0) 2024.05.13
데이터베이스(4)  (1) 2024.05.13

데이터베이스 시스템의 구성 요소

  1. 데이터베이스 서버
    • 데이터베이스에 대한 저장, 관리, 접근, 조작 등의 작업을 수행
    • 클라이언트로부터의 요청을 받아들여 해당 요청을 처리하고 결과를 반환
    • 데이터베이스 관리 시스템(DBMS)에 의해 구현
  2. 데이터베이스 클라이언트
    • 데이터베이스 서버에 연결하여 데이터베이스와 상호 작용하는 소프트웨어나 인터페이스
    • 사용자 또는 응용 프로그램이 데이터베이스에 접속하여 데이터를 조회, 삽입, 수정, 삭제 등의 작업을 수행할 수 있도록 도움

MySQL Client

  • MySQL Monitor - CLI기반
  • MySQL Workbench - GUI기반

 

SQL 분류

  1. DML(Data Manipulation Language)
    • 데이터 조작 언어
    • SELECT, INSERT, UPDATE, DELETE
  2. DDL(Data Definition Language)
    • 데이터 정의 언어, 데이터베이스 개체를 생성, 삭제, 변경
    • CREATE, DROP, ALTER
  3. DCL(Data Control Language)
    • 데이터 제어 언어, 데이터를 조회할 수 있는 권한을 부여하거나 빼앗을 때 사용
    • GRANT, REVOKE

 

MYSQL 구조

  • 데이터는 표(table)에 저장
  • 표들은 데이터 베이스(스키마, shema)
  • 이러한 스키마를 모아놓은 것이 데이터 베이스 서버

1. CREATE

스키마 생성

  • create database opentutorials;

테이블 생성

  • CREATE TABLE topic();
CREATE TABLE topic (
       id INT(11) NOT NULL AUTO_INCREMENT, //자동으로 1씩 증가해서 중복없게
       title VARCHAR(100) NOT NULL,
       description TEXT NULL,
       created DATETIME NOT NULL,
       author VARCHAR(30) NULL,
       profile VARCHAR(100) NULL,
       PRIMARY KEY(id));
//이름 타입(길이) 널여부

 

생성된 스키마 확인

  • show databases;

데이터베이스 선택

  • use opentutorials;

테이블 리스트 조회

  • SHOW TABLES;
  • DESC 테이블명; #테이블의 열 리스트 조회

테이블에 데이터 추가

  • INSERT INTO 테이블명 (컬럼명1, 컬럼명2) VALUES (넣을 데이터1, 넣을 데이터2);
insert into topic (title,description,created,author,profile)
values('MySQL','MySQL is...',now(),'egoing','developer');
///id는 AUTO_INCREMENT했으므로 사용x

 

 

2. READ

입력한 데이터 가져오기

  • SELECT 컬럼명(*) FROM 테이블명;
mysql> select * from topic;
+----+------------+-------------------------+---------------------+--------+---------------------------+
| id | title      | description             | created             | author | profile                   |
+----+------------+-------------------------+---------------------+--------+---------------------------+
|  1 | MySQL      | MySQL is...             | 2023-07-01 22:14:46 | egoing | developer                 |
|  2 | ORACLE     | ORACLE is               | 2023-07-01 22:25:39 | egoing | developer                 |
|  3 | SQL Server | SQL Server is...        | 2023-07-01 22:28:29 | duru   | data administrator        |
|  4 | PostgreSQL | PostgreSQL Server is... | 2023-07-01 22:30:38 | taeho  | data scientist, developer |
|  5 | MongoDB    | MongoDB is...           | 2023-07-01 22:31:32 | egoing | developer                 |
+----+------------+-------------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)

 

조건 추가

  • SELECT 컬럼명 FROM 테이블명 WHERE author=’egoing’;
mysql> select id,title,created,author from topic where author='egoing';
+----+---------+---------------------+--------+
| id | title   | created             | author |
+----+---------+---------------------+--------+
|  1 | MySQL   | 2023-07-01 22:14:46 | egoing |
|  2 | ORACLE  | 2023-07-01 22:25:39 | egoing |
|  5 | MongoDB | 2023-07-01 22:31:32 | egoing |
+----+---------+---------------------+--------+
3 rows in set (0.00 sec)

 

  • select id,title,created,author from topic where author='egoing' order by id DESC; #id를 기준으로 내림차순
mysql> select id,title,created,author from topic where author='egoing' order by id DESC;
+----+---------+---------------------+--------+
| id | title   | created             | author |
+----+---------+---------------------+--------+
|  5 | MongoDB | 2023-07-01 22:31:32 | egoing |
|  2 | ORACLE  | 2023-07-01 22:25:39 | egoing |
|  1 | MySQL   | 2023-07-01 22:14:46 | egoing |
+----+---------+---------------------+--------+
3 rows in set (0.01 sec)

 

3. UPDATE

  • update topic set title='Oracle' where id=2;

4. DELETE

  • delete from 테이블 where 조건;

'DB' 카테고리의 다른 글

REST API  (0) 2024.07.18
MySQL (2)  (1) 2024.07.18
데이터베이스(5)  (0) 2024.05.13
데이터베이스(4)  (1) 2024.05.13
데이터베이스(3)  (1) 2024.05.13

트랜젝션

  • 데이터베이스 내에서 하나의 그룹으로 처리해야 하는 명령문들을 모아놓은 작업 단위 ex) 송금
    • 출금과 입금이 1번씩 발생하지만 은행에서는 송금 자체를 하나의 트랜잭션으로 봄
    • 출금, 입금을 하나의 그룹으로 봄

 

트랜젝션 특징 (ACID)

  • 원자성(Atomicity) : 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 함(ALL-OR-Nothing 방식)
    • 올 커밋, 올 롤
    • 정상적으로 종료된 경우, 데이터 베이스 내의 연산 결과 모두 전부 반영
    • 중간에 장애가 발생한 경우, 처음 상태로 모두 되돌려 전부 취소
  • 일관성(Consistency) : 트랜잭션이 실행되기 전과 실행된 후의 데이터베이스는 일관성 있는 상태여야 함
    • 일관성 요구조건:A계좌 + B계좌 = 5000
    • 트랜잭션 작업 전후 에도 일관성 요구 조건이 유지되어야 함
  • 격리성(Isolation) : 둘 이상의 트랜잭션이 동시 실행되고 있을 때, 각각의 트랜잭션은 서로 간섭 없이 독립적으로 실행되야 함 → 동시성 제어를 통해 구현
    • 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것
    • 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음
  • 영속성(Durability) : 트랜잭션이 성공적으로 완료되었으면 결과는 영구적이어야 함
    • 시스템 장애, 손상, 전원 공급 장애 등의 상황이 발생하더라도 데이터는 안전하게 보존되어야 함

→데이터 안정성과 무결성을 보장하기 위해 ACID 트랜잭션 사용

 

트랜젝션 연산

  • Commit : 트랜잭션의 모든 연산이 성공적으로 수행됐을 때, 트랜잭션에서 수행한 모든 변경 내용이 영구적으로 데이터베이스에 반영하게 하는 연산
  • Rollback : 트랜잭션 도중 오류가 발생하거나 트랜잭션 내에서 일부 연산이 실패했을 때, 트랜잭션을 실패로 처리하고 이전 상태로 되돌리게 하는 연산

 

트랜젝션 상태

 

  • 활동 : 트랜잭션이 실행을 시작했거나 실행 중인 상태
  • 부분 완료 : 트랜잭션이 모든 연산을 성공적으로 수행하였고, Commit연산을 기다리고 있는 상태
  • 완료 : 트랜잭션이 성공적으로 완료되어 Commit연산을 수행한 상태
  • 실패 : 트랜잭션 내에서 오류가 발생하여 트랜잭션이 중단된 상태
  • 철회 : 트랜잭션 실행에 실패하여 Rollback연산을 수행한 상태

 

트랜잭션 격리 레벨

  • 동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정
  • READ-UNCOMMITTED (커밋되지 않은 읽기)
    • 커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용
    • 더티 리드 (Dirty Read) 발생 : 커밋 이전의 데이터를 보고있을 때, 트랜잭션이 롤백된다면 잘못된 데이터를 보고 있는 것
    • 더티 리드 (Dirty Read) : 특정 트랜잭션에 이해 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경 사항을 조회할 수 있는 문제
     
  • READ-COMMITTED (커밋된 읽기)
    • 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
    • 커밋되지 않은 데이터에 접근하지 않고, UNDO 영역의 데이터를 접근
    • UNDO 영역 : 데이터의 변경이 있을 경우, 이전의 데이터를 보관하는 곳
    • 더티 리드 해결
    • 반복 불가능한 조회 (Non-Repeatable Read, 논 리피터블 리드) 문제 : 하나의 트랜잭션 내에서는 동일한 셀렉트 쿼리를 날렸을 때 항상 같은 결과를 보장해야 하지만 그러지 못한 것
    • 반복 불가능한 조회 (Non-Repeatable Read) : 같은 트랜잭션 내에서 같은 데이터를 여러번 조회했을 때 읽어온 데이터가 다른 경우
  • REPETABLE-READ (반복 가능한 읽기)
    • 트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장함
  • SERIALIZABLE (직렬화 가능)
    • 한 트랜잭션에서 사용하는 데이터를 트랜잭션이 끝날 때까지 다른 트랜잭션에서 접근 불가
      • 가장 엄격한 격리수준

아래로 내려갈수록 격리 수준은 높아지고 데이터 정합성이 높아져 성능은 낮아짐

데이터 정합성 : 데이터가 일관되고 정확한 상태를 유지하는 것

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

'DB' 카테고리의 다른 글

MySQL (2)  (1) 2024.07.18
MySQL (1)  (0) 2024.07.18
데이터베이스(4)  (1) 2024.05.13
데이터베이스(3)  (1) 2024.05.13
데이터베이스(2)  (2) 2024.05.09

정규화란?

  • 테이블 간에 중복된 데이터를 제거하여 무결성을 유지하게 하는 것

정규화 단계

제 1정규화

  • 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것

제 2정규화

  • 제 1정규형 릴레이션에서 부분 함수 종속성을 제거하는 것
    • 부분 함수 종속성 : 기본키가 복합키일 경우 기본키를 구성하는 속성 중 일부에게 종속된 것
     

기본키(복합키) : 학생번호, 강좌이름 → 성적

강좌이름(기본키의 부분집합) → 강의실

 

제 3정규화

    • 이행 함수 종속 : A -> B, B -> C가 성립할 때 A -> C가 성립되는 것
    • 이행 함수 종속의 문제 : 학생번호 → 강좌이름 → 수강료인 경우 강좌 이름이 바뀌어도 학생은 수강료를 그대로 내고 수업을 들을 수 있음, 강좌이름에 맞게 수강료를 변경하는 과정 번거로움제 2정규형 릴레이션에서 이행 함수 종속성을 제거하는 것

 

BCNF 정규화

  • 제 3정규형 릴레이션에서 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

 

N대M 자기참조 관계 해결방법

  • 한 테이블 내의 레코드들 사이에 존재하는 N대 M관계
  • 보조 테이블 생성 후 원래 테이블과의 관계를 맺은 후 일대다 관계로 변환

 

뷰란?

데이터베이스의 하나 이상의 테이블의 필드들로 구성된 가상테이블

뷰의 사용이유?

데이터 무결성을 강화하고 여러 테이블들로부터 동시에 온 데이터로 작업하기 위해 사용

뷰 정의문

CREATE VIEW 뷰이름[(속성이름[,속성이름])]AS SELECT문; //뷰 생성
DROP VIEW 뷰이름 RESTRICT or CASCADE //뷰 삭제

 

'DB' 카테고리의 다른 글

MySQL (1)  (0) 2024.07.18
데이터베이스(5)  (0) 2024.05.13
데이터베이스(3)  (1) 2024.05.13
데이터베이스(2)  (2) 2024.05.09
데이터베이스(1) - 용어  (2) 2024.05.09

+ Recent posts