<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: orca orcinus</title>
    <description>The latest articles on DEV Community by orca orcinus (@orca_orcinus_2710ff43c693).</description>
    <link>https://dev.to/orca_orcinus_2710ff43c693</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3651118%2F7361ffb0-5a06-4164-bee6-8fbf558a31c8.png</url>
      <title>DEV Community: orca orcinus</title>
      <link>https://dev.to/orca_orcinus_2710ff43c693</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orca_orcinus_2710ff43c693"/>
    <language>en</language>
    <item>
      <title>이사가요</title>
      <dc:creator>orca orcinus</dc:creator>
      <pubDate>Thu, 18 Dec 2025 09:29:18 +0000</pubDate>
      <link>https://dev.to/orca_orcinus_2710ff43c693/isagayo-32p8</link>
      <guid>https://dev.to/orca_orcinus_2710ff43c693/isagayo-32p8</guid>
      <description>&lt;p&gt;dev.to 한글 입력이 자꾸 깨져서&lt;/p&gt;

&lt;p&gt;&lt;a href="https://velog.io/@orca_orcinus/posts" rel="noopener noreferrer"&gt;https://velog.io/@orca_orcinus/posts&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>머신러닝을 위한 데이터 전처리</title>
      <dc:creator>orca orcinus</dc:creator>
      <pubDate>Mon, 08 Dec 2025 05:56:05 +0000</pubDate>
      <link>https://dev.to/orca_orcinus_2710ff43c693/meosinreoningeul-wihan-deiteo-jeonceori-ih7</link>
      <guid>https://dev.to/orca_orcinus_2710ff43c693/meosinreoningeul-wihan-deiteo-jeonceori-ih7</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. 데이터 클리닝&lt;/strong&gt;&lt;br&gt;
-&amp;gt; 모델 학습에 방해가 되는 요소를 제거하거나 수정하여 데이터 품질을 올린다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 데이터 트랜스포메이션&lt;/strong&gt;&lt;br&gt;
-&amp;gt; 데이터를 알고리즘이 다루기 좋은 형태/분포로 바꾼다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 피처 엔지니어링&lt;/strong&gt;&lt;br&gt;
-&amp;gt; 모델 학습 성능을 높일 수 있는 새로운 변수를 만들어낸다.&lt;/p&gt;

&lt;p&gt;내가 사용하려고 만든 작업 플로우는 아래와 같다.&lt;/p&gt;

&lt;p&gt;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0. 데이터 파악&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;수치형&lt;br&gt;
문자열&lt;br&gt;
수치 + 문자열&lt;br&gt;
수치인척 문자열&lt;/p&gt;

&lt;p&gt;어떤 컬럼들이 있는지 의미 확인&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 정제&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1-1. 중복값 삭제&lt;br&gt;
1-2. 수치인척 문자열 -&amp;gt; 수치&lt;/p&gt;

&lt;p&gt;1-3. 범주형 처리 (순서 있는 문자열 -&amp;gt; 수치)&lt;br&gt;
1-4. 결측치 처리&lt;/p&gt;

&lt;p&gt;a) 대체&lt;/p&gt;

&lt;p&gt;숫자형 - 중앙값, 평균, 상수&lt;br&gt;
범주형 - 최빈값, 'Unknown'(특히 의미있는 결측)&lt;/p&gt;

&lt;p&gt;b) 삭제&lt;/p&gt;

&lt;p&gt;행 - 결측치가 적을 때&lt;br&gt;
-&amp;gt; 행 내에서 말고, 결측 행이 적을 때를 뜻함&lt;br&gt;
-&amp;gt; 행 내에서 결측치가 많으면 지워야지&lt;/p&gt;

&lt;p&gt;열 - 결측치가 많을 때&lt;br&gt;
-&amp;gt; 단, 의미있는 결측의 경우 삭제하지 않고 위와 같이 대체한다&lt;/p&gt;

&lt;p&gt;1-5. 이상치 처리 (에러 및 통계적 아웃라이어)&lt;/p&gt;

&lt;p&gt;먼저 명백한 오류인, 논리적으로 불가능한 에러 값을 처리한다&lt;/p&gt;

&lt;p&gt;박스플랏(IQR) - 히스트플랏kde(히스토그램) 순으로 모든 컬럼 확인.&lt;/p&gt;

&lt;p&gt;통계적 아웃라이어 처리 방법&lt;br&gt;
지도학습의 경우 타깃(y) - 피처(x) 분리해서 생각&lt;br&gt;
타깃은 원래 성격을 최대한 보존. 변환까진 괜찮은데 삭제/대체 최소화&lt;/p&gt;

