SQLD
정보시스템 모델링 세 가지 관점
1. 데이터 관점:
데이터 관점은 정보 시스템에서 사용되는 데이터를 정의합니다. 데이터 관점은 다음과 같은 요소를 포함합니다.
- 엔터티: 정보 시스템에서 구별되는 개체입니다.
- 속성: 엔터티를 설명하는 데이터입니다.
- 관계: 엔터티 간의 연결입니다.
데이터 관점은 일반적으로 **엔터티 관계 모델(ERM)**을 사용하여 표현됩니다.
2. 프로세스 관점:
프로세스 관점은 정보 시스템에서 수행되는 작업을 정의합니다. 프로세스 관점은 다음과 같은 요소를 포함합니다.
- 활동: 정보 시스템에서 수행되는 작업입니다.
- 데이터 흐름: 활동 간에 전달되는 데이터입니다.
- 제어 흐름: 활동이 수행되는 순서입니다.
프로세스 관점은 일반적으로 **데이터 흐름 다이어그램(DFD)**을 사용하여 표현됩니다.
3. 행위자 관점:
행위자 관점은 정보 시스템을 사용하는 사람과 시스템을 정의합니다. 행위자 관점은 다음과 같은 요소를 포함합니다.
- 행위자: 정보 시스템을 사용하는 사람 또는 시스템입니다.
- 역할: 행위자가 정보 시스템에서 수행하는 역할입니다.
- 책임: 행위자가 수행해야 하는 책임입니다.
행위자 관점은 일반적으로 **사용 사례 모델(Use Case Model)**을 사용하여 표현됩니다.
데이터 모델링의 세 가지 중요개념
- Things
- Attributes
- Relationships
발생 시점에 따라 구분 할 수 있는 엔터티의 유형들
- 기본 엔터티
- 중심 엔터티
- 행위 엔터티
파생 속성
파생 속성의 특징:
- 직접 저장되지 않음: 다른 속성을 사용하여 계산되거나 추출
- 업데이트 자동 반영: 기본 속성 값이 변경되면 파생 속성 값도 자동으로 업데이트
- 효율성: 데이터 저장 공간 및 처리 속도 향상
- 논리적 관계 표현: 데이터 간의 논리적 관계를 명확하게 표현
파생 속성 활용:
- 데이터 모델링: 엔터티 간의 관계를 명확하게 표현
- 데이터 분석: 새로운 정보를 도출하고 분석에 활용
- 데이터베이스 설계: 데이터 저장 공간 및 처리 속도 최적화
파생 속성 예시:
- 나이: 생년월일을 기반으로 계산
- 총액: 단가와 수량을 곱하여 계산
- 평균: 여러 값의 합을 개수로 나누어 계산
- 배송 상태: 주문 정보, 결제 정보, 물류 정보 등을 기반으로 추출
파생 속성 활용 시 고려 사항:
- 계산 로직 명확화: 파생 속성 계산 로직을 명확하게 정의
- 성능 고려: 복잡한 계산 로직은 성능 저하 초래 가능
- 데이터 일관성 유지: 기본 속성 값 변경 시 파생 속성 값 자동 업데이트
결론적으로, 파생 속성은 데이터 모델링, 분석, 설계에 유용하며, 데이터 관리 효율성을 높일 수 있습니다.
엔터티의 특징
엔터티는 정보 시스템에서 관리해야 할 구체적인 대상을 의미합니다. 엔터티는 다음과 같은 특징을 가집니다.
1. 구별 가능성:
- 엔터티는 서로 구별될 수 있어야 합니다.
- 예를 들어, "고객" 엔터티는 고객 고유의 식별 번호를 통해 구별됩니다.
2. 속성:
- 엔터티는 엔터티를 설명하는 속성을 가집니다.
- 예를 들어, "고객" 엔터티는 이름, 주소, 전화번호 등의 속성을 가질 수 있습니다.
3. 관계:
- 엔터티는 다른 엔터티와 관계를 가질 수 있습니다.
- 예를 들어, "고객" 엔터티는 "주문" 엔터티와 "주문한" 관계를 가질 수 있습니다.
4. 영속성:
- 엔터티는 시간이 지남에 따라 변하지 않거나 느리게 변화합니다.
- 예를 들어, "고객" 엔터티의 이름은 시간이 지남에 따라 변경될 수 있지만, 고객 고유의 식별 번호는 변경되지 않습니다.
5. 독립성:
- 엔터티는 다른 엔터티에 의존하지 않고 독립적으로 존재합니다.
- 예를 들어, "고객" 엔터티는 "주문" 엔터티에 의존하지 않고 독립적으로 존재합니다.
6. 관리 필요성:
- 엔터티는 정보 시스템에서 관리해야 할 필요성이 있습니다.
- 예를 들어, "고객" 엔터티는 마케팅, 영업, 고객 서비스 등의 목적으로 관리될 수 있습니다.
엔터티의 예시:
- 고객
- 제품
- 직원
- 주문
- 계약
엔터티는 정보 시스템 모델링에서 중요한 개념입니다. 엔터티를 명확하게 정의하는 것은 정보 시스템의 설계 및 구현에 중요한 영향을 미칩니다.
엔터티의 어원:
엔터티는 라틴어 "entitas"에서 유래했습니다. "entitas"는 "존재", "실재", "본질"을 의미합니다. 정보 시스템 모델링에서 엔터티는 정보 시스템에서 관리해야 할 구체적인 대상을 의미하기 때문에 "entitas"라는 단어가 사용되었습니다.
결론적으로, 엔터티는 고유명사가 아닌 일반 명사이며, 정보 시스템에서 관리해야 할 구체적인 대상을 의미합니다.
서브쿼리(Sub Query)
서브쿼리는 SQL 쿼리 내에 포함된 또 다른 쿼리로, 한 쿼리의 결과를 다른 쿼리의 입력으로 사용하는 경우에 활용됩니다. 서브쿼리의 종류와 위치에 따라 여러 가지 이름으로 구분됩니다. 아래는 서브쿼리의 주요 유형과 그 위치에 따른 명칭에 대한 설명입니다:
- 스칼라 서브쿼리 (Scalar Subquery)
- 위치: SELECT, WHERE, HAVING 절 내
- 특징: 단일 행과 단일 컬럼 (즉, 하나의 값)을 반환하는 서브쿼리입니다. 스칼라 서브쿼리의 결과는 변수나 상수와 같이 사용될 수 있습니다.
- 인라인 뷰 (Inline View)
- 위치: FROM 절 내
- 특징: 서브쿼리가 가상의 테이블을 생성하며, 이 테이블은 주 쿼리의 FROM 절에서 참조됩니다. 복잡한 쿼리를 단순화하고, 데이터를 임시로 구조화하는 데 유용합니다.
- 상관 서브쿼리 (Correlated Subquery)
- 위치: 주로 WHERE 절 내, 때로는 SELECT나 FROM 절 내
- 특징: 상관 서브쿼리는 외부 쿼리의 컬럼을 참조합니다. 외부 쿼리의 각 행에 대해 서브쿼리가 실행되며, 이로 인해 성능이 저하될 수 있지만, 복잡한 데이터 관계를 표현할 때 유용합니다.
- 존재 서브쿼리 (Exists Subquery)
- 위치: WHERE 절 내
- 특징: 존재 서브쿼리는 서브쿼리가 결과를 반환하는지 여부에 따라 TRUE 또는 FALSE 값을 반환합니다. EXISTS 또는 NOT EXISTS 연산자와 함께 사용되며, 주로 데이터의 존재 여부를 확인하는 데 사용됩니다.
- 다중 행 서브쿼리 (Multiple Row Subquery)
- 위치: WHERE, HAVING 절 내
- 특징: 하나 이상의 행을 반환할 수 있는 서브쿼리입니다. IN, ANY, ALL 같은 연산자와 함께 사용되어, 주 쿼리의 조건과 여러 행의 결과를 비교하는 데 활용됩니다.
- 다중 컬럼 서브쿼리 (Multiple Column Subquery)
- 위치: 주로 WHERE, HAVING 절 내
- 특징: 여러 컬럼을 반환하는 서브쿼리로, 주 쿼리의 조건과 비교하기 위해 사용됩니다. 다중 컬럼 서브쿼리는 복합적인 조건을 검사할 때 유용합니다.
서브쿼리의 이러한 유형들을 이해하고 적절히 활용하는 것은 SQLD와 SQLP 시험 준비에 있어 중요한 부분입니다. 각 유형의 서브쿼리를 다룰 때는 그 특성과 사용 상황을 잘 이해하고, 실제 쿼리 작성 시에 이를 효과적으로 적용할 수 있어야 합니다.
Where 절에 올 수 있는 서브쿼리 종류와 각각 차이점
WHERE 절에 사용될 수 있는 서브쿼리는 크게 세 가지 유형으로 구분할 수 있으며, 각각의 특징과 사용 방법이 다릅니다. 이러한 서브쿼리는 쿼리의 조건을 동적으로 결정하는 데 사용되며, 복잡한 데이터 집합에서 특정 조건을 만족하는 데이터를 검색하는 데 유용합니다.
1. 스칼라 서브쿼리 (Scalar Subquery)
- 특징: 단일 행과 단일 열(1x1)의 값을 반환합니다. 이 값은 비교 연산자와 함께 사용되어 조건을 평가하는 데 사용됩니다.
- 사용 예시: 이 예시에서 스칼라 서브쿼리는 전체 직원의 평균 연봉을 계산하고, 이 값을 메인 쿼리의 조건과 비교하여 평균 연봉보다 높은 직원을 찾습니다.
- SELECT 직원명 FROM 직원 WHERE 연봉 > (SELECT AVG(연봉) FROM 직원);
2. 상관 서브쿼리 (Correlated Subquery)
- 특징: 메인 쿼리의 각 행에 대해 실행되며, 메인 쿼리의 컬럼 값을 참조합니다. 상관 서브쿼리는 메인 쿼리의 실행 과정 중에 반복적으로 평가되므로, 성능에 영향을 줄 수 있습니다.
- 사용 예시: 이 예시에서 상관 서브쿼리는 메인 쿼리에서 선택된 각 직원의 부서별 평균 연봉을 계산하고, 이를 기준으로 평균보다 높은 연봉을 받는 직원을 찾습니다.
- SELECT 직원명 FROM 직원 A WHERE 연봉 > ( SELECT AVG(연봉) FROM 직원 B WHERE A.부서 = B.부서 );
3. EXISTS 서브쿼리
- 특징: 서브쿼리가 하나 이상의 행을 반환하는지 여부를 통해 TRUE 또는 FALSE 값을 반환합니다. EXISTS 서브쿼리는 주로 상관 서브쿼리와 함께 사용되며, 존재 여부만을 판단하기 때문에 성능적으로 유리할 수 있습니다.
- 사용 예시: 이 예시에서 EXISTS 서브쿼리는 각 직원이 하나 이상의 프로젝트에 참여했는지를 확인하고, 참여한 직원만을 결과로 반환합니다.
- SELECT 직원명 FROM 직원 A WHERE EXISTS ( SELECT 1 FROM 프로젝트 B WHERE A.직원ID = B.직원ID );
각 서브쿼리 유형은 특정 상황과 요구 사항에 따라 선택되어야 합니다. 스칼라 서브쿼리는 단순한 값 비교에, 상관 서브쿼리는 더 복잡한 상황에서 각 행의 데이터를 기반으로 한 동적인 비교에, 그리고 EXISTS 서브쿼리는 데이터의 존재 여부를 판단하는 데 주로 사용됩니다. SQLD와 SQLP 시험 준비 과정에서 이러한 서브쿼리들의 사용 방법과 차이점을 잘 이해하는 것이 중요합니다.
상관서브쿼리와 exists 서브 쿼리는 뭐가 다른거야?
상관 서브쿼리는 메인 쿼리를 여러번 시행한다는 점, exists 서브 쿼리는 exists와 꼭 같이 와야 한다는 점
그리고 exists 서브 쿼리의 SELECT 1은 무엇이며 꼭 고정적으로 사용해야하나?
상관 서브쿼리(Correlated Subquery)와 EXISTS 서브쿼리는 비슷해 보일 수 있지만, 사용 목적과 실행 방식에서 중요한 차이점이 있습니다. 여기서 각각의 특징과 차이점에 대해 설명하겠습니다.
상관 서브쿼리와 EXISTS 서브쿼리의 차이점
- 상관 서브쿼리:
- 상관 서브쿼리는 메인 쿼리의 각 행에 대해 실행됩니다. 즉, 메인 쿼리에서 선택된 각 행마다 서브쿼리가 반복적으로 실행되며, 이 과정에서 메인 쿼리의 특정 값에 의존하여 조건을 평가합니다.
- 상관 서브쿼리는 메인 쿼리의 컬럼 값을 참조하여 동적인 조건을 구성할 수 있습니다.
- 성능 저하의 원인이 될 수 있습니다. 왜냐하면 메인 쿼리의 각 행마다 서브쿼리를 실행해야 하기 때문입니다.
- EXISTS 서브쿼리:
- EXISTS 서브쿼리는 서브쿼리가 하나 이상의 행을 반환하는지만을 확인합니다. 실제 반환된 데이터의 내용은 중요하지 않으며, 존재 여부만을 TRUE 또는 FALSE로 반환합니다.
- EXISTS는 주로 상관 서브쿼리와 함께 사용되며, 메인 쿼리의 각 행이 서브쿼리 조건과 일치하는지 검사하는 데 사용됩니다.
- 성능 측면에서 상관 서브쿼리보다 유리할 수 있습니다. 왜냐하면 데이터의 존재 여부만 판단하면 되기 때문에 서브쿼리의 실행이 빨리 중단될 수 있습니다.
EXISTS 서브쿼리의 SELECT 1
- EXISTS 서브쿼리 내에서 SELECT 1은 서브쿼리가 조건에 맞는 행을 찾았는지를 확인하는 데 사용됩니다. SELECT 절의 내용은 EXISTS 조건의 결과에 영향을 주지 않기 때문에, 실제로 어떤 컬럼을 선택하든지 상관없습니다. 1을 사용하는 것은 단순히 관례적이며, 이해하기 쉽고 성능에도 영향을 주지 않기 때문에 널리 사용됩니다.
- 따라서, SELECT 1은 고정적으로 사용될 필요는 없으며, SELECT *, SELECT 컬럼명 등 실제로 필요한 데이터를 선택하지 않고 존재 여부만을 확인하기 위한 목적으로 사용됩니다.
상관 서브쿼리와 EXISTS 서브쿼리를 사용할 때는 각각의 특성을 잘 이해하고, 쿼리의 목적과 성능을 고려하여 적절한 방법을 선택하는 것이 중요합니다. SQLD와 SQLP 시험 준비 과정에서 이러한 차이점을 명확히 구분할 수 있도록 연습하는 것이 좋습니다.
TOP-N 서브 쿼리
TOP-N 서브쿼리는 결과 집합에서 상위 N개의 행만을 반환하는 쿼리를 말합니다. 이 유형의 서브쿼리는 데이터를 정렬한 후에 가장 상위에 위치하는 특정 수의 행을 제한적으로 선택할 때 사용됩니다. TOP-N 쿼리는 대량의 데이터 중에서 최대값이나 최소값, 혹은 그 범위에 해당하는 데이터를 효율적으로 조회할 때 유용합니다.
SQL에서는 TOP-N 쿼리를 구현하기 위해 다양한 방법을 사용할 수 있으며, 데이터베이스 시스템에 따라 지원하는 문법이 다를 수 있습니다. Oracle, SQL Server, PostgreSQL, MySQL 등 주요 데이터베이스 관리 시스템마다 조금씩 다른 구문을 제공합니다.
예시
- Oracle에서는 ROWNUM이나 FETCH FIRST 구문을 사용할 수 있습니다.
- SELECT * FROM ( SELECT 직원명, 연봉 FROM 직원 ORDER BY 연봉 DESC ) WHERE ROWNUM <= 10; -- 상위 10개 행만 반환
- SQL Server에서는 TOP 키워드를 사용합니다.
- SELECT TOP 10 직원명, 연봉 FROM 직원 ORDER BY 연봉 DESC;
- PostgreSQL과 **MySQL 8.0+**에서는 FETCH FIRST 또는 LIMIT 구문을 사용할 수 있습니다.
- SELECT 직원명, 연봉 FROM 직원 ORDER BY 연봉 DESC FETCH FIRST 10 ROWS ONLY; -- PostgreSQL SELECT 직원명, 연봉 FROM 직원 ORDER BY 연봉 DESC LIMIT 10; -- MySQL
TOP-N 서브쿼리는 특히 대규모 데이터베이스 환경에서 성능 최적화를 위해 매우 중요합니다. 사용자가 요구하는 정보의 일부만 빠르게 검색하고자 할 때, 전체 데이터를 스캔하고 정렬하는 대신, TOP-N 쿼리를 사용하여 필요한 데이터만을 효율적으로 추출할 수 있습니다.
SQLD와 SQLP 시험 준비 과정에서 TOP-N 쿼리의 사용법과 다양한 데이터베이스 시스템에서의 구현 방식을 이해하는 것은 데이터 처리 능력을 향상시키는 데 도움이 될 것입니다.
그룹 내 순위 관련 window 함수의 특징
SQL의 윈도우 함수(Window Functions)는 데이터 집합 내에서 각 행에 대한 계산을 수행할 때, 해당 행과 관련된 다른 행들을 기준으로 계산을 실행할 수 있게 해줍니다. 그룹 내 순위를 다루는 윈도우 함수로는 ROW_NUMBER(), RANK(), DENSE_RANK(), 그리고 NTILE() 등이 있습니다. 이 함수들은 데이터를 특정 기준에 따라 순위를 매기거나 그룹화할 때 사용됩니다. 아래에서는 윈도우 함수의 특징들을 나열하며, 잘못된 특징을 지적하겠습니다.
- *ROW_NUMBER()*는 각 행에 대해 고유한 순서 번호를 할당합니다. 중복 값이 있어도 각각 다른 순위를 부여합니다.
- *RANK()*는 중복 값을 허용하여 순위를 매깁니다. 만약 동일한 값이 여러 행에 존재할 경우, 이들 행 모두에 동일한 순위를 부여하고, 다음 순위는 중복된 개수만큼 건너뛰게 됩니다.
- *DENSE_RANK()*도 중복 값을 허용하지만, RANK()와 달리 순위 사이에 건너뛰기 없이 연속적인 순위를 부여합니다.
- *NTILE(n)*은 데이터를 n개의 동등한 부분으로 분할하고, 각 부분에 속하는 행에 대해 순위를 매깁니다.
- 윈도우 함수는 GROUP BY 절과 함께 사용될 수 없습니다. 이는 윈도우 함수가 OVER() 절 내에서 파티셔닝과 정렬을 정의하기 때문에, 집계 함수와는 다르게 독립적으로 작동합니다.
잘못된 특징은 5번입니다. 윈도우 함수의 가장 큰 특징 중 하나는 GROUP BY 절과는 독립적으로 작동한다는 것입니다. 그러나 이를 "윈도우 함수가 GROUP BY 절과 함께 사용될 수 없다"고 해석하는 것은 오해의 소지가 있습니다. 실제로 윈도우 함수와 GROUP BY 절은 서로 다른 목적으로 사용되며, 윈도우 함수는 OVER() 절을 통해 자신만의 파티셔닝과 정렬 규칙을 가집니다. 그러나 이는 GROUP BY 절이 사용될 수 없다는 것을 의미하지 않으며, GROUP BY는 집계 함수와 함께 사용되어 그룹별 집계를 수행합니다. 윈도우 함수는 집계 결과를 기반으로 행별 계산을 수행하는 데 사용될 수 있지만, 직접적으로 GROUP BY 절과 결합되어 사용되는 것은 아닙니다.
비용 기반 옵티마이저와 규칙 기반 옵티마이저의 특징과 차이점
데이터베이스 시스템에서 쿼리 옵티마이저(Query Optimizer)는 사용자로부터 받은 SQL 쿼리를 가장 효율적인 방식으로 실행하기 위한 실행 계획을 결정합니다. 옵티마이저는 주로 비용 기반(Cost-Based Optimizer, CBO)과 규칙 기반(Rule-Based Optimizer, RBO)의 두 가지 접근 방식으로 나뉩니다. 이 두 옵티마이저는 쿼리 실행 계획을 결정하는 방식에서 근본적인 차이를 가집니다.
비용 기반 옵티마이저 (CBO)
- 특징: 데이터베이스 내의 실제 데이터 분포와 통계를 기반으로 최적의 쿼리 실행 계획을 결정합니다. 비용 기반 옵티마이저는 다양한 실행 경로의 예상 비용을 계산하고, 가장 낮은 총 비용을 가지는 실행 경로를 선택합니다.
- 장점: 데이터의 실제 분포와 크기를 고려하기 때문에, 다양한 상황에서 일관되고 최적화된 성능을 제공할 수 있습니다.
- 단점: 정확한 비용 추정을 위해서는 데이터 통계가 정기적으로 업데이트되어야 하며, 이 과정에서 추가적인 오버헤드가 발생할 수 있습니다.
규칙 기반 옵티마이저 (RBO)
- 특징: 고정된 규칙 집합을 사용하여 쿼리의 실행 계획을 결정합니다. 이러한 규칙은 인덱스 사용 여부, 조인 순서 등 쿼리 실행에 영향을 미치는 다양한 요소들에 대한 우선 순위를 정의합니다.
- 장점: 데이터베이스의 실제 데이터 분포나 크기에 의존하지 않기 때문에, 통계 정보의 부재나 불완전함에 덜 민감합니다.
- 단점: 고정된 규칙에만 의존하기 때문에, 다양한 쿼리나 데이터 분포에 대해 최적의 성능을 보장하기 어렵습니다. 또한, 새로운 데이터베이스 기술이나 최적화 전략을 반영하기가 규칙 기반 시스템에서는 더 어렵습니다.
차이점
- 성능 최적화 기준: CBO는 데이터의 실제 분포와 크기를 기반으로 최적화를 수행하는 반면, RBO는 사전에 정의된 규칙에 따라 최적화를 수행합니다.
- 적응성: CBO는 데이터베이스의 변화에 더 잘 적응할 수 있으나, RBO는 고정된 규칙에 의존하기 때문에 새로운 상황이나 데이터 구조의 변화에 유연하게 대응하기 어렵습니다.
- 환경 요구 사항: CBO는 최적의 성능을 위해 정확하고 최신의 데이터 통계가 필요하지만, RBO는 통계 정보에 크게 의존하지 않습니다.
현대의 대부분 데이터베이스 관리 시스템(DBMS)은 비용 기반 옵티마이저를 사용하며, 이는 더 정교한 성능 최적화와 유연성을 제공하기 때문입니다. 그러나 규칙 기반 옵티마이저도 특정 상황이나 레거시 시스템에서 여전히 유용할 수 있습니다.
'[SQLD]' 카테고리의 다른 글
| Sort Merge Join, Nested Loop Join, b-tree, b+tree (0) | 2024.03.06 |
|---|