반응형

 

Blocking / Non Blocking Synchronous / Asynchronous

 

 

Blocking / Non Blocking

  • Blocking / Non Blocking은 호출되는 함수가 바로 제어권을 리턴 하느냐 마느냐 가 관심사
    • 제어권을 리턴하지 않으면 Blocking
    • 제어권을 리턴하면 NonBlocking
    제어권이 누구한테 있는지?

Synchronous / Asynchronous

  • Synchronous / Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경 쓰냐 가 관심사
    • 호출되는 함수의 작업 완료를 호출한 함수가 확인하면 Synchronous (동기)
    • 호출되는 함수의 작업 완료를 호출된 함수가 확인하면 Asynchronous (비동기)
    호출한 함수의 완료 여부를 누가 확인하는지?
  • 비동기 방식은 멀티 스레드 , 단일 스레드?요점은 비동기 방식은 스레드를 효율적으로 운용하여 반응성을 향상시키는 것비동기 방식 DB I/O가 발생하면 DB I/O는 다른 스레드에게 넘기고, 나머지 작업을 수행
  • 기존 방식 DB I/O가 발생하면 다른 작업을 수행하지 않고, DB데이터가 올 때까지 기다림.
  • 단일 스레드에서도 가능하다고는 하는데, 사실은 다른 프로세스의 스레드를 사용한다.
    다른 스레드 또는 다른 프로세스의 스레드를 사용하므로 결국, 멀티 스레드가 맞다.
  • 동기?
    **작업의 완료 확인 방식에서의 동기(synchronous):** 
    작업을 호출한 쪽이 결과가 반환될 때까지 기다린다는 의미입니다. 
    비동기(asynchronous)는 작업의 완료를 기다리지 않고 다른 작업을 수행하며, 
    작업의 결과는 나중에 돌려받습니다.(콜백, 이벤트, 프로미스 등을 통해).
    
    **쓰레딩과 Race Condition 문맥에서의 동기(synchronization)**: 
    쓰레드 간의 실행 순서나 자원 접근을 조절하는 방식을 의미합니다. 
    즉, 어떤 일련의 작업이 '동기화' 되어 있다면, 그 작업들은 미리 정의된 어떠한 
    순서에 따라 실행되어야 하며, 이를 통해 레이스 컨디션을 방지할 수 있습니다.
    
    **Synchronous (동기):** 시간에 대한 것
    동기 방식은 하나의 작업이 완료되어야 다음 작업이 시작됩니다. 
    여기서는 `시간의 흐름`에 집중이 되어 있습니다.
    **-> 시간**
    
    **Synchronization (동기화):** 상태나 데이터의 일관성 
    여러 프로세스나 쓰레드가 동시에 어떠한 자원을 접근할 때 그 순서와 방식을 
    조절하여 `데이터의 일관성`을 유지하는 것을 의미합니다.
    **-> 상태**
    
  • → 동기가 헷갈리는 이유

 

 

결론

  1. Blocking + Synchronous: 요청을 보내고 응답을 받을 때까지 아무 것도 하지 않는 상태로 대기.이렇게 되면 시스템의 효율성이 떨어짐 긴 대기 시간 동안 다른 중요한 작업을 처리할 수 없게 된다.
  2. Non-Blocking + Asynchronous: 요청을 보내고 바로 다른 작업을 계속 진행. 응답이 오면 해당 응답을 처리하는 콜백 함수나 이벤트 리스너를 통해 처리함 이 방식은 시스템의 효율성, 반응성을 크게 향상 시킬 수 있다.

→ 결국, 작업 시간이 긴 여러 DB I/O, 네트워크 처리는 비동기 방식이 좋다는 내용 👍

 

 


 

예시

프론트

왜 Javascript에서 axios 호출을 비동기식이라고 하는지?

Web APIs Ajax 요청, setTimeout(), 이벤트 핸들러의 등록과 같이 웹 브라우저에서 제공하는 기능들을 말한다.

이러한 요청들의 처리가 JavaScript 엔진의 쓰레드와는 다른 쓰레드들에서 이뤄진다는 점이다.

JavaScript 엔진의 스택에서 실행된 비동기 함수가 요청하는 비동기 작업에 대한 정보와 콜백 함수를 웹 API를 통해

브라우저에게 넘기면, 브라우저는 이러한 요청들을 별도의 쓰레드에 위임 해당 요청이 완료되는 순간 콜백 함수를 JavaScript 엔진의 태스크 큐라는 곳에 집어넣는다.

