일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 핸드캐리쿠리어차이점
- 영어시간읽기
- TACKING
- Armhole Drop
- 엑셀필터복사붙여넣기
- WHATTIMEOFTHEDAY
- 고급영어단어
- 비슬론지퍼
- 미니마카
- 암홀트롭
- 비리짐
- 봉제용어
- 40HQ컨테이너
- 나일론지퍼
- 우레탄지퍼
- 요척합의
- 엑셀드래그단축키
- 웹API
- 지연환가료
- 40HQ컨테이너40GP컨테이너차이
- 필터링후복사붙여넣기
- 미국영어연음
- 자켓실측
- 헤이큐
- AATCC
- MERN스택
- 클린코드
- 와끼
- 엑셀자동서식
- 슈퍼코딩
- Today
- Total
CASSIE'S BLOG
SQLD 정리 본문
34회 기출문제 및 해설 출처:
https://yunamom.tistory.com/237
35회 기출문제 및 해설 출처:
https://yunamom.tistory.com/260
37회 기출문제 및 해설 출처:
https://yunamom.tistory.com/321
38회 기출문제 및 해설 출처:
https://yunamom.tistory.com/269
39회 기출문제 및 해설 출처:
https://yunamom.tistory.com/265
45~49회 주관식만
https://yunamom.tistory.com/355
데이터모델링은 추상화단계에 따라 개념적데이터모델, 논리적데이터모델, 물리적데이터모델로 정리할 수 있다.
개념적데이터모델: 추상화수준이 높고
DDL (Data Definition Language) 데이터 정의 언어
"트랜잭션의 원자성(Atomicity)"이라는 용어는 데이터베이스 관리 시스템(DBMS)에서 중요한 특성 중 하나를 나타냅니다. 이것은 트랜잭션의 작업이 모두 성공적으로 실행되거나 아무것도 실행되지 않은 채 롤백되어 이전 상태로 돌아가는 것을 의미합니다. 이것이 '원자성'이라고 불리는 이유는 "원자"라는 단어에서 유래합니다.
원자(atom)는 근본적인 입자로서 더 이상 나눌 수 없는 가장 작은 단위를 의미합니다. 트랜잭션의 원자성은 이와 유사한 개념으로, 트랜잭션은 더 이상 나눌 수 없는 작은 단위로 간주됩니다. 즉, 트랜잭션의 모든 연산은 하나의 단위로 처리되며, 이 단위는 완전히 실행되거나 전혀 실행되지 않습니다. 이것이 '원자성'이라는 용어가 트랜잭션의 특성을 설명하는 데 사용되는 이유입니다.
따라서 "원자성"이라는 용어는 트랜잭션이 데이터베이스에 변경을 가할 때 이 변경이 하나의 원자적인 작업 단위로 간주되어야 함을 강조하는 것으로 이해할 수 있습니다.
SIGN이 양수 음수 0 ,
FLOOR 작거나 같은 최대 정수 리턴
MOD 나머지 반환
MINUS: 중복 행 1개로
UNION ALL = 중복행도 표시
"CONNECT BY"는 SQL에서 사용되는 절 중 하나로, 계층적인 데이터를 쿼리하는 데 사용됩니다. 이 절은 주로 계층적인 데이터 모델을 가진 테이블에서 사용되며, 부모-자식 관계를 표현하는 데 유용합니다.
자식 데이터는 부모 데이터와의 관계에서 아래쪽에 위치한 데이터를 의미합니다. 계층 구조에서 각 노드(데이터)는 부모 노드와 자식 노드를 가질 수 있습니다. 예를 들어, 조직도에서 각 부서는 부모 부서를 가지고 있을 수 있고, 이 부서들은 또 자식 부서를 가질 수 있습니다.
CONNECT BY 절을 사용하면 이러한 계층 구조를 쿼리할 수 있습니다. 이를 통해 부모-자식 관계를 지정하고, 데이터를 계층적으로 검색할 수 있습니다. 예를 들어, CONNECT BY를 사용하여 특정 부서의 하위 부서를 모두 검색하거나, 특정 부모 카테고리의 모든 하위 카테고리를 검색할 수 있습니다.
따라서 "CONNECT BY"를 사용하여 자식 데이터를 지정하는 것은 계층적인 데이터 구조에서 각 레벨의 하위 데이터를 선택하여 쿼리하는 것을 의미합니다.
순위 관련 함수
- RANK : 동일한 값에 대해서는 동일한 순위를 부여 (1,2,2,4)
- DENSE_RANK : 동일한 순위를 하나의 등수로 간주(1,2,2,3)
- ROW_NUMBER : 동일한 값이라도 고유한 순위 부여 (1,2,3,4)
가정: 다음은 학생들의 성적 데이터로, 각 점수의 순위를 나타냅니다.
- RANK:
- 학생 A: 80
- 학생 B: 90
- 학생 C: 90
- 학생 D: 95
- 학생 A: 순위 3
- 학생 B: 순위 1
- 학생 C: 순위 1 (동점으로 인해 같은 순위를 부여)
- 학생 D: 순위 4
- DENSE_RANK:
- 학생 A: 80
- 학생 B: 90
- 학생 C: 90
- 학생 D: 95
- 학생 A: 순위 2
- 학생 B: 순위 1
- 학생 C: 순위 1 (동점이지만 하나의 등수로 간주)
- 학생 D: 순위 3
- ROW_NUMBER:
- 학생 A: 80
- 학생 B: 90
- 학생 C: 90
- 학생 D: 95
- 학생 A: 순위 1
- 학생 B: 순위 2
- 학생 C: 순위 3 (동점이지만 각각 고유한 순위를 부여)
- 학생 D: 순위 4
이것은 순위 관련 함수를 설명하기 위한 단순화된 예시입니다. 데이터베이스에서 실제로 이러한 함수를 사용할 때는 테이블의 구조와 데이터에 따라 결과가 달라질 수 있습니다.
옵티마이저는 사용자가 질의한 SQL문에 대해 최적의 실행방법을 결정하는 역할을 수행한다.
함수적 종속성
데이터들이 어떤 기준 값에 의해 종속되는 현상
(-) 정규화
반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게 배치되도록 하는 것
• 1차 정규화: 같은 성격, 내용 컬럼이 연속될 때 칼럼 제거, 테이블 생성
• 2차 정규화: PK 복합키 구성일 때
부분적 함수 종속 관계 데이터 분리
• 3차 정규화: PK가 아닌 일반 칼럼에 의존하는 칼럼 분리
분산 DB를 만족하기 위한 가지
투명성
1. 분할 투명성 (단편화)
하나의 논리적 Relaion이 여러 단편으로 분할되어 각 사본이 여러 site에 저장.
2. 위치 투명성
사용하려는 데이터의 저장 장소 명시
불필요. 위치정보가 시스템 카탈로그에 유지
3. 지역사상 투명성
지역 DBMS와 물리적 DB 사이의 매핑 보장
4. 중복 투명성
DB 객체가 여러 site에 중복 되어 있는지 알 필요가 없는 성질
5. 장애 투명성
구성요소의 장애에 무관한 트랜잭션의
원자성 유지
6. 병행 투명성
다수 트랜잭션 동시 수행 시 결과의
일관성 유지, Timestamp, 분산 2단계 Locking 이용
데이터모델링 이해관계자
1) 개발자
2) DBA
3) 모델러
4) 현업업무전문가
DBA는 "Database Administrator"의 약자로, 데이터베이스를 관리하고 유지보수하는 전문가를 가리킵니다. 데이터베이스 관리, 보안, 성능 최적화, 복구 및 백업 등의 작업을 수행합니다.
파티셔닝: 테이블 수평분할기법, 논리적으로는 하나의 테이블이지만 물리적으로 여러 여러 데이터 파일에 분산 저장
List Partition: 특정한 값을 기준으로 분할
페어링
엔티티안에 인스턴스가 개별적으로 관계를
가지는 것
Mapping(사상) : 상호 독립적인 개념을 연결시켜주는 다리
논리적 사상 : 외부 스키마 - 개념 스키마
물리적 사상 : 개념 스키마 - 내부 스키마
논리적 사상은 데이터베이스에서 외부 스키마와 개념 스키마 간의 매핑을 나타냅니다. 이는 사용자나 응용 프로그램이 데이터베이스를 접근할 때의 논리적 구조를 정의합니다. 외부 스키마는 최종 사용자나 응용 프로그램이 볼 수 있는 뷰를 정의하며, 개념 스키마는 전체 데이터베이스의 논리적 구조를 나타냅니다.
물리적 사상은 개념 스키마와 내부 스키마 간의 매핑을 의미합니다. 이는 데이터베이스 시스템이 실제 데이터를 저장하는 방식과 물리적 장치에 대한 구조를 정의합니다. 개념 스키마는 데이터베이스의 논리적 구조를 나타내며, 내부 스키마는 실제 데이터가 저장되는 물리적 구조를 나타냅니다.
슈퍼/서브 타입 모델 : 업무를 구성하는 데이터를 공통과 차이점의 특징을 고려하여 효과적 표현. 논리적 모델
- 슈퍼 타입 : 공통 부분
- 서브 타입 : 공통으로부터 상속받아 다른 엔터티와 차이가 있는 속성
정규화 : 데이터의 정합성 확보와 데이터 입력/수정/삭제시 발생할 수 있는 이상현상을 방지하기 위해 중복 제거
문자형 함수
LOWER : 문자열을 소문자로
UPPER : 문자열을 대문자로
ASCII: 문자의 ASCII값 반환 CHR : ASCII 값에 해당하는 문자 반환
CONCAT : 문자열1, 2를 연결
SUBSTR: 문자열 중 m위치에서 n개의 문자 반환
LENGTH: 문자열 길이를 숫자 값으로 반환
CONCAT(RDBMS', SQL') -> 'RDBMS SOL' SUBSTR('SQL Expert',5,3) -> 'Exp LTRIM(XxxYYZZ×YZ'.'×') -> 'YYZZxYZ
TRIM(×' FROM 'x×YVZZxYZxx') -> VYZZxYZ:
CASCADE: 하위 오브젝트 까지 삭제
BEGIN-END 절은 SQL에서 트랜잭션을 정의하거나, 저장 프로시저에서 여러 개의 SQL 문을 그룹화할 때 사용됩니다. BEGIN-END 절을 사용하면 여러 SQL 문을 하나의 논리적 단위로 묶을 수 있습니다. 이것은 트랜잭션을 시작하고 종료하는 데 사용될 수도 있습니다. 트랜잭션은 데이터베이스 조작의 원자성, 일관성, 독립성, 지속성 (ACID)을 보장하는 데 중요합니다.
- 프로시저(Stored Procedure):
- 프로시저는 데이터베이스에 미리 저장된(혹은 '저장된') 명령어들의 집합입니다. 이러한 명령어 집합은 하나의 논리적 단위로 구성되어 있으며, 필요할 때마다 호출하여 실행할 수 있습니다.
- 프로시저는 일련의 SQL 문과 제어문을 포함할 수 있습니다. 이것은 보통 비즈니스 로직을 포함하거나 특정한 작업을 수행하기 위한 목적으로 사용됩니다.
- 프로시저는 명시적으로 호출되어 실행되며, 일반적으로 사용자가 직접 호출하여 실행합니다. 또한 트랜잭션 내에서 실행되며, COMMIT 또는 ROLLBACK을 사용하여 트랜잭션을 컨트롤할 수 있습니다.
- 트리거(Trigger):
- 트리거는 데이터베이스 내에서 특정한 이벤트가 발생했을 때 자동으로 실행되는 일련의 작업을 정의하는 데 사용됩니다. 이러한 이벤트는 INSERT, UPDATE, DELETE 등의 데이터 조작 명령어를 실행할 때 발생할 수 있습니다.
- 트리거는 데이터의 변화를 감지하고, 특정 조건에 따라 자동으로 특정 작업을 수행하도록 설정됩니다. 예를 들어, 특정 테이블에 새로운 데이터가 삽입되었을 때, 해당 테이블에서 데이터를 가져와 다른 테이블에 자동으로 삽입하는 등의 작업을 할 수 있습니다.
- 트리거는 주로 데이터 일관성 유지, 보안 강화, 로깅 등과 같은 목적으로 사용됩니다.
요약하자면, 프로시저는 사용자가 명시적으로 호출하여 실행하는 미리 정의된 명령어 집합이며, 트리거는 특정 이벤트가 발생할 때 자동으로 실행되는 작업을 정의합니다. 둘 다 데이터베이스의 기능을 확장하고 보다 효율적인 데이터 관리를 위해 사용됩니다.
로깅(Logging)은 주로 소프트웨어나 시스템에서 발생하는 이벤트나 활동을 기록하는 과정을 의미합니다. 데이터베이스에서 로깅은 특정 이벤트나 작업에 대한 기록을 생성하여 나중에 추적하거나 분석할 수 있도록 합니다.
데이터베이스 로깅은 주로 다음과 같은 목적으로 사용됩니다:
오류 및 경고 기록: 데이터베이스에서 발생하는 오류나 경고를 기록하여 나중에 분석하고 해결할 수 있도록 합니다. 이는 데이터베이스의 안정성과 신뢰성을 유지하는 데 도움이 됩니다.
트랜잭션 기록: 데이터베이스에서 수행된 각 트랜잭션에 대한 세부 정보를 기록합니다. 이는 데이터베이스의 상태를 추적하고 데이터 일관성을 유지하는 데 도움이 됩니다. 트랜잭션 로그를 사용하여 데이터 손실이나 손상된 데이터를 복구할 수도 있습니다.
보안 기록: 데이터베이스 접근 및 변경에 관련된 활동을 기록합니다. 이는 데이터베이스의 보안을 강화하고 불법적인 접근이나 비인가된 작업을 탐지하는 데 도움이 됩니다.
성능 모니터링: 데이터베이스의 성능을 모니터링하고 최적화하기 위해 실행된 쿼리나 작업에 대한 정보를 기록합니다. 이는 데이터베이스의 성능을 향상시키고 효율적으로 운영할 수 있도록 도와줍니다.
따라서 로깅은 데이터베이스의 안전성, 보안성, 일관성 및 성능을 유지하고 개선하는 데 중요한 역할을 합니다.
B-Tree 인덱스는 데이터베이스에서 가장 일반적으로 사용되는 인덱스 형태 중 하나입니다. B-Tree는 이진 트리(Binary Tree)의 변형으로, 여러 개의 자식을 가진 노드들로 이루어진 트리 구조를 말합니다. 데이터베이스에서 B-Tree 인덱스는 주로 검색 연산에 사용되며, 레코드들이 정렬된 순서로 저장됩니다. 이진 트리의 특성을 활용하여 효율적인 검색을 가능케 합니다.
따라서, 문제에서 설명하는 "주로 B-Tree 인덱스로 되어 있다."는 테이블 설계 시 인덱스와 관련된 설명으로 적절한 것입니다.
노드(Node)는 그래프 이론이나 트리 구조에서 기본적인 개념 중 하나입니다. 트리나 그래프의 구성 요소 중 하나로, 데이터를 저장하는 단위입니다. 각각의 노드는 데이터와 하나 이상의 자식에 대한 참조(링크 또는 포인터)를 가집니다.
이진 트리에서 각 노드는 다음과 같은 요소들을 포함할 수 있습니다:
- 데이터: 노드가 저장하는 정보를 나타냅니다. 이는 어떠한 형태의 데이터든 될 수 있습니다. 예를 들어, 정수, 문자열, 객체 등이 될 수 있습니다.
- 왼쪽 자식 노드에 대한 참조(링크 또는 포인터): 왼쪽 자식 노드를 가리키는 참조를 저장합니다.
- 오른쪽 자식 노드에 대한 참조(링크 또는 포인터): 오른쪽 자식 노드를 가리키는 참조를 저장합니다.
트리 구조에서 노드는 부모-자식 관계를 가지며, 루트 노드(root node)는 트리의 최상위 노드이고 부모 노드가 없습니다. 리프 노드(leaf node)는 자식이 없는 노드를 의미하며, 중간 노드는 최소한 하나 이상의 자식을 가지는 노드입니다.
노드는 트리나 그래프 구조에서 정보를 저장하고 구조를 형성하는 핵심적인 요소로, 이를 통해 다양한 알고리즘 및 데이터 구조를 구현할 수 있습니다.
이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드를 가지는 트리 구조를 말합니다. 이진 트리는 노드, 간선(edge), 루트(root), 리프(leaf) 등으로 이루어져 있습니다. 각 노드는 데이터와 왼쪽 자식 노드와 오른쪽 자식 노드에 대한 참조를 가집니다.
이진 트리의 중요한 특징은 다음과 같습니다:
- 각 노드는 최대 두 개의 자식 노드를 가질 수 있습니다.
- 왼쪽 서브트리(left subtree)에 있는 노드들은 해당 노드보다 작은 값을 가지며, 오른쪽 서브트리(right subtree)에 있는 노드들은 해당 노드보다 큰 값을 가집니다.
- 이진 트리는 검색, 삽입, 삭제 등 다양한 연산에 사용됩니다. 이진 탐색 트리(Binary Search Tree)는 이진 트리의 일종으로, 특정한 조건을 만족시키면서 데이터를 저장하는 방식입니다.
이진 트리는 데이터의 효율적인 검색, 정렬, 계층적 데이터 구조 표현 등 다양한 용도로 사용됩니다.
디스크의 여러 블록이란 일반적으로 디스크에 저장된 데이터의 작은 단위를 가리킵니다. 디스크는 데이터를 블록(block)이라는 단위로 저장하며, 각 블록은 고정된 크기를 가지고 있습니다. 이 블록은 디스크의 물리적인 섹터에 해당하며, 데이터베이스 시스템에서 데이터를 읽거나 쓸 때 가장 작은 단위로 사용됩니다.
블록의 크기는 디스크 시스템마다 다를 수 있지만, 일반적으로 4KB에서 64KB까지의 크기를 가질 수 있습니다. 블록 크기가 클수록 한 번에 더 많은 데이터를 읽거나 쓸 수 있지만, 작은 크기의 데이터를 읽거나 쓸 때는 오버헤드가 발생할 수 있습니다.
테이블에 많은 수의 컬럼이 존재하게 되면, 각 행(row)의 데이터가 여러 블록에 분산되어 저장될 수 있습니다. 이는 한 행의 데이터를 읽기 위해 디스크에서 여러 블록을 읽어야 함을 의미합니다. 디스크 I/O 연산은 매우 느린 작업 중 하나이므로, 이러한 경우에는 성능 저하가 발생할 수 있습니다.
따라서, 데이터베이스 설계 시에는 가능하면 테이블의 컬럼 수를 적절하게 제한하여 디스크 I/O를 최소화하는 것이 좋습니다. 또한, 데이터의 논리적인 구조와 접근 패턴을 고려하여 데이터를 적절히 정규화하고 인덱스를 효율적으로 활용하여 성능을 향상시킬 수 있습니다.
DB에서 UNION 연산자는 두 개 이상의 SELECT 문의 결과를 하나의 결과 집합으로 결합하는 데 사용됩니다. 이 때, 중복된 행을 제거하는 동작은 기본적으로 UNION 연산자의 특성 중 하나입니다.
UNION 연산자를 사용할 때 중복된 행을 제거하는 이유는 결과 집합에 중복된 데이터가 포함되지 않도록 하기 위함입니다. 예를 들어, 두 개의 테이블에서 같은 조건에 맞는 결과를 가져오는데, 이 결과들이 중복될 수 있습니다. 이러한 중복된 결과를 UNION 연산자를 사용하여 결합할 때, 중복된 행을 제거하지 않으면 결과 집합에 중복된 데이터가 포함되어 있게 됩니다. 이는 일반적으로 원하는 결과가 아니며, 데이터의 일관성과 정확성을 위해 중복된 행을 제거하는 것이 필요합니다.
따라서, DB에서 UNION 연산자를 사용할 때 중복된 행을 제거하는 것은 결과 집합의 중복을 방지하고 정확한 결과를 얻기 위한 것입니다. UNION은 합집합을 나타내는 집합 이론의 용어이며, 이를 데이터베이스에서 사용할 때 중복된 행을 제거하는 것은 집합의 특성을 따르는 것입니다.
스칼라 서브쿼리 개념:
인라인뷰(Inline View)는 SELECT 문의 FROM 절에 포함된 서브쿼리입니다. 이 서브쿼리는 메인 쿼리의 일부로 간주되며, 메인 쿼리의 다른 테이블과 마찬가지로 쿼리의 실행에 사용됩니다.
일반적으로 테이블은 데이터베이스에 영구적으로 저장되어 있지만, 인라인뷰는 쿼리 실행 시에 임시적으로 생성되어 메모리에 유지됩니다. 이 서브쿼리는 메인 쿼리와 함께 실행되어 결과 집합을 생성하며, 이 결과 집합은 메인 쿼리에서 다루는 다른 테이블의 결과와 동일한 방식으로 취급됩니다.
예를 들어, 다음과 같은 쿼리가 있다고 가정해보겠습니다.
SELECT *
FROM TableA
WHERE ColumnA IN (SELECT ColumnB FROM TableB);
위 쿼리에서, 서브쿼리 (SELECT ColumnB FROM TableB)는 인라인뷰로 사용됩니다. 이 서브쿼리는 메인 쿼리의 테이블인 TableA와 함께 실행되어, 메인 쿼리의 WHERE 조건에 따라 결과를 필터링합니다. 결과적으로 인라인뷰는 메인 쿼리의 일부로 취급되어, 메인 쿼리의 실행에 영향을 줍니다. 이것이 "하나의 테이블처럼 취급된다"는 의미입니다.
해설 : Lock/Unlock은 병행성 제어(동시성) 기법이다.
무결성 : 데이터 임의 갱신으로부터 보호해야 하는 것.
제약조건을 넣어서 무결성을 보장하거나, Triger 로직 안에 검사 기능을 넣을 수도 있고, 개발자의 코딩에서 로직을 넣을 수도 있다.
1은 소수점 첫째자리임.
SELECT ROUND(3.45, -1) AS COL1 FROM DUAL; 여기서 -1 이면 뭐가 어떻게 되는거야?
고유 키(unique key)와 기본 키(primary key) 사이의 주요 차이점은 다음과 같습니다:
중복 값 허용 여부: 기본 키는 각 행에 대해 고유한 값을 가져야 하며 중복 값이 허용되지 않습니다. 하지만 고유 키는 각 행에 대해 중복된 값을 허용하지 않지만, NULL 값을 가질 수 있습니다.
NULL 값 허용 여부: 기본 키는 NULL 값을 허용하지 않습니다. 즉, 기본 키 열에는 NULL이 포함될 수 없습니다. 하지만 고유 키는 NULL 값을 가질 수 있습니다.
테이블 내 유일성 보장: 기본 키는 테이블 내에서 각 행을 고유하게 식별하는 데 사용됩니다. 그러므로 기본 키는 반드시 정의되어야 하며 테이블에는 하나의 기본 키만 있어야 합니다. 반면에 고유 키는 테이블 내에서 특정 열 또는 열의 조합에 대해 고유성을 보장하기 위해 사용될 수 있습니다. 여러 개의 고유 키가 존재할 수 있습니다.
요약하면, 기본 키는 테이블 내에서 각 행을 식별하는 데 사용되는 고유한 식별자이며, 중복 값과 NULL 값이 허용되지 않습니다. 반면에 고유 키는 각 행을 식별하는 데 사용되며, 중복 값은 허용되지 않지만 NULL 값은 허용됩니다.
Unique Key는 중복값 허용 안함 impo
하나 이상의 속성값을 가지는 경우 정규화가 필요함
논리 모델링의 외래키는 물리 모델에서 반드시 구현되지 않음. (선택 사항임)
관계형 데이터베이스에서 식별자(Identifier)는 각 레코드를 고유하게 식별하는 데 사용되는 열(또는 열의 집합)입니다. 데이터베이스 설계 및 관리에 있어서 식별자는 매우 중요한 개념으로, 데이터를 식별하고 관리하는 데 필수적입니다.
- 주식별자(Primary Key):
- 주식별자는 특정 레코드를 유일하게 식별하는 데 사용되는 식별자입니다.
- 각 테이블에는 주식별자가 반드시 하나 존재해야 합니다.
- 주식별자는 NULL 값을 가질 수 없으며, 중복될 수 없습니다.
- 주식별자는 일반적으로 테이블을 생성할 때 지정되며, 주로 하나의 열로 구성됩니다.
- 보조식별자(Alternate Key):
- 보조식별자는 주식별자와 유사하지만, 주식별자가 될 수 없는 식별자입니다.
- 즉, 보조식별자는 유일한 값을 가지지만, 테이블의 레코드를 식별하는 데 사용되지 않습니다.
- 예를 들어, 여러 열의 조합으로 구성된 식별자가 있을 수 있습니다. 이러한 열의 조합은 보조식별자가 될 수 있습니다.
- 본질식별자(Natural Key):
- 본질식별자는 테이블에 이미 존재하는 실제 업무에서 사용되는 식별자입니다.
- 이는 비즈니스 도메인에서 논리적으로 고유한 열을 가리킵니다. 예를 들어, 주문 테이블의 주문 번호 열은 본질식별자가 될 수 있습니다.
- 복합식별자(Composite Key):
- 복합식별자는 두 개 이상의 열의 조합으로 구성된 식별자입니다.
- 복합식별자는 하나의 열로 식별할 수 없는 경우에 사용됩니다. 예를 들어, 학생 테이블에서 학번과 학년을 함께 사용하여 각 학생을 식별할 수 있습니다.
이러한 식별자들은 데이터베이스 설계에서 중요한 역할을 하며, 데이터의 정확성과 무결성을 유지하는 데 도움이 됩니다. 따라서 각 테이블에 적절한 식별자를 선택하고 구현하는 것이 중요합니다.
ROLLUP : 인수 순서중요(계층적) / 계층 간 정렬 가능(계층 내 정렬 불가, order by 사용해야함)
CUBE : 모든값에 다차원집계 생성 / 시스템에 많은 부하
GroupingSets : 인수 순서무관(평등)
HAVING 절은 실제로 그룹화된 결과에 조건을 적용하여 그룹을 필터링하는 데 사용됩니다. 이는 일반적으로 집계 함수와 함께 사용됩니다.
HAVING 절은 WHERE 절과 비슷해 보일 수 있지만, WHERE 절은 개별 행에 조건을 적용하여 특정 행을 필터링하는 데 사용되고, HAVING 절은 그룹화된 결과에 조건을 적용하여 그룹을 필터링하는 데 사용됩니다.
네, 맞습니다. HAVING 절은 그룹화된 결과 집합에서 특정 조건을 충족하는 그룹을 선택하는 데 사용됩니다. 따라서 HAVING 절은 집계 함수를 사용하여 각 그룹의 특성을 확인하고 그룹을 필터링할 수 있습니다.
주어진 예시에서는 전체 행의 수를 COUNT(*)로 계산하고, 그 결과가 4를 초과하는 그룹만을 선택하도록 HAVING 절이 지정되어 있습니다. 따라서 이 쿼리는 행의 수를 기준으로 그룹화된 결과 집합에서 4보다 큰 값을 가진 그룹만을 선택하게 됩니다.
하지만 데이터의 숫자는 실제로는 중요하지 않습니다. COUNT(*)는 행의 수를 계산하기 때문에, 데이터가 1, 2, 3, 4가 아닌 다른 값으로 구성되어 있더라도 행의 수가 4가 되면 같은 결과를 얻게 됩니다.
행 개수 구하기 - COUNT
25.
SELECT DISINCT COL1 // 중복제거
FROM SQLD_34_16_01 (1, 2, 3, 5, 6) 선택
UNION ALL // 중복 허용 합집합
SELECT COL1 // (1, 2, 2, 4, 5)
FROM SQLD_34_16_02
==> (1, 2, 3, 5, 6) + (1, 2, 2, 4, 5) = 1, 1, 2, 2, 2, 3, 4, 5, 5, 6 (10건)
RATIO_TO_REPORT 함수는 전체 SUM 값에 대한 각 행의 칼럼 값의 비율을 계산합니다. 이 함수는 특정 칼럼 값이 전체 값 중에서 차지하는 비율을 계산하여 0부터 1까지의 값으로 표현합니다.
예를 들어, 어떤 테이블에 "sales" 칼럼이 있고, 이 칼럼 값들의 합이 100이라고 가정해 봅시다. RATIO_TO_REPORT 함수를 사용하면 각 행의 sales 값이 전체 합 중에서 차지하는 비율을 계산할 수 있습니다.
예를 들어, sales가 20, 30, 40, 10인 네 개의 행이 있다면:
- 첫 번째 행의 비율은 20 / 100 = 0.2
- 두 번째 행의 비율은 30 / 100 = 0.3
- 세 번째 행의 비율은 40 / 100 = 0.4
- 네 번째 행의 비율은 10 / 100 = 0.1
따라서 RATIO_TO_REPORT 함수는 이러한 비율을 계산하여 각 행의 칼럼 값에 대한 비율을 반환합니다. 이 값은 0부터 1까지의 값으로 표현되며, 각 행이 전체 값 중에서 차지하는 상대적인 위치를 보여줍니다.
UPDATE SQLD_34_21 SET N1=3 WHERE N2=1;
CREATE TABLE SQLD_34_21_TEMP (N1 NUMBER);
ROLLBACK;
1) SQL 서버의 경우, AUTO COMMIT 꺼두면 UPDATE, CREATE 모두 취소되고 다시 테이블이 생성되지 않음
2) 오라클은 DDL의 AUTO COMMIT이 기본이기 때문에 CREATE 취소되지않고, UPDATE도 취소X
항 4개, INSERT 3개
37.
1) ORDER BY 기본 오름차순 (작은 것부터)
2) SELECT 사용X 것도 ORDER BY 가능 (12번 참조)
3) ORDER BY 1, COL1 혼용 가능
4) 오라클 NULL : ∞
SQL서버 NULL : -∞
해설 : NOT - AND - OR 순으로 연산
SQL에서의 NTILE 함수는 결과 집합을 지정된 숫자의 그룹으로 분할합니다. NTILE 함수는 일반적으로 순위가 있는 값을 동일한 크기의 그룹으로 나눌 때 사용됩니다. 이를테면, 전체 데이터셋을 4개의 그룹으로 나누려면 NTILE(4)를 사용할 수 있습니다.
NTILE 함수는 다음과 같이 사용됩니다:
NTILE(n) OVER (ORDER BY column_name)
여기서 n은 결과를 몇 개의 그룹으로 분할할지를 나타내는 매개변수이며, column_name은 결과를 기준으로 정렬할 열의 이름입니다.
NTILE 함수는 결과 집합을 정렬하고, 순위를 계산한 후에 각 행에 대해 순위를 그룹 수로 나누어 해당 행이 속하는 그룹을 결정합니다. 이를 통해 결과 집합이 지정된 그룹 수로 분할됩니다.
예를 들어, NTILE(4)를 사용하면 전체 데이터셋을 4개의 그룹으로 나누게 되고, 각 그룹은 비슷한 크기의 행을 포함하게 됩니다.
39회
데이터베이스에서 식별 관계(Identifying Relationship)는 한 테이블의 행이 다른 테이블의 행을 식별하는 관계를 나타냅니다. 이러한 관계에서는 부모 테이블의 기본 키(primary key) 컬럼이 자식 테이블의 외래 키(foreign key) 컬럼으로 사용됩니다.
일반적으로 식별 관계는 부모 테이블의 기본 키를 자식 테이블의 외래 키로 참조하는 관계를 의미합니다. 이는 자식 테이블의 각 행이 부모 테이블의 특정 행과 관련이 있음을 나타냅니다. 즉, 자식 테이블의 외래 키는 부모 테이블의 기본 키를 가리키는 것으로, 이를 통해 부모 테이블의 각 행을 식별할 수 있습니다.
식별 관계는 일대일(One-to-One) 또는 일대다(One-to-Many) 관계일 수 있습니다. 일대다 관계에서는 부모 테이블의 한 행이 여러 자식 테이블의 행과 연결될 수 있습니다.
예를 들어, "부서(Department)" 테이블과 "직원(Employee)" 테이블이 있다고 가정해 봅시다. 이때 "직원" 테이블의 각 행은 "부서" 테이블의 특정 부서를 식별하는데 사용되는 부서 ID를 포함할 수 있습니다. 이렇게 "직원" 테이블의 부서 ID 컬럼은 "부서" 테이블의 기본 키를 참조하여 부서를 식별하는 데 사용될 수 있습니다.
내부 식별자 (Internal Identifier): 데이터베이스 시스템에서 자동으로 생성되고 관리되는 식별자를 의미합니다. 일반적으로 시스템에서 사용하는 식별자로 사용자에게 노출되지 않습니다.
1-1-3. Hash Join
- 해싱 함수(Hashing Function) 에 의한 탐색을 하여 조인을 수행하는 방식
- 해싱 함수는 직접적인 연결을 담당하는 것이 아니라 연결될 대상을 특정 지역(partition)에 모아두는 역할만을 담당
- 해시값을 이용하여 테이블을 조인하는 방식
- Sort-Merge 조인은 정렬의 부하가 많이 발생하여, 이를 보완하기 위한 방법으로 Sort 대신 해쉬값을 이용하는 조인
Hash Join 특징
- Random Access와 정렬에 대한 부담을 해소 > 대용량의 데이터 처리 시 사용됨
- parallel processing을 이용한 Hash Join은 대용량 데이터를 처리하기 위한 최적의 솔루션
- 2개의 조인 테이블 중 small rowset을 가지고 hash_area_size에 지정된 메모리 내에서 hash table 생성
- CBO에서만 가능하며, CPU 성능에 의존적(CPU 자원 많이 소비)
- Hash table 생성 후 Nested Loop처럼 순차적인 처리 형태로 수행
- 배치 작업에 유리
Hash Join 주의사항
- 대용량 데이터 처리에서는 상당히 큰 hash area를 필요로 함으로, 메모리의 지나친 사용으로 오버헤드 발생 가능성
- 소량의 데이터를 조인할 때 오히려 불필요한 I/O가 증가할 수 있음
- 연결조건 연산자가 ‘=’인 동치조인인 경우에만 가능
- Equi Join에서만 가능 > Non-Equal 조인 조건인 경우 Hash Join으로 수행되지 못하고 Merge Join으로 수행됨
- Outer Table의 해시 키 칼럼에 중복값이 적은 경우에 사용
- 두 집합 중 크기가 작은 집합을 Outer Table로 결정
- 조인 칼럼에 적당한 Index가 없는데 Nested Loop Join이 비효율 적일 때 사용
- Nested Loop Join에서 조인 칼럼 Index가 있더라도 Random Access 부하가 심할 때 사용
Hash Join 부분 출처: https://velog.io/@ynjch97/SQLD-JOINNested-Loop-Join-Sort-Merge-Join-Hash-Join
SAL보통 SALARY
GROUP BY 절은 그룹화된 결과를 나타내기 위해 사용됩니다. 그룹화된 결과에서는 각 그룹에 대한 집계 함수 (예: COUNT, SUM 등)를 사용할 수 있습니다. SELECT 절에 나열되는 열은 GROUP BY 절에 명시된 열 또는 집계 함수를 포함해야 합니다.
따라서 이 경우에는 SELECT 절에 EMPNO가 포함되어 있지 않아야 합니다. EMPNO가 GROUP BY 절에 명시되어 있지 않고, 집계 함수 COUNT에도 사용되지 않았기 때문에 올바르지 않은 선택지입니다.
그러므로 정답은 1) EMPNO 입니다.
--37회
도메인 = 허용 범위
"카디널리티(Cardinality)"는 데이터베이스에서 특정 열(속성)에 대한 고유한 값의 수를 가리킵니다. 이것은 주어진 열에서 중복되지 않는 값의 개수를 의미합니다.
예를 들어, "성별" 열의 카디널리티가 2이면, 해당 열에는 두 가지 고유한 값(예: 남성, 여성)만 포함됩니다. 반면에 "도시" 열의 카디널리티가 100이면, 해당 열에는 100개의 서로 다른 도시 이름이 포함됩니다.
카디널리티는 데이터베이스 설계 및 쿼리 최적화에 중요한 역할을 합니다. 예를 들어, 카디널리티가 높은 열은 인덱싱이 필요할 수 있습니다. 반면에 카디널리티가 낮은 열은 인덱싱을 할 필요가 없을 수 있습니다.
ER(Entity-Relationship) 모델에서 "degree"는 관계(relationship)가 연결하는 엔티티(entity)의 수를 가리킵니다. 이것은 관계에 참여하는 엔티티의 수를 의미하며, 관계의 복잡성을 나타내는 중요한 개념 중 하나입니다.
- Unary Relationship (Degree 1):
- 단항 관계는 한 엔티티 유형만 관련되어 있습니다. 예를 들어, "직원" 엔티티와 "관리자" 관계는 단항 관계의 예입니다. 여기서 "직원"은 "관리자"에 의해 관리될 수 있습니다.
- Binary Relationship (Degree 2):
- 바이너리 관계는 두 개의 엔티티 유형 간의 관계를 나타냅니다. 가장 일반적인 형태의 관계입니다. 예를 들어, "주문" 엔티티와 "고객" 엔티티 간의 관계는 바이너리 관계입니다. "주문"은 "고객"에 의해 생성될 수 있습니다.
- Ternary Relationship (Degree 3):
- 테너리 관계는 세 개의 엔티티 유형 간의 관계를 나타냅니다. 이것은 세 가지 엔티티 간의 복잡한 관계를 설명할 때 사용됩니다. 예를 들어, "도서 대출" 시스템에서 "도서", "회원", "대출" 간의 관계는 테너리 관계입니다. "도서 대출"은 특정 "도서"가 특정 "회원"에게 "대출"되는 것을 나타냅니다.
이러한 방식으로, 관계의 degree는 해당 관계가 얼마나 많은 엔티티 유형을 포함하고 있는지를 나타냅니다. ER 다이어그램에서 관계선에 인접한 작은 숫자로 표시되기도 합니다.
"주 릴레이션을 참조"
정규화(Normalization)는 데이터베이스 설계 단계에서 중복을 최소화하고 데이터 구조를 최적화하는 프로세스입니다. 이를 통해 데이터베이스가 일관된 상태를 유지하고, 삽입, 삭제, 갱신 시 발생할 수 있는 이상 현상을 방지할 수 있습니다. 정규화는 보통 다음과 같은 단계로 수행됩니다:
- 1NF(First Normal Form):
- 데이터베이스의 각 테이블이 원자적인 속성을 가지도록 분해합니다. 즉, 각 열에는 하나의 값만 포함되어야 합니다. 이를 위해 복합 속성을 단일 값으로 분리하고, 반복 그룹을 단일 엔티티로 만듭니다.
- 2NF(Second Normal Form):
- 1NF를 만족하면서 부분 함수 종속을 제거합니다. 이를 위해 테이블을 더 작은 테이블로 분해하고, 이에 따라 관련 데이터를 이동시켜야 합니다. 이상 현상을 방지하고, 데이터의 중복을 최소화합니다.
- 3NF(Third Normal Form):
- 2NF를 만족하면서 이행적 함수 종속을 제거합니다. 즉, 비주요 속성이 후보 키가 아닌 주요 키에 종속되어서는 안됩니다. 이를 위해 다른 열로 이동하여 각 열의 종속성을 확인하고, 필요한 경우 새로운 테이블을 생성합니다.
- BCNF(Boyce-Codd Normal Form):
- 모든 결정자가 후보 키인 3NF를 보완합니다. 이상 현상을 완전히 제거하기 위해 추가적인 분해가 필요할 수 있습니다.
- 4NF, 5NF 등의 추가 정규화 단계:
- 특정 상황에서는 3NF나 BCNF 이상의 정규화가 필요할 수 있습니다. 4NF(제 4 정규화)는 다치 종속성을 제거하기 위한 것이며, 5NF(제 5 정규화)는 조인 종속성을 제거하기 위한 것입니다. 이러한 정규화 단계는 상황에 따라 필요할 수 있습니다.
이러한 정규화 과정은 데이터베이스 설계를 개선하고 데이터의 일관성, 무결성을 유지하기 위해 수행됩니다. 그러나 너무 많은 정규화는 성능에 영향을 미칠 수 있으므로 적절한 정규화 수준을 유지하는 것이 중요합니다.
가질 수 있는 걸로 알고 있는데...
유니크 키도 Null 값 가질 수 있다.
SQL 문에서 PRECEDING은 윈도우(frame)의 현재 행을 기준으로 앞쪽에 위치한 행들을 지정하는 키워드입니다. 따라서 BETWEEN 50 PRECEDING AND 100 FOLLOWING은 현재 행을 중심으로 이전 50개 행부터 이후 100개 행까지를 포함하는 윈도우를 지정한다는 의미입니다.
SQL에서 윈도우 함수를 사용할 때, 윈도우의 범위를 지정하는 방법에는 두 가지가 있습니다: ROWS와 RANGE.
- ROWS: ROWS 키워드를 사용하면 행(row)의 개수를 기준으로 윈도우를 지정합니다. 따라서 BETWEEN 50 PRECEDING AND 100 FOLLOWING은 현재 행을 중심으로 이전 50개 행부터 이후 100개 행까지를 포함하는 윈도우를 지정하는 것입니다.
- RANGE: RANGE 키워드를 사용하면 값(value)의 범위를 기준으로 윈도우를 지정합니다. 이는 일반적으로 숫자형 데이터에서 사용됩니다. 예를 들어, 날짜나 숫자 형태의 데이터에서 일정한 범위를 지정할 때 유용합니다. RANGE는 실제 값의 범위에 따라 윈도우를 지정하기 때문에, 데이터가 밀집되어 있을 때 윈도우의 크기가 유동적으로 조절됩니다.
따라서 제시된 SQL 쿼리에서는 RANGE 키워드를 사용하여 윈도우의 범위를 지정해야 합니다. 윈도우 함수와 함께 사용될 때는 보통 ROWS나 RANGE 중 하나를 선택하여 사용하게 됩니다.
문제 22. 다음 파티션에 대한 설명으로 틀린 것을 고르시오. 정답확인🌼
1) RANK() OVER (PARTITION BY JOB ORDER BY 급여 DESC) JOB_RANK
#직업별 급여가 높은 순서대로 부여되고 동일한 순위는 동일한 값이 부여 된다.
2) SUM(급여) OVER (PARTITION BY MGR ORDER BY 급여 RANGE UNBOUNDED PRECEDING)
#RANGE는 논리적 주소에 의한 행 집합을 의미하고 MGR별 현재 행부터 파티션내 첫번째 행까지 급여의 합계를 계산한다.
3) AVG(급여) OVER (PARTITION BY MGR ORDER BY 날짜 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING))
#각 MGR 별로 앞의 한건, 현재 행, 뒤의 한건 사이에서 급여의 평균을 계산한다.
4) COUNT(*) OVER (ORDER BY 급여) RANGE BETWEEN 10 PRECEDING AND 300 FOLLOWING)
#급여를 기준으로 현재 행에서의 급여의 10에서 300사이의 급여를 가지는 행의 수를 COUNT
2번?
먼저, 각 MGR 그룹 내에서 작업을 수행합니다. 이것을 'PARTITION BY MGR'이라고 합니다. 즉, 각 MGR 별로 데이터가 그룹화됩니다.
그런 다음, 각 MGR 그룹 내에서 '날짜' 열을 기준으로 데이터를 정렬합니다. 이것을 'ORDER BY 날짜'라고 합니다. 즉, 각 MGR 그룹 내에서는 날짜에 따라 데이터가 정렬됩니다.
그 후에는 각 MGR 그룹 내에서 다음과 같은 작업을 수행합니다: 각 행에 대해 앞의 한 건과 뒤의 한 건을 포함하여 총 세 개의 연속된 행을 선택합니다.
선택된 세 행에 대해 급여의 평균을 계산합니다. 즉, 선행 행, 현재 행, 후행 행 사이의 급여 평균을 구합니다.
이러한 과정을 통해 각 MGR 그룹 내에서 날짜를 기준으로 정렬된 데이터에 대해 급여의 평균을 계산합니다.
문제 27. 다음 중 아래에서 Join에 대한 설명으로 올바르지 않은 것은? 정답확인🌼
가) 마스터 테이블과 슬레이브 테이블 간의 조인은 일반적으로 기본키와 외래키 사이에서 발생한다.
나) EQUI Join은 두 개의 테이블 간에 칼럼 값이 일치하는 것을 조회한다.
다) EQUI Join은 >, <, >=, <= 를 사용한다.
라) EQUI Join은 두 개의 테이블에서 교집합을 찾는다.
1) 가 2) 나 3) 다 4) 라 |
DCL (=CONTROL)
회수는 REVOKE
38회
VIEW는 데이터베이스에서 데이터를 쿼리할 때 편리하게 사용할 수 있는 가상 테이블입니다. VIEW는 기존의 하나 이상의 테이블로부터 데이터를 가져와서 새로운 가상의 테이블을 형성하므로, 원본 데이터에 직접적인 영향을 주지 않고 데이터에 대한 접근을 제어하거나 보안을 강화할 수 있습니다.
데이터베이스 보안과 관련하여 VIEW가 중요한 역할을 하는 몇 가지 이유는 다음과 같습니다:
데이터 노출 제어: VIEW를 사용하면 특정 사용자에게만 필요한 데이터를 노출시킬 수 있습니다. 즉, VIEW를 통해 특정 컬럼을 숨기거나 특정 행을 필터링하여 보안을 강화할 수 있습니다.
접근 제어: VIEW를 통해 사용자에게 데이터에 대한 읽기 권한만 부여하거나, 특정 조건에 맞는 데이터만 제한적으로 제공함으로써 데이터베이스 접근을 제어할 수 있습니다.
복잡한 쿼리 숨기기: VIEW를 사용하여 복잡한 쿼리를 감춤으로써 사용자가 직접 복잡한 쿼리를 작성하지 않고도 필요한 정보에 접근할 수 있도록 합니다. 이는 데이터베이스 구조를 숨기고 보안을 향상시키는 데 도움이 됩니다.
따라서 VIEW는 데이터베이스 보안과 관련하여 데이터 노출을 제어하고 접근을 제어함으로써 보안을 강화하는 데 중요한 역할을 합니다.
"RENAME"은 데이터베이스 객체의 이름을 변경하는 데 사용되는 SQL 명령문입니다. 보통 테이블, 뷰, 컬럼 등의 이름을 변경할 때 사용됩니다. "RENAME" 명령문은 DDL(Data Definition Language)에 속합니다. 여기서 DDL은 데이터베이스의 구조를 정의하거나 조작하기 위한 언어의 하나입니다.
여기서 "RENAME"이 DDL에 속하는 이유는 다음과 같습니다:
데이터베이스 구조 변경: "RENAME" 명령문은 데이터베이스의 구조를 변경합니다. 객체의 이름을 변경하는 것은 데이터베이스의 구조를 변경하는 것이기 때문에 DDL에 속합니다.
트랜잭션 제어와 무관: "RENAME" 명령문은 트랜잭션의 일부로 처리되지 않습니다. 즉, "RENAME"을 실행하면 해당 명령문이 즉시 커밋되거나 롤백되며, 트랜잭션 제어에 영향을 주지 않습니다. 이는 "RENAME"이 데이터의 논리적인 구조를 변경하는 것이기 때문에 트랜잭션과는 관련이 없기 때문입니다.
반면, DCL(Data Control Language)은 데이터베이스에 대한 접근 권한을 제어하기 위한 언어입니다. DCL에 속하는 명령문은 데이터베이스에 대한 접근 권한을 부여하거나 취소하는 데 사용됩니다. "RENAME" 명령문은 데이터베이스 구조를 변경하므로 DDL에 속합니다.
인조 식별자는 주로 시스템이나 프로그램에 의해 자동으로 생성되는 식별자를 말합니다. 이러한 식별자는 일반적으로 비즈니스 프로세스나 자연적인 현상과는 무관하게 생성됩니다. 예를 들어, 데이터베이스에서 테이블에 새로운 레코드를 추가할 때 자동으로 생성되는 고유한 숫자나 문자열이 인조 식별자입니다. 이러한 인조 식별자는 비즈니스 로직과는 독립적으로 주로 기술적인 목적을 위해 사용됩니다.
내부 식별자(Internal Identifier)는 주로 시스템 내부에서 사용되는 식별자입니다. 주로 데이터베이스나 프로그램 코드 내에서 사용되며, 사용자나 외부 시스템에 노출되지 않습니다. 이러한 식별자는 주로 데이터 관리를 위해 사용되며, 외부적으로는 일반적으로 가시적이지 않습니다.
단일 식별자(Surrogate Identifier)는 엔터티나 객체를 구별하기 위해 시스템에서 자동으로 생성되는 고유한 식별자입니다. 이러한 식별자는 본래의 비즈니스 속성이 아니라 주로 기술적인 목적을 위해 사용됩니다. 일반적으로 데이터베이스 레코드를 구별하기 위해 사용되며, 주로 본질 식별자가 존재하지 않을 때 사용됩니다.
따라서, 내부 식별자는 시스템 내부에서 사용되는 식별자이며, 단일 식별자는 엔터티나 객체를 구별하기 위해 시스템에서 자동으로 생성되는 고유한 식별자입니다.
surrogate 대용의
[SQLD_39_12]
COL1 COL2
---------------
100 100
NULL 60
NULL NULL
[SQL]
SELECT COALESCE(COL1,COL2*50,50)
FROM SQLD_39_12;
왜 COL2가 여기서 60이 되는거야?
SQL 쿼리를 실행할 때, COALESCE 함수는 여러 인수 중에서 첫 번째로 NULL이 아닌 값을 반환합니다. 따라서 COL1이 NULL이 아니면 COL1의 값을 반환하고, 그렇지 않으면 COL2 * 50의 값을 반환하게 됩니다. 이 때 COL2가 60이 되는 이유는 COL1이 NULL이므로 COALESCE 함수에서 COL2 * 50의 값을 반환하는데, COL2의 값이 60이기 때문입니다. 따라서 결과적으로는 60이 반환됩니다.
RANK와 DENSE_RANK는 둘다 중복 등수다.
ROW_NUMBER는 이름부터 특이하잖아. ROW를 무조건 다 채운다. 이렇게 생각하면 될 듯
UNIQUE SCAN은 딱 하나 유일한 값
일반적으로 조건문을 작성할 때 사용되는 연산자의 실행 순서에 관한 것입니다.
괄호는 가장 높은 우선순위를 갖습니다. 괄호 안의 연산이 먼저 수행됩니다.
NOT 연산자는 그 다음으로 높은 우선순위를 갖습니다. NOT 연산자는 단항 연산자로서, 해당 조건이 참인지 거짓인지를 뒤집습니다.
비교연산자들은 그 다음 우선순위를 가지며, 일반적으로 등호(=), 부등호(<, >), 작거나 같음(<=), 크거나 같음(>=) 등이 포함됩니다.
AND 연산자는 비교 연산자보다 낮은 우선순위를 갖습니다. AND 연산자는 두 개의 조건이 모두 참일 때 전체 조건이 참이 됩니다.
OR 연산자는 가장 낮은 우선순위를 가집니다. OR 연산자는 두 개의 조건 중 적어도 하나가 참이면 전체 조건이 참이 됩니다.
이러한 우선순위 규칙은 조건문을 읽거나 작성할 때 연산자들의 실행 순서를 이해하는 데 도움이 됩니다. 따라서 조건문을 이해하고 작성할 때 이러한 우선순위를 고려하는 것이 중요합니다.
- MSSQL에서 NULL값은 0이다.
- 이 설명은 틀렸습니다. MSSQL에서 NULL은 값이 알려지지 않았거나 존재하지 않음을 나타내는 특별한 값입니다. NULL은 숫자 0과는 다르며, 데이터의 부재를 나타내는 것으로, 실제 값이 0인 경우와는 다릅니다.
- ORACLE에서 NULL은 TRUE 혹은 FALSE의 의미이다.
- 이 설명 또한 틀렸습니다. ORACLE에서 NULL은 조건식에서 참 또는 거짓을 나타내지 않습니다. NULL은 값이 알려지지 않았거나 존재하지 않음을 나타내는 것으로, 조건식에서 비교 연산자와 함께 사용될 때 예상치 못한 결과를 초래할 수 있습니다. 예를 들어, NULL = NULL은 FALSE가 아닌 NULL을 반환합니다
45~49 주관식
NVL은 "Null Value Logic"의 줄임말입니다.
6-4아님? = 2
평균값 계산할 때는 null 빼고, null 인거 4개 빼고 2?
24/4 = 6
null이 0으로 바뀌니까 24/6이 되서 4가 되는거지
사례로 정규형 잘 설명해줌:
https://mjn5027.tistory.com/46
- Truncate: 테이블의 모든 데이터를 한 번에 삭제합니다.
- CASCADE DELETE: 특정 행이나 레코드를 삭제할 때, 외래 키 관계에 있는 다른 테이블에서 해당 레코드를 참조하는 레코드들도 함께 자동으로 삭제됩니다.
따라서, cascade와 truncate는 데이터를 삭제하는데 사용되지만, cascade는 관계형 데이터베이스에서 외래 키 관계를 유지하는 방식으로 작동하는 반면, truncate는 테이블의 데이터를 모두 삭제하는 방식으로 작동합니다.
drop vs truncate vs delete 관련 설명 출처:
https://project-notwork.tistory.com/24
전혀 모르겠다.
IN키워드는 OR과 같다.
ORDER BY 절은 데이터 자체를 변경하지 않습니다. 대신에 데이터를 정렬하는 데 사용됩니다.
주어진 문제에서, ORDER BY 절은 주어진 데이터를 정렬하는 데 사용됩니다. 주어진 SQL 쿼리에서는 CASE 문을 사용하여 특정 조건에 따라 정렬을 수행합니다. 그러나 이 조건은 데이터를 변경하는 것이 아니라 정렬하는 데 사용됩니다.
다시 한 번 설명드리면, 주어진 데이터와 SQL 쿼리를 사용하여 다음과 같은 결과가 나옵니다:
- ID가 3인 경우: 3 * 3 = 9
- ID가 1인 경우: 1 * 3 = 3
- ID가 2인 경우: 2
- ID가 4인 경우: 4
위 결과를 내림차순으로 정렬하면, 9, 4, 3, 2가 됩니다. 그런 다음, 이 순서에 따라 ID를 선택하여 3번째로 나오는 값은 1이 됩니다. 따라서 정답은 1입니다.
ORDER BY의 조건절은 단순히 데이터의 순서를 변경하며, 데이터 자체를 변경하지 않습니다.
PRIOR, <> 이건 뜻 뭐야..
MySQL의 문에서 <> 이거는 != 같지않다. 뜻임
[개념 정리]
계층형 쿼리 : 부모, 자식 간의 수직관계를 트리 구조 형태로 보여주는 쿼리
START WITH : 트리 구조의 최상위 행을 지정합니다.
CONNECT BY : 부모, 자식의 관계를 지정합니다.
PRIOR : CONNECT BY 절에 사용되며 PRIOR에 지정된 컬럼이 맞은편 컬럼을 찾아갑니다.
CONNECT BY PRIOR 자식 컬럼 = 부모 컬럼 : 부모 → 자식 순방향 전개
CONNECT BY PRIOR 부모 컬럼 = 자식 컬럼 : 자식 → 부모 역방향 전개
ORDER SIBLINGS : 계층형 쿼리에서 정렬을 수행합니다.
해설: 사원이 오른쪽에 위치해 있으므로 RIGHT OUTER JOIN (OUTER 생략 가능)
- 외부 스키마(External Schema) - 서브 스키마, 사용자 뷰
1. 외부 스키마는 사용자나 응용 프로그래머가 개인의 입장에서 필요한 데이터베이스의 논리적 구조를 정의한다.
2. 외부 스키마는 전체 데이터베이스의 한 논리적인 부분으로 볼 수 있기 때문에 서브 스키마라고도 한다.
3. 하나의 데이터베이스 시스템에는 여러 개의 외부 스키마가 존재할 수 있다.
4. 하나의 외부 스키마를 여러개의 응용 프로그램 혹은 사용자가 공유할 수 있다.
5. 일반 사용자는 SQL과 같은 질의어를 이용하여 DB를 쉽게 사용할 수 있다.
6. 응용 프로그래머는 C나 JAVA 등의 언어를 사용하여 DB에 접근한다.
- 개념 스키마(Conceptual Schema) - 전체적인 뷰
1. 개념 스키마는 데이터베이스의 전체적인 논리적 구조로, 모든 응용 프로그램이나 사용자들이 필요로 하는 데이터를 종합한 조직 전체의 데이터베이스로 하나만 존재한다.
2. 개념 스키마는 개체 간의 관계(Relationship)와 제약 조건을 나타내고 데이터베이스의 접근 권한, 보안 및 무결성 규칙에 관한 명세를 정의한다.
3. 데이터베이스 파일에 저장되는 데이터의 형태를 나타내는 것으로, 단순히 스키마라고 하면 개념 스키마를 의미한다.
4. 기관이나 조직체의 관점에서 데이터베이스를 정의한 것이다.
5. DBA에 의해서 구성된다.
- 내부 스키마(Internal Schema) - 시스템 설계자 뷰
1. 내부 스키마는 물리적인 저장장치 입장에서 데이터가 저장되는 방법을 기술한 것이다.
2. 내부 스키마는 실제 데이터베이스에 저장될 레코드의 물리적인 구조를 정의한다.
3. 내부 스키마는 저장 데이터 항목의 표현방법, 내부 레코드의 물리적 순서, 인덱스 유/무 등을 나타낸다.
4. 시스템 프로그래머나 시스템 설계자가 관리한다.
<답> 2 null 은 제외된 상태에서 수행되며, 그 결과에서 4 인 row 를 제외
위의 샘플 예제로 1 에서 시작된 결과는 1,3,4,7,8 / 5개의 rows 에서 COL1<>4를 제외한 4개
해설
이 쿼리는 계층적인 구조를 가진 데이터를 처리하기 위해 사용됩니다. START WITH 및 CONNECT BY PRIOR 구문을 사용하여 특정 조건에 따라 계층적인 관계를 설정합니다.
- 먼저 START WITH COL1= 1 구문은 계층적인 쿼리의 시작점을 나타냅니다. 여기서는 COL1 값이 1인 행을 시작점으로 설정합니다.
- 그 다음 CONNECT BY PRIOR COL1 = COL2 구문은 이전 행과 다음 행 간의 관계를 설정합니다. 즉, 이전 행의 COL1 값과 현재 행의 COL2 값이 같은 경우에 이어진다는 의미입니다.
- WHERE COL1 <> 4 구문은 COL1 값이 4가 아닌 행만을 대상으로 쿼리를 실행하도록 필터링합니다.
따라서 이 쿼리는 다음과 같은 순서로 실행됩니다:
- COL1 값이 1인 행을 시작점으로 삼습니다.
- COL1 값이 1인 행의 COL2 값을 찾습니다. 여기서는 COL2 값이 1인 행이 없으므로 NULL입니다.
- NULL인 행은 필터링되므로 결과에 포함되지 않습니다.
- COL1 값이 1인 행의 COL2 값과 같은 행을 찾습니다. 여기서는 COL2 값이 1인 행이 없으므로 NULL입니다.
- 마찬가지로 NULL인 행은 필터링되므로 결과에 포함되지 않습니다.
- COL1 값이 1인 행의 COL2 값과 같은 행을 찾습니다. 여기서는 COL2 값이 3인 행입니다.
- COL1 값이 3인 행의 COL2 값과 같은 행을 찾습니다. 여기서는 COL2 값이 7인 행입니다.
- COL1 값이 7인 행의 COL2 값과 같은 행을 찾습니다. 여기서는 COL2 값이 8인 행입니다.
따라서 COL1 값이 1, 3, 7, 8인 총 4개의 행이 결과로 반환됩니다.
주어진 쿼리는 계층형 쿼리입니다. CONNECT BY 절을 사용하여 계층적인 구조를 나타냅니다. START WITH 절은 계층 구조의 시작 지점을 지정합니다.
여기서는 COL1과 COL2 간의 계층적인 관계를 찾아야 합니다. 쿼리에서 CONNECT BY PRIOR COL1 = COL2 부분은 COL1과 COL2 간의 부모-자식 관계를 설정합니다. (그래서 COL1 컬럼이 1 인것을 COL2컬럼 1인거에 연결되서 찾을 수 있는거임)
시작점은 COL1이 1인 행으로 시작합니다. COL1 값이 1인 행의 COL2 값과 같은 행을 찾습니다. 여기서 COL1 값이 1인 행의 COL2 값과 일치하는 행은 COL2 값이 3인 행입니다. 그 다음으로 COL1 값이 3인 행의 COL2 값과 같은 행을 찾습니다. 이때 COL1 값이 3인 행의 COL2 값과 일치하는 행은 COL2 값이 7인 행입니다. 이런 식으로 계속해서 부모-자식 관계를 탐색하며 진행합니다.
결과적으로 COL1 값이 1, 3, 7, 8인 행이 반환되는 것입니다. 처음에 COL1이 1이고 COL2가 NULL이므로 시작 행은 제외됩니다. 또한 WHERE 절에서 COL1이 4인 행은 제외됩니다. 따라서 최종적으로는 COL1 값이 1, 3, 7, 8인 네 개의 행이 결과로 반환됩니다.
START WITH에 IS NOT NULL을 사용하면 NULL이 아닌 C2 값으로 시작하는 행에서부터 연결된 계층 구조를 형성하게 됩니다. 그러나 주어진 결과를 얻기 위해서는 NULL인 행부터 시작해야 합니다. 따라서 IS NULL을 사용하여 NULL인 행을 시작점으로 설정해야 원하는 결과를 얻을 수 있습니다.
ROLLUP & CUBE
주식별자의 5가지 특징중 하나인 ( ? )은
하나의 키로 특정 행을 바로 찾아낼수 있는 고유한 데이터 속성을 말한다.
유일성
주식별자의 5가지 특징
주식별자의 특징?
유일성 : 주식별자에 의해 엔터티내에 모든 인스턴스들을 유일하게 구분할 수 있다.
최소성 : 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함.
불변성 : 주식별자가 한 번 특정 엔터티에 지정되면 그 식별자의 값은 변하지 않아야 함.
존재성 : 주식별자가 지정되면 반드시 데이터 값이 존재해야한다. Null은 허용되지 않는다.
위 4가지 특징 빈출유형입니다.
내부식별자 / 외부식별자
스스로 생성이 가능한지의 여부에 따라 구분되는 식별자도 있습니다. 내부식별자는 스스로 생성이 됩니다. 하지만 외부식졀자는 타 엔터티로부터 받아옵니다. 그래서 ERD 도식을 보면 속성 옆에 (FK)라고 붙은게 가끔 보일겁니다. 이건 Foriegn Key (스펠링 맞나요? ㅎㅎ) 라고 해서 외부로부터 값을 받아오는거라 (FK)가 붙은애는 외부식별자에 해당합니다.
따라서 (FK)가 없다면 모두 내부식별자입니다.
관계분류가 ERD에 없다는 이야기다.
전체가 그냥 메인쿼리다.
메인 쿼리는 데이터베이스에서 실행되는 주요 쿼리를 가리킵니다. 이 쿼리는 데이터를 가져오거나 조작하는 주된 목적을 가지고 있으며, 서브쿼리나 다른 쿼리의 일부로 사용되는 것이 아니라 독립적으로 실행됩니다. 메인 쿼리는 데이터베이스에서 실행되는 가장 바깥쪽의 쿼리입니다.
예를 들어, 다음은 주문(order) 테이블에서 특정 조건을 만족하는 주문을 조회하는 메인 쿼리의 예시입니다.
SELECT *
FROM orders
WHERE order_date >= '2024-01-01';
위의 예시에서 SELECT * FROM orders WHERE order_date >= '2024-01-01'; 이 부분이 메인 쿼리입니다. 이 쿼리는 orders 테이블에서 주문일자가 '2024-01-01' 이후인 모든 주문을 조회하는 것을 목적으로 합니다. 메인 쿼리는 데이터베이스에서 직접 실행되며, 어떤 서브쿼리의 일부로 사용되지 않습니다.
, "병행성 제어" 또는 "동시성 제어"는 데이터베이스에서 여러 사용자가 동시에 데이터를 읽고 쓸 때 발생할 수 있는 문제를 관리하는 기술을 가리킵니다. 병행성 제어는 여러 트랜잭션이 동시에 데이터베이스에 접근할 때 발생할 수 있는 다음과 같은 문제를 다룹니다:
- Lost Update (잃어버린 업데이트): 한 트랜잭션이 데이터를 수정한 후, 다른 트랜잭션이 같은 데이터를 수정할 때, 첫 번째 수정이 무시되는 문제입니다.
- Dirty Read (더러운 읽기): 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽을 때 발생하는 문제입니다.
- Non-Repeatable Read (반복할 수 없는 읽기): 동일한 쿼리를 실행했을 때, 한 트랜잭션이 다른 트랜잭션의 변경 내용으로 인해 다른 결과를 반환하는 문제입니다.
- Phantom Read (유령 읽기): 동일한 쿼리를 실행했을 때, 한 트랜잭션이 다른 트랜잭션에 의해 삽입 또는 삭제된 데이터를 볼 때 발생하는 문제입니다.
Lock/Unlock은 이러한 병행성 제어 기법 중 하나로, 데이터에 대한 접근을 제한하여 여러 트랜잭션 간의 충돌을 방지합니다. 특정 데이터나 데이터 행에 대한 잠금(Lock)을 설정하여 다른 트랜잭션이 해당 데이터를 수정하거나 읽을 수 없도록 합니다. 그리고 해당 데이터에 대한 작업이 완료되면 잠금을 해제(Unlock)하여 다른 트랜잭션이 해당 데이터에 접근할 수 있도록 합니다. 이를 통해 데이터베이스에서 데이터의 일관성과 무결성을 유지할 수 있습니다.
RTRIM: 오른쪽 공백 제거
SUBSTR: 문자열슬라이싱
TRIM은 아예 제거하는 함수임.
TRIM(STR, M, N) 함수는 문자열 STR의 시작 부분과 끝 부분에서 지정된 문자를 제거한 후 반환합니다. 여기서 M은 문자열의 시작 부분에서 제거할 문자의 수를 나타내며, N은 문자열의 끝 부분에서 제거할 문자의 수를 나타냅니다.
예를 들어, TRIM(' Hello World ', 3, 2)를 실행하면 다음과 같이 됩니다:
문자열의 시작 부분에서 공백 3개가 제거됩니다.
문자열의 끝 부분에서 공백 2개가 제거됩니다.
결과적으로 반환되는 문자열은 'Hello World'가 됩니다.
<SQL>
SELECT ROUND(3.45. 1) AS COL1 FROM DUAL; 여기서 1이 소수점 첫째자리 반올림인데 일의 자리 반올림하려면 -1 하면 되는거야? 응
- ROUND 함수
ROUND 함수는 숫자를 각 자리에서 반올림해주는 함수
ex ) ROUND(564.159, 2) => 564.18
ROUND( 숫자, N ) => N자리 숫자 뒤에서 반올림
③ ROUND(n, i)와 TRUNC(n1, n2)
ROUND 함수는 매개변수 n을 소수점 기준 (i+1)번 째에서 반올림한 결과를 반환한다. i는 생략할 수 있고 디폴트 값은 0, 즉 소수점 첫 번째 자리에서 반올림이 일어나 정수 부분의 일의 자리에 결과가 반영된다.
입력
SELECT ROUND(10.154), ROUND(10.541), ROUND(11.001)
FROM DUAL;
결과
ROUND(10.154) ROUND(10.541) ROUND(11.001)
------------- ------------- ---------------
10 11 11
입력
SELECT ROUND(10.154, 1), ROUND(10.154, 2), ROUND(10.154, 3)
FROM DUAL;
결과
ROUND(10.154,1) ROUND(10.154,2) ROUND(10.154,3)
---------------- --------------- ---------------
10.2 10.15 10.154
ROUND(10.154, 3)는 3+1, 즉 네 번째 자리가 0이므로 결과는 10.154가 반환되었다. n이 0일 때는 i에 입력된 숫자에 상관없이 무조건 0을 반환하며, i가 음수이면 소수점을 기준으로 왼쪽 i번째에서 반올림이 일어난다.
입력
SELECT ROUND(0, 3), ROUND(115.155, -1), ROUND(115.155, -2)
FROM DUAL;
결과
ROUND(0,3) ROUND(115.155,-1) ROUND(115.155,-2)
---------- ----------------- -----------------
0 120 100
첫 번째는 n이 0이므로 무조건 0이 반환됐고 두 번째는 i가 -1이므로 115에서 5가 반올림되어 120이, 세 번째 컬럼에는 -2가 입력되어 115에서 백의 자리 1이 반올림되어 결과는 100이 되었다.
TRUNC 함수는 반올림을 하지 않고 n1을 소수점 기준 n2자리에서 무조건 잘라낸 결과를 반환한다. n2 역시 생략할 수 있으며 디폴트 값은 0이고, 양수일 때는 소수점 기준으로 오른쪽, 음수일 때는 소수점 기준 왼쪽 자리에서 잘라낸다.
입력
SELECT TRUNC(115.155), TRUNC(115.155, 1), TRUNC(115.155, 2), TRUNC(115.155, -2)
FROM DUAL;
결과
TRUNC(115.155) TRUNC(115.155,1) TRUNC(115.155,2) TRUNC(115.155,-2)
--------------- ---------------- ---------------- ------------------
115 115.1 115.15 100
INNER AND OUTER
https://bommbom.tistory.com/entry/SQLD-%EC%A1%B0%EC%9D%B8Join-%EC%A2%85%EB%A5%982-Inner-%EC%A1%B0%EC%9D%B8-vs-Outer-%EC%A1%B0%EC%9D%B8
A보다 COL1이 커야지..1번 맞음
GROUP BY GROUPING SETS (상품명)은 상품명을 기준으로 그룹화한 후 상품명 별 총합을 계산합니다. 이 경우, 다른 그룹화 설정은 없으므로 상품명 별로만 결과가 그룹화됩니다. 즉, 상품명 별 총합만을 출력합니다.
반면에 GROUP BY GROUPING SETS (상품명, ())에서는 빈 괄호를 사용하여 상품명 이외의 다른 그룹화 설정이 없음을 명시합니다. 이것은 기본적으로 상품명 별 총합을 계산하는 것과 동일하지만, 빈 괄호를 사용하여 명시적으로 다른 그룹화 설정이 없음을 나타내므로 코드를 더 명확하게 만듭니다.
즉, GROUP BY GROUPING SETS (상품명)과 GROUP BY GROUPING SETS (상품명, ())은 결과적으로 동일한 결과를 반환하지만, 두 번째 옵션은 명시적으로 다른 그룹화 설정이 없음을 나타냅니다.
이 문제에서 GROUP BY GROUPING SETS 문법을 사용할 때, 괄호 안에 아무것도 없는 빈 괄호 ()를 사용하여 모든 그룹화 설정을 나타내는 것이 바람직합니다.
GROUP BY GROUPING SETS 구문에서 빈 괄호 ()는 "모든 그룹화 설정"을 의미합니다. 따라서 GROUP BY GROUPING SETS (상품명, ())는 '상품명'으로 그룹화한 후에 '상품명'을 제외한 다른 그룹화 설정이 없음을 나타냅니다. 반면에 GROUP BY GROUPING SETS (상품명)은 다른 그룹화 설정을 명시적으로 나타내지 않아서 문제의 요구사항에 부합하지 않습니다.
결론적으로, GROUP BY GROUPING SETS 구문을 사용할 때는 모든 그룹화 설정을 나타내기 위해 빈 괄호 ()를 함께 사용하는 것이 권장됩니다. 따라서 문제에서 정답으로 제시된 것은 GROUP BY GROUPING SETS (상품명, ())입니다.
Window function"은 데이터베이스에서 사용되는 용어로, 특정 윈도우(또는 범위) 내에서 데이터를 계산하거나 조작하는 함수를 의미합니다. 이러한 함수들은 데이터를 그룹화하고 분석할 때 유용하게 활용됩니다. 예를 들어, 평균, 합계, 순위 등을 윈도우 내에서 계산할 수 있습니다. 이것은 주로 데이터 분석이나 집계 작업에서 사용됩니다.
Order by가 default가 오름차순인거 계속 나옴
이 기출문제들보다 더 어려워졌고, 주관식 없어짐.
실제 데이터 결과값을 묻는 문제들이 많아서 더 디테일하게 공부할 것
1문제 차이로 탈락.. 근데 시간이 없어서 모자라게 공부함. 인정..
다시 디테일하게 공부해서 다시 칠 것...!
'PROGRAMMING > 기타' 카테고리의 다른 글
자기계발사이트 (0) | 2024.03.07 |
---|---|
업무 툴 (0) | 2024.02.29 |
컴퓨터 그래픽스 실기 (0) | 2024.01.28 |
Ai Tools (0) | 2024.01.21 |
리눅스 명령어 모음 (0) | 2024.01.17 |