end point에는 7 layer가 존재하지만, 라우터에는 network layer까지만 존재한다.

하위 계층에서 상위 계층에게 서비스를 제공하는 것이다.

Application layer

ex) chrome 브라우저 등: user program

client process와 server process의 의사 소통(다른 컴퓨터 상에 존재하는 프로세스 간 통신)

⇒ os에서 이를 위해 `소켓`이라는 인터페이스를 만들어 놓음.

  • 서버
    • always-on host
    • 고정된 ip 주소
    • data centers for scaling
  • 클라이언트
    • communication with server
    • may be intermittently connected
    • may have dynamic ip addresses
    • do not communicate directly with each other

소켓의 주소 = ip address + port

  • ip 주소: 인터넷 상의 컴퓨터 주소
  • port: 같은 인터넷 상의 특정 컴퓨터의 소켓

 

왜 웹 서버들이 동일한 포트를 쓸까? (80) 

www.google.com → DNS → ip 주소로 변환(default port:80)

서버는 24시간 켜져 있어야 하고, 주소가 일정해야 한다. 주소를 해석해 주는 것이 DNS인데, 
포트 넘버까지 다른 것 보다 같도록 정하는 것이 더 효율적이기 때문이다. 
즉, DNS에서 포트 넘버까지 다 만들어 주어야 하기 때문이다.

 

 

transport 계층에서 이러한 서비스가 제공되면 좋겠다는 희망 사항

  • data integrity: 보낸 데이터가 유실되지 않고 온전하게 목적지까지 도착했으면 좋겠다. ⇒ transport layer(tcp)에서 제

  • throughput: 보낸 데이터가 최소 ~~ bps, 전달 용량에 대한 희망 사항

  • timing: 보낸 데이터가 ~~ 시간 안에 도착 했으면 좋겠다.

  • security: 내가 보낸 데이터가 안전 했으면 좋겠다.

    ⇒ 나머지는 제공x

 

HTTP

hypertext transfer protocol

hypertext: text 인데 중간 중간에 다른 텍스트를 가리키는 링크가 존재

  • tcp 프로토콜을 사용
    • request, response 이전에 connection을 생성한다.
  • stateless
    • HTTP는 단순해서 요청 들어오면 응답을 보내주고 끝이다. 상대방의 상태 등을 기억하지 않는다.

1. non-persistent HTTP: connection 맺은 뒤 통신 완료 후 connection을 끊는 경우

2. persistent HTTP: connection 맺은 뒤 통신 완료 후 connection을 끊지 않고 재 사용하는 경우

- 실제로는 Pipeline과 persistent HTTP가 결합된 방식을 사용

 

소켓

client process와 server process간의 통신

os가 제공해주는 api의 일종으로, os에는 application layer의 하위 계층들이 구현되어있다. 즉, application layer와 os 사이를 이어주는 transport layer 인터페이스를 사용해 주어야 한다. os에는 transport layer를 tcp와 udp, 2가지 방식을 구현한다. application layer는 이 구현되어 있는 소켓 중에 tcp, udp 둘 중 하나의 방식을 선택한다.

 

1. tcp socket = socket stream

 

 

  • 신뢰성 제공 및 순서대로 전송(연결성)
  • bidirectional

 

 

 

 

 

  • tcp socket function

  • int socket(int domain, int type, int protocol)
    • type: udp인지 tcp인지
    • 리턴 값은 생성된 소켓의 id

 

  • int bind(int sockfd, struct socketaddr* myaddr, int addrlen)
    • 생성한 소켓의 id를 사용해서 특정 포트에 바인딩 하겠다.
    • 클라이언트에서 바인드 함수를 사용하지 않는 이유는, 바인드 함수는 특정 소켓을 어떤 포트에 바인드 해주는 개념인데, 클라이언트는 특정 포트에 바인드 할 필요가 없기 때문이다. (아무 포트나 쓰면 됨)

 

  • int listen(int sockfd, int backlog)
    • 방금 생성한 소켓을 listen 용도로 사용할 것이며, 동시에 request가 들어올 경우, 최대 n개까지 큐에 담아 놓고 순서대로 처리하겠다.

 

  • int accept(int sockfd, struct sockaddr* cliaddr, int* addrlen)
    • 다 준비 되었으니 클라이언트로부터 연락을 기다리겠다.
    • 이 함수는 실행 되면 block되어 있다가 클라이언트로부터 요청이 들어오면 리턴 된다. 리턴이 될 때, 두 번째 파라미터에 클라이언트의 ip와 port 주소가 저장된다. (=서버에 클라이언트의 주소가 저장된다)

 

 

 

 

 

 