→ JS가 비동기 함수를 실행하면, JS는 이 함수들에 대해 신경 쓰지 않는다. (비동기)

호출된 함수는 브라우저가 신경 쓰며, 작업을 완료하면 JS에게 Call Back 을 준다.

async function fetchExternalData() {
  const response = await fetch('<http://external-service/data>');
  const data = await response.json();

  // 위 요청-응답을 비동기로 브라우저에게 넘겨 처리하고, 아래 작업을 바로 실행함
  otherWork();

  return data;
}

 

 

백엔드

**WebFlux**는 Spring 5에서 도입된 반응형 프로그래밍 모델로, Non-Blocking + Asynchronous 방식 WebFlux는 Project Reactor를 기반으로 하며, **Mono**와 **Flux**라는 반응형 스트림 타입을 제공

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class ExternalService {

    @Autowired
    private WebClient webClient;

    public Mono<String> fetchExternalData() {
        String data = webClient.get()
                        .uri("/data")
                        .retrieve()
                        .bodyToMono(String.class);

				// 위 요청-응답을 비동기로 처리하고, 아래 작업을 바로 실행함
				otherWork();
    }
}

 

 


 

 

! 질문

비동기 방식이 무엇인가?

→ DB I/O, 네트워크 작업 등의 시간 소요가 큰 작업의 완료를 기다리지 않고, 해당 작업 완료 시 콜백을 통해 결과를 받아오면서 동시에 다른 작업을 계속 수행하는 방식을 의미합니다.

WebFlux, axios를 추가로 설명하면 👍

 

(네트워크에서) 동기 방식이 무엇인가?

→ 여러 개의 요청-응답을 순차적으로 처리하여, 실행하는 것입니다.

반응형

'CS > 네트워크' 카테고리의 다른 글

[TCP/IP MODEL]  (0) 2022.08.31
반응형

 

 

 

 

 

1계층 물리 계층

물리적인 매체를 이용해 비트 스트림을 전송

비트 단위 전송 010100

 

 


 

 

2계층 데이터링크 계층

hop to hop 전송 담당

Mac 주소 사용

유선 - 이더넷 MTU 1500byte

무선 - LTE

 

IP주소를 이용해 바로 옆(라우터, Host)으로 전달하는 역할을 하는 계층

 

데이터를 전송하고자 할 때 매체를 타고 전파된다.

매체를 이용하면 브로드캐스트로 전파된다. (사람이 공기를 이용해 말을 하듯이)

여러 노드가 동시에 매체를 이용하게되면, 충돌이 발생한다. 

 

충돌을 해결하기 위해 여러 시도 -> 정해진 시간마다 노드가 데이터를 보내는 방식

현재 사용하는 방식은 임의로 아무때나 Random Access하는 방식을 사용

임의로 아무때나 매체에 접근하므로 충돌은 언젠간 발생하며, 충돌을 해결해주어야 한다.

 

CSMA(carrier sense multiple access)

데이터를 보내기전에 매체를 감지하여 확인 후 전송한다.

 

CD(collision detection)

보낸 데이터의 충돌을 감지하면 전송을 멈춘다.

랜덤 딜레이를 주고 이후에 다시 전송을 시도한다.

 

 

 

스위치 (STAR형)

스위치가 중간에서 순서를 정리

스위치는 네트워크 관점에서 큰 의미 X

단순하게 연결을 위해 사용하는 것

switch table  [destination MAC : port]

 

 


 

ARP(IP를 사용하므로 사실 3계층에 위치)

IP를 이용해 MAC주소를 알아낸다.

 

프레임은 목적지 MAC주소로 데이터를 전송하므로 

목적지의 MAC주소를 알아야 한다.

MAC주소를 알아내기 위해 IP를 이용한다.

 

출발지 노드는 ARP TABLE [IP : MAC] 을 갖고 있다.

테이블에 IP에 해당되는 MAC 주소가 없다면

ARP TABLE을 채우기위해 브로드캐스트로 ARP를 전송

IP에 해당되는 정보를 가진 노드가 응답으로 자신의 MAC 주소준다.

출발지 노드는 목적지 MAC 주소를 채우고 데이터를 전송

 

스위치를 이용할 때는 데이터 링크(MAC)까지 올라가고,

ARP를 이용하려면 라우터 - 네트워크 계층 (IP)까지 올라가야 한다.

 

라우팅 테이블을 만들 때, ARP 테이블도 만든다.

 


 

 

3계층 네트워크 계층

장비: 라우터 - NAT, Forwarding, 방화벽

Host to Host

IP 주소 사용

 

 

