<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>younghyun.log</title>
        <link>https://velog.io/</link>
        <description>🌱 주니어 백엔드 개발자입니당</description>
        <lastBuildDate>Tue, 24 Sep 2024 07:51:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>younghyun.log</title>
            <url>https://images.velog.io/images/younghyun-na/profile/ce6467bf-0939-4097-81e6-b94c8e96b84b/디즈니_라푼젤_배경화면_고화질_모음_(3).jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. younghyun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/younghyun-na" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스] 징검다리]]></title>
            <link>https://velog.io/@younghyun-na/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A7%95%EA%B2%80%EB%8B%A4%EB%A6%AC</link>
            <guid>https://velog.io/@younghyun-na/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A7%95%EA%B2%80%EB%8B%A4%EB%A6%AC</guid>
            <pubDate>Tue, 24 Sep 2024 07:51:55 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-idea">💡 Idea</h2>
<blockquote>
<p>완전탐색은 불가능한 크기이다 =&gt; <strong>이분탐색</strong></p>
</blockquote>
<h2 id="💬-사고-과정">💬 사고 과정</h2>
<p>distance가 1 이상 1,000,000,000 이하 =&gt; 완전탐색 불가능</p>
<p>start: 가능한 거리의 최소값 (0으로 설정)
end: 가능한 거리의 최대값 (distance로 설정)</p>
<h2 id="💻-code">💻 CODE</h2>
<p>참고한 코드</p>
<pre><code class="language-python">def solution(distance, rocks, n):
    answer = 0
    start, end = 0, distance

    rocks.sort() # 정렬되어 있지 않은 상태이기 때문에 정렬해야한다.

    #이분 탐색
    while start &lt;= end: 
        mid = (start + end) // 2   # 중간값
        del_stones = 0      # 제거한 돌을 카운트
        pre_stone = 0        # 기준이되는 돌(시작지점)

        # 바위 사이의 거리 확인
        for rock in rocks:   # 징검다리 돌면서 
            if rock - pre_stone &lt;  mid: # 돌 사이의 거리가 가정한 값보다 작으면 제거
                del_stones += 1 
            else:         # 아니라면 그 돌을 새로운 기준으로 세운다.
                pre_stone = rock

            if del_stones &gt; n:  # 제거된 돌이 문제 조건 보다 크면 for문을 나온다
                break

        if del_stones &gt; n: # 제거된 돌이 너무 많으면 가정한 값이 큰 것이므로 범위를 작은 쪽으로 줄인다.
            end = mid - 1
        else:        # 반대라면 큰 쪽으로 줄인다.
            answer = mid
            start = mid + 1

    return answer</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 피로도]]></title>
            <link>https://velog.io/@younghyun-na/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%94%BC%EB%A1%9C%EB%8F%84</link>
            <guid>https://velog.io/@younghyun-na/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%94%BC%EB%A1%9C%EB%8F%84</guid>
            <pubDate>Tue, 10 Sep 2024 15:26:25 GMT</pubDate>
            <description><![CDATA[<h2 id="🔎-알고-가기">🔎 알고 가기</h2>
<h4 id="길이-관계없이-모든-순열-구하는-방법-백트래킹">길이 관계없이 모든 순열 구하는 방법 (백트래킹)</h4>
<pre><code class="language-python">
def make_permutations(arr, perm):
    if perm:
        print(perm)
    # 탐색이 완료되는 기준이 명시적으로 없기 때문에 return이 필요하지 않음
    for i in range(len(arr)):
        # 현재 선택한 원소를 제외하고 나머지 원소들로 다시 순열을 만듦
        make_permutations(arr[:i] + arr[i+1:], perm + [arr[i]])

make_permutations(arr, [])</code></pre>
<h2 id="💻-code">💻 CODE</h2>
<p>참고해서 작성한 코드</p>
<pre><code class="language-python"># 필요한 변수
# 해당 순열에 들어간 던전의 개수 (실제 던전 데이터는 필요X) -&gt; cnt
# 현재 피로도 -&gt; k

answer = 0

def dfs(dungeons, k, cnt):
    global answer
    answer = max(answer, cnt)

    for i in range(len(dungeons)):
        if k &gt;= dungeons[i][0]:
            dfs(dungeons[:i]+dungeons[i+1:], k-dungeons[i][1], cnt+1)

def solution(k, dungeons):
    global answer

    dfs(dungeons, k, 0)
    return answer</code></pre>
<p>참고한 코드</p>
<pre><code class="language-python">answer = 0

def dfs(k, cnt, dungeons, visited):
    global answer 
    if cnt &gt; answer:
        answer = cnt

    for i in range(len(dungeons)):
        if not visited[i] and k &gt;= dungeons[i][0]:
            visited[i] = True
            dfs(k - dungeons[i][1], cnt + 1, dungeons, visited)
            visited[i] = False

def solution(k, dungeons):
    global answer
    visited = [False] * len(dungeons)
    dfs(k, 0, dungeons, visited)
    return answer</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 기술 질문]]></title>
            <link>https://velog.io/@younghyun-na/JAVA-%EA%B8%B0%EC%88%A0-%EC%A7%88%EB%AC%B8</link>
            <guid>https://velog.io/@younghyun-na/JAVA-%EA%B8%B0%EC%88%A0-%EC%A7%88%EB%AC%B8</guid>
            <pubDate>Mon, 12 Aug 2024 06:38:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>주 언어가 뭔지, 왜 자바를 선택했는지, 다른 언어보다 좋은 이유가 무엇인지 말해주세요.</li>
