본문 바로가기
Resource/SQLD

[SQLD] 데이터 모델링의 이해 문제 (41-80)

by 우창욱 2024. 4. 23.

41.아래를 참고할 때 시간대별사용량 테이블을 기반으로 고객별 사용금액을 출력하는 SQL로 가장 적절한 것은?

 

① (조인조건 "B.사용시간대 <= C.시작시간대 AND B.사용시간대 >= C.종료시간대" 가 잘못되었음.)

SELECT A.고객ID, A.고객명, SUM(B.사용량 * C.단가) AS 사용금액
FROM 고객 A INNER JOIN 시간대별사용량 B
ON (A.고객ID = B.고객ID) INNER JOIN 시간대구간 C
ON (B.사용시간대 <= C.시작시간대 AND B.사용시간대 >= C.종료시간대)
GROUP BY A.고객ID, A.고객명
ORDER BY A.고객ID, A.고객명;


② (조인 조건 "ON (A.고객ID = B.고객ID AND B.사용시간대 BETWEEN C.시작시간대 AND C.종료시간대)"를 사용하는데 조인 순서가 올바르지 않음. 두 개의 테이블 조인을 동시에 수행하려 하지만 SQL의 구문에서 올바른 ON 절을 사용하여야 함.)

SELECT A.고객ID, A.고객명, SUM(B.사용량 * C.단가) AS 사용금액
FROM 고객 A INNER JOIN 시간대별사용량 B INNER JOIN 시간대구간 C
ON (A.고객ID = B.고객ID AND B.사용시간대 BETWEEN C.시작시간대 AND C.종료시간대)
GROUP BY A.고객ID, A.고객명
ORDER BY A.고객ID, A.고객명;


③ 

SELECT A.고객ID, A.고객명, SUM(B.사용량 * C.단가) AS 사용금액
FROM 고객 A INNER JOIN 시간대별사용량 B
ON (A.고객ID = B.고객ID) INNER JOIN 시간대구간 C
ON B.사용시간대 BETWEEN C.시작시간대 AND C.종료시간대
GROUP BY A.고객ID, A.고객명
ORDER BY A.고객ID, A.고객명;


④ (BETWEEN JOIN 은 유효한 SQL 구문이 아님.)

SELECT A.고객ID, A.고객명, SUM(B.사용량 * C.단가) AS 사용금액
FROM 고객 A INNER JOIN 시간대별사용량 B
ON (A.고객ID = B.고객ID) BETWEEN JOIN 시간대구간 C
GROUP BY A.고객ID, A.고객명
ORDER BY A.고객ID, A.고객명;

 

42. 실행 결과가 다른 하나는?

① (USING 절은 괄호 안에 같은 이름의 필드를 지정할 때 사용된다. ex. "USING (STADIUM_ID)"

- USING 절은 컬럼 이름만 명시한다.

- 두 테이블에서 같은 이름을 가진 컬럼에 대해 조인을 수행한다.

- USING 을 사용할 때는 컬럼 이름 앞에 테이블 별칭이나 이름을 붙이지 않는다.

- SELECT 구문에서 해당 조인 컬럼을 참조할 때는, 별칭 없이 컬럼 이름만 사용할 수 있다.)

SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
FROM TEAM T INNER JOIN STADIUM S USING (T.STADIUM_ID = S.STADIUM_ID);


② 

SELECT TEAM.REGION_NAME, TEAM.TEAM_NAME, TEAM.STADIUM_ID, STADIUM.STADIUM_NAME
FROM TEAM INNER JOIN STADIUM ON (TEAM.STADIUM_ID = STADIUM.STADIUM_ID);


③ 

SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
FROM TEAM T, STADIUM S
WHERE T.STADIUM_ID = S.STADIUM_ID;


④ 

SELECT TEAM.REGION_NAME, TEAM.TEAM_NAME,
TEAM.STADIUM_ID, STADIUM.STADIUM_NAME
FROM TEAM, STADIUM
WHERE TEAM.STADIUM_ID = STADIUM.STADIUM_ID;

 

43. 아래 두 SQL이 같은 결과를 출력할 때, 빈칸 ㉠ 에 들어갈 내용으로 가장 적절한 것은?

[SQL(1)] (조인 조건 없이 조인하고 있으므로 카티시안 곱(Cartesian Product) 또는 CROSS JOIN으로 해석한다.)

SELECT ENAME, DNAME
FROM EMP, DEPT
ORDER BY ENAME;

[SQL(2)]

SELECT ENAME, DNAME
FROM EMP ㉠ DEPT
ORDER BY ENAME;

① FULL OUTER JOIN
② SELF JOIN
③ NATURAL JOIN
④ CROSS JOIN

 

44. 아래를 참고할 때 SQL 실행 결과로 가장 적절한 것은?

[OS]

OSID(PK) OS명
100 Android
200 iOS
300 Bada

 

[단말기]

단말기ID(PK) 단말기명 OSID(FK)
1000 A1000 100
2000 B2000 100
3000 C3000 200
4000 D3000 300

 

[고객]

고객번호(PK) 고객명 단말기ID(FK)
11000 홍길동 1000
12000 강감찬 <NULL>
13000 이순신 <NULL>
14000 안중근 3000
15000 고길동 4000
16000 이대로 4000

 

