1) 한 개의 엔터티는 두 개 이상의 인스턴스의 집합이어야 한다.
2) 엔터티는 관계를 두 개까지만 가질 수 있다.
3) 한 개의 엔터티는 두 개 이상의 속성을 갖는다.
4) 한 개의 속성은 한 개의 속성값을 갖는다.
한 개의 엔터티는 두 개 이상의 인스턴스의 집합이어야 한다.: TRUE
1) Barker
2) IE
3) IE Notation
4) IDEF1X
[TEST 16]
MemberID Name
-----------------
NULL 조조
2 여포
3 관우
4 장비
5 조훈
NULL 유비
1) SELECT COUNT(3) FROM TEST16;
2) SELECT COUNT(MemberID) FROM TEST16;
3) SELECT COUNT(NULLIF (MemberID, NULL)) FROM TEST16;
4) SELECT COUNT(*) FROM TEST16 WHERE MemberID IS NOT NULL;
[TEST17]
COL1 COL2
-------------
NULL A
1 B
2 C
3 D
4 E
[SQL]
SELECT*FROM TEST17 WHERE COL1 IN(1, 2, NULL);
1) 2)
COL1 COL2 COL1 COL2
------------- -------------
1 B 2 B
2 C 2 C
3) 4)
COL1 COL2 COL1 COL2
------------- -------------
1 B NULL A
2 C 1 B
3 D 2 C
4 E 3 D
4 E
1) 9999
2) 0
3) NULL
4) 1
EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
DEPT(DEPTNO, DNAME, LOC)
1)
SELECT DEPTNO FROM DEPT
WHERE DEPTNO NOT IN
(SELECT DEPTNO FROM EMP);
2)
SELECT DEPTNO FROM DEPT A
WHERE NOT EXISTS
(SELECT * FROM EMP B WHERE
A.DEPTNO = B.DEPTNO);
3)
SELECT B.DEPTNO FROM EMP A
RIGHT OUTER JOIN
DEPT B ON A.DEPTNO = B.DEPTNO
WHERE EMPNO IS NULL;
4)
SELECT DEPTNO FROM DEPT
WHERE DEPTNO <> ANY (SELECT
DEPTNO FROM EMP);
이 문제는 SQL 질의문에 대한 이해를 바탕으로, 사원이 한 명도 없는 부서(DEPTNO)를 찾는 네 가지 다른 방식의 SQL 질의문 중 가장 거리가 먼 것을 찾는 것입니다. 각 옵션을 분석해 보겠습니다.
첫 번째 옵션은 NOT IN
을 사용하여 EMP
테이블에 없는 DEPT
테이블의 DEPTNO
를 찾습니다. 이 방식은 EMP
테이블에 해당 부서번호가 전혀 나타나지 않은 경우에만 해당 부서번호를 반환합니다.
두 번째 옵션은 NOT EXISTS
를 사용하여, EMP
테이블에 특정 부서번호가 존재하지 않는 DEPT
테이블의 DEPTNO
를 찾습니다. NOT IN
방식과 유사하게 작동하지만, 서브쿼리를 이용해 좀 더 명시적으로 해당 부서번호가 EMP
테이블에 존재하는지를 체크합니다.
세 번째 옵션은 RIGHT OUTER JOIN
을 사용하여 DEPT
테이블과 EMP
테이블을 조인하고, EMPNO
가 NULL
인 경우(즉, EMP
테이블에 해당 부서번호가 없는 경우)를 찾습니다. 이 방식은 두 테이블을 조인하여 결과를 도출하는 방식으로, 물리적으로 가장 멀리 떨어진 방식이라고 볼 수 있습니다.
네 번째 옵션은 <> ANY
를 사용하여, EMP
테이블에 있는 어느 DEPTNO
와도 다른 DEPT
테이블의 DEPTNO
를 찾습니다. 이 방식은 문제의 의도와 맞지 않는 방식입니다. 왜냐하면 ANY
조건은 EMP
테이블에 존재하는 어떤 DEPTNO
와도 다르다는 조건을 만족하는 DEPTNO
를 찾지만, 실제로는 적어도 하나의 DEPTNO
가 EMP
테이블에 존재할 경우 해당 DEPTNO
는 결과에서 제외됩니다. 이는 사원이 한 명도 없는 부서를 찾는 것과는 거리가 멉니다.
따라서, 가장 거리가 먼 것은 옵션 4입니다. 이 옵션은 사원이 한 명도 없는 부서를 찾기 위한 목적과 가장 거리가 멀며, 질의의 의도와 맞지 않는 방식으로 작동합니다.
[릴레이션]
ARTICLES(ID, TITLE, JOURNAL, ISSUE, YEAR, STARTPAGE, ENDPAGE, TR_ID)
[인덱스]
CREATE INDEX IDX1 ON ARTICLES(YEAR, STARTPAGE);
CREATE INDEX IDX2 ON ARTICLES(STARTPAGE, ENDPAGE);
CREATE INDEX IDX3 ON ARTICLES(JOURNAL, ISSUE, YEAR);
1) 2)
SELECT TITLE FROM ARTICLES SELECT TITLE FROM ARTICLES
WHERE JOURNAL = 'JACM' AND WHERE ENDPAGE - STARTPAGE > 50;
ISSUE = 55;
3) 4)
SELECT TITLE FROM ARTICLES SELECT TITLE FROM ARTICLES
WHERE YEAR > 1995 AND WHERE JOURNAL = 'JACM';
YEAR < 2000;
인덱스는 데이터베이스에서 데이터를 빠르게 찾기 위한 구조로, 특정 열(들)에 대해 생성됩니다. 생성된 인덱스를 기반으로 각 질의의 검색 속도가 어떻게 향상될 수 있는지 살펴보겠습니다.
1) 첫 번째 질의는 JOURNAL
과 ISSUE
를 조건으로 사용합니다. 이는 IDX3
인덱스(JOURNAL
, ISSUE
, YEAR
)를 활용할 수 있으므로, 검색 속도가 향상될 수 있습니다.
2) 두 번째 질의는 ENDPAGE - STARTPAGE > 50
라는 계산 조건을 사용합니다. 이러한 종류의 계산 조건은 인덱스를 직접적으로 활용할 수 없습니다. 왜냐하면, 인덱스는 특정 열의 값에 기반한 검색에 최적화되어 있으며, 두 열의 값을 사용한 계산 결과에 기반한 검색은 인덱스의 도움을 받기 어렵기 때문입니다.
3) 세 번째 질의는 YEAR
열에 대한 범위 검색을 사용합니다. 이는 IDX1
인덱스(YEAR
, STARTPAGE
)를 부분적으로 활용할 수 있으므로, 검색 속도에 도움이 될 수 있습니다. 비록 STARTPAGE
는 조건에 사용되지 않지만, 인덱스의 첫 번째 컬럼인 YEAR
가 사용되므로 인덱스의 효과를 일부 받을 수 있습니다.
4) 네 번째 질의는 JOURNAL
을 조건으로 사용합니다. 이는 IDX3
인덱스(JOURNAL
, ISSUE
, YEAR
)를 활용할 수 있으므로, 검색 속도가 향상될 수 있습니다. 하지만 이 질의는 ISSUE
나 YEAR
같은 다른 조건들을 포함하지 않아, 인덱스 IDX3
의 첫 번째 컬럼만을 사용하게 됩니다.
결론적으로, 가장 적절하지 않은 질의는 2번입니다. 이 질의는 생성된 인덱스에 의하여 검색 속도를 향상시킬 수 없는 유일한 경우로, 두 열의 값에 기반한 계산 조건을 포함하기 때문입니다. 나머지 질의들은 생성된 인덱스를 통해 검색 속도를 어느 정도 향상시킬 수 있습니다.
[보기]
- SQL이 데이터베이스에서 실행될 때 실행 절차 및
방법을 표현하여 DBA에게 알려준다.
- 옵티마이저의 종류를 확인할 수 있는 RULE, COST가 표현되고
SQL이 내부적으로 어떤 방식으로 실행되었는지 확인 할 수 있다.
1) 실행계획
2) 내부계획
3) 절차계획
4) 표현계획
[SQL1]
SELECT COL1, COL2, COUNT(*)
FROM TEST46
GROUP BY ROLLUP(COL1, COL2);
[SQL2]
SELECT COL1, COL2, COUNT(*)
FROM TEST46
GROUP BY GROUPING SETS( );
정답 : (COL1, COL2),(COL1),()
[SQL]
SELECT COUNT(*) FROM TEST50
( ) TEST50;
[RESULT]
COUNT(*)
----------
25
주어진 SQL 쿼리와 결과를 보면, TEST50
테이블에서 총 25건의 행이 반환되었다고 합니다. 이 테이블에는 총 5건의 행이 있다고 했을 때, 25건의 결과가 나오려면 각 행이 5번씩 반복되어야 합니다. 이는 테이블을 자기 자신과 조인할 경우 발생할 수 있는 현상입니다.
SQL에서 테이블을 자기 자신과 조인하여 각 행을 여러 번 반복시키려면, 테이블을 카테시안 곱(Cartesian product)으로 조인해야 합니다. 카테시안 곱은 모든 가능한 행의 조합을 반환하는데, 여기서는 5건의 행이 각각 다른 5건의 행과 조합되어 총 25(5x5)건의 결과를 생성합니다.
따라서, 빈칸에 들어갈 SQL 구문은 테이블을 자기 자신과 카테시안 곱으로 조인하는 명령어입니다. SQL에서 이를 수행하는 가장 간단한 방법은 ,
(콤마)를 사용하는 것입니다. 콤마는 FROM 절에서 여러 테이블을 나열할 때 사용되며, 조인 조건 없이 모든 테이블의 카테시안 곱을 반환합니다. 하지만, 최신 SQL 관례에서는 명시적인 JOIN 구문을 권장하므로, CROSS JOIN을 사용하는 것이 더 명확할 수 있습니다.
그러나 이 문제의 형식과 명시된 결과를 고려할 때, 가장 간단하고 직관적인 방법으로 빈칸을 채우려면 ,
를 사용하는 것이 적절합니다. 따라서 올바른 답변은:
, TEST50
이렇게 하면 TEST50
테이블이 자기 자신과 카테시안 곱으로 조인되어, 5x5=25건의 결과가 생성됩니다.
FULL OUTER JOIN
을 사용하는 경우에 대해 설명하겠습니다. FULL OUTER JOIN
은 두 테이블 간의 조인을 수행할 때, 양쪽 테이블의 모든 행을 포함하되, 조인 조건에 맞지 않는 행에 대해서는 NULL
값을 채워 넣는 조인 방식입니다. 즉, 양쪽 테이블의 모든 데이터를 결과에 포함시키며, 한쪽에만 존재하는 데이터도 결과에 포함됩니다.
문제 상황에서 TEST50
테이블에 총 5건의 행이 있고, 이 테이블을 자기 자신과 FULL OUTER JOIN
으로 조인한다고 가정하면, 결과는 어떻게 될까요? 조인 조건을 명시하지 않으면, 이는 기본적으로 카테시안 곱을 생성하는 것과 유사하게 동작할 수 있습니다. 하지만, FULL OUTER JOIN
의 주요 목적과 사용 사례는 두 테이블 간의 모든 데이터를 포함시키면서, 한쪽 테이블에만 있는 데이터도 결과에 포함시키는 것입니다. 이는 주로 두 데이터 집합의 차이를 비교하거나 합치기 위해 사용됩니다.
문제에서 요구하는 것은 단순히 TEST50
테이블의 데이터를 5배로 증가시켜 총 25건의 결과를 만드는 것입니다. FULL OUTER JOIN
을 사용하면, 조인 조건에 따라 결과가 달라질 수 있으며, 조인 조건을 명시하지 않는 한 (또는 조건이 없이 사용한다면), 실제로는 적절한 사용 사례가 아닙니다. 또한, FULL OUTER JOIN
은 두 테이블 간의 모든 데이터를 합치려는 목적에 더 적합하며, 이 문제에서 요구하는 단순한 카테시안 곱을 생성하는 것과는 다른 목적을 가지고 있습니다.
따라서, 문제의 요구 사항에 따라 단순히 테이블의 모든 행 조합을 생성하려면 ,
(콤마)를 사용하는 것이나 CROSS JOIN
이 더 적절합니다. FULL OUTER JOIN
은 이 경우에는 가장 적절하지 않은 선택으로 볼 수 있습니다.