2. udp socket = socket datagram

 

  • 신뢰성을 제공하지 않으며 no order guarantees (비연결성)
  • no notion of connection: app indicates destination for each packet
  • can send or receive

 

 

 

 

 

 

  • udp socket function

 

 

 

  • int sendto(int sockfd, char* buf, size_t nbytes, int flags, struct sockaddr* destaddr, int addrlen)

 

  • int close(int sockfd)
    • 데이터 교환이 끝난 후, 최종적으로 close해 주어야 다른 프로세스가 사용할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

소켓의 경우, 프로그램이 에러 등이 나서 cntrl+c/z 등을 눌러 멈추면 프로세스는 죽지만, 그 프로세스에서 바인드 한 포트는 한동안 release 되지 않고 가지고 있다. 그래서 같은 포트를 쓸 수 없는 경우가 있다.

 

아래 시스템 콜을 쓰면 cntrl+c 등을 눌러줄 때 소켓 관련 자료 구조들이 다 release된다.

#include<signal.h>
void cleanExit(){exit(0);}

in socket code:
signal(SIGTERM, cleanExit);
signal(SIGINT, cleanExit);

 

presentation layer

운영체계의 한 부분으로 입력, 출력되는 데이터를 하나의 표현 형태로 변환하는 계층으로 필요한 번역을 수행한다.

즉 두 장치가 일관되게 전송 데이터를 서로 이해할 수 있도록 하는 역할이다.

 

해당 계층은 클라이언트 구현중에 데이터 교환 포맷을 맞추려고 내가 직접 수행해 준 적이 종종 있던거 같다.

 

데이터 표현이 상이한 응용 프로세스의 독립성을 제공하고, 암호화 한다.

표현 계층(Presentation layer)은 코드 간의 번역을 담당하여 사용자 시스템에서 데이터의 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어 준다. MIME 인코딩이나 암호화 등의 동작이 이 계층에서 이루어진다.

예를 들면, EBCDIC로 인코딩된 문서 파일을 ASCII로 인코딩된 파일로 바꿔 주는 것,

해당 데이터가 TEXT인지, 그림인지, GIF인지 JPG인지의 구분 등이 표현 계층의 몫이다.

  • 사용자의 명령어를 완성 및 결과 표현. 포장/압축/암호화

+ 보안 규약 정의

TLS/SSL : 암호화 프로토콜

  • Transport layer Secure:
  • Secure Socket layer:

ex) HTTP/HTTPS -> TLS/SSL 기술이 사용 된다.

 

  • private key & foreign key 작동 원리

 

session layer

SSH/TLS 제공

응용 간의 제어 역할을 수행하는 통신 세션을 구성하는 계층으로 통신장치 간의 상호작용을 설정하고 유지하며, 동기화하여 사용자 간의 세션(포트)연결이 유효한지 확인하고 설정하는 역할을 한다.

 

데이터가 통신하기 위한 논리적인 연결을 담당하는데, 해당 논리적인 연결을 세션이라 하는거 같다. 근데 세션이 정확히 어떤건지 이해가 안된다. 세션에 대한 [https://88240.tistory.com/190] 여기의 설명이 좋은거 같다.

 

데이터가 통신하기 위한 논리적인 연결을 말한다. 통신을 하기위한 대문이라고 보면 된다.

 

하지만 4계층에서도 연결을 맺고 종료할 수 있기 때문에 우리가 어느 계층에서 통신이 끊어 졌나 판단하기는 한계가 있다.

그러므로 세션 계층은 4 계층과 무관하게 응용 프로그램 관점에서 봐야 한다.

 

 

세션 설정, 유지, 종료, 전송 중단시 복구 등의 기능이 있다.

세션 계층(Session layer)은 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다.

 

동시 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex)의 통신과 함께, 체크 포인팅과 유휴, 종료, 다시 시작 과정 등을 수행한다.

 