&lt;p&gt;이후&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;대체 (클리핑)&lt;/li&gt;
&lt;li&gt;변환 (로그)&lt;/li&gt;
&lt;li&gt;삭제&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;2. 인코딩 - 원핫 (순서 없는 범주형)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;지도학습은 타깃(y) 피처(x) 분리.&lt;/p&gt;

&lt;p&gt;컬럼을 따로 지정할 수도 있지만&lt;br&gt;
그냥 넣어도 수치형이 아닌 것들을 알아서 인코딩한다&lt;br&gt;
표면적으로 수치형인데 개념적으로 범주형이라 인코딩하고 싶으면 수동으로 지정해야함&lt;/p&gt;

&lt;p&gt;데이트타임이 좀 특이한데 그냥 겟더미즈에 넣으면 반응 안하고 무시함&lt;br&gt;
근데 머신에 넣으면 오류남. 그래서 뭔가 변환을 해야하는데&lt;br&gt;
그냥 통째로 겟더미즈 수동 변환 컬럼에 지정해버리면 날짜 시간 값마다 더미 만들어서 차원폭발 일어남&lt;br&gt;
그래서 겟더미즈가 아니라 내가 데이트타임에서 원하는 값을 쪼개고 수치형으로 정리해놔야함&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 스케일링&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;스케일링이 필요한 모델의 경우&lt;br&gt;
적합한 스케일러를 고른다&lt;br&gt;
수치형 컬럼만 골라서 넣는다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 피처 엔지니어링&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;피처 엔지니어링은 데이터마다 접근 방식이 매우 다양해서 간단히 말할 수 없다.&lt;/p&gt;

&lt;p&gt;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ&lt;/p&gt;

&lt;p&gt;공부하면서 가장 혼동이 왔던 부분은 값을 수정하는 메서드 3종이다.&lt;br&gt;
이번 기회에 간단히 정리해봤다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) .apply(func)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;replace, map으로 처리하기 어려운 복잡한 로직을 적용한다.&lt;br&gt;
그래서 주로 함수와 같이 사용하는데 하나 알아둬야할 것이 있다.&lt;/p&gt;

&lt;p&gt;함수의 x가 무엇이냐?&lt;br&gt;
시리즈면 '스칼라'를 하나씩 가져와서 처리. 그걸 모아서 반환값은 시리즈.&lt;br&gt;
데이터프레임이면 '시리즈'를 하나씩 가져와서 처리. 그걸 모아서 반환값은 데이터프레임.&lt;/p&gt;

&lt;p&gt;주의! func 뒤에 () 쓰면 안됨. 안 써야 앞에 객체를 받음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) .replace()&lt;/strong&gt;&lt;br&gt;
값 치환.&lt;br&gt;
지정하지 않은 것은 그대로 둔다. (중요)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) .map()&lt;/strong&gt;&lt;br&gt;
이것도 매핑 규칙에 맞춰 값을 치환한다.&lt;br&gt;
그런데 지정하지 않은 것들은 모조리 null로 바뀐다. (중요)&lt;/p&gt;

&lt;p&gt;데이터를 null로 바꿔버리면 아주 위험할 것 같은데 이게 왜 있을까?&lt;br&gt;
무슨 이유로 만들어진 메서드인지 궁금해서 알아봤다.&lt;/p&gt;

&lt;p&gt;목적은 시리즈의 값들을 매핑 규칙에 따라 &lt;strong&gt;'재정의'!!&lt;/strong&gt;&lt;br&gt;
그래서 규칙에 없는 것들은 null로 바꾸는구나.&lt;/p&gt;

&lt;p&gt;이렇게 말하면 조금 더 이해가 쉽다.&lt;br&gt;
"내가 필요한 값만 재정의하고 나머지는 관심 없으므로 null"&lt;/p&gt;

&lt;p&gt;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ&lt;/p&gt;

&lt;p&gt;데이터 전처리는 어느정도 틀이 정해져있는 반복 노동이다.&lt;br&gt;
특히 클리닝과 트랜스포메이션이 그렇다.&lt;br&gt;
따라서, 앞으로 ai에 의해 자동화될 가능성이 굉장히 높다.&lt;/p&gt;