라우터 동작 방식: 라우팅 알고리즘 -> 포워딩 테이블 구성 -> 포워딩

 

 

ip를 하나하나 다 저장하면 방대해지므로

서울, 대전, 부산과 같이 크게 묶은 후 라우팅 테이블의 ip range(Network Id)를 본다.

라우터는 라우팅 테이블을 보고 IP의 subnet mask 만큼 네트워크 IP로,

해당되는 라우터로 패킷을 forward (ip range가 가장 길게 매칭되는 곳으로 전송)

서브넷: 같은 prefix를 갖는 집합

 

 

 

라우팅 테이블 구성 방식

(1) Link state - 다익스트라 알고리즘

브로드캐스팅으로 자신의 링크정보를 네트워크에 뿌린다.

각 점은 각자 다익스트라 알고리즘을 수행하여 라우팅 테이블을 구성한다.

범위는 라우터들이 속한 도메인 범위에서 수행

 

(2) Distance vector - 벨만 포드 알고리즘

min(자신의 옆 라우터 이동 비용 + 도착지까지의 비용)

 

 

Fragmentation

IP 패킷을 2계층 이더넷 MTU에 맞게 분리, 조립하는 과정을 거친다.

재조립에 사용되는 식별자(identification), Offset을 헤더에 갖는다. (같은 데이터면 1씩 증가)

 

 

 


 

 

4계층 전송 계층

Process to Process

 

TCP, UDP

헤더에 포트번호를 갖고 있음

 

TCP, UDP 세그먼트도 이더넷 MTU를 따라야하기 때문에 분리한다.

 

 

 

TCP - 신뢰성 있는 통신

3way handshake(TCP Flags [Syn, Ack, Fin])

를 이용해 통신을 성립 후 신뢰성 지향 송수신을 한다.

버퍼를 이용해 흐름제어, 혼잡제어를 한다.

항상 수신측의 상황을 고려한다.

ack로 세그먼트의 시퀀스 넘버를 요청

 

흐름제어

슬라이딩 윈도우로 흐름을 제어한다.

ack를 받으면 ack 이후를 즉시전송 후 슬라이딩 윈도우를 밀고, 다시 전송한 세그먼트들의 ack를 기다린다.

윈도우의 크기는 수신측 상황에 맞춘다.

 

혼잡제어

송신한 세그먼트들이 timeout될 때 까지 지수적으로 증가시켜서 세그먼트를 전송해본다.

timeout이 발생하면 최종 전송 크기의 반으로 감소시켜 진행하고, 이후 가산 증가시키며 전송

 

 

 

 

 

UDP - 신뢰성 없는 통신

오류제어만 수행한다.

오류가 발생하면 해당 패킷은 폐기

헤더가 작아 커스텀하여 사용하기도 한다.

 


 

 

응용 계층

암호화, 실시간 처리 등을 응용계층에서 전담한다. (OSI 7 layer의 세션, 표현 계층의 역할을 포함한다.)

 

TCP socket 또는 UDP socket 을 형성하여 통신한다.

 

여러개의 소켓이 형성

소켓위에서 응용계층 프로세스가 동작한다.

전송계층의 헤더를 보고 맞는 소켓(port)으로 올린다.

 

 

 

 

HTTP 일 경우

헤더와 바디로 구성된 메세지를 전송계층에 데이터로 넘김

 

 

 

 


 

반응형

'CS > 네트워크' 카테고리의 다른 글

Blocking / Non Blocking, Synchronous / Asynchronous  (0) 2023.10.03
반응형

 

쓰기와 쓰기가 동시에 작업하는 것이 불가능

읽기와 읽기는 동시에 언제든 가능

 

문제 부분은 쓰기 트랜잭션읽기 트랜잭션이 동시에 일어날 때

 

하나의 트랜잭션은 발생 시점부터 데이터 일관성을 가져야 한다.

 

 

 

Read uncommited - 오손 읽기(Dirty read) 

commit되지않은 데이터를 읽는 문제

 

 

Read commited - 반복 불가능 읽기(Non repeatable read)

update -> commit된 데이터를 읽어, 데이터 일관성이 깨진다.

 

 

Repeatable read - 유령 데이터 읽기(Phantom read)

트랜잭션 시작 전 commit 된 데이터만 undo영역을 이용하여 읽는다. 일관성이 깨지지 않는다.

insert -> commit 된 데이터를 읽어, 데이터를 추가로 읽어 데이터 일관성이 깨진다.

 

 

Serializable - 모든 문제 해결

트랜잭션이 다른 트랜잭션으로 부터 완전히 독립

 

 

 

 