이 계층은 TCP/IP 세션을 만들고 없애는 책임을 진다.

 

통신하는 사용자들을 동기화하고 오류복구 명령들을 일괄적으로 다룬다.

통신을 하기 위한 세션을 확립/ 유지 /중단 (운영체제가 해줌)

 

소켓을 만드는 layer

↔ 쿠키: 중요 정보 x, 하이 재킹 당하기 쉽기 때문에

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

HTTP/1.1 와 HTTP/2 (Feat TCP, UDP, TLS)  (0) 2021.02.08
network edge/core와 데이터를 전달하는 방식  (0) 2021.01.18

 

  • network edge
    • end systems(hosts)
      • run application programs ex. web, email
    • client/server model
      • client host request, receives service from always-on server
      • ex. web browser/server, email client/server
    • peer-peer model
      • minimal use of dedicated servers
      • ex. skype, bitTorrent, KaZaA
  • network core
  • access networks, physical media

 

network core에서 데이터를 전달하는 방식

1. circuit switching

 

 

 

  • 출발지에서 목적지까지 가는 길을 다 계산해 놓는다.
  • bandwidth에 따라 사용할 수 있는 인원 제한이 있다.
  • ex. 유선 전화 방식

 

 

 

 

 

 

 

 

 

 

 

2. packet switching - 인터넷에서 사용

  • 유저에게 패킷을 받아서 그때그때 포워딩 해준다.

  • 많은 사용자가 몰리면 각자의 사용 시간에 따라 분산되어서 제약 없이 사용할 수 있다.

  • packet switching의 단점: delay, loss

  • processing delay: 먼저 라우터에서 패킷을 받으면, 맨 먼저 패킷 검사를 한다.(어디로 가야하는지, 제대로 된 패킷인지 확인) ⇒ 라우터 성능에 따라 줄일 수 있다.
  • queueing delay: 라우터에서 나가는 속도보다 쌓이는 속도가 빠르게 되면 라우터 안에서 줄이 생길텐데, 잠깐 저장하는 큐가 있다. 이 경우 자신의 순서가 될 때까지 기다려야 한다. ⇒ 사용자들이 사용하는 패턴에 따라 달라진다. 네트워크 상황에서 발생하는 거의 모든 delay의 원인 ⇒ 큐의 크기도 제한되어 있기 때문에, 너무 많은 데이터가 들어오면 유실된다. 인터넷에서 발생하는 거의 모든 loss의 원인
  • transmission delay: 내 차례가 되어서 나가는 순간, 첫번째 비트부터 마지막 비트까지 데이터가 모두 나가는 순간까지 걸리는 시간이 있다. ⇒ packet length(bits)/link bandwidth(bps) ⇒ 케이블 공사를 해서 bandwidth를 늘리면 줄일 수 있다.
  • propagation delay: 물리적인 link를 통해 sender에서 receiver까지 도달하는 시간을 의미한다. 보통 통신 선의 종류에 따라 크게 달라짐 ⇒ length of physical link/propagation speed in medium(=빛의 속도)

그러면 패킷 유실이 일어난다면 재 전송이 필요한데, 누가 재전송 할 것이냐?

⇒ 맨 처음 라우터가 재전송: 왜냐하면 라우터는 빠르게 전달하는 것이 목적이므로, 단순 작업을 하는 것을 최대한 목표로 한다. 지능적인 작업은 최대한 edge에 몰아 넣도록 한다.

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

HTTP/1.1 와 HTTP/2 (Feat TCP, UDP, TLS)  (0) 2021.02.08
OSI 7 layers  (0) 2021.01.18

https://programmers.co.kr/learn/challenges?tab=sql_practice_kit

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

* SELECT

SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC; # 모든 레코드 조회

c.f. ORDER BY 1: 테이블 첫번째 컬럼 순서 번호에 따라 (오름차순)정렬

 

만약 ORDER BY를 생략하는 경우 DB에서 row에 접근하는 방식인 cursor의 스펙이 반영된다. (mysql의 경우는 PK 중심으로 정렬)

https://dba.stackexchange.com/questions/6051/what-is-the-default-order-of-records-for-a-select-statement-in-mysql

 