&lt;p&gt;ai가 해준다고 공부를 안해도 된다는 것은 아니다.&lt;br&gt;
나는 ai가 대체할 수 없는 역량을 더 강화하는 것이 효율적이라 생각한다.&lt;br&gt;
도메인 특화 피처 엔지니어링은 오랜 기간 ai가 대체할 수 없을 것 같다.&lt;/p&gt;

&lt;p&gt;그럼 결국 무엇이 중요한가? 돌고돌아 도메인 지식이 또 중요해진다.&lt;br&gt;
데이터 사이언스는 시작과 끝이 도메인 지식인 것 같다.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>machinelearning</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>SQL 을 조금 더 알아보자</title>
      <dc:creator>orca orcinus</dc:creator>
      <pubDate>Mon, 08 Dec 2025 04:58:56 +0000</pubDate>
      <link>https://dev.to/orca_orcinus_2710ff43c693/sql-eul-jogeum-deo-alaboja-1k0i</link>
      <guid>https://dev.to/orca_orcinus_2710ff43c693/sql-eul-jogeum-deo-alaboja-1k0i</guid>
      <description>&lt;p&gt;&lt;strong&gt;&amp;lt;목차&amp;gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SELECT 와 별칭의 범위&lt;/li&gt;
&lt;li&gt;GROUP BY 작동 원리&lt;/li&gt;
&lt;li&gt;GROUP BY 와 SELECT&lt;/li&gt;
&lt;li&gt;HAVING 이 존재하는 이유&lt;/li&gt;
&lt;li&gt;JOIN 의 실제 작동 원리&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;## 1. SELECT 와 별칭의 범위&lt;/strong&gt;&lt;br&gt;
지난 글에서 SQL의 실제 작동 순서를 알아보았다&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft28uon6ft6s0o70b940y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft28uon6ft6s0o70b940y.png" alt=" " width="564" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;실제로는 SELECT의 작동 위치가&lt;br&gt;
FROM 위가 아닌 HAVING 아래라는 것이 핵심인데&lt;br&gt;
이것을 모를 때 생기는 가장 큰 오해가 있다.&lt;br&gt;
&lt;strong&gt;'SELECT 에서 만든 별칭은 그보다 윗쪽에 있는 절에서는 사용할 수 없다'&lt;/strong&gt;는 것이다.&lt;br&gt;
예를 들면 SELECT에서 만든 AS '별칭'은&lt;br&gt;
그 아래에 있는 ORDER BY에서는 당연히 사용할 수 있지만&lt;br&gt;
윗쪽에 있는 WHERE 절에서는 원칙적으로 사용할 수 없다.&lt;br&gt;
그런데 종종 어떤 곳에서는 WHERE 절에서 사용이 되기도 한다.&lt;br&gt;
그건 저 실수를 저지르는 사람들이 너무 많다보니&lt;br&gt;
최신DB들이 편의성을 위해 인식하도록 바꿔놓은 것이다.&lt;br&gt;
원래는 불가능한 것이 맞다.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. GROUP BY 작동 원리&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdg4y27qbdbdttsi8ylt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdg4y27qbdbdttsi8ylt.png" alt=" " width="477" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;예를 들어, 이런 테이블에서&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT InvoiceNo, COUNT(*) AS cnt
FROM data3
GROUP BY InvoiceNo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GROUP BY와 COUNT(*)을 이용하면&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1tz495fyi68q3vcg8e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1tz495fyi68q3vcg8e1.png" alt=" " width="397" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;이런 결과가 나온다.&lt;br&gt;
그런데 궁금하다.&lt;br&gt;
우리 눈에는 하나의 컬럼 값인데 도대체 어떻게 몇 개인지 출력된 걸까?&lt;br&gt;
GROUP BY는 하나의 컬럼 값만 남기고 삭제하는 것이 아니라&lt;br&gt;
해당 컬럼 값의 이름으로 &lt;strong&gt;'집계용 객체'&lt;/strong&gt;를 만드는 것이다.&lt;br&gt;
데이터 베이스 용어로는 &lt;strong&gt;"결과 셋(Result Set)을 재구성했다"&lt;/strong&gt;라고 한다.&lt;br&gt;
그래서 눈에 보이는 컬럼 값은 하나인데도 여러가지 연산이 가능한 것이다.&lt;br&gt;
예를 들어, 아래테이블을 그룹화하면&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name   age
-----  ----
Alice  20
Alice  21
Alice  23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;내부적으로는 이런 구조가 되는 것이다&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;그룹(name='Alice') → [20,21,23]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;3. GROUP BY 와 SELECT&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;GROUP BY를 처음 사용하면 이런 실수를 자주 한다.&lt;br&gt;
GROUP BY에서 지정한 컬럼이 SELECT에 없는 오류&lt;br&gt;
GROUP BY에서 지정하지 않은 컬럼이 SELECT에 있는 오류&lt;/p&gt;