MySQL은 Repeatable read를 사용하므로 유령 데이터 읽기가 발생할 수 있지만,

inno db 넥스트 키락으로 row에 락을걸어 insert 트랜잭션을 막기때문에, 유령 데이터 읽기가 발생하지 않는다.

 


 

https://idea-sketch.tistory.com/46

 

[MySQL]MySQL 벼락치기(5) - 갭락(Gap Lock)과 넥스트 키 락(Next-Key Lock)

이번 포스팅은 사내에서 MySQL 관련 내용 발표를 위해 Real MySQL(http://wikibook.co.kr/real-mysql/) 서적을 기반으로 학습하고 이해한 내용을 정리하는 포스팅이다. 포스팅에서는 주로 InnoDB 스토리지 엔진

idea-sketch.tistory.com

 

반응형
반응형

 

 

Mysql은 Oracle과는 다르게 rownum을 지원하지 않아서 커스텀으로 만들어서 사용해줘야 한다. 

함수를 사용하여 rownum을 지정해줄 수도 있다.

 

  • 커스텀 rownum
  • 함수 row_number()

 

 


 

커스텀 rownum

 

select @rownum:= @rownum + 1 as rownum, t.* 
from table1 t, (select @rownum := 0) r;

 



select rt.* 

from (
select @rownum:= @rownum +1 as rownum, t.* 
from table1 as t, (select @rownum := 0) as r 

) as rt
where rt.rownum between 2 and 4;

 

 


 

select rt.* 

from (
select @rownum:= @rownum +1 as rownum, t.* 
from table1 as t, (select @rownum := 0) as r

) as rt
order by rt.age;

 

 

부속질의로 사용 시 rownum을 만들고 order by를 하면 순서가 뒤바뀔 수 있다.

 


 

select @rownum:= @rownum +1 as rownum, t1.* 
from (
select t.* 
from table1 as t
    order by age desc
) t1, (select @rownum := 0) as r
order by t1.age;

 

 

order by 이후에 rownum을 만들어 주자.

 


row_number() 함수 (Mysql 8버전 이상)

 

select row_number() over (order by t.age desc) as rownum, t.*
from table1 t;

 

 


 

select row_number() over (order by t.age desc) as rownum, t.*
from table1 t
where t.rownum between 3 and 10;

 

해당 쿼리는 동작하지 않는다.

from -> where -> select 순서로 동작하므로 where 에서 select에서 동작하는 rownum을 알아볼 수 없다.

 


 

select rt.* 
from (
select row_number() over (order by t.age desc) as rownum, t.*
from table1 t
) as rt
where rt.rownum between 3 and 10;

 

부속질의를 활용해서 rownum이 생성된 이후에 사용해야 한다.

반응형
반응형

 

 

알아야 할 개념

시간복잡도, 공간 복잡도

 

알아야 할 자료구조

배열, 연결 리스트, 스택, 큐, 덱, 힙, 트리, 해시, 그래프

 

알아야 할 알고리즘

정렬, 구현, 재귀, 그리디, 탐색(+DFS/BFS, 백트래킹, 이분 탐색), 다이내믹 프로그래밍, 그래프 알고리즘

 

 


알고리즘

 


 

배열 문제

 

Array, LinkedList

Sliding window

Two Pointer

1차원 BFS/DFS

 


 

구현

 


 

 

재귀

 

Back Tracking

Union-Find

Divide and Conquer

 


 

그리디

 


 

정렬

 

기본 정렬 문제

Merge Sort

Quick Sort

 


 

탐색

 

DFS/BFS

Back Tracking

 

이분 탐색

 

Binaray Search

Parametric Search

 


 

다이내믹 프로그래밍

 

기본 DP

2차원 DP

최장 증가 부분 수열(LIS)

 


 

그래프

 

최단경로

Dijkstra

Floyd-Warshall

 

최소 신장 트리(Minimum Spanning Tree)

Kruscal

Prim

 

위상 정렬(Topology sort)

 

 

 


 

반응형
반응형

 

도메인 무결성 제약조건

 

각 속성의 도메인에 지정된 값만을 가져야 한다는 조건이다.

ex) 주문 일자 속성 -> 날짜 값만을 가져야 함

 


 

개체 무결성 제약조건

 

기본키는 NULL이면 안되며, 유일해야 한다.

 


 

참조 무결성 제약조건

 

부모 릴레이션에서 튜플을 삭제할 경우

 

RESTRICTED : 자식에서 참조하고 있다면 삭제를 거부

CASCADE : 자식의 튜플까지 삭제

