본문 바로가기
Database/SQLD

SQLD 문제 풀이 10

by KkingKkang 2023. 5. 30.

1. 다음 중 아래의 ERD를 참조하여 아래 SQL과 동일한 결과를 출력하는 SQL로 가장 부적절한 것은?

SELECT A.회원번호, A.회원명
	FROM 회원 A,
    동의항목 B
WHERE A.회원번호 = B.회원번호
GROUP BY A.회원번호, A.회원명
HAVING COUNT(CASE WHEN B.동의여부 = 'N' THEN 0 ELSE NULL END) >= 1 --동의여부가 N인거 카운트
ORDER BY A.회원번호;
--1
SELECT A.회원번호, A.회원명
	FROM 회원 A
    WHERE EXISTS ( SELECT 1 
    		FROM 동의항목 B
    		WHERE A.회원번호 = B.회원번호
            AND B.동의여부 = 'N')
ORDER BY A.회원번호;

--EXISTS의 () 사이에는 서브쿼리만 올 수 있습니다.
--EXISTS는 () 안의 서브쿼리로 부터 해당 컬럼의 값이 존재 유무만 체크를 합니다.
--'Select 1'을 적어두었지만 아무 필드나 적으셔도 상관없습니다. 중요한 건 조건에 맞춰 반환값이 있냐 없느냐 차이를 두고 필터링이 되기 때문입니다.

--2
SELECT A.회원번호, A.회원명
	FROM 회원 A
    WHERE A.회원번호 IN (SELECT B 회원번호 FROM 동의항목 B WHERE B.동의여부 = 'N')
ORDER BY A.회원번호;

--3
SELECT A.회원번호, A.회원명
	FROM 회원 A
    WHERE 0 < (SELECT COUNT(*) FROM 동의항목 B WHERE B.동의여부 = 'N')
ORDER BY A.회원번호;
--결과 : 0 < 2 이므로 필터링 없이 모든 데이터가 출력된다 

--4
SELECT A.회원번호, A.회원명
	FROM 회원 A, 동의항목 B
    WHERE A.회원번호 = B.회원번호 AND B.동의여부 = 'N'
    GROUP BY A.회원번호, A.회원명
ORDER BY A.회원번호;

정답 : 3

 

2. 아래의 데이터 모델을 기준으로 SQL을 작성하였다. 다음 중 아래의 SQL에 대해 가장 바르게 설명한 것은?

 

SELECT A.회원ID, A.회원명, A.이메일
FROM 회원 A
--ㄱ
WHERE EXISTS (SELECT 'X'
			FROM 이벤트 B, 메일발송 C
            WHERE B.시작일자 >= '2014.10.01'
            AND B.이벤트ID = C.이벤트ID
--ㄴ
			AND A.회원ID = C.회원ID
--ㄷ
			HAVING COUNT(*) < (SELECT COUNT(*) FROM 이벤트
					WHERE 시작일자 >= '2014.10.01'));

 

1) 이벤트 시작일자가 '2014.10.01'과 같거나 큰 이벤트를 대상으로 이메일이 발송된 기록이 있는 모든 회원을 추출하는 쿼리이다. 
▶︎ ㄷ 을 제외하면 맞음

2) ㄴ을 제거하고 exists 연산자를 in 연산자로 변경해도 결과는 동일하다.

3) ㄷ은 이벤트 시작일자가 '2014.10.01' 과 같거나 큰 이벤트건수와 그 이벤트들을 기준으로 회원별 이메일 발송건수를 비교하는 것이다.

4) group by 및 집계함수를 사용하지 않고 having 절을 사용하였으므로 sql이 실행되지 못하고 오류가 발생한다.
▶︎ 테이블 전체가 집계함수의 대상이 될 때 having사용 가능

 

3. 다음 중 서브쿼리에 대한 설명으로 가장 적절한 것은?

1) 단일행 서브쿼리는 서브쿼리의 실행 결과가 항상 한 건 이하인 서브쿼리로서 in, all 등의 비교연산자를 사용하여야 한다.

▶︎ = , >= , <= , > , <

2) 다중행 서브쿼리 비교 연산자는 단일 행 서브쿼리의 비교 연산자로도 사용할 수 있다.

3) 연관 서브쿼리는 주로 메인쿼리에 값을 제공하기 위한 목적으로 사용한다.

▶︎연관 서브쿼리는 주로 메인쿼리에 값을 제공 받기 위한 목적으로 사용한다.

4) 서브 쿼리는 항상 메인 쿼리에서 읽혀진 데이터에 대해 서브쿼리에서 해당 조건이 만족하는지를 확인하는 방식으로 수행된다.

 

4. 다음 중 아래 sql에 대한 설명으로 가장 부적절한 것은?

select b.사원번호, b.사원명, a.부서번호, a.부서명
	, (select count(*)
    	from 부양가족 y
        where y.사원번호 = b.사원번호 ) as 부양가족수
from 부서 a, (select * 
			from 사원
           where 입사년도 = '2014')b
where a.부서번호 = b.부서번호
	and exists ( select 1
    		from 사원 x
            where x.부서번호 = a.부서번호);

1) 위 sql에는 다중 행 연관 서브쿼리, 단일 행 연관 서브쿼리, inline view가 사용되었다.

서브쿼리가 from절 안에서 사용되는 경우, 해당 서브쿼리를 '인라인뷰' 라고 한다. 

2) select절에 사용된 서브쿼리는 스칼라 서브쿼리라고도하며, 이러한 형태의 서브쿼리는 join으로 동일한 결과를 추출할 수도 있다.

3) where절의 서브쿼리에 사원 테이블을 검색 조건으로 입사년도 조건을 from절의 서브쿼리와 동일하게 추가해야 원하는 결과를 추출할 수 있다.

4) from절의 서브쿼리는 동적 뷰(dynamic view)라고도 하며, sql문장 중 테이블 명이 올 수 있는 곳에서 사용할 수 있다.

inline view = dynamic view

반응형

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

SQLD 문제 풀이 12  (0) 2023.06.01
SQLD 문제 풀이 11  (1) 2023.05.30
SQLD 문제 풀이 9  (2) 2023.05.22
SQLD 문제 풀이 8  (0) 2023.05.22
SQLD 문제 풀이 7  (0) 2023.05.15

댓글