&lt;p&gt;이런 실수를 반복하다보면 그룹화한 컬럼이 반드시 출력되어야하는구나를 알게되는데&lt;br&gt;
여기서 또 궁금하다.&lt;br&gt;
왜 그렇지?&lt;br&gt;
그리고 SELECT에서 다른 함수들은 왜 출력될 수 있는 거지?&lt;br&gt;
간단히 말하면, &lt;strong&gt;'그룹화한 객체 옆에는 그것을 대표할 수 있는 값만 올 수 있기 때문'&lt;/strong&gt;이다&lt;br&gt;
데이터 베이스의 기본 구조를 떠올려보면&lt;br&gt;
&lt;strong&gt;'하나의 행 = 어떤 하나의 사물/사건의 정보를 담은 단위'&lt;/strong&gt;이다&lt;br&gt;
즉, 행 하나하나가 어떤 사물/사건인 것이다.&lt;br&gt;
그런데 어떤 컬럼이 그룹화 됐을 때,&lt;br&gt;
원래 하던 대로 그 옆에 '하나의 행'에 대한 정보를 넣어버리면?&lt;br&gt;
데이터 베이스의 기본 구조가 완전히 망가진다&lt;br&gt;
테이블 = 어떤 종류의 객체&lt;br&gt;
행 = 그 객체의 개별 인스턴스&lt;br&gt;
컬럼 = 그 인스턴스를 설명하는 속성&lt;br&gt;
이기 때문이다.&lt;br&gt;
이러한 이유로 그룹화 컬럼 옆에는 반드시 그것을 대표하는 값이 와야하는 것이다.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. HAVING 이 존재하는 이유&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;나는 처음 공부할 때, WHERE이 있는데 왜 HAVING이 또 있는지 궁금했다.&lt;br&gt;
왜 굳이 조건 필터링 예약어가 2개일까?&lt;br&gt;
글을 열심히 읽은 독자라면 이제 HAVING이 존재하는 이유를 자연히 알 것이다.&lt;br&gt;
WHERE은 행 단위로 필터링하는 기능을 수행하고&lt;br&gt;
HAVING은 그룹을 필터링하는 기능을 수행한다.&lt;br&gt;
즉, '하나의 행'들로 이루어진 테이블을 필터링하는 것과&lt;br&gt;
'그룹'들로 이루어진 테이블을 필터링하는 것의 차이다.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. JOIN 의 실제 작동 원리&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A) 논리적 관점 - 개념&lt;br&gt;
테이블A와 테이블B를 크로스 조인(Cartesian Product)한다.&lt;br&gt;
곱집합을 만드는 것으로 가능한 모든 조합이 생성 된다&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e81ea7tif33lpl7d6mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e81ea7tif33lpl7d6mi.png" alt=" " width="490" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;예를 들어, 테이블A가 20행이고 테이블B가 30행이면 600행의 테이블이 만들어진다.&lt;br&gt;
여기서 JOIN의 종류와 조건(ON condition)에 맞는 행만 남기는 것이다.&lt;br&gt;
INNER JOIN - 조건에 맞는 행만 남긴다.&lt;br&gt;
LEFT JOIN - 왼쪽 테이블의 행 + 조건에 맞는 행만 남긴다.&lt;br&gt;
이래서 LEFT JOIN을 쓰면 NULL이 들어간 행이 많이 보이는 것이다.&lt;br&gt;
B) 물리적 관점 - 실제 작동&lt;br&gt;
하지만 매번 저렇게 곱집합을 생성해버리면 불필요한 연산량이 폭발하기 떄문에&lt;br&gt;
실제로는 곱집합을 전부 만들지 않도록 똑똑한 알고리즘을 사용하고 있다.&lt;br&gt;
ex. Nested Loop Join, Hash Join 등&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>SQL 공부를 시작할 때 반드시 알아야할 것</title>
      <dc:creator>orca orcinus</dc:creator>
      <pubDate>Mon, 08 Dec 2025 04:58:12 +0000</pubDate>
      <link>https://dev.to/orca_orcinus_2710ff43c693/sql-gongbureul-sijaghal-ddae-bandeusi-alayahal-geos-1cjc</link>
      <guid>https://dev.to/orca_orcinus_2710ff43c693/sql-gongbureul-sijaghal-ddae-bandeusi-alayahal-geos-1cjc</guid>
      <description>&lt;p&gt;이 글을 누른 독자는&lt;br&gt;