DEFAULT : 자식의 외래 키 값을 DEFAULT 값으로 변경

NULL : 자식의 외래키 값을 NULL로 변경

 

 

 


 

반응형
반응형

 

제4 정규형

 

1 대 N 다치 종속의 제거이다.

하나의 결정자가  다른 속성에서 여러 종속자를 결정할 때 다치 종속한다고 한다.

 

한 릴레이션에서 1 대 N으로 관계가 나타나도 되지만, 문제가 되는 부분은 1 : N, 1: N 두 개 이상으로

다치 종속이 구성되어있을 때 이상현상이 발생하므로 중심이 되는 속성을 기준으로 릴레이션을 분리해주어야 한다.

 

이름 과목 동아리
홍길동 데이터베이스 농구
홍길동 보안 축구
홍길동 데이터베이스 야구

 

해당 테이블에서 과목을 추가하게 되면, 동아리도 추가를 해줘야 하는 문제가 발생한다.

그러므로 이름, 과목 / 이름, 동아리로 분리해줘야 한다.

 


 

제 5 정규형

 

조인 종속성이 존재하면 제5 정규형 대상이다.

조인 종속성이란 마치 조인을 한 것과 같은 릴레이션의 중복을 제거해주는 것을 말한다.

 

이름 과목 동아리
홍길동 데이터베이스 농구
홍길동 데이터베이스 야구
홍길동 보안 농구
홍길동 보안 야구
홍길동 자바 농구
홍길동 자바 야구

 

해당 테이블만 놓고 보면 이름과 과목은 연관성이 있고, 이름과 동아리 또한 연관성이 존재한다.

즉, 이름 속성을 기준으로 연관성을 가지므로 조인 종속성이 존재한다고 볼 수 있다.

 

조인 종속성을 제거하여 분리하면

이름, 과목 / 과목, 동아리 / 이름, 동아리 3개의 테이블이 나오게 된다.

 

이름, 과목

홍길동 데이터베이스
홍길동 보안
홍길동 자바

 

과목, 동아리

데이터베이스 농구
데이터베이스 야구
보안 농구
보안 야구
자바 농구
자바 야구

 

이름 동아리

홍길동 농구
홍길동 야구

 

 

2개의 테이블을 조인하면 본래의 릴레이션을 형성할 수 없다.

3개의 테이블을 전부 사용하여 조인해야 본래 테이블로 복구가 가능하다.

 

 

 

반응형

'CS > Database' 카테고리의 다른 글

[Mysql] rownum 활용  (0) 2022.07.20
[데이터베이스] 무결성 제약 조건  (0) 2022.06.15
[Database] MYSQL SQL 총정리  (0) 2022.05.03
[MYSQL] 각종 도구 사용 명령어  (0) 2022.05.03
[데이터베이스] 자연 키 vs 대리 키  (0) 2022.04.22
반응형

 

BinarySearch를 사용하면 검색 범위를 logN으로 엄청나게 단축시킬 수 있다.

만약 탐색할 범위가 너무 크다면 고려해봐야 한다.

 

특히 응용이라고 할 수 있는 최댓값, 최솟값을 찾아야 하는 이분 탐색을 이용하는

매개 변수 탐색 Parametric Search는 굉장히 유용하다.

 

주의할 점은 이분 탐색을 사용하기 이전에 탐색할 배열은 무조건 정렬되어있어야 한다.

이분 탐색은 기준 값가변 값을 통해 Start와 End를 결정한다.

 


 

 

package Search.BinarySearch;

public class BinarySearchTest {

    static int[] arr;

    public static void main(String[] args) {
        arr = new int[]{1,3,5,7,9,11,13};
        int idx = BinarySearchCode(9);
        System.out.println(idx);
    }

    public static int BinarySearchCode(int findNumber){
        int s = 0;
        int e = arr.length - 1;
        int mid;

        int returnNumber = 0;

        while(s <= e){
            mid = (s+e) / 2;

            if(findNumber == arr[mid]) {
                returnNumber = mid;
                break;
            }
            else if(findNumber > arr[mid])
                s = mid + 1;
            else if(findNumber < arr[mid])
                e = mid - 1;
        }
        return returnNumber;
    }
}

 

이분 탐색의 코드 자체는 간단하다.

left에서 시작하는 s, right에서 시작하는 e가 서로 교차하게 되면 종료한다.

 

(s+e)/2를 이용한 중간 값 mid를 계속 조건에 맞게 변화시키며 탐색범위를 이분한다.

