모의 면접 답변!
1. 지수 백오프 알고리즘을 설명하시오
지수 백오프(Exponential Backoff) 알고리즘은 네트워크 통신에서 사용되는 재전송 전략 중 하나입니다. 이 알고리즘은 특히 통신 중에 발생할 수 있는 충돌이나 혼잡과 같은 문제에 대응하기 위해 설계되었습니다. 주로 데이터 패킷을 전송하는 데 사용되며, 전송이 실패한 경우 일정 시간을 기다린 후 다시 시도하는 방식으로 작동합니다.
이 알고리즘의 주요 특징은 다음과 같습니다:
- 재전송 지연 시간 증가: 초기에는 재전송 시도 간의 시간 간격이 짧게 설정되어 있지만, 전송이 여러 번 실패할 경우 재전송 간격이 점차 증가합니다. 이는 혼잡이나 충돌로 인한 문제가 잠시 해소되도록 기다리는 것을 의미합니다.
- 지수적 증가: 재전송 간격의 증가는 지수적으로 이루어집니다. 즉, 각 재전송 시도마다 재전송 간격이 두 배로 증가합니다. 이는 지수 함수의 형태를 띄며, 지수적 백오프라는 이름의 유래가 됩니다.
- 최대 재전송 횟수 제한: 일정 횟수 이상의 재전송 시도 후에는 전송을 포기하고 에러 처리를 수행합니다. 이는 무한히 재전송을 시도하여 시스템을 무너뜨리는 것을 방지합니다.
- 랜덤화: 일부 구현에서는 재전송 간격에 랜덤화 요소를 추가하여 네트워크에 대한 부하를 분산시키고, 여러 클라이언트 간의 동시 재전송을 방지합니다. 이는 일종의 콜리젼을 방지하는 효과를 가집니다.
지수 백오프 알고리즘은 주로 네트워크 프로토콜에서 사용되며, 예를 들어 TCP/IP에서 재전송을 수행할 때 적용됩니다. 이를 통해 효율적인 통신이 가능하며, 네트워크의 혼잡과 충돌에 강건한 통신을 구현할 수 있습니다.
2. 이진 트리와 이진 탐색 트리(BST)의 차이점은 무엇인가요?
이진 트리(Binary Tree)와 이진 탐색 트리(Binary Search Tree, BST)는 둘 다 이진 트리의 한 종류입니다. 그러나 이 둘 사이에는 몇 가지 중요한 차이점이 있습니다.
- 정의:
- 이진 트리: 각 노드가 최대 두 개의 자식 노드를 가지는 트리 구조입니다. 이진 트리는 특별한 조건 없이 구성될 수 있습니다.
- 이진 탐색 트리: 이진 트리의 일종으로, 각 노드의 왼쪽 자식은 해당 노드보다 작은 값을, 오른쪽 자식은 해당 노드보다 큰 값을 가집니다. 즉, 이진 탐색 트리는 특정한 정렬된 순서를 가지고 있습니다.
- 정렬 순서:
- 이진 트리: 특별한 정렬 순서를 갖지 않습니다. 각 노드의 자식들이 어떤 값보다 작거나 크지 않을 수 있습니다.
- 이진 탐색 트리: 각 노드의 왼쪽 서브트리는 해당 노드보다 작은 값을 가지고, 오른쪽 서브트리는 해당 노드보다 큰 값을 가집니다. 이로 인해 트리를 중위 순회하면 정렬된 순서로 노드들을 방문할 수 있습니다.
- 탐색 효율:
- 이진 트리: 특별한 정렬 순서를 갖지 않기 때문에, 트리의 높이가 균형적이지 않을 수 있습니다. 따라서 탐색 연산의 효율성이 보장되지 않습니다.
- 이진 탐색 트리: 정렬된 순서를 갖고 있기 때문에, 탐색 연산의 평균적인 시간 복잡도는 O(log n)입니다. 하지만 트리가 불균형하게 성장할 경우 최악의 경우 시간 복잡도는 O(n)이 될 수 있습니다.
- 적용:
- 이진 트리: 데이터를 단순히 트리 구조로 저장하고자 할 때 사용됩니다. 특별한 정렬 순서가 필요하지 않은 경우에 사용됩니다.
- 이진 탐색 트리: 데이터를 정렬된 순서로 저장하고자 할 때 사용됩니다. 탐색, 삽입, 삭제 등의 연산이 주로 필요한 경우에 사용됩니다.
이러한 차이점으로 즉 정렬이 되어있는 트리의 구조가 필요할 때에는 이진 탐색 트리를 그렇지 않은 경우에는 이진 트리를이용하면 될 것으로 보입니다.
3. 데이터베이스에서 Index는 무엇이며 왜 사용하나요?
데이터베이스에서 인덱스(Index)는 특정 열(또는 열의 집합)에 대한 데이터의 빠른 검색을 위해 사용됩니다. 일반적으로 데이터베이스 테이블에 대한 인덱스는 키-값 쌍으로 구성되며, 각 키는 해당 열의 값이고, 값은 해당 키가 존재하는 행의 위치(또는 주소)입니다.
인덱스는 다음과 같은 이점을 제공합니다:
빠른 검색: 인덱스를 사용하면 데이터베이스에서 특정 조건에 부합하는 행을 더 빠르게 검색할 수 있습니다. 인덱스를 사용하지 않고 테이블을 검색하는 경우 전체 테이블을 스캔해야 하지만, 인덱스를 사용하면 해당 열의 값에 대한 빠른 접근이 가능합니다.
정렬: 인덱스는 주로 정렬된 순서로 데이터를 저장합니다. 이렇게 되면 정렬된 쿼리를 실행할 때 효율적으로 작동하며, ORDER BY 절이나 GROUP BY 절을 사용하는 쿼리의 성능을 향상시킵니다.
고유성 강제: 인덱스를 고유(unique)로 설정할 수 있습니다. 이렇게 하면 해당 열에 중복된 값을 저장하는 것을 방지할 수 있습니다.
조인 성능 향상: 조인 연산에서 인덱스가 사용될 경우 조인 조건에 해당하는 열을 빠르게 검색할 수 있습니다.
그러나 인덱스를 사용하는 것은 일반적으로 공간을 차지하고 데이터베이스 갱신 연산(INSERT, UPDATE, DELETE)의 성능을 저하시킬 수 있습니다. 인덱스를 생성할 때마다 추가적인 공간이 필요하며, 갱신 연산을 수행할 때마다 해당 인덱스를 업데이트해야 합니다. 이러한 이유로 인덱스는 신중하게 선택되어야 하며, 쿼리의 패턴과 데이터베이스 용도에 따라 적절하게 사용되어야 합니다.
즉 데이터를 빠르게 찾아주기 위해서 따로 찾아갈 수 있는 안내판을 만드는 건데 데이터의 규모가 크면 클수록 장점이 나타나며 속도에 개선을 준다고 할 수 있다. 하지만 단점으로는 안내판을 만드는 저장공간이 필요하므로 저장공간을 절약 해야하는 상황에서는 맞지 않을 수 있다고 판단이 되며 규모가 작아서 전체를 스캔하는데 시간이 많이 들지않는 상황에서는 큰 차이를 보이지 않기 때문에 상황에 맞추어서 넣어야하는 판단이 필요하다고 생각이 됩니다.
1. 언제 사용하며 어떻게 구현할 수 있나요?
앞에서 말했다시피 규모가 큰 데이터 베이스에서 빠르게 값을 찾아가기 위해서 사용이 되는 것이며 해시 테이블 방식을 이용해서 키값을 해시 함수를 통해서 변환을 하고 각 키에 맞는 값의 주소를 INDEX로 저장을 해주는 방식이다.
2. 그럼 모든 컬럼에 대해 Index를 설정할 수 있을까요?
꼭 그런것은 아니다. 앞에서 말했다시피 INDEX를 만들어 주기위해서는 따로 저장공간을 만들어 주어야 하기 때문에 모든 컬럼을 INDEX로 만들게 된다면 저장공간이 비효율 적으로 사용될 가능성이 있기 때문에 자주검색이 되어야 하는 부분이나 WHERE이나 JOIN에서 사용이 되는 컬럼을 인덱스로 생성을 해주는 편이라고 하며 또 다른 이유로는 해시테이블의 연산은 등호 = 방식에 특화되어 있기 때문에 값이 1이라도 달라지면 완전히 다른 해시의 값이 생성이 되며 이러한 점으로 인하여 부등호 연산이 자주 사용이 되는 데이터 베이스의 검색에서는 적합하지 않다고 볼 수 있다.
4. SQL 과 NoSQL 데이터베이스는 어떤 차이가 있나요? 그러한 차이를 고려했을 때 어떤 경우에 SQL 과 NoSQL 데이터베이스를 사용해야 하는지 설명해주세요.
- 데이터 모델:
- SQL 데이터베이스: SQL 데이터베이스는 관계형 데이터 모델을 사용합니다. 데이터는 테이블로 구성되며, 각 테이블은 레코드(행)의 모음으로 구성됩니다. 테이블 간에는 관계를 설정할 수 있습니다.
- NoSQL 데이터베이스: NoSQL 데이터베이스는 다양한 데이터 모델을 제공합니다. 주로 문서, 열, 그래프, 키-값 형태의 모델을 사용합니다. 이러한 모델은 관계형 모델보다 유연하며, 비구조화된 데이터를 처리하기에 적합합니다.
- 쿼리 언어:
- SQL 데이터베이스: SQL 데이터베이스는 SQL(Query Language)을 사용하여 데이터를 조작하고 검색합니다. SQL은 표준화되어 있으며, 데이터베이스 간에 이식성이 높습니다.
- NoSQL 데이터베이스: NoSQL 데이터베이스는 각각의 데이터 모델에 특화된 쿼리 언어를 사용합니다. 일부 NoSQL 데이터베이스는 SQL을 지원하기도 합니다.
- 확장성:
- SQL 데이터베이스: 전통적으로 수직적 확장(vertical scaling)이 주로 사용됩니다. 즉, 단일 서버의 성능을 높이는 방식으로 확장합니다.
- NoSQL 데이터베이스: 대부분의 NoSQL 데이터베이스는 수평적 확장(horizontal scaling)을 지원합니다. 데이터베이스를 여러 머신에 분산하여 데이터를 처리하고 저장할 수 있습니다.
- 일관성:
- SQL 데이터베이스: ACID(Atomicity, Consistency, Isolation, Durability) 트랜잭션을 지원하여 데이터 일관성을 보장합니다.
- NoSQL 데이터베이스: NoSQL 데이터베이스 중에는 일관성 모델을 선택할 수 있는 경우가 있습니다. 일관성, 가용성, 분할 내성(Consistency, Availability, Partition tolerance) 중에서 선택할 수 있으며, 일반적으로 일관성보다 가용성과 분할 내성에 중점을 둡니다.
어떤 경우에 SQL 데이터베이스를 사용해야 하고 어떤 경우에 NoSQL 데이터베이스를 사용해야 할까요?
- SQL 데이터베이스 사용 사례:
- 정형화된 데이터를 다루는 경우.
- 복잡한 쿼리가 필요한 경우.
- ACID 트랜잭션을 필요로 하는 경우.
- 데이터의 일관성이 중요한 경우.
- NoSQL 데이터베이스 사용 사례:
- 비정형화된 데이터를 다루는 경우.
- 데이터의 구조가 자주 변경되는 경우.
- 대규모 데이터의 처리 및 저장이 필요한 경우.
- 수평적 확장이 필요한 경우.
SQL과 NoSQL를 보면서 느낀 차이점으로는 SQL은 딱 맞는 칸에 정확한 데이터를 넣고 관리 하기 위해서 사용이 되는 것이며 NoSQL은 다양한 데이터를 자유롭게 받아들여 저장을 하기 위해 만들어진 방식이라고 할 수 있을 것 같다.
우리가 게임을 만들때 아이디 비번 능력치등을 저장하는 방식은 모두가 같은 컬럼을 가지고 있으니 SQL의 방식이 어울리는 것 같고 자기소개서 데이터 같은 경우에는 각 사람의 특징을 이나 능력을 담아야하는데 틀에 맞추기에는 너무 다양해서 넣기 힘드니 NoSQL의 방식이 어울린다고 보면 될 것 같습니다.
5. 가장 좋아하는 정렬 알고리즘이 있나요? 왜 그 알고리즘을 좋아하나요? 해당 알고리즘의 동작 방식에 대해서 설명해주실 수 있나요?
저는 선택 정렬 알고리즘을 가장 선호하는 알고리즘입니다. 수업시간에 정렬알고리즘에 대해서 조사를 해보고 직접 구현을 해보면서 이 정렬알고리즘이 정확하게 어떻게 작동을 하는지 알수 있게 되어서 정감이 갔습니다. 물론 선택정렬은 시간복잡도 O(N^2)의 시간을 가지고 있어 빠른 정렬방식은 아니지만 직관적인 정렬방법이라 좋아합니다. 선택정렬은 맨 왼쪽 부터 작은 값 순으로 정렬을 하는데 해당 값이 들어갈자리를 위해서 해당INDEX부터 뒤에 있는 INDEX의 값을 모두 비교를 하면서 그 중에서 가장 작은 값과 자리를 바꾸어 가면서 한 칸씩 진행하여 마지막까지 가면 정렬이 되는 방법입니다.
6. 도서관에서 도서에 대한 정보를 저장하는 웹사이트를 개발한다고 하고 각 도서에 대한 정보를 담는 자료구조를 만들어야할 때, 어떤 자료구조를 왜 사용할 것인가요?
제가 만약에 도서의 정보를 찾는 방법을 만들어 본다면 해시 테이블과 딕셔너리를 이용해서 만들 것 같습니다.
먼저 각 도서의 이름에 맞추어 해시테이블을 생성해주어 나중에 검색을 할 때 빨리 찾아갈 수 있도록 하고 각 도서에 대한 정보(책 이름, 저자, 내용, 출판사 등등)을 표현하는 방식으로는 딕셔너리를 이용해서 각 키에 맞추어 값을 저장해두어 검색시 해당 책의 딕셔너리 값을 꺼내어 표시하는 방법으로 만들어 줄 것 같습니다.
7. 정렬 알고리즘에서 일반적으로 가장 빠른 정렬 알고리즘을 설명해주세요.
정렬 알고리즘 중에서 기본적으로 가장 빠른 정렬알고리즘으로 알려진 것은 퀵 정렬이며, 퀵 정렬은 분할 정복 알고리즘을 기반으로 만들어졌으며 분할 시 특징으로 피벗이라는 특정 인덱스의 값을 하나 선정하여 그 피벗의 값을 기준으로 작은 값과 큰 값을 양쪽으로 나누어 주며 나누어 진 값에서 다시 피벗 값을 구하여 나누기를 할 수 없을 때까지 반복 합니다. 그로 인해 작은 값은 왼쪽으로 큰 값을 오른쪽으로 정렬이 되는 구조이며 시간 복잡도는 O(NlogN)의 시간을 가지고 있습니다.
8. 논리적 설계와 물리적 설계에 대해서 상세히 설명해주세요.
- 논리적 설계 (Logical Design):
- 목표: 논리적 설계는 시스템의 기능과 구조를 정의하고 설명하는 것을 목표로 합니다. 이 단계에서는 시스템의 논리적 모델을 개발하여 시스템의 작동 방식과 구성 요소 간의 상호 작용을 이해합니다.
- 주요 활동:
요구 사항 분석: 시스템이나 소프트웨어의 기능적 요구 사항을 이해하고 문서화합니다.
기능적 설계: 시스템의 기능을 기술하고, 각 기능 간의 상호 작용을 정의합니다.
데이터 모델링: 데이터베이스 설계를 위해 엔터티, 속성, 관계를 식별하고 관계형 모델이나 다른 데이터 모델을 만듭니다. - 알고리즘 설계: 시스템의 작동 방식을 결정하고, 알고리즘을 설계합니다.
- 결과물:
시스템의 논리적 모델: 시스템의 동작 방식, 데이터 구조, 인터페이스 등을 설명하는 문서 또는 다이어그램.
데이터베이스 스키마: 엔터티, 속성, 관계 등을 정의한 데이터베이스 설계 문서.
- 목표: 논리적 설계는 시스템의 기능과 구조를 정의하고 설명하는 것을 목표로 합니다. 이 단계에서는 시스템의 논리적 모델을 개발하여 시스템의 작동 방식과 구성 요소 간의 상호 작용을 이해합니다.
- 물리적 설계 (Physical Design):
- 목표: 물리적 설계는 논리적 설계에서 정의된 모델을 실제로 구현할 수 있는 형태로 변환하는 것을 목표로 합니다. 이 단계에서는 시스템의 성능, 확장성, 보안 등을 고려하여 실제 구현을 위한 세부 사항을 결정합니다.
- 주요 활동:
시스템 아키텍처 설계: 시스템의 물리적 구성 요소와 통신 방식을 설계합니다.
데이터베이스 구조 설계: 논리적 모델을 바탕으로 실제 데이터베이스 구조를 설계하고 최적화합니다.
하드웨어 및 네트워크 구성 설계: 시스템을 실행할 하드웨어, 네트워크 구성, 서버 배치 등을 결정합니다. - 보안 및 성능 최적화: 보안 요구 사항을 고려하고, 성능을 최적화하기 위한 조치를 취합니다.
- 결과물:
시스템의 구현 계획: 하드웨어, 소프트웨어, 네트워크 구성에 대한 문서 또는 다이어그램.
데이터베이스 스키마 구현: 물리적 저장 구조와 인덱스, 파티셔닝 등을 고려한 데이터베이스 구현 문서.
- 목표: 물리적 설계는 논리적 설계에서 정의된 모델을 실제로 구현할 수 있는 형태로 변환하는 것을 목표로 합니다. 이 단계에서는 시스템의 성능, 확장성, 보안 등을 고려하여 실제 구현을 위한 세부 사항을 결정합니다.
논리적 설계와 물리적 설계는 밀접한 관계를 가지고 있으며 논리적 설계는 목적을 위해서 필요한 기능을 기술 하고 각 기능들이 서로 상호 작용하는 정의 하는 단계 라고 할 수 있으며 이러한 논리적 설계를 바탕으로 실제로 구현을 하기 위해서 필요한 물리적인 하드웨어 네트워크의 설계와 성능, 확장성, 보안을 고려하며 설계를 하는 것이 물리적 설계라고 할 수 있습니다.
이것을 실생활에 있는 것으로 반영을 해보자면? 우리가 알고리즘 문제를 풀 때에 수학같은 계산식을 만들거나 피보나치 수열, 아니면 구슬의 개수로 조합을 만든다고 하는 문제를 풀이 할 때 먼저 공책을 이용해서 나올 수 있는 경우의 수를 계산해보고 수식으로 어떻게 나올 수 있는 지를 만드는 과정이 논리적 설계라고 할 수 있을 것 같고 그 수식을 바탕으로 코딩을 만들어서 컴퓨터에서 맞는 값이 나오도록 하는 것이 물리적 설계에 해당하지 않을 까 생각이 듭니다.
9. SQL에서 JOIN에 대해서 상세히 설명해주세요.
JOIN 연산은 관계형 데이터베이스에서 사용되는 데이터 검색 및 조작을 위한 중요한 연산입니다. JOIN 연산은 두 개 이상의 테이블에서 데이터를 결합하여 하나의 결과 집합을 생성합니다.
일반적으로 JOIN 연산은 두 테이블 간의 관계를 기반으로 수행됩니다. 공통된 키값이 있는 열을 선택하여 두 테이블을 연결합니다. JOIN 연산을 통해 연결된 두 테이블의 데이터를 결합하여 하나의 결과 집합을 생성하며, 이 결과 집합은 하나의 가상 테이블로 간주됩니다.
JOIN 연산은 여러 유형이 있으며, 주요한 유형은 다음과 같습니다:
INNER JOIN: 두 테이블 간에 일치하는 행들을 결합합니다. 즉, 공통된 값들을 가진 행들만 결과 집합에 포함됩니다.
LEFT JOIN (또는 LEFT OUTER JOIN): 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행들을 결합합니다. 만약 오른쪽 테이블에 일치하는 행이 없는 경우에도 왼쪽 테이블의 모든 행이 결과 집합에 포함됩니다.
10. 퀵 소트 알고리즘에서 최악의 시간복잡도를 방지하기 위한 방법에 대해서 설명해주세요.
퀵 소트(Quick Sort) 알고리즘은 평균적으로 매우 효율적인 정렬 알고리즘입니다. 하지만 피벗(pivot)을 선택하는 방식에 따라 최악의 경우에는 시간 복잡도가 O(n^2)이 될 수 있습니다. 이러한 최악의 경우를 방지하기 위해 다음과 같은 방법들이 사용될 수 있습니다:
- 랜덤한 피벗 선택:
최악의 경우를 방지하기 위해 피벗을 무작위로 선택하는 방법이 있습니다. 피벗을 무작위로 선택하면 최악의 경우가 발생할 확률이 줄어듭니다. 일반적으로 배열에서 임의의 위치에 있는 요소를 피벗으로 선택합니다. - 중앙값 피벗 선택:
배열의 첫 번째, 중간, 마지막 요소 중에서 중앙값(median)을 피벗으로 선택하는 방법도 있습니다. 이 방법은 피벗을 고르게 분할하기 때문에 최악의 경우를 피할 수 있습니다. 그러나 이 방법은 추가적인 비용이 발생할 수 있습니다. - 삽입 정렬과의 결합:
작은 크기의 배열에 대해서는 퀵 소트보다 삽입 정렬(Insertion Sort)을 사용하는 것이 효율적일 수 있습니다. 작은 크기의 배열에 대해서는 퀵 소트보다 삽입 정렬이 더 빠르기 때문에, 배열의 크기가 작아지면 퀵 소트 대신 삽입 정렬을 사용하는 방법을 고려할 수 있습니다. - 피벗의 중복 제거:
동일한 값을 갖는 요소가 많은 경우, 퀵 소트의 성능을 저하시킬 수 있습니다. 따라서 피벗의 중복을 최대한 제거하고, 중복되는 값들을 여러 그룹으로 분할하는 방법을 고려할 수 있습니다.
이러한 방법들을 조합하여 퀵 소트의 최악의 경우를 방지하고 성능을 향상시킬 수 있습니다. 하지만 어떤 방법을 선택할지는 입력 데이터의 특성과 구현의 편의성 등을 고려하여 결정해야 합니다.
앞에 퀵정렬을 말했다시피 퀵정렬은 값을 나누는 피벗에 의해 분할이 되므로 피벗의 선택이 정렬에 가장 중요한 부분이라고 할 수 있습니다. 만약에 피벗이 계속 최소값만 선택을 하게 되는 경우에는 O(N^2)값으로 버블 및 선택 정렬과 같은 시간이 걸릴 수도 있습니다. 그렇기 때문에 이런점을 방지하기 위해서는 최대한 다양한 방법으로 피벗을 선택하는 방법이 있는데 먼저 피벗을 랜덤으로 골라주는 방법과 리스트의 길이 정중앙의 값을 골라서 분할하는 방법도 있습니다. 하지만 이 방법은 리스트의 길이를 알아낸다는 점에서 시간이 더 소요될 수 있다는 점이 있습니다. 또 다른 방법으로는 한 번 선택 했던 피벗의 값고 동일한 값의 피벗은 선택하지않는다는 규칙을 넣을 수도 있으며 삽입정렬을 함께 사용하여 작은 길이의 리스트는 삽입정렬로 바꾸어 사용하는 방법도 있습니다.
SQLD 문제 풀기
일반 집합 연산자
- UNION : 합집합 (중복행은 1개로)
- UNION ALL : 합집합 (중복행이라도 포함)
- INTERSECT : 교집합 (서로 같은 부분만)
- EXCEPT, MINUS : 차집합 (A에서 B와 같은 부분을 뺀 것)
- CROSS JOIN : 곱집합 (A와 B의 조합으로 만들어지는 것)
순수 관계 연산자 : 관계형 DB를 새롭게 구현
- SELECT >> WHERE
- PROJECT >> SELECT
- NATRUAL JOIN >> 다양한 JOIN
- DIVIDE >> 사용 X
- {a,x}{a,y}{a,z} divdie {x,z} = {a}
FROM 절 JOIN 형태
- INNER JOIN : 동일한 값이 있는 행만 반환 USING이나 ON 필수 사용
- NATURAL JOIN : 두 테이블 간 동일한 이름을 갖는 모든 칼럼들을 대해 EQUI JOIN 수행, USING/ON/WHERE절에서 JOIN 불가능. SQL SEVER 지원 X
- USING 조건절 : 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 JOIN 별명이나 테이블 이름과 같은 접두사를 붙일 수 없다. SQL SEVER 지원 X
- ON 조건절 : WHERE 조건절을 분리하여 이해가 쉬우며, 칼럼명이 다르더라도 JOIN 조건을 사용 할 수 있다는 장점 보유, 별명이나 테이블명 반드시 사용
- CROSS JOIN : 양쪽 집합의 M*N건의 데이터 조합이 발생
- OUTER JOIN : JOIN 조건에서 동일한 값이 없는 행도 반환이 가능하다. USING 또는 ON 반드시 사용
- LEFT ( OUTER ) JOIN : 좌측 테이블에 해당하는 데이터를 읽은 후 나중에 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어옴 우측 테이블에 값이 없는 경우 NULL 로 표시
- RIGHT (OUTER ) JOIN : 위와 반대
- FULL (OUTER) JOIN : 조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN하여 결과 생성, 중복 데이터는 삭제
계층형 질의
테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해 사용
- SATRT WITH : 계층 구조 전개의 시작 위치 지정
- CONNECT BY : 다음에 전개될 자식 데이터 지정
- PRIOR : CONNECT BY 절에 사용되며, 현재 읽은 칼럼을 지정한다.
- PRIOR (자식) = (부모) 형태를 사용하면 계층 구조에서 부모 데이터에서 자식 데이터 방향으로 전개하는 순방향 전개, 반대로 하면 역방향 전개
- NOCYCLE : 동일한 데이터가 전개 X
- ORDER SILINGS BY : 형재 노드간의 정렬 수행
- WHERE : 모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출 (필터링)
- LEVEL : 루트 데이터라면 1, 그 하위 데이터라면 2, 리프 데이터 까지 1씩 증가하면서 간다. 즉 레벨 단계 표기
- CONNECT_BY_ISLEAF : 해당 데이터가 리프인지 (참 1, 거짓 0)
- CONNECT_BY_ISCYCLE : 해당 데이터가 조상이면 1 아니면 0 (CYCLE 옵션이 사용되었을 시에만)
- SYS_CONNECT_BY_PATH : 루트 데이터 부터 현재 전개할 데이터 까지의 경로 표시
- CONNECT_BY_ROOT : 현재 데이터 부터 루트 데이터 까지 표시
셀프 조인
동일 테이블 사이의 조인, FROM 절에 동일 테이블 2번 이상 나다난다. 반드시 테이블 별팅 사용
서브 쿼리
하나의 SQL문안에 포함되어 있는 또 다른 SQL문 즉, 필터링 한걸 다시 사용하는 느낌??
서브 쿼리시 주의사항
- 서브쿼리를 괄호로 감싸서 사용
- 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능
- 서브쿼리에서는 ORDER BY를 사용하지 못한다.
- SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT-VALUES, UPDATE-SET 절에 사용이 가능하다.
단일 행 비교 연산자
- = 등호
- < , > 부등호 (크다, 작다)
- <> 부등호 (같지 않다)
다중 행 비교 연산자
- IN : ~중에 포함
- ALL : 모든 서브 쿼리의 결과와 비교
- ANY / SOME : 서브쿼리의 모든 결과가 참일 경
- EXISTS : 서브쿼리의 칼럼 값 존재 여부 확인
스칼라 서브 쿼리
한 행, 한 칼럼만 반환하는 서브쿼리
인라인 뷰
테이블 명이 올 수 있는 곳에 사용, ORDER BY 사용 가능
뷰
테이블은 실제로 데이터를 가지고 있는 반면, 뷰는 실제로 데이터를 가지고 있지 않는다. 즉 가상 테이블이라고 보면 된다.
뷰의 장점
- 독립성 : 테이블의 구조가 변경이 되어도 뷰를 사용하는 프로그램은 변경 X
- 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성 가능
- 보안성 : 직원의 급여정보와 같이 숨기고 싶은 정보가 존재할 때
- 예시)
CREATE VIEW V_PLAYER_TEAM AS
DROP VIEW V_PLAYER_TEAM
- 예시)
ROLLUP : Subtotal을 생성하기 위해 사용, Grouping Columns의 수를 N이라고 했을 때 N+1 Level의 Subtotal이 생성 된다.
GROUPING : Subtotal의 total을 생성
CUBE : 결합 가능한 모든 값에 대하여 다차원 집계를 생성, ROLLUP에 비해 부하가 심함
GROUPING SETS : 인수들에 대한 개별 집계를 구할 수 있다. 다양한 소계 집합 생성 가능
윈도우 함수 : 행과 행간의 관계를 정의하거나 행과 행간을 비교 연산하는 함수
RANK : 특정 항목에 대한 순위를 구하는 함수, 동일한 값에 대해서는 동일한 순위를 부여(1,2,2,4)
DENSE_RANK : RANK에서 동일한 순위를 하나의 등수로 간주 (1,2,2,3)
ROW_NUMBER : 동일한 값이라도 고유한 순위 부여
SUM : 파티션별 윈도우의 합을 구할 수 있다. ex) 같은 매니저를 두고 있는 사원들의 월급의 합
MAX, MIN : 파티션별 최대 최소의 값
AVG : 원하는 조건에 맞는 데이터에 대한 통계의 값 = 평균
COUNT : 조건에 맞는 데이터에 대한 통계의 값 = 갯수
FRIST_VALUE : 파티션별 윈도우에서 가장 먼저나오는 값 SQL Server제외
LAST_VALUE : 마지막 값 SQL Server제외
LAG : 파티션별 윈도우에서 몇번 째 이전 행의 값
LEAD : 파티션별 윈도우에서 몇번 째 이후 행의 값
RATIO_TO_REPORT : 파티션 내 전체 SUM값에 대한 행 별 칼럼 값의 백분율을 소수점으로 구할수 있다. 0보다 크고 1보자 작은 값
PERCENT_RANK : 파티션 별 윈도우에서 제일 먼저 나오는 것을 0, 제일 늦게 나오는 것을 1로 해서 행의 순서별 백분율을 구한다. (0 <= X <= 1)
CUME_DIST : 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 구한다. (0 <= X <= 1)
NTILE : 파티션별 전체 건수를 인수 값으로 N등분한 결과를 구할 수 있다.( 어따 쓰는거지?)
DCL
유저 생성하고 권한을 제어할 수 있는 명령어
튜터님 강의!
아날로그 >>> 디지털
표본화 : 아주 잘게 쪼개서 분할 시킴
양자화 : 값의 크기를 만듬
부호화 : 0.1 데이터로 만듬
AI 노래를 만들기 위해서는 우리가 말을 하는 데이터를 모아서 각 단어마다 있는 값을 모아서 저장
말을 인식 해서 글자로 옴겨주는 방법을 알수 있다.
그리고 글자를 말로 변환하는 TTS를 이용해서 소리를 내준다.
이런걸 지원하는 API를 많이 알아두자.
허깅 페이스 모델 : 우리가 사용하는 일상적인 언어를 처리하는 자료가 있는 사이트
Models - Hugging Face
huggingface.co
'코딩 교육 TIL' 카테고리의 다른 글
2024-04-02 AI 코딩 TIL (0) | 2024.04.02 |
---|---|
2024-04-01 AI 코딩 TIL (0) | 2024.04.01 |
2024-03-28 AI 코딩 TIL (0) | 2024.03.28 |
2024-03-27 AI 코딩 TIL (0) | 2024.03.27 |
2024-03-26 AI 코딩 TIL (3) | 2024.03.26 |