SQL을 학습하다 막혀서 검색한 사람일 것으로 가정하고 작성한다.&lt;br&gt;
어떤 목적으로 SQL을 학습하는지는 모르지만 반드시 알아야할 것이 있다.&lt;br&gt;
지금 SQL을 배우는 곳에서 분명히 예약어를 하나씩 알려줄 건데&lt;br&gt;
그렇게 배우면 지식이 파편화돼서 힘들어지는 순간이 분명히 온다&lt;/p&gt;

&lt;p&gt;C, 자바, 파이썬 같은 프로그래밍 언어들은 문법을 하나 배우면&lt;br&gt;
내가 필요한 곳 혹은 쓰고싶은 곳에 넣으면서 각각이 독립적으로 기능하는데&lt;br&gt;
SQL은 커다란 틀이 정해져있어서&lt;br&gt;
작성 순서를 반드시 지켜야하고&lt;br&gt;
해당 절 안에서 사용 가능한 예약어가 무엇인지 알아야한다.&lt;/p&gt;

&lt;p&gt;그래서 쿼리문의 전체 구조를 먼저 알아야 한다.&lt;br&gt;
지금부터 아래의 순서로 글을 작성하겠다.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&amp;lt;목차&amp;gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SQL의 틀&lt;br&gt;
SQL의 실제 작동 순서&lt;br&gt;
서브쿼리 VS WITH(=CTE)&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. SQL의 틀&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;우선 전체 틀을 보여줄테니 외우자.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqp77k7pdcruezk53yjtn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqp77k7pdcruezk53yjtn.webp" alt=" " width="206" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;이것이 SQL의 기본 틀이다.&lt;br&gt;
'틀'이라는 것은 정해진 규칙이니까&lt;br&gt;
의구심을 갖지 말고 외워서 따르도록 한다.&lt;br&gt;
줄바꿈 공백 부분도 의도된 것이니 외우자.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. SQL의 실제 작동 순서&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2epbfey484158ad3ecc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2epbfey484158ad3ecc.webp" alt=" " width="564" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;이것이 SQL의 실제 작동 순서이다.&lt;br&gt;
SELECT는 사실 HAVING 다음에 실행된다. (다음 글에서 추가 설명)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyibtkziolbvcyjtcse7.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyibtkziolbvcyjtcse7.webp" alt=" " width="551" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SQL이라는 것은 결국 이 덩어리가 계속 반복되는 것이다.(조회 기준)&lt;br&gt;
이것을 빨리 깨닫는 것이 매우매우 중요하다.&lt;br&gt;
저 덩어리가 계속 반복되면서&lt;br&gt;
WITH 전처리를 하거나&lt;br&gt;
ORDER BY, LIMIT 출력을 조절하거나&lt;br&gt;
UNION 다른 덩어리와 이어주는 것이다&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. 서브쿼리 vs WITH(=CTE)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;반복되는 덩어리는 '서브쿼리' 형태로&lt;br&gt;
덩어리 안에서조차 반복된다.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyaz0vieacqixuum3mc94.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyaz0vieacqixuum3mc94.webp" alt=" " width="546" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;서브쿼리는 이 위치에서 사용 가능하다.&lt;br&gt;
그런데 쿼리문을 쓰다보면&lt;br&gt;
서브쿼리와 WITH 무엇을 쓸까? 고민되는 순간이 생기는데&lt;br&gt;
&lt;strong&gt;한 번만 쓰는 경우 or 단일 값 필요 -&amp;gt; 서브쿼리&lt;br&gt;
나머지 -&amp;gt; 싹다 WITH&lt;/strong&gt;&lt;br&gt;
이렇게 사용하면 아주 좋다.&lt;br&gt;
아 그리고 너무나 당연하게도&lt;br&gt;
WITH 내부에서조차 저 덩어리가 반복된다.&lt;br&gt;
끝&lt;br&gt;
//추가&lt;br&gt;
서브쿼리, WITH 외에 추가로 VIEW 가 있다.&lt;br&gt;
VIEW를 써야하는 경우도 분명히 있어서 선택을 해야하는데&lt;br&gt;
대부분의 경우 서브쿼리, VIEW 보다 WITH를 쓰는것이 좋다.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