찾지 못하였다면 그냥 종료될 것이고, 찾았다면 idx를 리턴한다.

 

 


 

 

이분 탐색에서 가장 중요하다고 생각하는 점은

변하는 가변 값과 변하지 않는 기준 값이다.

 

기준 값과 가변 값과의 비교를 통해 s, e 범위를 결정한다.

 

현재 코드에서는 찾을 숫자(기준 값)를 기준으로

mid를 이용해서 가변 값과의 비교를 통해 s, e를 결정하고 있지만

Prametric Search를 하게 되면 기준 값은 문제를 보고 결정을 해주어야 한다.

 

 


 

public static long binarySearch(int need){
    long s = 0;
    long e = 2_000_000_000;
    long returnHeight = 0;

    while(s <= e){
        long mid = (s + e) / 2;

        // 기준값 설정
        // 자른 값들의 총합을 이용
        long sum = 0;
        for(int i = 0; i<arr.length; i++){
            int ele = arr[i];
            if(ele > mid)
                sum += ele - mid;
        }

        if(sum >= need) { // 조건을 만족하므로 범위를 더 엄밀하게 줄임
            s = mid + 1;
            returnHeight = mid;    // 조건을 충족한다면 일단 저장
        }else if(sum < need)
            e = mid - 1;
    }
    return returnHeight;
}

 

백준 2805 나무자르기 문제의 코드 일부다.

 

해당 문제에서 기준 값은 need 이다. (함수의 매개변수로 받고 있음)

가변 값은 mid를 이용해 구한 sum이다.

 

mid를 기준으로 자른 값들의 총합(sum)이 need 이상이면,

더 엄밀하게 자르기 위해 s를 더 올려서 mid를 높인다.

만족하지 않는다면 e를 낮춰서 mid를 낮춘다.

 

탐색 범위를 마지막에 만족하는 것까지 좁힐 수 있으므로 최대값을 구할 수 있다.

 

 

 

이분 탐색, 매개 변수 탐색을 구현할 땐 기준 값, 가변 값을 무엇으로 할 지 항상 생각하자.

 

 


Prametric Search 문제

 

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net

 


 

https://www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

 

반응형
반응형

문자열 함수

 

문자열 함수에서 인자가 여러 개일 때 적용대상 @column 위치는 거의 맨 앞이다.

 

concat

select concat(@column, " ", @column) from books;

 

concat_ws

select concat("구분자", @column, @column) from books;

 

substr

substring

substring(@column, start, end) 앞 ~ 뒤 [모두 포함]

substring(@column, start) 앞부터 count

substring(@column, -start) 뒤부터 count

 

replace

replace(@column, "바뀌기 전 문자", "바뀐 후 문자")

 

reverse

reverse(@column)

 

char_length

char_length(@column)

 

upper

대문자로 변경

 

lower

소문자로 변경

 

LPAD

lpad(@column, 총길이, 채울 문자)

 

RPAD

rpad(@column, 총길이, 채울 문자)

 

Binary

binary(@column)  대소문자를 구분한다.

@sql 

where binary(name) like "%C%"

 

 


 

형 변환

cast(@column as type)

type - unsigned, signed, decimal, char, date, datetime

 


숫자 함수

 

ABS(숫자) : 절댓값

 

CEIL(숫자) : 값보다 큰 정수 중 가장 작은 정수 // 4.7 -> 5

FLOOR(숫자) : 값보다 작은 정수 중 가장 큰 정수 // 4.7 -> 4

ROUND(숫자, 자릿수) : 자릿수 기준 반올림 

TRUNCATE(숫자, 자릿수) : 자릿수 기준 버림

 

POW(X, Y)  : 제곱

SQRT(숫자) : 제곱근

MOD(분자, 분모) : 나머지

 

GREATEST(숫자1, 숫자2, ...) : 가장 큰 수

LEAST(숫자1, 숫자2, ...) : 가장 작은 수

 


날짜 함수

 

year(), month(), day(), hour(), minute(), second()

 

date(), time()

 

date_format(@column , '% H')

문자를 얻을 땐 % 대문자

숫자를 얻을 땐 % 소문자

 

date_diff(@column , INTERVAL 1 MONTH)

date_add(@column , INTERVAL 1 MONTH)

 

 

datetime +- INTERVAL expr unit

 

@sql

  • SELECT DATE_ADD(birthdt, INTERVAL 1 MONTH) FROM people
  • SELECT DATE_ADD(birthdt, INTERVAL 10 SECOND) FROM people;
  • SELECT DATE_ADD(birthdt, INTERVAL 3 QUARTER) FROM people;
  • SELECT birthday + INTERVAL 1 MONTH FROM people;
  • SELECT birthday - INTERVAL 5 MONTH FROM people;

 

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format

 

MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions

12.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 11.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats

dev.mysql.com

 

 

 


랭크

 

rank() over (order by @column [asc or desc]) // 중복, 순위 밀림 => 1, 1, 1, 4 ...

dense_rank() over (order by @column [asc or desc]) // 중복, 순위 밀리지 않음 => 1, 1, 1, 2, 2 ...

row_number() over (order by @column [asc or desc])  //  순서대로

select 절에서 만들어지기 때문에 Oracle rownum처럼 추가로 view로 만들어서 정렬할 필요가 없다.

 


문법

 

distinct 

중복 행 제거 (컬럼이 아닌, 행 전체 기준)

 

order by

[option] asc, desc 

 

limit

0부터 N까지 조회

특이한 점은 전체를 조회할 때 N을 큰 숫자로 지정함

ex) limit 0, 19221032181328091

 

like, not like

where @column like '% 문자%' // 모든 문자, % 자리에 어떠한 문자도 없어도 조회

where @column like '_문자' // 한 개, 숫자 자릿수도 가능

 

between

@column between 3 and 15 // 3 이상 15 이하

 

if(조건식, true일 경우, false일 경우)

 

ifnull(@column, null일 경우)

 


집계 group by

 

mysql5 -> mysql8 변경사항

 

 

select min(stock_quantity), title

from books

group by released_year;

min(stock_quantity)는 집계 함수인 반면

title은 집계 함수의 결과가 아니고, group by의 대상도 아니라서

여러 값이 존재해서 오류를 일으키거나, 임의의 값을 가져오게 된다.

 

 

select min(stock_quantity)title 

from books

group by title;

title이 group by의 대상이라서, 대표 값이 명확히 있기 때문에 가능하다.

 

 

group by 이후에 min(stock_quantitiy) 행을 보고자 할 때 서브 쿼리를 활용

select * 

from books 

where stock_quantity 

in  (select min(stock_quantity)

       from books

       group by released_year);

 

 

group by 

select집계 함수, group by 대상만 사용 가능

 

집계 함수

count(), min(), max(), avg(), sum()

집계함수는 중첩할 수 없다. max(count(@Column)) 불가능

 

 

null 값을 집계 함수에 포함시키려면 IFNULL, CASE를 사용하면 된다.