</ol>
</blockquote>
<ul>
<li>자바를 선택한 이유는, 객체 지향 언어로서 코드의 재사용성과 유지보수성이 높기 때문입니다<ul>
<li>객체 지향 특성 덕분에 프로젝트에서 코드를 모듈화하고 재사용할 수 있어, 개발 효율성을 크게 향상시킬 수 있었습니다. 또한, 유지보수가 용이해 프로젝트의 버그를 더 빠르고 효과적으로 수정할 수 있었습니다</li>
</ul>
</li>
</ul>
<blockquote>
<ol start="2">
<li>Java의 특징을 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>자바는 객체지향 프로그래밍 언어입니다. </li>
<li>JVM에서 실행되므로, 다양한 플랫폼에서 동일한 코드가 실행될 수 있습니다.</li>
<li>가비지 컬렉션을 통해 자동으로 메모리를 관리합니다. </li>
</ul>
<blockquote>
<ol start="3">
<li>Java의 컴파일 과정에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>자바의 컴파일 과정은 소스 코드를 <code>.java</code> 파일에서 바이트코드가 포함된 <code>.class</code> 파일로 변환하는 단계로 이루어집니다. 이 바이트코드는 JVM에서 실행되며, 플랫폼에 독립적으로 동작할 수 있게 합니다.</li>
</ul>
<blockquote>
<ol start="4">
<li>JVM의 역할에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>JVM이란 자바 가상 머신입니다.</li>
<li>JVM은 메모리를 Heap과 Stack으로 나누어 관리합니다. Garbage Collection은 Heap 영역에서 사용되지 않는 객체를 자동으로 정리해 메모리 누수를 방지합니다.</li>
<li>스택 기반으로 동작하며, 자바 바이트 코드를 OS에 맞게 해석해주는 역할을 하고, 가비지컬렉션을 통해서 자동적인 메모리 관리를 해줍니다.</li>
</ul>
<blockquote>
<ol start="5">
<li>객체지향의 설계원칙(SOLID)에 대해서 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>단일 책임 원칙: 한 클래스는 하나의 책임만 가져야 합니다.</li>
<li>개방-폐쇄 원칙: 확장에는 열려있고, 수정에는 닫혀있어야 합니다.</li>
<li>리스코프 치환 원칙: 하위 타입은 항상 상위 타입을 대체할 수 있어야 합니다. 하위 클래스는 상위 클래스의 동작을 변경하지 않고 확장해야 합니다.</li>
<li>인터페이스 분리 원칙: 인터페이스는 가능한 최소한의 메소드만 포함해야 합니다.</li>
<li>의존관계 역전 원칙: 추상화(인터페이스나 추상 클래스)에 의존하도록 설계하되, 구체적인 클래스(구체적인 구현)에 직접 의존하지 말아야 한다.</li>
</ul>
<blockquote>
<ol start="6">
<li>OOP(객체 지향 프로그래밍)이란?</li>
</ol>
</blockquote>
<ul>
<li>데이터와 그 데이터를 처리하는 메소드를 객체로 묶어, 코드의 재사용성과 유지보수성을 높이는 프로그래밍 패러다임입니다.</li>
</ul>
<blockquote>
<ol start="7">
<li>OOP의 4가지 원칙에 대해서 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>캡슐화: 데이터와 메소드를 하나의 객체로 묶어 외부에서 접근을 제한하고, 내부 구현을 숨깁니다.</li>
<li>상속: 기존 클래스의 속성과 메소드를 새로운 클래스가 물려받아 재사용하고, 계층 구조를 형성합니다.</li>
<li>다형성: 동일한 인터페이스를 통해 다양한 구현체를 사용할 수 있어 코드의 유연성을 높입니다.</li>
<li>추상화: 복잡한 시스템을 단순화하여 핵심 개념만을 모델링하고, 세부 구현을 숨깁니다.</li>
</ul>
<blockquote>
<ol start="8">
<li>객체지향 프로그래밍의 장점은?</li>
</ol>
</blockquote>
<ul>
<li>상속이 가능해 코드의 재사용성이 높고, 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수가 용이합니다.</li>
</ul>
<blockquote>
<ol start="8">
<li>객체지향 vs 절차지향</li>
</ol>
</blockquote>
<ul>
<li>객체지향 프로그래밍은 데이터와 기능을 객체로 묶어 코드의 재사용성과 유지보수성을 높이는 반면,</li>
<li>절차지향 프로그래밍은 데이터를 처리하기 위한 함수 중심으로 프로그램을 구조화하여 순차적으로 실행합니다.</li>
</ul>
<blockquote>
<ol start="9">
<li>오버라이딩과 오버로딩에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>오버라이딩은 상위 클래스의 메소드를 하위 클래스가 재정의하는 것을 말합니다.</li>
<li>오버로딩은 같은 이름의 메소드를 매개변수의 종류나 개수에 따라 여러 개 정의하는 것을 말합니다.</li>
</ul>
<blockquote>
<ol start="10">
<li>불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>생성 후 상태가 변하지 않는 객체로, 대표적인 예로 String 클래스가 있습니다.</li>
</ul>
<blockquote>
<ol start="11">
<li>추상 클래스와 인터페이스를 설명하고, 차이에 대해 설명해주세요. <a href="https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0">Reference</a></li>
</ol>
</blockquote>
<ul>
<li><p>추상 클래스는 일부 메소드가 구현된 클래스이며, 공통 기능을 제공하면서 서브 클래스에서 추가 구현을 요구합니다.</p>
<ul>
<li>자전거는 기본적으로 페달, 바퀴, 핸들이 있는데, 너는 자전거에 벨이나 바구니를 추가할 수 있어</li>
</ul>
</li>
<li><p>인터페이스는 모든 메소드가 추상 메소드로만 구성된 구조로, 클래스가 구현해야 할 동작을 정의합니다.</p>
<ul>
<li>모든 게 설계도처럼 비어있어서, 너가 모든 동작을 직접 만들어야 해라고 요구하는 구조</li>
</ul>
</li>
<li><p>추상 클래스는 추상 메서드 말고 변수, 일반 메서드 등이 작성이 가능하지만, 인터페이스는 상수, 추상 메서드만 작성이 가능합니다.</p>
</li>
<li><p>인터페이스는 다중 상속이 가능하고, 추상 클래스는 단일 상속만 가능합니다.</p>
</li>
<li><p>인터페이스 : implements 라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌</p>
</li>
<li><p>추상 클래스 : extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장 시키는 느낌</p>
</li>
</ul>
<blockquote>
<ol start="12">
<li>가비지 컬렉션에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li><p>가비지 컬렉션은 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거하는 기능입니다. 메모리 누수를 방지하고 자바 프로그램의 메모리 관리를 효율적으로 수행하는 JVM의 기능입니다.</p>
</li>
<li><p>개발자가 해제되는 타이밍을 알 수 없다는 것이 단점이다.</p>
</li>
</ul>
<blockquote>
<ol start="13">
<li>자바의 메모리 영역에 대해 설명해주세요. <a href="https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%8A%A4%ED%83%9D-%ED%9E%99">Reference</a></li>
</ol>
</blockquote>
<ul>
<li>자바의 메모리 공간은 크게 메소드, 스택, 힙 영역으로 구분됩니다.</li>
<li>메소드 영역은 프로그램이 시작될 때부터 종료될 때까지 메모리에 존재하는 영역으로, 클래스에 대한 정보와 전역변수(static 변수)를 저장합니다.</li>
<li>스택 영역은 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리에서 사라집니다. </li>
<li>힙 영역은 런타임시 동적으로 생성되는 객체와 배열을 저장하는 공간으로, 가비지 컬렉션에 의해 메모리가 관리됩니다. </li>
</ul>
<blockquote>
<ol start="14">
<li>각 메모리 영역이 할당되는 시점은 언제인가요?</li>
</ol>
</blockquote>
<ul>
<li>메소드 영역은 프로그램이 시작될 때, 클래스가 로딩될 때 생성</li>
<li>스택 영역은 각 메소드가 호출될 때 할당되며, 메소드가 종료되면 해제됩니다.</li>
<li>힙 영역은 new 키워드를 사용하여 객체나 배열을 생성할 때 할당됩니다. (런타임시 할당)</li>
</ul>
<blockquote>
<ol start="15">
<li>프로세스와 스레드의 차이에 대해 설명해주세요. <a href="https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html#google_vignette">Reference</a></li>
</ol>
</blockquote>
<ul>
<li>프로세스는 실행 중인 프로그램의 인스턴스이며 독립적인 메모리 공간을 갖고, 스레드는 프로세스 내에서 실행되는 작은 실행 단위로 프로세스의 메모리를 공유합니다. </li>
<li>프로세스는 각각 별도의 자원을 사용하지만, 스레드는 같은 프로세스 내에서 자원(코드,데이터,힙)을 공유합니다.</li>
</ul>
<blockquote>
<ol start="16">
<li>클래스와 객체에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>클래스는 객체를 만들기 위한 설계도로, 코드에서 데이터와 기능을 정의합니다.</li>
<li>객체는 클래스 설계도를 바탕으로 실제로 생성된 실체로, 메모리에서 데이터와 기능을 가진 인스턴스입니다.</li>
</ul>
<pre><code class="language-java">// 클래스
class Car {
  // 생성자
  Car(String color, String model) {
        this.color = color;
        this.model = model;
    }
}
public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Car myCar = new Car(&quot;Red&quot;, &quot;Toyota&quot;);
    }
}</code></pre>
<blockquote>
<ol start="17">
<li>생성자에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>생성자는 객체가 생성될 때 자동으로 호출되어 객체의 초기화 작업을 수행하는 특수한 메소드입니다.</li>
<li>생성자는 클래스와 같은 이름의 메서드, 객체가 생성될 때 호출되는 메서드입니다.</li>
<li>주로 초기화 작업에서 사용합니다. </li>
<li>기본 생성자는 작성하지 않아도 기본적으로 만들어지고, 매개 변수를 다르게 하여 매개 변수가 다른 생성자를 생성할 수 있습니다.</li>
</ul>
<blockquote>
<ol start="18">
<li>Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>Wrapper Class는 기본 자료형을 객체로 다룰 수 있게 해주는 클래스이며, Boxing은 기본 자료형을 Wrapper Class 객체로 변환하는 과정이고, UnBoxing은 Wrapper Class 객체를 기본 자료형으로 변환하는 과정입니다.</li>
</ul>
<blockquote>
<ol start="19">
<li>Synchronized에 대해 아는대로 말해주세요.</li>
</ol>
</blockquote>
<ul>
<li>여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다.</li>
<li>자바에서 스레드 간의 동기화를 지원하는 키워드로, 멀티스레드 환경에서 데이터의 일관성을 유지하기 위해 특정 코드 블록이나 메소드에 대한 접근을 동기화하여 여러 스레드가 동시에 실행되지 않도록 합니다.</li>
</ul>
<blockquote>
<ol start="20">
<li>new String()과 리터럴(&quot;&quot;)의 차이에 대해 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>new String()은 힙 영역에 새 객체를 생성하지만, 리터럴&quot;&quot;은 문자열 풀에서 이미 존재하는 문자열 객체를 재사용합니다.</li>
</ul>
<blockquote>
<ol start="21">
<li>String, StringBuffer, StringBuilder의 차이를 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>String: 한 번 생성되면 변경할 수 없고, 문자열을 수정하면 새로운 String 객체가 생성됩니다.</li>
<li>StringBuffer: 생성 후에도 문자열을 변경할 수 있고,  여러 스레드에서 동시에 사용해도 안전합니다.</li>
<li>StringBuilder: 문자열을 변경할 수 있고, 스레드 안전성을 제공하지 않습니다.</li>
</ul>
<blockquote>
<ol start="22">
<li>String 객체가 불변인 이유에 대해서 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li>String 객체는 보안성, 스레드 안전성을 위해서 불변으로 설계되었습니다.</li>
</ul>
<blockquote>
<ol start="23">
<li>Call by Reference와 Call by Value의 차이가 무엇인가요?</li>
</ol>
</blockquote>
<ul>
<li>Call by Value는 값의 복사본을 전달하여 함수 내부의 변경이 원본에 영향을 미치지 않습니다.</li>
<li>Call by Reference는 변수의 주소를 전달하여 함수 내부의 변경이 원본에 영향을 미칩니다.</li>
</ul>
<ol>
<li><p>기본 자료형 (Primitive Types)</p>
<pre><code class="language-java">public class Test {
 public static void main(String[] args) {
     int x = 5;
     changeValue(x);
     System.out.println(&quot;After changeValue: &quot; + x);  // 출력: 5 &quot;즉, 기본 자료형은 값 자체가 복사됨&quot;
 }

 public static void changeValue(int num) {
     num = 10;  // num 값을 바꿔도 main 함수의 x는 영향을 받지 않음
 }
}</code></pre>
</li>
<li><p>객체 (Reference Types)</p>
<pre><code class="language-java">public class Test {
 public static void main(String[] args) {
     int[] arr = {1, 2, 3};
     changeArray(arr);   &quot;배열을 가리키는 주소가 복사되어 넘어감&quot;
     System.out.println(&quot;After changeArray: &quot; + arr[0]);  // 출력: 10
 }

 public static void changeArray(int[] array) {
     array[0] = 10;  // 원본 배열의 첫 번째 값을 변경
 }
}</code></pre>
<p>기본 자료형은 값 자체를 복사하여 전달하므로, 함수 내에서 변경해도 원본 값은 변하지 않습니다.
객체는 참조 값(주소)을 복사하여 전달하므로, 함수 내에서 객체의 상태를 변경하면 원본 객체도 영향을 받습니다. 하지만 여전히 참조 값 자체는 복사된 것이죠.</p>
</li>
</ol>
<blockquote>
<ol start="24">
<li>Java는 멀티 스레드(Multi Thread) 환경인데 멀티스레드란 무엇인가?</li>
</ol>
</blockquote>
<ul>
<li>멀티스레드(Multi-Thread)는 하나의 프로세스 내에서 여러 스레드를 동시에 실행하여 병렬로 작업을 처리하는 방식으로, 자바에서는 이러한 스레드를 생성하고 관리하여 프로그램의 성능을 향상시키고 자원을 효율적으로 사용할 수 있습니다.</li>
</ul>
<blockquote>
<ol start="25">
<li>인터페이스 추상클래스에 대해서 설명하세요</li>
</ol>
</blockquote>
<ul>
<li><p>인터페이스: 메서드의 선언만 포함하며, 구현은 해당 인터페이스를 구현하는 클래스에서 제공됩니다.</p>
</li>
<li><p>추상 클래스: 추상 메서드(구현 없는 메서드)와 일반 메서드(구현 있는 메서드) 모두 포함할 수 있으며, 상속을 통해서만 인스턴스화될 수 있습니다.</p>
</li>
<li><p>인터페이스는 &quot;이런 기능을 해야 한다&quot;는 규약을 정의하며, 다양한 클래스가 특정 기능을 구현하도록 강제할 때 사용됩니다.</p>
<ul>
<li><code>implements</code> 키워드를 사용해서 인터페이스에 정의된 메스드를 각 클래스의 목적에 맞게 기능을 구현한다.</li>
</ul>
</li>
<li><p>추상 클래스는 공통된 속성과 동작을 여러 클래스에 제공하면서, 서브클래스가 구체적인 동작을 정의하도록 할 때 사용됩니다.</p>
<ul>
<li><code>extends</code> 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장시킨다.</li>
</ul>
</li>
</ul>
<blockquote>
<ol start="26">
<li>스크립트 언어와 컴파일언어의 차이</li>
</ol>
</blockquote>
<ul>
<li>스크립트 언어<ul>
<li>인터프리터가 한 라인 한 라인 기계어로 번역하며 실행합니다.</li>
<li>우리가 컴파일 에러라고 부르는 문법 오류를 사전에 방지하지 못하기 때문에 주의해야 합니다.</li>
</ul>
</li>
<li>컴파일 언어<ul>
<li>실행 전 소스코드를 컴파일하여 기계어로 변환 후 해당 파일을 실행합니다.</li>
<li>이미 기계어로 변환된 것을 실행하므로 비교적 빠릅니다.</li>
<li>컴파일 과정을 거쳐 기계어 코드로 번역이 되기 때문에 사전에 검증을 할 수 있고, 최적화를 해줄 수 있습니다.</li>
</ul>
</li>
</ul>
<blockquote>
<ol start="27">
<li>Error와 Exception의 차이를 설명해주세요.</li>
</ol>
</blockquote>
<ul>
<li><p>Error는 시스템 수준에서 발생하는 문제로, 일반적으로 복구할 수 없으며, 프로그램의 중단을 초래합니다. </p>
<ul>
<li>컴파일 시점에 체크할 수 없기 때문에 개발자가 예외 처리를 통해 해결할 수 없는 경우가 많습니다.</li>
<li>오류가 발생하면 프로그램은 비정상 종료됩니다.</li>
<li>예측 불가능한 UncheckedException에 속합니다.</li>
</ul>
</li>
<li><p>Exception은 프로그램 내에서 발생하는 문제로, 개발자가 이를 처리하여 프로그램을 계속 실행할 수 있습니다.</p>
</li>
</ul>
<blockquote>
<ol start="27">
<li>checked Exception과 unchecked Exception의 차이</li>
</ol>
</blockquote>
<ul>
<li><p>checked Exception은 값 넣기 전에 에러나는 것, unchecked Exception은 runtimeException과 같이 실행후에 알 수 있는 것. 값 넣으면 에러나는 것</p>
</li>
<li><p>CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 예외 처리를 해야 합니다.</p>
</li>
<li><p>UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 됩니다.</p>
</li>
</ul>
<blockquote>
<ol start="28">
<li>Java 접근 제어자에 대해서 각각 설명해 주세요.</li>
</ol>
</blockquote>
<ul>
<li>public: 모든 클래스에서 접근 가능</li>
<li>protected: 같은 패키지 또는 하위 클래스에서 접근 가능</li>
<li>default: 같은 패키지 내에서만 접근 가능</li>
<li>private: 동일 클래스 내에서만 접근 가능</li>
</ul>
<blockquote>
<ol start="29">
<li>JVM의 구조에 대해서 설명해 주세요.</li>
</ol>
</blockquote>
<ul>
<li>클래스 로더: 클래스 파일을 메모리로 로드하고, 연결 작업을 수행합니다.</li>
<li>메모리 영역: 메소드 영역, 힙, 스택, 네이티브 메소드 스택, 프로그램 카운터(PC) 레지스터로 구성됩니다.</li>
<li>실행 엔진: 바이트코드를 실행하고, JIT 컴파일을 수행하여 성능을 최적화합니다.</li>
</ul>
<blockquote>
<ol start="30">
<li>Garbage Collector 에 대해서 설명해 주세요. 어떻게 동작하나요?</li>
</ol>
</blockquote>
<blockquote>
<ol start="31">
<li>GC의 종류에 대해서 말해보세요.</li>
</ol>
</blockquote>
<blockquote>
<ol start="32">
<li>Java 버전 별 특성에 대해서 아는대로 말해주세요.</li>
</ol>
</blockquote>
<blockquote>
<ol start="33">
<li>Java는 Call By Value일까요, Call By Reference 일까요?</li>
</ol>
</blockquote>
<ul>
<li>Java는 Call By Value로, 기본 자료형은 값 자체가 복사되어 전달되고, 객체는 참조 값이 복사되어 전달되어 참조하는 객체를 수정할 수 있습니다.</li>
</ul>
<blockquote>
<ol start="34">
<li>리플렉션(Reflection)이란 무엇인가요?</li>
</ol>
</blockquote>
<ul>
<li>구체적인 클래스 타입을 알지 못해도 클래스의 메서드, 타입, 변수들을 접근할 수 있게 해주는 Java API</li>
<li>JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용됩니다.</li>
</ul>
<blockquote>
<ol start="35">
<li>본인 관점에서, 인터페이스는 주로 어떨 때 사용하나요?</li>
</ol>
</blockquote>
<ul>
<li>구현과 인터페이스의 분리를 통해 코드의 유연성과 재사용성을 높이기 위해 사용합니다. 예를 들어, 서로 다른 클래스들이 공통의 메소드 집합을 구현하게 하여 다양한 객체를 동일한 방식으로 처리할 때 유용합니다.</li>
</ul>
<blockquote>
<ol start="36">
<li>equals와 ==의 차이는 무엇인가요?</li>
</ol>
</blockquote>
<ul>
<li>==: 두 객체가 동일한 메모리 주소를 참조하는지 비교합니다.</li>
<li>equals: 두 객체의 내용을 비교하여 동등성을 판단합니다.</li>
</ul>
<blockquote>
<ol start="37">
<li>Wrapper Class란 무엇인가요?</li>
</ol>
</blockquote>
<ul>
<li>Wrapper Class는 기본 자료형을 객체로 감싸서, 객체 지향적 기능(예: 메소드 호출)을 제공하는 클래스입니다. 예를 들어, int는 Integer로, char는 Character로 감싸집니다.</li>
</ul>
<blockquote>
<ol start="38">
<li>클래스, 객체, 인스턴스 차이에 대해서 설명해 주세요.</li>
</ol>
</blockquote>
<ul>
<li>클래스: 객체를 생성하기 위한 설계도나 틀로, 속성과 메소드를 정의합니다.</li>
<li>객체: 클래스의 설계도를 바탕으로 메모리에 생성된 실체로, 실제 데이터와 기능을 가지고 있습니다.</li>
<li>인스턴스: 객체와 동일한 의미로 사용되며, 클래스에서 생성된 개별 객체를 지칭합니다.</li>
</ul>
<blockquote>
<ol start="39">
<li>Stream API란 무엇인가요?</li>
<li>Lambda란 무엇인가요?</li>
<li>함수형 인터페이스란 무엇인가요?
JVM 기동시 주로 사용되는 옵션들을 아는대로 말해보세요.
foreach를 사용할 수 있는 자료구조는 어떤 인터페이스를 상속받고 있나요?
iterator와 iterable 차이는 무엇인가요?
synchronized 키워드에 대해 설명해 주세요.
volatile 키워드에 대해 설명해 주세요.
final 키워드에 대해서 설명해주세요. 각각의 쓰임에 따라 어떻게 동작하나요?</li>
</ol>
</blockquote>
<blockquote>
<p>Java의 제네릭(Generics)에 대해 설명하세요.</p>
</blockquote>
<ul>
<li>제네릭은 Java의 타입 안정성을 맡고 있습니다.</li>
<li>컴파일 과정에서 타입 체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기에 객체의 타입 안정성을 높이고 형 변환의 번거로움을 줄여줍니다.</li>
</ul>
<blockquote>
<p>static을 사용하는 이유에 대해 설명하세요.</p>
</blockquote>
<ul>
<li>static(정적)이란 고정된 의미를 뜻하고, 인스턴스를 생성하지 않아도 접근이 가능합니다. </li>
<li>모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖이기에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재합니다.</li>
<li>객체 생성 없이 바로 사용이 가능하기에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용하면 좋습니다.</li>
</ul>
<blockquote>
<p>컬렉션 프레임워크(Collection  FrameWork)에 대해 설명하세요. <a href="https://backendcode.tistory.com/163">Reference</a></p>
</blockquote>
<ul>
<li>컬렉션 프레임워크란 데이터의 집합, 그룹을 의미하며 자료 구조를 바탕으로 객체나 데이터들을 효율적으로 관리할 수 있는 자료 구조들이 있는 라이브러리이다.</li>
<li>컬렉션 프레임워크는 Java의 인터페이스를 사용해서 구현된다.</li>
<li>대표적으로 List, Set, Map, Stack, Queue 등이 있다.</li>
</ul>
<blockquote>
<p>왜 불변 객체나 final을 굳이 사용해야 하는지 설명하세요.</p>
</blockquote>
<ul>
<li>메서드 호출 시 파라미터 값이 변하지 않는다는 것을 보장할 수 있기 때문입니다.</li>
</ul>
<blockquote>
<p>직렬화(Serialize)와 역직렬화에 대해 설명하세요.</p>
</blockquote>
<ul>
<li>직렬화(Serialize)란 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트(Byte) 형태로 데이터를 변화하는 과정을 뜻한다.</li>
<li>역직렬화란 직렬화된 바이트(Byte) 형태의 데이터를 다시 객체로 변환하는 과정을 뜻한다.</li>
</ul>
<blockquote>
<p>Array와 ArrayList의 차이점에 대해 설명하세요.</p>
</blockquote>
<ul>
<li>Array는 인덱스(Index)로 접근하고, ArrayList는 메서드를 통해 접근한다.</li>
<li>Array는 Object 뿐만 아니라 원시 타입(int, long, double 등)도 담을 수 있지만,</li>
<li>ArrayList는 Object만 담을 수 있다. 그래서 정수를 ArrayList에 넣을 경우 Integer형은 가능하지만 int 형은 불가능하다.</li>
</ul>
<blockquote>
<p>JVM이란?</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[최종 오답 정리]]></title>
            <link>https://velog.io/@younghyun-na/%EC%B5%9C%EC%A2%85-%EC%98%A4%EB%8B%B5-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@younghyun-na/%EC%B5%9C%EC%A2%85-%EC%98%A4%EB%8B%B5-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 09 Jun 2023 11:34:10 GMT</pubDate>
            <description><![CDATA[<h3 id="데이터-모델링">데이터 모델링</h3>
<ul>
<li>물리적인 스키마 설계를 하기 전 단계는 &quot;논리적 모델링&quot;이다.</li>
<li>중심 엔티티는 업무 중심 역할, 기본 엔티티로부터 발생하고 관계를 통해 생성된다.</li>
<li>행위 엔티티는 부모 엔티티로부터 발생, 자주 바뀐다.</li>
<li>데이터 모델링의 3요소는 &quot;엔티티&quot;, &quot;속성&quot;, &quot;관계&quot;이다.</li>
</ul>
<h3 id="반정규화">반정규화</h3>
<ul>
<li>테이블 추가하는 기법 존재</li>
<li>데이터 무결성이 깨질 가능성이 있다.</li>
<li>자주 사용되는 테이블에 접근하는 프로세스 수가 많고 일정한 범위만 조회하는 경우</li>
<li>통계 정보를 필요로 할 때 별도의 통계 테이블을 생성해야 하는 경우</li>
</ul>
<h3 id="기본적인-dml-select-insert-update-delete">기본적인 DML (SELECT, INSERT, UPDATE, DELETE)</h3>
<pre><code class="language-sql">WHERE 회원번호 IS NOT NULL;</code></pre>
<h3 id="기본적인-ddl-create-alter-drop-rename-truncate">기본적인 DDL (CREATE, ALTER, DROP, RENAME, TRUNCATE)</h3>
<pre><code class="language-sql">// 테이블 생성
CREATE TABLE &lt;테이블 명&gt; &lt;컬럼명&gt; &lt;데이터형&gt;

// 컬럼의 데이터 타입을 변형하는 SQL구문
ALTER TABLE &lt;테이블 명&gt; ALTER COLUMN &lt;컬럼명&gt; &lt;데이터 타입&gt;

// 연관된 테이블 같이 삭제하는 SQL구문
DROP TABLE &lt;테이블 명&gt; CASCADE</code></pre>
<h3 id="기본적인-dcl-grant-revoke">기본적인 DCL (GRANT, REVOKE)</h3>
<ul>
<li>GRANT: 권한을 주는 명령어<pre><code class="language-sql">GRANT CREATE TABLE TO &lt;사용자 명&gt;</code></pre>
<h4 id="기본적인-tcl-commit-rollback-savepoint">기본적인 TCL (COMMIT, ROLLBACK, SAVEPOINT)</h4>
</li>
<li>DDL 문장 실행시 AUTO COMMIT이 실행된다.</li>
<li>ROLLBACK시 최신 COMMIT까지 복귀 또는 지정 SAVEPOINT까지 복귀</li>
</ul>
<h4 id="constraint">CONSTRAINT</h4>
<pre><code class="language-sql">// 제약 조건 추가
ALTER TABLE &lt;테이블 명&gt; ADD CONSTRAINT &lt;제약조건이름&gt; &lt;제약조건&gt; 
// 제약 조건 삭제
ALTER TABLE &lt;테이블 명&gt; DROP CONSTRAINT &lt;제약조건이름&gt;
// 외래키
CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES apple (id)
// 기본키 
CONSTRAINT pk_id PRIMARY KEY</code></pre>
<h3 id="null-관련">NULL 관련</h3>
<pre><code class="language-sql">// 표현식1이 NULL이면 표현식2 출력
NVL(표현식1, 표현식2)  
ISNULL(표현식1, 표현식2)

// 표현식1 = 표현식2이면 NULL, 아니면 표현식1
NULLIF(표현식1, 표현식2)
// Null! if 표현식1 = 표현식2, 그렇지 않으면 표현식1</code></pre>
<pre><code class="language-sql">// NULL이 아닌 최초의 표현식
COALESCE(표현식1, 표현식2, ...) </code></pre>
<pre><code class="language-sql">// expression과 search 값들을 순차적으로 비교하며, 일치하는 첫 번째 search 값을 찾으면 해당하는 result 값을 반환
DECODE(expression, search1, result1, search2, result2, ..., default_result)</code></pre>
<h4 id="null을-어떻게-계산하는가">NULL을 어떻게 계산하는가</h4>
<ul>
<li>SUM(컬럼)에서 컬럼 값이 NULL이면 SUM에 포함하지 않는다.</li>
<li>COUNT(컬럼)에서 컬럼 값이 NULL인 것을 제외한 행의 수를 계산한다.</li>
</ul>
<h3 id="join">JOIN</h3>
<ul>
<li>N개의 테이블을 조인할 경우 조인 최소 조건은 N-1개이다.</li>
<li>NATURAL JOIN은 WHERE절 불가능, CROSS JOIN은 WHERE절 가능</li>
</ul>
<h3 id="join-1">JOIN</h3>
<pre><code class="language-sql">// B-A 차집합을 구하는 구문
FROM B
WHERE NOT EXISTS (SELECT &#39;X&#39;
                  FROM A
                  WHERE A.ID = B.ID)

// B-A 차집합을 구하는 구문                 
FROM B LEFT OUTER JOIN A
   ON (A.ID = B.ID)
WHERE A.ID IS NULL</code></pre>
<h3 id="join-2">JOIN</h3>
<p>왼쪽 테이블 m, 오른쪽 테이블 n, 교집합 행 k일때</p>
<ul>
<li>INNER JOIN = k</li>
<li>LEFT OUTER JOIN = 왼쪽 테이블 행의 개수 + (교집합에서 오른쪽 테이블의 행이 많은 것 체크)</li>
<li>RIGHT OUTER JOIN = 오른쪽 테이블 행의 개수 + (교집합에서 왼쪽 테이블의 행이 많은 것 체크)</li>
<li>FULL OUTER JOIN = m+n-k</li>
<li>CROSS JOIN = m x n</li>
</ul>
<h3 id="그룹-함수">그룹 함수</h3>
<p>GROUP BY: 1행 종류 = m, 2행 종류 = n, 행의 개수 = k일때</p>
<ul>
<li>ROLL UP = k+m+1</li>
<li>CUBE = k+m+n+1</li>
<li>GROUPING SETS = m+n</li>
</ul>
<h3 id="alias절">ALIAS절</h3>
<ul>
<li>FROM절에서 ALIAS를 할 수는 있지만 ALIAS 키워드를 사용하는 것은 불가능하다.</li>
<li>WHERE와 GROUP BY에서 사용할 수 없다.</li>
</ul>
<h3 id="서브-쿼리">서브 쿼리</h3>
<ul>
<li>GROUP BY를 제외한 모든 곳에서 사용 가능하다.</li>
<li>다중행 서브쿼리는 반드시 비교 연산자를 사용해야 한다.<ul>
<li>다중행 서브쿼리 비교 연산자(IN, ALL, ANY, SOME, EXISTS)는 단일행 서브쿼리에서 사용가능</li>
<li>단일행 서브쿼리 비교 연산자(=, &gt;, &lt;)는 다중행 서브쿼리에서 사용가능</li>
</ul>
</li>
<li>서브 쿼리 이론<ul>
<li>서브쿼리는 메인쿼리 칼럼 사용 가능</li>
<li>메인쿼리는 서브쿼리 칼럼 사용 불가능</li>
</ul>
</li>
</ul>
<h3 id="group-함수">GROUP 함수</h3>
<ol>
<li>ROLL UP 함수</li>
</ol>
<ul>
<li><code>GROUP BY ROLLUP(A)</code>: 전체 합계, 컬럼 A소계</li>
<li><code>GROUP BY ROLLUP(A,B)</code>: 전체 합계, 컬럼 A소계, 컬럼 A,B 조합 소계</li>
</ul>
<ol start="2">
<li>CUBE 함수</li>
</ol>
<ul>
<li><code>GROUP BY CUBE(A)</code>: 전체 합계, 컬럼 A소계</li>
<li><code>GROUP BY CUBE(A,B)</code>: 전체 합계, 컬럼 A소계, 컬럼 B소계, 컬럼 A,B 조합 소계</li>
</ul>
<ol start="3">
<li>GROUPING SETS 함수</li>
</ol>
<ul>
<li><code>GROUP BY GROUPING SETS(A)</code>: 컬럼 A소계</li>
<li><code>GROUP BY GROUPING SETS(A,B)</code>: 컬럼 A소계, 컬럼 B소계</li>
</ul>
<h4 id="where-11">WHERE 1=1</h4>
<pre><code class="language-sql">WHERE 1=1  // true
WHERE 1=2  // false  -&gt; SELECT count(*)가 0이 됨</code></pre>
<h3 id="window-함수">WINDOW 함수</h3>
<p>순위, 집계, 행순서, 비율</p>
<pre><code class="language-sql">SELECT WINDOW 함수 OVER (&lt;행을 분할&gt; &lt;행을 정렬&gt; &lt;대상행 지정&gt;)</code></pre>
<ul>
<li>행을 분할: PARTITION BY  (=GROUP BY)</li>
<li>행을 정렬: ORDER BY    </li>
<li>행을 지정: ROWS 또는 RANGE<pre><code class="language-sql">// 순위: RANK, DENSE_RANK, ROW_NUMBER
// RANK(1,2,2,4), DESSE_RANK(1,2,2,3), ROW_NUMBER(1,2,3,4)
SELECT RANK() OVER (ORDER BY &lt;컬럼&gt; DESC) AS RANK</code></pre>
</li>
</ul>
<h3 id="sql이-오류가-나는-경우">SQL이 오류가 나는 경우</h3>
<ul>
<li>가변 문자열인데 비교 연산하는 경우</li>
<li>단일행 하위 질의에 2개 이상의 행이 리턴되는 경우</li>
<li>고객ID를 FK로 가지고 있는 주문 엔티티에 (고객ID, 주문ID, 상품) 데이터를 넣었을 때, 고객ID가 고객 엔티티에 없는 경우 -&gt; 무결성 제약 조건</li>
</ul>
<h3 id="trigger란">Trigger란</h3>
<ul>
<li>특정 테이블에 DML문이 수행되었을 때 자동으로 동작하도록 작성된 프로그램이다.</li>
</ul>
<h3 id="주관식-키워드">주관식 키워드</h3>
<ul>
<li>파티셔닝</li>
<li>DML / DDL / DCL / TCL</li>
<li>GRANT / REVOKE / WITH GRANT OPTION / CASCADE</li>
<li>CONSTRAINT</li>
<li>VIEW</li>
<li>NL JOIN / SORT MERGE JOIN / HASH JOIN</li>
</ul>
<h3 id="기출-모음">기출 모음</h3>
<ul>
<li>NULL이 존재하면 UNKNOWN 반환</li>
<li>TRUNC: 소수점 이하의 값을 절삭하여 정수 부분만 남김</li>
<li>GROUPING SETS(A,B,C) = GROUP BY A UNION ALL GROUP BY B UNION ALL GROUP BY C</li>
<li>INSERT 구문은 IDENTITY 또는 CHECK 문제가 나옴<ul>
<li>IDENTITY: AUTO_INCREMENT</li>
<li>CHECK: 조건을 만족하지 못할 경우 에러가 나나, NULL은 무시돼서 결과로 나온다.</li>
</ul>
</li>
<li>결합함수: CONCAT, || (ORACLE에서), + (SQL에서)</li>
<li>NATURAL JOIN에서 사용된 열은 식별자를 가질 수 없다.</li>
<li>CHARACTER는 고정 길이 문자열 정보 (고정 길이 문자열 S만큼 최대 길이를 갖고 그보다 작을 시 공백으로 채운다.)</li>
<li>VARCHAR : 가변길이 문자열 정보</li>
<li>WHERE A.ID = B.ID 는 INNER JOIN이다</li>
<li>DCL이 TCL을 포함하고 있다.</li>
<li>차집합 -&gt; MINUS (오라클), EXCEPT (sql)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 조인 수행 원리]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%A1%B0%EC%9D%B8-%EC%88%98%ED%96%89-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%A1%B0%EC%9D%B8-%EC%88%98%ED%96%89-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Fri, 09 Jun 2023 09:32:56 GMT</pubDate>
            <description><![CDATA[<h3 id="nl-join">NL JOIN</h3>
<ul>
<li>프로그래밍에서 사용하는 중첩된 반복문과 유사한 방식으로 조인을 수행</li>
<li>랜덤 엑세스 방식으로 데이터를 읽음</li>
<li>대량의 데이터 처리 시 적합하지 않다</li>
<li>Driving Table로는 데이터가 적거나 where절 조건으로 row의 숫자를 줄일 수 있는 테이블이어야 한다 </li>
<li>Driven Table에는 조인을 위한 적절한 인덱스가 생성되어 있어야 한다.</li>
</ul>
<h3 id="sort-merge-join">SORT MERGE JOIN</h3>
<ul>
<li>조인 칼럼을 기준으로 데이터를 정렬하여 조인을 수행</li>
<li>주로 FULL TABLE 스캔 방식으로 데이터를 읽음</li>
<li>랜덤 액세스로 NL Join에서 부담이 되던 넓은 범위의 데이터를 처리할 때 이용되던 조인 기법</li>
<li>조인 컬럼의 인덱스가 없어도 조인 작업이 가능하다는 장점</li>
<li>모든 정렬 작업을 수행하기에 메모리가 부족한 경우 성능이 떨어질 수 있다</li>
<li>동등 조인 뿐만 아니라 비동등 조인에 대해서도 조인 작업이 가능하다</li>
</ul>
<h3 id="hash-join">HASH JOIN</h3>
<ul>
<li>조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있는 조인 기법</li>
<li>해쉬 함수 적용 시 동일한 값은 항상 같은 값으로 해싱됨</li>
<li>생성된 해쉬 테이블의 크기가 메모리에 적재할 수 있는 크기보다 더 커지면 임시 영역(디스크)에 해쉬 테이블을 저장</li>
<li>동등 조인에서만 사용이 가능하다 </li>
<li>NL JOIN의 랜덤 엑세스와 SORT MERGE JOIN의 정렬 작업의 부담을 위한 대안이다</li>
<li>행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다 </li>
<li>드라이빙 조건과 상관없이 좋은 성능을 발휘할 수 있는 조인 방법이다</li>
<li>유용한 인덱스가 부족하여 중첩루프 조인이 비효율적 일 때 효과적이다</li>
</ul>
<h3 id="dring-table이란">Dring Table이란</h3>
<p>조인을 할때 먼저 액세스 되는 테이블을 Driving Table이라고 하며 나중에 액세스 되는 테이블을 Driven Table이라고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD 암기] SQL 기본]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%95%94%EA%B8%B0-SQL-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%95%94%EA%B8%B0-SQL-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Fri, 09 Jun 2023 07:57:34 GMT</pubDate>
            <description><![CDATA[<h3 id="dml">DML</h3>
<p>SELECT, INSERT, UPDATE, DELETE</p>
<pre><code class="language-sql">INSERT INTO &lt;테이블 명&gt; (컬럼명 리스트) VALUES (컬럼 리스트에 넣을 값)
UPDATE &lt;테이블 명&gt; SET 수정되어야 할 컬럼명 = 수정되어야 할 값;
DELETE FROM &lt;테이블 명&gt;</code></pre>
<h3 id="ddl">DDL</h3>
<p>CREATE, ALTER, DROP, RENAME, TRUNCATE</p>
<pre><code class="language-sql">ALTER TABLE &lt;테이블 명&gt; DROP &lt;컬럼 명&gt;;
RENAME TALBE &lt;테이블 명&gt; TO &lt;테이블 명&gt;;</code></pre>
<ul>
<li>명령어를 입력하는 순간 작업이 즉시 완료(AUTO COMMIT)된다.</li>
<li>TRUNCATE는 모든 데이터를 삭제하지만 테이블 구조는 남겨놓는다. </li>
</ul>
<h3 id="dcl">DCL</h3>
<p>GRANT, REVOKE</p>
<ul>
<li>GRANT: 데이터베이스 객체에 대한 접근 권한을 부여한다. </li>
<li>REVOKE: 이전에 부여된 권한을 취소한다.<h3 id="tcl">TCL</h3>
COMMIT, ROLLBACK</li>
<li>ROLLBACK은 커밋되지 않은 모든 트랜잭션을 모두 롤백한다.</li>
</ul>
<h3 id="constraint">CONSTRAINT</h3>
<p>데이터의 무결성을 지키기 위해 제한된 조건을 말한다.</p>
<h3 id="제약-조건-추가">제약 조건 추가</h3>
<pre><code class="language-sql">// PK 복합키 제약조건 추가
ALTER TABLE CONSTRAINT_TEST
  ADD CONSTRAINT PK_SEQ_ID PRIMARY KEY (SEQ, ID)

// FK 외래 키 설정
CREATE TABLE CONSTRAINT_TEST(
      SEQ INT NOT NULL CONSTRAINT PK_SEQ PRIMARY KEY
    , USER_NAME VARCHAR(100) NOT NULL 
                CONSTRAINT FK_USERNAME FOREIGN KEY REFERENCES USER_TBL(NAME)
)</code></pre>
<p>[14번]
외래키 값은 NULL값을 가질 수 있다.
외래키 값은 참조 무결성 제약을 받을 수 있다.</p>
<p>[26번] DELETE vs TRUNCATE vs DROP</p>
<ul>
<li>DELETE는 DML, TRUNCATE와 DROP은 DDL이다.</li>
<li>DELETE는 커밋 이전에 Rollback이 가능하지만, 나머지 둘은 불가능하다.</li>
<li>DELETE는 데이터만 삭제, TRUNCATE는 테이블을 초기 상태로, DROP은 테이블의 정의 자체를 완전히 삭제한다.</li>
</ul>
<p>[28번]</p>
<ul>
<li>Dirty Read: 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다.</li>
</ul>
<p>[29번]</p>
<ul>
<li>ORACLE에서는 DDL문장 수행 후 자동으로 커밋을 수행한다.</li>
<li>SQL Server에서는 DDL문장 수행 후 자동으로 커밋을 수행하지 않는다.</li>
</ul>
<p>[36번]</p>
<pre><code class="language-sql">SELECT * FROM TABLE WHERE &lt;컬럼명&gt; IS NOT NULL</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD 암기] 데이터 모델과 성능  ]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%95%94%EA%B8%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EC%84%B1%EB%8A%A5</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%95%94%EA%B8%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EC%84%B1%EB%8A%A5</guid>
            <pubDate>Fri, 09 Jun 2023 06:56:10 GMT</pubDate>
            <description><![CDATA[<h3 id="성능-데이터-모델링">성능 데이터 모델링</h3>
<p>데이터베이스 성능 향상을 목적으로 설계 단계의 데이터 모델링 때부터 성능 관련된 사항이 데이터 모델링에 반영되도록 하는 것</p>
<h3 id="성능-데이터-모델링-수행-절차">성능 데이터 모델링 수행 절차</h3>
<ol>
<li>정규화</li>
<li>DB 용량 산정</li>
<li>트랜잭션 유형 파악</li>
<li>반정규화</li>
<li>이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정</li>
<li>성능관점에서 데이터 모델을 검증</li>
</ol>
<h3 id="성능-데이터-모델링-시-고려사항">성능 데이터 모델링 시 고려사항</h3>
<p>PK/FK 컬럼 순서조정, FK인덱스 생성 등은 성능 향상을 위한 데이터 모델링 작업에 중요한 요소이다
이력데이터는 시간에 따라 반복적으로 발생돼서 대량일 가능성이 높아 성능을 고려하여 컬럼 등을 추가하도록 설계</p>
<h3 id="정규화">정규화</h3>
<ol>
<li>제 1 정규형: 모든 속성 값이 원자 값 <ul>
<li>1차 정규화: 중복값 제거, 새로운 테이블 추가, 1:M 관계</li>
</ul>
</li>
<li>제 2 정규형: 기본키에 완전 종속<ul>
<li>2차 정규화: PK가 2개 이상의 속성일 때 종속성 제거</li>
</ul>
</li>
<li>제 3 정규형: 일반 컬럼에 의존하는 컬럼이 존재<ul>
<li>3차 정규화: 기본키에 의존하지 않고 일반 컬럼에 의존하는 컬럼 제거</li>
</ul>
</li>
</ol>
<h3 id="반정규화">반정규화</h3>
<p>시스템의 성능향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법</p>
<h3 id="반정규화-고려-시-판단-요소">반정규화 고려 시 판단 요소</h3>
<p>다량 데이터 탐색의 경우 파티션, 데이터 클러스터링 등 다양한 기법으로 성능 개선 가능
처리가 반복적이고 빈번하면 반정규화 고려</p>
<h3 id="테이블과-컬럼의-반정규화">테이블과 컬럼의 반정규화</h3>
<ul>
<li>테이블 병합: 1:1, 1:M 관계 테이블 병합</li>
<li>테이블 분할: 디스크 IO 분산 처리, 디스크 IO 및 데이터 접근 효율성을 높임</li>
<li>테이블 추가</li>
<li>중복 컬럼 추가: 조인을 감소</li>
<li>파생 컬럼 추가: 성능저하 예방을 위해 미리 계산</li>
<li>이력테이블 컬럼 추가: 최근 값 조회 시 성능저하 예방을 위해</li>
<li>PK에 의한 컬럼 추가: 성능향상을 위해 일반속성으로 포함</li>
<li>응용 시스템 오작동을 위한 컬럼 추가: 이전 데이터를 임시적으로 중복하여 보관</li>
</ul>
<h3 id="반정규화-대상에-대해-다른-방법으로-처리">반정규화 대상에 대해 다른 방법으로 처리</h3>
<ul>
<li>지나치게 많은 조인 -&gt; 뷰</li>
<li>대량 데이터 처리나 부분 처리 -&gt; 클러스터링, 파티셔닝, 인덱스 조정</li>
</ul>
<h3 id="컬럼수가-많은-테이블">컬럼수가 많은 테이블</h3>
<ul>
<li>디스크 IO가 대량으로 발생, 성능 저하</li>
<li>접근 빈도에 따라 컬럼을 구분해서 1:1 테이블 분리</li>
<li>컬럼 위치 조정으로 NULL이 존재하는 컬럼을 뒤로 모아서 로우의 길이 감소시킬 수 있음</li>
<li>NULL 상태이던 컬럼에 데이터가 채워지면 더 많은 로우 체인이 발생할 수 있어서 바람직하지 않음</li>
</ul>
<h3 id="파티셔닝">파티셔닝</h3>
<p>데이터 엑세스 성능을 향상시키기 위해 적용하는 방법 중 하나이다. 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리하여 데이터 엑세스 성능도 향상시키고, 데이터 관리방법도 개선할 수 있도록 테이블에 적용하는 기법이다.</p>
<h3 id="슈퍼서브-타입-데이터-모델-변환">슈퍼/서브 타입 데이터 모델 변환</h3>
<p>트랜잭션에 따라 알맞게 구성하기</p>
<ul>
<li><p>트랜잭션 일괄 처리: 하나의 테이블로 구성</p>
</li>
<li><p>트랜잭션 슈퍼타입+서브타입에 대해 발생: 슈퍼타입+서브타입으로 테이블 구성</p>
</li>
<li><p>트랜잭션 개별 처리: 개별 테이블로 구성</p>
</li>
<li><p>쓸데없이 테이블을 하나로 통합하면 많은 양의 데이터가 집약되어 있어 성능이 저하될 수 있다.</p>
</li>
<li><p>쓸데 없이 개별로 유지하면 UNION 연산에 의해 성능이 저하될 수 있다.</p>
</li>
</ul>
<h3 id="pkfk-컬럼">PK/FK 컬럼</h3>
<ul>
<li>FK는 반드시 인덱스 생성, 조회 조건 고려하여 인덱스 컬럼 순서를 효율적으로 생성해야 함</li>
<li>트랜잭션에 의해 거의 활용되지 않을 때만 FK 인덱스를 지우는 방법이 적절</li>
</ul>
<h3 id="분산-데이터베이스">분산 데이터베이스</h3>
<ul>
<li>실시간 업무적인 특성을 가지고 있을 때 분산 데이터베이스를 사용하여 구성</li>
<li>공통코드, 기준정보 등 마스터 데이터는 분산 데이터베이스에 복제분산을 적용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD 암기] 데이터 모델링   ]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%95%94%EA%B8%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%95%94%EA%B8%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Fri, 09 Jun 2023 05:55:35 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터-모델링">데이터 모델링</h2>
<h3 id="유의점">유의점</h3>
<ul>
<li><strong>중복</strong>: 여러 장소에 같은 정보를 저장하지 않기.</li>
<li><strong>비유연성</strong>: 데이터의 정의를 사용 프로세스와 분리하기.</li>
<li><strong>비일관성</strong>: 데이터와 데이터간의 상호 연관 관계에 대한 명확한 정의가 필요. 프로세스와 테이블의 연계성을 높이지 않기.</li>
</ul>
<h3 id="종류">종류</h3>
<ul>
<li><strong>개념적 데이터 모델링</strong>: 추상화 수준이 높고, 업무 중심, 포괄적 수준의 모델링, 전사적 데이터모델링, EA 수립 시 사용</li>
<li><strong>논리적 데이터 모델링</strong>: 시스템 구축하려는 업무에 대해 KEY, 속성, 관계를 정확하게 표현, 재사용성 높음</li>
<li><strong>물리적 데이터 모델링</strong>: 실제로 데이터베이스에 이식할 수 있도록 성능, 저장 등 물리적 성격을 고려하여 설계</li>
</ul>
<h3 id="데이터-모델링의-주요-이유">데이터 모델링의 주요 이유</h3>
<h3 id="데이터베이스-스키마-구조-3단계">데이터베이스 스키마 구조 3단계</h3>
<ul>
<li><strong>외부스키마</strong>: 사용자 관점, DB에 저장되는 데이터와 그들간의 관계를 표현</li>
<li><strong>개념스키마</strong>: 개념단계 하나의 개념적 스키마, 조직 전체의 DB</li>
<li><strong>내부스키마</strong>: 내부단계, DB가 물리적으로 저장된 형식</li>
</ul>
<h3 id="엔티티의-특징">엔티티의 특징</h3>
<ul>
<li>유일한 식별자</li>
<li>두 개 이상의 인스턴스의 집합</li>
<li>업무 프로세스에 의해 반드시 이용</li>
<li>반드시 속성이 있어야 함</li>
<li>다른 엔티티와 최소 한 개 이상의 관계, 공통코드나 통계성 엔티티의 경우 생략 가능</li>
</ul>
<h3 id="발생시점에-따른-엔티티-분류">발생시점에 따른 엔티티 분류</h3>
<ul>
<li><strong>기본 엔티티</strong>: 원래 존재하는 정보, 독립적 생성, 상속받지 않음</li>
<li><strong>중심 엔티티</strong>: 업무 중심 역할, 기본 엔티티로부터 발생, 관계를 통해 생성</li>
<li><strong>행위 엔티티</strong>: 부모 엔티티로부터 발생, 자주 바뀌거나 데이터 양 증가, 상관 모델링 시 도출</li>
</ul>
<h3 id="erd">ERD</h3>
<ul>
<li>ERD 작성 방법은 엔티티 도출 -&gt; 엔티티 배치 -&gt; 관계 설정 -&gt; 관계명 기술 흐름</li>
<li>관계의 명칭은 관계 표현에 있어서 매우 중요한 부분에 해당</li>
<li>ERD에서는 관계를 연결할 때, 존재와 행위를 구분하지 않고 단일화된 표기법 사용</li>
</ul>
<h3 id="유무형에-따른-엔티티-분류">유무형에 따른 엔티티 분류</h3>
<ul>
<li><strong>유형 엔티티</strong>: 물리적 형태,안정적이고 지속적으로 활용, 업무로부터 엔티티 구분이 용이</li>
<li><strong>개념 엔티티</strong>: 물리적인 형태가 없음, 관리해야 할 개념적 정보로 구분</li>
<li><strong>사건 엔티티</strong>: 업무 수행에 따라 발생, 발생량이 많고 각종 통계 자료에 이용</li>
</ul>
<h3 id="속성">속성</h3>
<p>의미상 더 이상 분리되지 않는 최소의 데이터 단위
하나의 속성에는 한 개의 값만 가짐
속성은 하나의 인스턴스에만 속할 수 있음</p>
<h3 id="속성의-특성에-따른-분류">속성의 특성에 따른 분류</h3>
<ul>
<li>기본 속성: 업무분석을 통해 바로 정의한 속성 (이미 업무상 코드로 정의한 속성이면 기본 속성 아님)</li>
<li>설계 속성: 업무상 존재하지 않지만 설계하면서 도출한 속성</li>
<li>파생 속성: 다른 속성으로부터 계산이나 변형되어 생성</li>
</ul>
<h3 id="속성-명칭">속성 명칭</h3>
<ul>
<li>서술식 속성명을 사용하지 않음</li>
<li>유일성 확보</li>
<li>해당 업무에서 사용하는 이름을 부여</li>
</ul>
<h3 id="속성의-쪼갤-수-있는지에-따라-분류">속성의 쪼갤 수 있는지에 따라 분류</h3>
<p>속성은 하나의 값을 갖지만,
그 안에 동일한 성질 여러 값이 나타남 – 다중 값
한 개의 값만 가짐 – 단일 값</p>
<h3 id="도메인">도메인</h3>
<p>속성이 가질 수 있는 값의 범위, 엔티티 내에서 속성에 대한 데이터 타입과 크기, 제약사항을 지정</p>
<h3 id="관계의-표기법">관계의 표기법</h3>
<ul>
<li>관계명 : 관계의 이름</li>
<li>관계 차수 : 1:1, 1:M, M:N</li>
<li>관계 선택사양 : 필수관계, 선택관계<ul>
<li>필수 참여: 참여하는 모든 참여자가 반드시 관계를 가짐</li>
<li>선택 참여: 물리속성에서 외부키로 연결되는 경우 NULL을 허용할 수 있는 항목</li>
</ul>
</li>
</ul>
<h3 id="관계의-분류">관계의 분류</h3>
<ul>
<li>연관 관계: 실선, 소스코드에서 멤버변수로 선언</li>
<li>의존 관계: 점선, 오퍼레이션에서 파라미터로 사용</li>
<li>ERD에서는 존재적 관계와 행위에 의한 관계를 구분하지 않지만, 클래스 다이어그램에서는 구분함</li>
</ul>
<h3 id="두-개의-엔티티-사이에서-관계를-도출할-때-체크할-사항">두 개의 엔티티 사이에서 관계를 도출할 때 체크할 사항</h3>
<ul>
<li>엔티티 사이에 연관 규칙이 존재하는 지</li>
<li>엔티티 사이에 정보의 조합이 발생되는지</li>
<li>업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는지</li>
<li>업무기술서, 장표에 관계연결을 가능하게 하는 동사가 있는지</li>
</ul>
<h3 id="식별자-분류">식별자 분류</h3>
<ol>
<li>대표성</li>
</ol>
<ul>
<li>주식별자: PK</li>
<li>보조식별자: 일반키</li>
</ul>
<ol start="2">
<li>스스로 생성 여부</li>
</ol>
<ul>
<li>내부식별자: 스스로 만들어지는 식별자</li>
<li>외부식별자: FK</li>
</ul>
<ol start="3">
<li>속성의 수</li>
</ol>
<ul>
<li>단일식별자: 하나의 속성으로 구성된 식별자</li>
<li>복합식별자: 둘 이상의 속성으로 구성된 식별자</li>
</ul>
<ol start="4">
<li>대체 여부</li>
</ol>
<ul>
<li>본질 식별자: 업무에 의해 만들어지는 식별자</li>
<li>인조 식별자: 본질 식별자의 합 (주문번호 = 사번+주문일자)</li>
</ul>
<h3 id="주식별자-특징">주식별자 특징</h3>
<ul>
<li>유일성: 유일하게 구분되어야 함</li>
<li>최소성: 유일성을 만족하는 최소의 속성을 사용해야 함 </li>
<li>불변성: 자주 변하지 않아야 함</li>
<li>존재성: Not Null</li>
</ul>
<h3 id="비식별자-관계를-선택하는-기준">비식별자 관계를 선택하는 기준</h3>
<ul>
<li>상호간 연관성이 약할 경우</li>
<li>자식테이블에서 독립적인 PK의 구조를 가지기를 원할 때</li>
<li>SQL 문 복잡성 증가 방지</li>
<li>각 엔티티가 갖던 여러 개별 관계가 통합되는 경우</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 인덱스 기본]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Thu, 08 Jun 2023 14:56:29 GMT</pubDate>
            <description><![CDATA[<h3 id="트리-기반-인덱스">트리 기반 인덱스</h3>
<p>DBMS에서 가장 일반적인 인덱스는 B-트리 인덱스
Oracle에서 트리 기반 인덱스에는 B-트리 인덱스 외에도 비트맵 인덱스, 리버스 키 인덱스, 함수기반 인덱스등이 존재</p>
<h3 id="sql-server의-클러스터형-인덱스">SQL server의 클러스터형 인덱스</h3>
<p>첫째, 인덱스의 리프 페이지가 곧 데이터 페이지다.
둘째, 리프 페이지의 모든 로우(=데이터)는 인덱스 키 칼럼 순으로 물리적으로 정렬되어 저장된다.</p>
<ul>
<li>테이블 로우는 물리적으로 한 가지 순서로만 정렬될 수 있다.</li>
</ul>
<p>[135번]</p>
<ul>
<li>테이블의 전체 데이터를 읽는 경우는 인덱스를 사용하지 않는 FTS를 사용한다.</li>
<li>인덱스는 조회만을 위한 오브젝트이며, 삽입, 삭제, 갱신의 경우 오히려 부하를 가중한다.</li>
<li>인덱스가 존재하는 상황에서 데이터를 입력하면, 매번 인덱스 정렬이 일어나므로 대량의 데이터를 삽입할 때는 모든 인덱스를 제거하고, 데이터 삽입이 끝난 후에 인덱스를 다시 생성하는 것이 좋다.</li>
</ul>
<p>[136번]</p>
<ul>
<li>CLUSTERED 인덱스: 인덱스의 리프 페이지가 곧 데이터 페이지이며, 리프 페이지의 모든 데이터는 인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장된다.</li>
<li>BITMAP 인덱스: 시스템에서 사용될 질의를 시스템 구현 시에 모두 알 수 없는 경우인 DW 및 AD-HOC 질의 환경을 위해 설계되었으며, 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조이다.</li>
</ul>
<p>[137번]
규칙 기반 옵티마이저는 적절한 인덱스가 존재하면 전체 테이블 스캔보다는 항상 인덱스를 사용하려고 한다.</p>
<p>[138번]
후행 컬럼을 검색 조건에 이용해서 효율적인 검색이 불가능하다.
범위 검색보다 동등 검색 조건이 훨씬 효율적이다.</p>
<p>[139번]
많은 양의 데이터를 읽을 경우에는 인덱스 스캔보다 테이블 전체 스캔이 유리할 수도 있다.</p>
<p>[140번]
인덱스는 UPDATE 작업에는 부하가 없을 수도 있다.
SQL의 클러스터형 인덱스는 ORACLE의 IOT와 매우 유사하다.
인덱스를 활용하여 데이터를 조회할 때 컬럼의 순서는 실행 성능과 관계가 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 옵티마이저]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%98%B5%ED%8B%B0%EB%A7%88%EC%9D%B4%EC%A0%80</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%98%B5%ED%8B%B0%EB%A7%88%EC%9D%B4%EC%A0%80</guid>
            <pubDate>Thu, 08 Jun 2023 14:12:54 GMT</pubDate>
            <description><![CDATA[<h3 id="옵티마이저">옵티마이저</h3>
<p>사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행</p>
<h3 id="규칙기반-옵티마이저">규칙기반 옵티마이저</h3>
<p>규칙(우선 순위)을 가지고 실행계획을 생성
이용 가능한 인덱스 유무와 (유일, 비유일, 단일, 복합 인덱스)종류
SQL문에서 사용하는 연산자(=, &lt;, &lt;&gt;, LIKE, BETWEEN 등)의 종류
SQL문에서 참조하는 객체(힙 테이블, 클러스터 테이블 등)의 종류</p>
<ul>
<li>가장 높은 우선순위는 ROWID를 활용하여 엑세스하는 방법이고, 제일 낮은 우선순위는 전체 테이블 스캔이다.</li>
</ul>
<h3 id="비용기반-옵티마이저-cbo">비용기반 옵티마이저 (CBO)</h3>
<p>대안 계획 생성기에 의해서 생성된 대안 계획의 비용을 예측하는 모듈
통계정보, DBMS 버전, DBMS 설정 정보 등의 차이로 인해 동일 SQL문도 서로 다른 실행계획이 생성</p>
<h3 id="실행-계획">실행 계획</h3>
<p>옵티마이저는 다양한 처리 방법들 중에서 가장 효율적인 방법을 찾아줌
실행계획을 구성하는 요소는 조인 순서, 조인 기법, 액세스 기법, 최적화 정보, 연산 등</p>
<h3 id="sql-처리-흐름도">SQL 처리 흐름도</h3>
<p>SQL 실행 계획을 시각화해서 표현한 것이다.</p>
<p>[131번]
동일 SQL문에 대해 실행계획이 다르다고 해서 실행 결과가 달라지지 않는다.</p>
<p>[133번]
SQL 처리 흐름도는 성능적인 측면도 포현할 수 있다.
인덱스 스캔 및 전체 테이블 스캔 등의 엑세스 기법 모두 표현 가능하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 절차형 SQL]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%A0%88%EC%B0%A8%ED%98%95-SQL</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%A0%88%EC%B0%A8%ED%98%95-SQL</guid>
            <pubDate>Thu, 08 Jun 2023 14:04:36 GMT</pubDate>
            <description><![CDATA[<h3 id="절차형-sql">절차형 SQL</h3>
<p>절차 지향적인 프로그램이 가능하도록 DBMS 벤더별로 PL/SQL(Oracle), SQL/PL, T-SQL 등의 절차형 SQL을 제공</p>
<h3 id="plsql">PL/SQL</h3>
<p>PL/SQ은 절차적 언어의 특성을 가지고 있기 때문에 원하는 결과, 제약조건, 처리 절차를 개발자가 작성해야 한다.
PL/SQL은 Block 구조로 되어있어 각 기능별로 모듈화가 가능하다.
DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용할 수 있다. 
PL/SQL은 Oracle에 내장되어 있으므로 Oracle과 PL/SQL을 지원하는 어떤 서버로도 프로그램을 옮길 수 있다. 
PL/SQL은 여러 SQL 문장을 Block으로 묶고 한 번에 Block 전부를 서버로 보내기 때문에 통신량을 줄일 수 있다.</p>
<p>블록 단위 구성 : PL/SQL 모두 블록 구조로 이루어져있습니다. 이 블록 구조는 선언부 , 실행부 , 예외처리 부로 나뉘며  DECLARE - BEGIN - EXCEPTION - END 가 이에 해당한다.</p>
<h3 id="plsql-구조">PL/SQL 구조</h3>
<p>DECLARE : BEGIN ~ END 절에서 사용될 변수와 인수에 대한 정의 및 데이터 타입을 선언하는 선언부이다. </p>
<p>BEGIN ~ END : 개발자가 처리하고자 하는 SQL문과 비교문, 제어문을 이용하여 필요한 로직을 처리하는 실행부이다. </p>
<p>EXCEPTION : BEGIN ~ END 절에서 실행되는 SQL문이 실행될 때 에러가 발생하면</p>
<h3 id="저장-프로시저">저장 프로시저</h3>
<p>SQL을 로직과 함께 데이터베이스 내에 저장해 놓은 명령문의 집합이다.
저장 프로시저는 쿼리문의 집합으로 어떠한 동작을 일괄 처리하기 위한 용도로 사용한다.
모듈식 프로그래밍이 가능하다.</p>
<h3 id="trigger-생성과-활용">Trigger 생성과 활용</h3>
<p>특정한 테이블에 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램 (수동으로 실행될 수 없음)
저장 프로시저로 실행할 수 없는 사항을 해결해준다
주된 역할은 데이터의 무결성 유지이다.</p>
<h3 id="프로시저와-트리거-차이점">프로시저와 트리거 차이점</h3>
<p> <img src="https://velog.velcdn.com/images/younghyun-na/post/f340b652-793f-472f-bd4e-a408d47b72c7/image.png" alt=""></p>
<p>[123번]
PL/SQL로 작성된 것들 (저장모듈)은 작성자의 기준으로 트랜잭션을 분할할 수 있다.</p>
<p>[124번]
동적 SQL 또는 DDL 문장을 실행할 때 EXECUTE IMMEDIATE를 사용해야 한다.</p>
<p>[125번]</p>
<ul>
<li>저장형 프로시저는 SQL을 로직과 함께 데이터베이스 내에 저장해 놓은 명령문의 집합을 의미한다.</li>
<li>저장형 함수(사용자 정의 함수)는 다른 SQL문을 통하여 호출되고 그 결과를 리턴하는 SQL의 보조적인 역할을 한다.</li>
<li>트리거는 DML문이 수행되었을 때 DB에서 자동으로 동작하도록 작성된 프로그램이다.</li>
<li>트리거의 용도는 데이터의 무결성과 일관성을 위해서 사용자 정의 함수를 사용하는 것이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] DCL]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-DCL</link>
            <guid>https://velog.io/@younghyun-na/SQLD-DCL</guid>
            <pubDate>Thu, 08 Jun 2023 13:36:24 GMT</pubDate>
            <description><![CDATA[<h3 id="유저와-권한">유저와 권한</h3>
<p>DML, TCL 명령어들 이외에도 유저를 생성하고 권한을 제어할 수 있는 DCL(DATA CONTROL LANGUAGE) 명령어</p>
<p>GRANT: 권한을 부여하는 명령</p>
<pre><code class="language-sql">grant &lt;권한 리스트&gt; on &lt;객체명&gt; to &lt;사용자 리스트&gt;</code></pre>
<p>REVOKE: 다른 사용자에게 부여한 권한을 회수하기 위한 명령</p>
<pre><code class="language-sql">revoke &lt;권한리스트&gt; on &lt;객체명&gt; from &lt;사용자 리스트&gt;</code></pre>
<p>WITH GRANT OPTION: 부여받은 권한을 다른 사용자에게 전파할 수 있는 특별한 옵션</p>
<pre><code class="language-sql">// select 권한을 kim에게 부여함과 동시에 이 권한을 다른 사용자에게 다시 전파할 수 있는 자격까지 부여
grant select on student to kim with grant option</code></pre>
<h3 id="role을-이용한-권한-부여">ROLE을 이용한 권한 부여</h3>
<p>ROLE: 권한별로 사용자 그룹을 만들어 그룹에 권한을 부여하는 방법</p>
<pre><code class="language-sql">// 롤 생성
create role &lt;롤이름&gt;

// 롤에 사용자 배정
grant &lt;롤이름&gt; to &lt;사용자 리스트&gt;

// 롤에 권한을 부여
grant select on &lt;객체명&gt; to &lt;롤이름&gt;

// 롤 삭제
drop role &lt;롤 이름&gt;</code></pre>
<p>[121번]
ROLE는 많은 DBMS 사용자에게 개별적으로 많은 권한을 부여하는 번거로움과 어려움을 해소하기 위해 다양한 권한을 하나의 그룹으로 묶어놓은 논리적인 권한의 그룹이다.</p>
<p>[122번]</p>
<pre><code class="language-sql">REVOKE INSERT ON R FROM KIM CASCADE;</code></pre>
<p>WITH GRANT OPTION으로 KIM으로부터 권한을 부여받았다면, 그 사람은 CASCADE 명령어로, INSERT 권한이 KIM과 동시에 취소된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] WINDOW 함수]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-WINDOW-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@younghyun-na/SQLD-WINDOW-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 08 Jun 2023 10:23:39 GMT</pubDate>
            <description><![CDATA[<h3 id="window-function">WINDOW FUNCTION</h3>
<p>행과 행 간의 관계를 쉽게 정의하기 위해 만든 함수이다.
다른 함수와는 달리 중첩(NEST)해서 사용하지는 못하지만, 서브쿼리에서는 사용할 수 있다.</p>
<h3 id="window-function-종류">WINDOW FUNCTION 종류</h3>
<ol>
<li>순위 관련 함수: RANK, DENSE_RANK, ROW_NUMBER</li>
<li>집계 관련 함수 : SUM, MAX, MIN, AVG, COUNT<ul>
<li>sql server는 OVER 절의 OREDER BY 지원 X</li>
</ul>
</li>
<li>행 순서 관련 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD<ul>
<li>오라클에서만 지원</li>
</ul>
</li>
<li>비율 관련 함수 : CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT  </li>
</ol>
<h3 id="window-function-문법">WINDOW FUNCTION 문법</h3>
<p>INDOW 함수에는 OVER 문구가 키워드로 필수 포함된다.</p>
<pre><code class="language-sql">SELECT WINDOW_FUNCTION (ARGUMENTS) OVER 
( [PARTITION BY 컬럼] [ORDER BY 컬럼] [WINDOWING 절] )
FROM 테이블명 ; </code></pre>
<ul>
<li>WINDOW_FUNCTION : 윈도우 함수 </li>
<li>ARGUMENTS(인수) : 함수에 따라 0 ~ N개 인수가 지정될 수 있다. </li>
<li>PARTITION BY 절 : 전체 집합을 기준에 의해 소그룹으로 나눌 수 있다.   </li>
<li>ORDER BY 절 : 어떤 항목에 대해 순위를 지정할 지 order by 절을 기술한다.</li>
<li>WINDOWING 절 : WINDOWING 절은 함수의 대상이 되는 행 기준의 범위를 강력하게 지정할 수 있다. (sql server 에서는 지원하지 않음)</li>
</ul>
<h3 id="그룹-내-순위-함수">그룹 내 순위 함수</h3>
<ul>
<li>RANK: 동일 값에 대해서는 동일 순위를 부여하고 중간 순위 비워둠</li>
<li>DENSE_RANK: 동일 값에 대해서는 동일 순위를 부여하고 중간 순위 비워두지 않음</li>
<li>ROW_NUMBER: 동일 값에 대해서도 유일한 순위를 부여함</li>
</ul>
<p>[112번]
Partition과 Group By 구문은 의미적으로 유사하다.
Partition 구문이 없으면 전체 집합을 하나의 Partition으로 정의한다.
윈도우 함수 적용 범위는 Partition을 넘을 수 없다.</p>
<p>[115번]</p>
<pre><code class="language-sql">FROM (SELECT 추천경로, 추천인, 추천점수,
             ROW_NUMBER() OVER (PARTITION BY 추천경로
             ORDER_BY 추천점수 DESC) AS RNUM
      FROM 추천 내역)
WHERE RNUM = 1;</code></pre>
<p>추천경로별로 추천 점수가 가장 높은 데이터를 한건씩 출력하는 SQL이다.</p>
<p>[116번]
ROWS BETWEEN 1 PRECEDING AND 1  FOLLOWING: 현재 행을 기준으로 파티션내 앞뒤 한건씩을 범위로 지정한다.</p>
<h3 id="그룹-내-행-순서-함수">그룹 내 행 순서 함수</h3>
<ul>
<li>LAG 함수 : 파티션별 윈도우에서 이전 몇 번째 행의 값</li>
<li>LEAD 함수 : 파티션별 윈도우에서 이후 몇 번째 행의 값</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 그룹 함수]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EA%B7%B8%EB%A3%B9-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EA%B7%B8%EB%A3%B9-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 08 Jun 2023 08:42:04 GMT</pubDate>
            <description><![CDATA[<h3 id="group-by절">GROUP BY절</h3>
<pre><code class="language-python">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY 상품ID, 월;</code></pre>
<p><img src="https://velog.velcdn.com/images/younghyun-na/post/30a049b9-61b8-439c-a26c-7e26f4db013b/image.png" alt=""></p>
<h3 id="grouping-함수">GROUPING 함수</h3>
<p>GROUPING 함수: ROLLUP, CUBE, GROUPING SETS를 지원하는 역할</p>
<pre><code class="language-sql">SELECT 
    CASE GROUPING(상품ID) WHEN 1 THEN &#39;모든 상품ID&#39; ELSE 상품ID END AS 상품ID,
    CASE GROUPING(월) WHEN 1 THEN &#39;모든 월&#39; ELSE 월 END AS 월, 
    SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/younghyun-na/post/67bf58c2-630f-4916-9384-5a643d1571e1/image.png" alt=""></p>
<p>집계가 계산된 결과에 GROUPING(표현식) = 1
그 외에는 GROUPING(표현식) = 0</p>
<h3 id="rollup-함수">ROLLUP 함수</h3>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/younghyun-na/post/4eafc70b-2b3d-41f4-81d3-0263162fc736/image.png" alt=""></p>
<p>그에 대한 소계(SUBTOTAL), 총계(GRAND TOTAL)가 모두 나온다.
ROLLUP함수는 인수의 순서에도 영향을 받게 된다.</p>
<h3 id="cube-함수">CUBE 함수</h3>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY CUBE(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/younghyun-na/post/fdbcd147-5bdd-4a77-9cf0-24c4c5006fa5/image.png" alt=""></p>
<p>CUBE 함수는 그룹핑 컬럼이 가질 수 있는 모든 경우의 수에 대하여 소계(SUBTOTAL)과 총계(GRAND TOTAL)을 생성한다. 
인자의 순서가 달라도 결과는 같다.</p>
<h3 id="grouping-sets-함수">GROUPING SETS 함수</h3>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY GROUPING SETS(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/younghyun-na/post/a3a53bfc-f1a5-49c0-a30c-595fbf00b648/image.png" alt=""></p>
<p>첫번째 인자(상품ID)별 소계(SUBTOTAL), 두번째 인자(월)별 소계(SUBTOTAL)이 나오는 것을 확인할 수 있다.
괄호로 묶은 집합별로 집계를 구할 수 있다.
ROLLUP과 CUBE와 달리 계층 구조가 나타나지 않으며 따라서 인자의 순서가 달라도 결과는 똑같다.</p>
<p>[105번]
ROLLUP: GROUP BY절 데이터, 지역별 합계, 전체 집계
CUBE: GROUP BY절 데이터, 지역별 합계, 월별 합계, 전체 집계 
GROUPING SETS: 지역별 합계, 월별 합계</p>
<p>[108번]
CUBE, GROUPING SETS, ROLL UP 모두 일반 그룹 함수로 동일한 결과를 추출할 수 있다.</p>
<p>[109번]</p>
<pre><code class="language-sql">// 두 결과는 같다
GROUP BY CUBE (A.설비ID, B.에너지코드)
GROUP BY GROUPING SETS ((A.설비ID), (B.에너지코드), (A.설비ID, B.에너지코드), ())</code></pre>
<p>[111번]</p>
<pre><code class="language-sql">GROUP BY GROUPING SETS ((상품ID, 월))</code></pre>
<p>이 결과는 GROUP BY절과 같다.
하나의 인자별로 집계가 되기 때문에 GROUP BY 그 자체이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 서브쿼리]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC</guid>
            <pubDate>Wed, 07 Jun 2023 17:57:09 GMT</pubDate>
            <description><![CDATA[<p>서브쿼리는 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말한다.</p>
<ul>
<li>서브쿼리에서는 ORDER BY를 사용하지 못한다.</li>
<li>서브쿼리가 사용 가능한 곳: SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT문의 VALUES, UPDATE문의 SET </li>
</ul>
<h3 id="1-반환되는-데이터-형태에-따른-서브쿼리-분류">1. 반환되는 데이터 형태에 따른 서브쿼리 분류</h3>
<h3 id="단일행-서브쿼리">단일행 서브쿼리</h3>
<p>서브쿼리의 결과 건수가 반드시 1건 이하. 
단일 행 비교 연산자( =, &lt;. &gt; &lt;=, &gt;=, &lt;&gt;) 와 함께 사용된다. </p>
<h3 id="다중행-서브쿼리">다중행 서브쿼리</h3>
<p>서브쿼리 실행 결과가 여러 건. 
IN, ALL, ANY, SOME, EXISTS 와 함께 사용된다. </p>
<ul>
<li>IN - 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건</li>
<li>ALL - 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건</li>
<li>SOME, ANY - 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건</li>
<li>EXISTS - 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건</li>
</ul>
<h3 id="다중-컬럼-서브쿼리">다중 컬럼 서브쿼리</h3>
<p>다중 컬럼 서브쿼리는 서브쿼리의 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미한다. </p>
<p>서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼 개수와 컬럼의 위치가 동일해야 한다. </p>
<p>sql server에서는 지원하지 않는 기능이다</p>
<pre><code class="language-sql">SELECT TEAM_ID, PLAYVER_NAME, POSITION, BACK_NO , HEIGHT 
FROM   PLAYER
WHERE  (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT)
                             FROM  PLAYER
                             GROUP BY TEAM_ID)
ORDER BY TEAM_ID, PLAYER_NAME; </code></pre>
<h3 id="2-동작-방식에-따른-서브쿼리-분류">2. 동작 방식에 따른 서브쿼리 분류</h3>
<h3 id="연관-서브쿼리">연관 서브쿼리</h3>
<p>서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태. 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용된다. </p>
<p>EXISTS 서브쿼리는 항상 연관 서브쿼리로 사용된다.</p>
<h3 id="비-연관-서브쿼리">비 연관 서브쿼리</h3>
<p>서브쿼리가 메인쿼리 컬럼을 가지고 있지 않은 형태. 메인쿼리에 값을 제공하기 위한 목적으로 주로 사용된다. </p>
<p>[95번]
다중 컬럼 서브쿼리는 SQL Server에서 지원하지 않는다.
연관 서브쿼리는 서브쿼리가 메인쿼리 컬럼을 포함하고 있는 형태의 서브쿼리이다.
서브쿼리는 단일행 또는 복수행 비교 연산자와 함께 사용할 수 있다.</p>
<p>[99번]
비연관 서브쿼리는 주로 메인쿼리에 값을 제공하기 위해 사용한다.
메인 쿼리의 결과가 서브쿼리로 제공될 수도 있고, 서브 쿼리의 결과가 메인쿼리로 제공될 수도 있다.</p>
<h3 id="그-밖의-위치에서-사용하는-서브쿼리">그 밖의 위치에서 사용하는 서브쿼리</h3>
<h3 id="스칼라-서브쿼리">스칼라 서브쿼리</h3>
<p>SELECT 절에 서브쿼리 사용하기</p>
<h3 id="인라인뷰">인라인뷰</h3>
<p>FROM 절에서 서브쿼리 사용하기
인라인 뷰는 SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰이다.</p>
<h3 id="뷰">뷰</h3>
<p>독립성, 편리성, 보안성 보장
뷰(View)는 실제 데이터를 가지고 있지 않다. 
뷰를 사용하기 위해서 해당 뷰의 이름을 FROM 절에 적어 사용해주면 된다.</p>
<p>[100번]
인라인 뷰: 서브쿼리가 FROM 절에서 안에서 사용되는 경우, 해당 서브쿼리를 &#39;인라인뷰&#39;라고 한다. FROM 절에서 사용된 서브쿼리의 결과가 하나의 테이블에 대한 뷰(View)처럼 사용된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 계층형 질의]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%A7%88%EC%9D%98</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%A7%88%EC%9D%98</guid>
            <pubDate>Wed, 07 Jun 2023 14:21:52 GMT</pubDate>
            <description><![CDATA[<ul>
<li>테이블에 계층형 데이터 존재 시 데이터를 조회하기 위해 계층형 질의 사용</li>
<li>계층형 데이터는 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터</li>
</ul>
<h3 id="오라클-계층형-질의">오라클 계층형 질의</h3>
<ul>
<li><p>계층형 쿼리: 부모, 자식 간의 수직관계를 트리 구조 형태로 보여주는 쿼리</p>
</li>
<li><p>START WITH: 계층 구조 전개의 시작 위치를 지정하는 구문. 즉, 루트 데이터를 지정한다.</p>
</li>
<li><p>CONNECT BY: 다음에 전개될 자식 데이터를 지정하는 구문.</p>
<ul>
<li>자식 데이터는 CONNECT BY절에 주어진 조건을 만족해야 함.(조인)</li>
</ul>
</li>
<li><p>PRIOR: CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정한다.</p>
<ul>
<li><code>PRIOR 자식 = 부모</code> : 부모 → 자식 순방향 전개</li>
<li><code>PRIOR 부모 = 자식</code> : 자식 → 부모 역방향 전개</li>
</ul>
</li>
<li><p>ORDER SIBLINGS BY: 형제 노드 사이에서 정렬을 수행</p>
</li>
<li><p>LEVER: 계층 구조 쿼리에서 수행 결과의 Depth를 표현하는 의사컬럼</p>
</li>
<li><p>WHERE : 모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출한다.(필터링)</p>
</li>
<li><p>NOCYCLE : 데이터를 전개하면서 이미 나타났던 동일한 데이터가 전개 중에 다시 나타난다면 이것을 사이클(Cycle)</p>
</li>
</ul>
<p>[88번] ORACLE 계층형</p>
<ul>
<li>순방향 전개란 자식 노드로부터 부모 노드 방향으로 전개하는 것을 말한다.</li>
<li>루트 노드의 LEVEL 값은 1이다.</li>
</ul>
<p>[89번]</p>
<pre><code class="language-sql">START WITH 매니저사원번호 IS NULL
CONNECT BY PRIOR 사원번호 = 매니저사원번호
AND 입사일자 BETWEEN &#39;2013-01-01&#39; AND &#39;2013-12-31&#39;
ORDER SIBLINGS BY 사원번호</code></pre>
<p>부모 행의 자식을 찾는 과정에서 ORACLE은 부모 행에 대한 CONNECT BY 조건 PRIOR 식을 평가한다.
따라서 조건이 부모에 해당되지 않아서 부모를 선택하지 않는 경우는 없다.</p>
<p>[90번]</p>
<ul>
<li>SQL SERVER에서 계층형 질의문은 CTE를 재귀 호출함으로써 계층 구조를 전개한다.</li>
<li>CTE 식을 앵커 멤버와 재귀 멤버로 분할한다.</li>
<li>PRIOR 키워드는 SELECT, WHERE절에서도 사용할 수 있다.</li>
</ul>
<p>[91번]
<code>CONNECT BY 상위부서코드 = PRIOR 부서코드</code>는
<code>CONNECT BY PRIOR 부서코드 =  상위부서코드</code>와 같다.</p>
<h3 id="셀프-조인">셀프 조인</h3>
<p>동일 테이블 사이의 조인. FROM 절에 동일 테이블이 두 번 이상 나타난다.
식별을 위해 반드시 테이블 별칭(Alias)를 사용한다.</p>
<pre><code class="language-sql">SELECT E1.사원, E1.관리자, E2.관리자 차상위_관리자 
FROM 사원 E1, 사원 E2 
WHERE E1.관리자 = E2.사원</code></pre>
<pre><code class="language-sql">SELECT E1.사원, E1.관리자, E2.관리자 차상위_관리자 
FROM 사원 E1 
   LEFT OUTER JOIN 사원 E2 
   ON (E1.관리자 = E2.사원)</code></pre>
<p>[94번]
DISTINCE: 중복된 값은 한번만 출력한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 집합 연산자]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%A7%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%A7%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Wed, 07 Jun 2023 13:27:05 GMT</pubDate>
            <description><![CDATA[<p>조인을 사용하지 않고 연관된 데이터를 조회하는 방법
집합 연산자는 여러 질의의 결과를 연결하여 하나로 결합하는 방식 사용</p>
<p><strong>UNION: 합집합
UNION ALL: 합집합이면서 중복된 행도 그대로 표시
INTERSECT: 교집합
EXCEPT: 차집합(앞-뒤)</strong></p>
<p>INTERSECT</p>
<pre><code class="language-sql">// PLAYER 중 소속이 K02인 선수들이면서 골키퍼인 선수들의 집합의 교집합 
// INTERSECT 사용
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT 
FROM PLAYER 
WHERE TEAM_ID = &#39;K02&#39; 
      INTERSECT SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT 
                FROM PLAYER 
                WHERE POSITION = &#39;GK&#39; 
ORDER BY 1, 2, 3, 4, 5;

// EXISTS를 사용
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT 
FROM PLAYER X
WHERE X.TEAM_ID = &#39;K02&#39; 
      AND EXISTS (SELECT 1 
                  FROM PLAYER Y 
                  WHERE Y.PLAYER_ID = X.PLAYER_ID 
                        AND Y.POSITION = &#39;GK&#39;) 
ORDER BY 1, 2, 3, 4, 5;

// IN 서브쿼리를 사용
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT 
FROM PLAYER
WHERE TEAM_ID = &#39;K02&#39;
      AND PLAYER_ID IN (SELECT PLAYER_ID 
                        FROM PLAYER 
                        WHERE POSITION = &#39;GK&#39;) 
ORDER BY 1, 2, 3, 4, 5;</code></pre>
<p>[82번] UNION ALL</p>
<pre><code class="language-sql">SELECT ENAME AAA, JOB AAB
...
UNION ALL
SELECT ENAME BBA, JOB BBB
...</code></pre>
<p>UNION ALL을 사용하는 경우 컬럼은 첫번째 SQL 모듈 기준으로 표시된다.
따라서 AAA와 AAB를 사용한다.</p>
<p>[83번] UNION ALL과 UNION</p>
<pre><code class="language-sql">...
UNION ALL  // 위의 결과를 모두 더한다
...
UNION    // 위의 결과의 합집합을 실행한다
...</code></pre>
<p>UNION을 실행하는 과정에서 UNION ALL에서 만들어졌던 중복이 모두 제거된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 표준조인]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%ED%91%9C%EC%A4%80%EC%A1%B0%EC%9D%B8</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%ED%91%9C%EC%A4%80%EC%A1%B0%EC%9D%B8</guid>
            <pubDate>Wed, 07 Jun 2023 12:00:39 GMT</pubDate>
            <description><![CDATA[<h3 id="순수-관계-연산자">순수 관계 연산자</h3>
<p>SELECT, PROJECT, JOIN, DIVIDE</p>
<p>[67번]
Join시 적절한 Join조건이 없으면 카티시안 곱이 발생한다.
3개의 엔티티를 Join하기 위해서는 가운데 엔티티가 WHERE 절에 최소 2번이 나타나야 한다.</p>
<h3 id="inner-join">INNER JOIN</h3>
<p>JOIN 조건에서 동일한 값이 있는 행만 반환
WHERE에서 사용하던 JOIN을 FROM에서 정의, USING 조건절이나 ON 조건절을 필수적으로 사용해야 함</p>
<pre><code class="language-sql">SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP, DEPT 
WHERE EMP.DEPTNO = DEPT.DEPTNO;

SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME 
FROM EMP 
  INNER JOIN DEPT 
  ON EMP.DEPTNO = DEPT.DEPTNO; 

// INNER는 디폴트이므로 생략 가능하다
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME 
FROM EMP 
  JOIN DEPT 
  ON EMP.DEPTNO = DEPT.DEPTNO;</code></pre>
<h3 id="natural-join">NATURAL JOIN</h3>
<p>두 테이블 간의 동일한 이름을 갖는 모든 컬럼들에 대해 EQUI JOIN을 수행
추가로 USING, ON, WHERE 절에서 JOIN 조건을 정의할 수 없음
JOIN이 되는 테이블의 데이터 성격과 컬럼명이 동일해야 하는 제약 조건이 있음</p>
<pre><code class="language-sql">SELECT DEPTNO, EMPNO, ENAME, DNAME 
FROM EMP 
NATURAL JOIN DEPT;</code></pre>
<h3 id="using-조건절">USING 조건절</h3>
<p>NATURAL JOIN에서 모든 일치되는 컬럼에 대해 JOIN이 이루어지지만
FROM 절의 USING 조건절을 이용하면 원하는 컬럼에 대해 선택적으로 EQUI JOIN 할 수 있다</p>
<p>[70번] USING 조건절은 접두사를 붙일 수 없다.</p>
<pre><code class="language-sql">USING (T.STADIUM_ID = S.STADIUM_ID)  // 잘못된 표현
USING (STADIUM_ID)  // 맞는 표현</code></pre>
<h3 id="cross-join">CROSS JOIN</h3>
<p>일반 집합 연산자의 PRODUCT 개념으로 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터 조합</p>
<ul>
<li>결과는 양쪽 집합의 M+N 건의 데이터 조합 발생</li>
<li>NATURAL JOIN의 경우 WHERE 절에서 JOIN 조건을 추가할 수 없지만, CROSS JOIN의 경우 WHERE 절에 JOIN 조건을 추가할 수 있다.</li>
</ul>
<p>[71번] CROSS JOIN</p>
<pre><code class="language-sql">// 카타시안 프로덕트를 만들기 위한 SQL 문장
SELECT ENAME, DNAME
FROM EMP CROSS JOIN DEPT
ORDER BY ENAME;</code></pre>
<h3 id="outer-join">OUTER JOIN</h3>
<p>INNER JOIN과 대비하여 OUTER JOIN이라고 불리며, JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용</p>
<p>[77번]</p>
<pre><code class="language-sql">// ORACLE에서는 +로 OUTER JOIN 구문을 처리한다.
WHERE A.게시판ID = B.게시판ID(+)
AND B.삭제여부(+) = &#39;N&#39;
AND A.사용여부 = &#39;Y&#39;

// SQL 서버
LEFT OUTER JOIN 게시글 B
ON A.게시판ID = B.게시판ID AND B.삭제여부 = &#39;N&#39;
WHERE A.사용여부 = &#39;Y&#39;</code></pre>
<p>이를 통해 B를 중심으로 OUTER JOIN임을 알수있다.
따라서 게시글이 존재하지 않는 게시판도 조회되어야 한다.</p>
<h4 id="left-outer-join">LEFT OUTER JOIN</h4>
<p>왼쪽 테이블 먼저 다 읽고 우측 테이블 읽기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 조인]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-%EC%A1%B0%EC%9D%B8</link>
            <guid>https://velog.io/@younghyun-na/SQLD-%EC%A1%B0%EC%9D%B8</guid>
            <pubDate>Wed, 07 Jun 2023 11:01:46 GMT</pubDate>
            <description><![CDATA[<h3 id="equi-join">EQUI JOIN</h3>
<p>EQUI(등가) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법</p>
<pre><code class="language-sql">// WHERE 절에 JOIN 조건 넣기
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2 
WHERE 테이블1.컬럼명1 = 테이블2.컬럼명2; </code></pre>
<pre><code class="language-sql">// ON 절에 JOIN 조건 넣기
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ... 
FROM 테이블1 
  INNER JOIN 테이블2 
  ON 테이블1.칼럼명1 = 테이블2.칼럼명2;</code></pre>
<h3 id="non-equi-join">NON EQUI JOIN</h3>
<p>Non EQUI(비등가) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용되는 방법
데이터 모델에 따라서 Non EQUI JOIN이 불가능한 경우도 있다.</p>
<pre><code class="language-sql">SELECT 테이블1.칼럼명, 테이블2.칼럼명, ... 
FROM 테이블1, 테이블2 
WHERE 테이블1.칼럼명1 BETWEEN 테이블2.칼럼명1 AND 테이블2.칼럼명2;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] GROUP BY, ORDER BY]]></title>
            <link>https://velog.io/@younghyun-na/SQLD-GROUP-BY-ORDER-BY</link>
            <guid>https://velog.io/@younghyun-na/SQLD-GROUP-BY-ORDER-BY</guid>
            <pubDate>Wed, 07 Jun 2023 10:44:57 GMT</pubDate>
            <description><![CDATA[<h3 id="다중행-함수">다중행 함수</h3>
<p>집계 함수, 그룹 함수, 윈도우 함수</p>
<h4 id="집계-함수">집계 함수</h4>
<pre><code class="language-sql">COUNT(*)       // &quot;NULL값을 포함&quot;한 행의 수
COUNT(표현식)  // 표현식이 &quot;NULL인 것을 제외&quot;한 행의 수
SUM(표현식)    // 표현식의 &quot;NULL값을 제외&quot;한 합계
AVG(표현식)    // 표현식의 &quot;NULL값을 제외&quot;한 평균</code></pre>
<h4 id="group-by">GROUP BY</h4>
<ul>
<li>SELECT와 달리 ALIAS명을 사용할 수 없다.</li>
<li>WHERE절에는 올 수 없다.</li>
</ul>
<h4 id="order-by">ORDER BY</h4>
<ul>
<li>컬럼명 대신 Alias명이나 컬럼 순서를 나타내는 정수를 혼용하여 사용할 수 있다.<pre><code class="language-sql">// Case1. 칼럼명 사용 
SELECT DNAME, LOC, DEPTNO 
FROM DEPT 
ORDER BY DNAME, LOC, DEPTNO DESC;
</code></pre>
</li>
</ul>
<p>// Case2. 칼럼명 + ALIAS명 사용 
SELECT DNAME DEPT, LOC AREA, DEPTNO 
FROM DEPT 
ORDER BY DNAME, AREA, DEPTNO DESC;</p>
<p>// Case3. 칼럼 순서번호 + ALIAS명 사용 
SELECT DNAME, LOC AREA, DEPTNO 
FROM DEPT 
ORDER BY 1, AREA, 3 DESC;</p>
<pre><code>+ 기본적인 정렬은 ASC이다.
+ SQL에서는 NULL값을 가장 작은 값으로, ORACLE에서는 NULL값을 가장 큰 값으로 간주한다.


[53번] GROUP BY
중첩된 그룹함수는 최종 결과값이 1건이므로 group by 기준인 2개의 컬럼을 select절에 기술할 수 없다.

[55번] GROUP BY, ORDER BY
GROUP BY를 사용할 경우, ORDER BY에 GROUP BY 표현식이 아닌 값은 기술될 수 없다.

[59번] SELECT 문장 실행 순서
1) `FROM`: 테이블 참조
2) `WHERE`: 대상 데이터 아닌 것은 제거
3) `GROUP BY`: 행들을 소그룹화
4) `HAVING`: 그룹핑된 값의 조건에 맞는 것만 출력
5) `SELECT`: 데이터 값 출력/계산
6) `ORDER BY`: 데이터 정렬

#### TOP N 쿼리
순위가 높은 N개의 로우를 추출하기 위해 ORDER BY 절과 WHERE 절의 ROWNUM 조건을 같이 사용한다.
데이터의 일부가 먼저 추출된 후 정렬 작업이 일어나므로 주의하자.

#### TOP()
```sql
// TOP(2): 급여가 높은 2명을 출력
// WITH TIES: 같은 급여를 받는 사원이 있으면 같이 출력
SELECT TOP(2) WITH TIES ENAME, SAL 
FROM EMP 
ORDER BY SAL DESC;</code></pre>]]></description>
        </item>
    </channel>
</rss>