What is the default order of records for a SELECT statement in MySQL?

Suppose you have the following table and data: create table t ( k int, v int, index k(k) ) engine=memory; insert into t (k, v) values (10, 1), (10, 2), (10, 3); When

dba.stackexchange.com

SELECT NAME, DATETIME from ANIMAL_INS ORDER BY ANIMAL_ID DESC; # 역순 정렬
SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick' # 아픈 동물 찾기
ORDER BY ANIMAL_ID ASC;
SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS 
WHERE INTAKE_CONDITION != 'Aged' # 어린 동물 찾기
ORDER BY ANIMAL_ID ASC;
SELECT ANIMAL_ID, NAME, DATETIME 
FROM ANIMAL_INS 
ORDER BY NAME ASC, # 오름차순 정렬
DATETIME DESC; # 내림차순 정렬
SELECT NAME from ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1; # 상위 N개 레코드

 

* SUM, MAX, MIN

SELECT DATETIME from ANIMAL_INS ORDER BY DATETIME DESC limit 1; # 최댓값 구하기
SELECT max(datetime) from ANIMAL_INS # 최댓값 구하기
SELECT count(*) AS count FROM ANIMAL_INS; # 동물의 수 구하기
SELECT COUNT(*) 
FROM (SELECT DISTINCT NAME FROM ANIMAL_INS WHERE NAME IS NOT NULL) AS A; # 중복 제거

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS

여기서 두번째 풀이는 COUNT 안에 컬럼이 들어갔기 때문에 NULL은 자동으로 제외되므로 따로 IS NOT NULL을 해줄 필요 없음

 

* GROUP BY

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS COUNT
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC
SELECT NAME, COUNT(NAME) AS COUNT 
FROM ANIMAL_INS 
GROUP BY NAME HAVING COUNT(NAME)>1 
ORDER BY NAME ASC;

c.f. COUNT(*)와 COUNT(NAME)의 차이:

https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_count

 

MySQL :: MySQL 8.0 Reference Manual

 

dev.mysql.com

* 의 경우 특정 column이 null값인 경우도 포함한다. 이 문제에서는 NAME column이 NULL인 경우도 COUNT하게 된다.
하지만, COUNT(column)은 해당 column이 NULL값을 갖고 있는 row의 경우 COUNT하지 않는다.

 

c.f. 조건절 HAVING과 WHERE 차이

HAVING: SELECT 문에서 사용된 그룹이나 aggregate function(AVG, SUM, MIN, MAX, VAR,COUNT, GROUPING, STDEV 등)에 조건을 부여해서 결과를 세분화한다. SELECT 문과 함께만 사용할 수 있으며, 주로 GROUP BY와 함께 쓰인다. 그룹화된 결과에만 적용될 수 있다.

 

즉, where 같은 경우는 모든 필드에 대해 우선적으로 조건을 주고
having은 group by 된 이후 그룹화되어진 새로운 테이블에 조건을 줄 수 있다는 차이점이 있다.

SELECT hour(datetime) AS hour, count(*) AS count 
FROM animal_outs
ORDER BY hour

c.f. HOUR(time) : 해당날짜의 시간을 반환한다. 결과값은 0 에서 23 이다.

http://happycgi.com/community/bbs_detail.php?bbs_num=43&tb=board_man_story

 

[MYSQL] 시간 관련 함수 정리 - happycgi

MySQL - 문서 제목 : MySQL 날짜 관련 함수- DAYOFWEEK(date) : 해당 날짜의 요일을 숫자로 반환한다. 일요일은 1, 토요일은 7 이다.- 예 : select DAYOFWEEK('1998-02-03');- WEEKDAY(date) : 해당 날짜에 대한 요일을 반환

happycgi.com

WITH RECURSIVE rgen (n)
  AS (SELECT 0 # 0부터 22개 생성(0~23까지)
       UNION ALL
      SELECT n+1
        FROM rgen
       WHERE n < 23)
SELECT TIME.n AS HOUR, IF(RESULT.COUNT IS NULL , 0, RESULT.COUNT) AS COUNT
FROM(SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT 
        FROM ANIMAL_OUTS AS OUTS
        GROUP BY HOUR
        ORDER BY HOUR) AS RESULT RIGHT OUTER JOIN rgen AS TIME