EX) SUM(IFNULL(<COLUMN>, 1)

 


분기문

 

if (조건식) then

     명령문

elseif (조건식) then

     명령문

else

     명령문

end if

 


 

case

      when (조건식) then 명령문

      when (조건식) then 명령문

      when (조건식) then 명령문

      else

end case

 


 

while(조건식) do

    명령문

end while

 

 

 


조인

 

join(기본 조인), inner join(내부 조인), equi join(동등 조인)은 전부 다 같다.

natural join - join을 수행한다. (단, 조인에 사용한 열은 한 번만 추출)

 

마찬가지로

left outer join과 left join의 차이는 없다.

 

명시하는 방법 때문에 종류가 많아 보이지만 사실 같은 것이 많다. 헷갈리지 말자.

 

조인 종류 

inner join

 

left join

right join

full outer join [mysql 에선 지원하지 않는다.]

 

self join

 

cross join

 


@sql

SELECT g1.pg, g1.af, b.title FROM
(select max(pages) as pg, author_fname as af
 from books group by author_fname) g1
JOIN books b
ON g1.pg = b.pages AND g1.af = b.author_fname;

 

  • from 부속 질의로 필요한 테이블을 만들고 조인하면 유용하다.
  • join 조건에 and를 사용하여 더 분명하게 join 해줄 수 있다.

 

ON table.col BETWEEN 10 AND 20

 

  • join 조건에 between으로 범위 조인도 가능하다.

 


 

UNION

관계없는 테이블을 합칠 수 있음

필드명(as 가능)과 데이터 타입이 같아야 함

중복 값은 기본적으로 제거되지만 필요한 경우 UNION ALL

 

@sql

(select city, char_length(city) from station order by char_length(city) asc, city asc limit 1)
union
(select city, char_length(city) from station order by char_length(city) desc, city asc limit 1);

 


부속 질의

 

select

scalar 부속 질의 (단일행, 단일열)

 

from

inline-view (가상의 테이블을 일시적 생성)

 

where

중첩 부속 질의 

단일 행 단일 열 - 비교 연산자

다중 행 단일 열 - all, any

다중 행 다중 열 - in, exists

 

 


 

단일 행 단일 열 

비교 연산자, select에서도 사용 가능한 scalar 부속 질의

 

다중 행 단일 열   ALL, ANY

any는 부속 질의의 결과가 하나라도 만족하면 true가 된다.

단일 열 이어야 한다.

 

다중 행 다중 열  IN, EXISTS

select * from students s 
join papers p 
on s.id = p.student_id 
where (p.grade, p.student_id) in ( (60, 1), (75, 1) );    # 괄호 필수

 

 

 

 

 

 

 

 

 

 

 

 


 

SQL 프로그래밍

 

delimiter를 변경해주는 이유는 선언 시에 세미콜론이 문장의 끝이 아님을 알려줘야 하므로 변경을 해준다.

 

변수 선언과 대입

set @변수명 = 대입값;

 

 

프로시저

프로시저를 create할 때는 종료 문자 delimiter 변경해주어야 한다.

프로시저 안에서 사용되는 변수 선언 declare 변수명 타입 [default n]

변수의 값 변경은 set

 

 

drop procedure if exists testProcedure;
delimiter $$
create procedure testProcedure(
    in num1 int,           // input
    in num2 int,
    out num3 int,       // output
    out num4 int

)
begin 

   declare num5 int default 5;    // 변수 선언

   set @num10 = 10;    // 변수 선언 대입


    set num3 = num1 + num2;        // 값 변경
    set num4 = num1 - num2;
end $$
delimiter ;

set @add = 0;
set @sub = 0;


call testProcedure(5, 10, @add, @sub);

 

 

 


 

함수

프로시저와의 차이점은 파라미터 in, out 이 없다. 입력만 가능하다.

return 에 반환 데이터 형식을 지정해야 한다.

함수 호출은 select 문장 안에서 호출한다.

함수 내부에서 select 사용이 불가능하다.

 

 


 

커서

 

# 프로시저 내부

 

declare EOR boolean default false;   // 행의 끝을 알릴 변수 

declare 커서명 cursor for (select sql)   // 커서 선언

declare CONTINUE HANDLER for not found set EOR = true;   // 더 읽을 행이 없을 때 동작할 명령어

 

open 커서명

 

cursor_loop  : loop

    fetch 커서명 into 저장할 변수 // 커서 선언 -> 결과 sql 칼럼 개수에 맞게 변수 설정

 

    if EOR then leave cursor_loop   // 더 읽을 행이 없으면 true

    end if

 

    set sum = sum + 결과 변수

end loop cursor_loop

 

close 커서명

 

 

mysql, rownum 만들기
select @rownum:= @rownum +1 as rownum, t.* 
from table1 t, (select @rownum := 0) r;

 

 


 

트리거

삽입, 삭제, 갱신이 일어나면 자동으로 작동되는 개체

삽입, 삭제, 갱신 이전 테이터를 저장 등을 할 수 있다.

after 트리거와 before 트리거 가 있다.

 

create trigger 트리거명 

    after DELETE // 삭제 이후

    on 테이블 // 트리거를 부착할 테이블

    for each row // 각 행마다 적용

begin

    동작할 명령어

end 

 

 

 


create view 뷰네임 as 쿼리

필요한 정보만 노출시켜 보안에 도움이 된다.

복잡한 쿼리를 뷰로 미리 생성해놓고 단순한 쿼리로 조회, 사용할 수 있다.

 

 


인덱스

 

검색 속도가 향상된다.

추가적인 공간이 10% 정도 필요하다.

변경 작업이 자주 발생할 경우 오히려 성능이 낮아진다.

 

 

클러스터드 인덱스 

테이블당 하나만 생성 가능

영어사전처럼 정렬을 인덱스에 맞춰서 해놓는다.

기본키를 지정하면 기본키 정렬에 맞게 클러스터드 인덱스가 자동 생성된다.

클러스터드 인덱스는 기본키에 unique not null 칼럼보다 우선 적용된다.

 

보조 인덱스 (비 클러스터드 인덱스와 비슷한 개념)

여러 개 생성 가능

책의 찾아보기처럼 별도로 존재한다.

칼럼을 unique null로 지정하면 보조 인덱스가 자동 생성된다.

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

[GOORM.IDE]

 

경로이동 : cd node_modules/mysql/sqls
mysql 실행 : mysql
sql file 실행 : source 파일명.sql

 

 

오류: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

명령어 : sudo service mysql restart

 

 


[WORK BENCH]

 

reverse engineer / table -> erd

forward engineer / erd -> table

 

반응형

+ Recent posts