[SQL]

SELECT A.고객번호, A.고객명, B.단말기ID, B.단말기명, C.OSID, C.OS명
FROM 고객 A LEFT OUTER JOIN 단말기 B ON (A.고객번호 IN (11000, 12000) AND A.단말기ID = B.단말기ID) 
LEFT OUTER JOIN OS C ON (B.OSID = C.OSID)
ORDER BY A.고객번호;

① ("FROM 고객 A LEFT OUTER JOIN 단말기 B ..." 조건은 "고객" 테이블 전체를 조회한 뒤에 고객번호가 11000, 12000 번호인 고객에 대해서만 조인을 수행한다는 의미.

"고객" 테이블의 모든 행을 결과에 포함하고, 해당하는 "단말기" 테이블의 행을 옆에 연결한다.

"고객" 테이블의 어떤 행이 조인 조건을 충족하는 "단말기" 행을 찾지 못하면, 해당 "고객" 행은 여전히 결과에 포함되지만 "단말기" 테이블에서 오는 컬럼들은 모두 NULL 값을 갖게 된다.

따라서 11000, 12000 고객번호만 단말기 및 OS 정보가 결합되고 다른 고객들은 NULL로 채워진다.)

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android
12000 강감찬 <NULL> <NULL> <NULL> <NULL>
13000 이순신 <NULL> <NULL> <NULL> <NULL>
14000 안중근 <NULL> <NULL> <NULL> <NULL>
15000 고길동 <NULL> <NULL> <NULL> <NULL>
16000 이대로 <NULL> <NULL> <NULL> <NULL>


② 

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android
12000 강감찬 <NULL> <NULL> <NULL> <NULL>


③ 

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android


④ 

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android
12000 강감찬 <NULL> <NULL> <NULL> <NULL>
13000 이순신 <NULL> <NULL> <NULL> <NULL>
14000 안중근 3000 C3000 200 iOS
15000 고길동 4000 D4000 300 Bada
16000 이대로 4000 D4000 300 Bada

 

(참고) LEFT OUTER JOIN

조인 수행 시 먼저 표기된 좌측 테이블에 해당하는 데이터를 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어온다. 즉, Table A와 B가 있을 때 (Table 'A'가 기준), A와 B를 비교해서 B의 JOIN 컬럼에서 같은 값이 있을 때 그 해당 데이터를 가져오고, B의 JOIN 컬럼에서 같은 값이 없는 경우에는 B 테이블에서 가져오는 컬럼들은 NULL 값으로 채운다.

 

45. 아래 SQL에서 실행 결과가 같은 것은?

SELECT A.ID, B.ID
FROM TBL1 A FULL OUTER JOIN TBL2 B
ON A.ID = B.ID;

㉯ (UNION은 중복 결과를 제거)

SELECT A.ID, B.ID
FROM TBL1 A LEFT OUTER JOIN TBL2 B
ON A.ID = B.ID
UNION
SELECT A.ID, B.ID
FROM TBL1 A RIGHT OUTER JOIN TBL2 B
ON A.ID = B.ID;

㉰ (UNION ALL은 중복을 제거하지 않음. SELECT 1은 조건을 만족하는 행이 하나라도 존재하는 지 여부만을 확인하기 위해 사용한다. 실제로 반환되는 값은 중요하지 않다. 이 경우 '1'.

즉 TBL1에서 TBL2에 없는 ID만을 찾으라는 명령을 수행하는 것과 같고,

TBL2에서 TBL1에 없는 ID만을 찾으라는 명령을 수행하는 것과 같다.)

SELECT A.ID, B.ID
FROM TBL1 A, TBL2, B
WHERE A.ID = B.ID
UNION ALL
SELECT A.ID, NULL
FROM TBL1 A
WHERE NOT EXISTS (SELECT 1 FROM TBL2 B WHERE A.ID = B.ID)
UNION ALL
SELECT NULL, B.ID
FROM TBL2 B
WHERE NOT EXISTS (SELECT 1 FROM TBL1 A WHERE B.ID = A.ID);

 

① (가), (나)
② (가), (다)
③ (나), (다)
④ (가), (나), (다)

 

(작성중...)

 

51. 아래에서 설명하는 서브쿼리의 종류로 가장 적절한 것은?

서브쿼리의 실행 결과로 여러 럼을 반환한다. 메인 쿼리의 조건절에 여러 컬럼을 동시에 비교할 수 있다. 서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼 개수와 컬럼의 위치가 동일해야 한다.

① 단일 행 (Single Row) 서브쿼리
② 다중 컬럼 (Multi Column) 서브쿼리
③ 다중 행 (Multi Row) 서브쿼리
④ 단일 컬럼 (Single Column) 서브쿼리

 

52. SQL 실행 결과가 다른 하나는?


② 
③ 
④ 

 

(작성중...)

'Resource > SQLD' 카테고리의 다른 글

[SQLD] SQL 기본 및 활용 문제 (1 ~ 50)  (1) 2024.02.27
[SQLD] 데이터 모델링의 이해 문제 (1-50)  (1) 2024.02.27
[SQLD] SQL 기본  (0) 2024.02.24
[SQLD] 데이터 모델과 성능  (0) 2024.02.21
[SQLD] 데이터 모델링의 이해  (0) 2024.02.19