ON RESULT.HOUR = TIME.n

이 문제가 어려웠던 이유는 이렇게 count가 0인 값도 나타내주어야 했는데,

그냥 count를 쓸 경우 0인 값이 나타나지 않았다. (행이 없으면 row가 만들어지지 않는다.)

 

따라서 count==0이면 0으로 반환하도록 하고싶을 때 뭔가 outer join이 필요하다.

 

위 풀이는 WITH RECURSIVE 구문을 이용하여 리스트 데이터를 생성하는 방법이다.

WITH RECURSIVE 구문을 이용하여 만든 테이블은 아래와 같이 생겼다.

 n

---

 0

 1

 ...

23

 

다른 방법)

사용자 정의 변수는 @를 앞에 붙이고 사용한다. (초기화 하지 않으면 디폴트 값은 NULL이다.)

SET 또는 SELECT 문을 사용하여 변수를 초기화 할 수 있다.

SET @HOUR = -1;
SELECT @HOUR := @HOUR + 1 AS HOUR, (
    select count(*) 
    from animal_outs 
    where hour(datetime) = @hour) AS COUNT 
FROM ANIMAL_OUTS 
GROUP BY HOUR 
HAVING HOUR BETWEEN 0 AND 23

 

* IS NULL

SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL ORDER BY ANIMAL_ID;

c.f. is null과 = null의 차이

https://stackoverflow.com/questions/9581745/sql-is-null-and-null

 

SQL is null and = null

Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference between IS NULL and =NULL What is the difference between where x is null and where x = ...

stackoverflow.com

NULL은 'unknown' 값이므로 NULL과 비교한 쿼리의 결과는 항상 unknown이다.

(null is special value which does not equal anything --> 따라서 항상 false 리턴)

따라서 NULL인지 확인하는 IS (NOT) NULL 구문을 사용하도록 한다.

SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL ORDER BY ANIMAL_ID;
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name'), SEX_UPON_INTAKE FROM ANIMAL_INS;

c.f. IFNULL: 해당 필드의 값이 NULL을 반환할때 다른 값으로 출력할 수 있도록 하는 함수

다른 방법으로는 case when 조건 then 결과 문을 사용할 수 있다.

SELECT ANIMAL_TYPE, 
    case when NAME is null 
    then 'No name' 
    else NAME 
    end, 
    SEX_UPON_INTAKE 
FROM ANIMAL_INS;

 

* JOIN

c.f. join의 종류

1. INNER JOIN: default join 방식, 두 테이블 모두 있는 경우
2. OUTER JOIN: left 또는 right로 지정된 한쪽 테이블의 모든 결과를 보여줌
3. CROSS JOIN: 두개의 테이블에서 가능한 모든 조합을 찾는다. --> ON 구문을 사용할 수 없다
4. FULL OUTER JOIN: LEFT OUTER JOIN + RIGHT OUTER JOIN 후 중복 제거
5. SELF JOIN: 자기 자신과의 JOIN (Self join이라는 명령어가 따로 있는 것은 아니고, outer join이던 inner join이던 자기 자신과 조인할 경우는 self join이 된다)

SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS AS OUTS
LEFT OUTER JOIN ANIMAL_INS AS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL;
SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS AS INS JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME;
SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS AS INS LEFT OUTER JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY INS.DATETIME ASC
LIMIT 3;
SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME
FROM ANIMAL_INS AS INS INNER JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE != OUTS.SEX_UPON_OUTCOME AND INS.SEX_UPON_INTAKE LIKE '%Intact%'

c.f. LIKE 구문 사용법

https://support.microsoft.com/ko-kr/office/like-%EC%A1%B0%EA%B1%B4%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B0%BE%EA%B8%B0-65b07c8a-b314-435a-8b48-2b911856d4f9

 

LIKE 조건을 사용하여 데이터 찾기

LIKE 조건을 사용하여 특정 패턴과 일치하는 데이터를 찾을 수 있습니다.

support.microsoft.com

 

* String, Date

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS 
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty') 
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS 
WHERE ANIMAL_TYPE='Dog' AND (NAME LIKE '%EL%' OR NAME LIKE '%el%') 
ORDER BY NAME;
SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%', 'O', 'X') AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID


SELECT  ANIMAL_ID,
        NAME,
        IF(SEX_UPON_INTAKE REGEXP 'Neutered|Spayed', 'O' , 'X') AS 중성화
FROM    ANIMAL_INS

 

SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_INS AS INS , ANIMAL_OUTS AS OUTS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY DATEDIFF(OUTS.DATETIME, INS.DATETIME) DESC
LIMIT 2;

c.f. 두 날짜 간 차이를 계산하는 함수 DATEDIFF vs TIMESTAMPDIFF vs TIMEDIFF

DATEDIFF: 단순한 날짜 차이

TIMEDIFF: 두 시간의 차이 계산

TIMESTAMPDIFF: 차이의 단위(년도, 분기, 월, 주, 일, 시, 분, 초)를 지정하여 계산

  • SECOND : 초
  • MINUTE : 분
  • HOUR : 시
  • DAY : 일
  • WEEK : 주
  • MONTH : 월
  • QUARTER : 분기
  • YEAR : 년도
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME ,'%Y-%m-%d' ) as 날짜
FROM ANIMAL_INS ORDER BY ANIMAL_ID

c.f. DATE_FORMAT: 시간을 원하는 형태로 반환하는 함수, 대소문자 주의

 


쿼리 처리 순서

1. 구문 분석(Parsing)

해당 쿼리가 문법적으로 틀리지 않은지 확인. 해당 구문을 SQL 서버가 이해할 수 있는 단위들로 분해하는 과정.

만약 구문이 부정확하다면 여기서 처리를 중단. 이 문장이 일괄 처리(batch) 내에 있다면 일괄 처리 전체를 중단.(Batch abort : Batch 중 하나라도 syntax error가 있다면 전체 batch가 실행되지 않는다.)

2. 표준화(Standardization)

실제로 필요없는 부분들이 제거. 표준화된 쿼리 트리(Standard Query Tree)가 만들어 진다.

3. 최적화(Optimization)

통계나 조각 정보 등을 바탕으로 실행 계획을 만들어 낸다. 쿼리처리에서 매우 중요한 단계

① 쿼리 분석 : 검색 제한자(SARG)인지 조인 조건인지 판단.

② 인덱스 선택 : 분포 통계 정보를 이용하여 인덱스검색이나 테이블 스캔 중의 하나를 선택. 여러 인덱스 중 가장 효율적인 인덱스를 선택

③ 조인 처리 : JOIN, UNION, GROUP BY, ORDER BY 절을 가지고 있는지 확인하여 적절한 작업 순서를 선택

이 단계의 출력은 실행 계획(Execution Plan) 이다.

4. 컴파일(Compilation)

컴파일을 하면 이진 코드가 생성된다. 일반적인 경우에는 컴파일하고 나면 .exe, .dll 등의 이진 파일이 만들어 지는데, SQL Server에서는 그냥 메모리(프로시저 캐시)에만 올린다. 그래서 컴파일 속도가 매우 빠르다.

5. 실행(Execute)

엑세스 루틴으로 가서 실제 처리를 하고 결과를 돌려준다.

 


SELECT 실행 순서

-문법 순서-

SELECT                            - 1

FROM                               - 2

WHERE                             - 3

GROUP BY                        - 4

HAVING                            - 5

ORDER BY                        - 6

 

-실행 순서-

FROM                               - 1 해당 데이터가 있는 곳을 찾아가서

WHERE                             - 2 조건에 맞는 데이터만 가져와서

GROUP BY                        - 3 원하는 데이터로 가공

HAVING                             - 4 가공한 데이터에서 조건에 맞는 것만

SELECT                            - 5 뽑아내서

ORDER BY                         - 6 정렬



출처: https://police84.tistory.com/69

 

쿼리 처리 과정 / SELECT 실행순서

쿼리가 처리되는 과정은 다음과 같다. 1. 구문 분석(Parsing) 해당 쿼리가 문법적으로 틀리지 않은지 확인. 해당 구문을 SQL 서버가 이해할 수 있는 단위들로 분해하는 과정. 만약 구문이 부정확하다

police84.tistory.com

 

+ Recent posts