본문 바로가기
Database/SQLD

SQLD 문제 풀이 9

by KkingKkang 2023. 5. 22.

1. 다음 중 SELF JOIN을 수행해야 할 경우로 가장 적절한 것은?

1) 한 테이블 내에서 두 칼럼이 연관 관계가 있다.
2) 두 테이블에 연관된 칼럼은 없으나 JOIN을 해야 한다.
3) 두 테이블에 공통 칼럼이 존재하고 두 테이블이 연관 관계가 있다.
4) 한 테이블 내에서 연관된 칼럼은 없으나 JOIN을 해야 한다. 

SELF JOIN 문법

SELECT <열 목록>
FRON <테이블> 별칭A
	INNER JOIN <테이블> 별칭B
WHERE 검색 조건

 

2. 아래와 같이 일자별 테이블이 존재할 때 아래 결과처럼 일자별 누적매출액을 SQL로 구하려고 한다. WINDOW FUNCITON을 사용하지 않고 일자별 누적매출액을 구하는 SQL로 옳은 것은?

--1번
SELECT 
	A.일자, SUM(A.매출액) AS 누적매출액
FROM 일자별매출 A
GROUP BY A.일자
ORDER BY A.일자;
-- 모든 결과가 1000이 나온다.

--2번
SELECT 
	B.일자, SUM(B.매출액) AS 누적매출액
FROM 일자별매출 A
JOIN 일자별매출 B ON (A.일자 >= B.일자)
GROUP BY B.일자
ORDER BY B.일자;
-- 누적 매출액이 반대로 된다 

--3번
SELECT A.일자
	, SUM(B.매출액) AS 누적매출액
    FROM 일자별매출 A
    JOIN 일자별매출 B ON (A.일자 >= B.일자)
GROUP BY A.일자
ORDER BY A.일자;

--4번
SELECT A.일자
	, (SELECT SUM(B.매출액) FROM 일자별매출 B WHERE B.일자 >= A.일자) AS 누적매출액
    FROM 일자별매출 A
GROUP BY A.일자
ORDER BY A.일자;
-- A.일자 >= B.일자로 바꿔야 정답

 

답 : 3번

WINDOW FUNCTION 

함수(컬럼) OVER (Partition by 컬럼 Order by 컬럼)

1) 함수 

  • 그룹 내 순위(RANK) 관련 함수 : RANK, DENSE_RANK(동일 값 중복 순위 부여), ROW_NUMBER
  • 그룹내 집계(AGGREGATE) 관련 함수 : SUM, MAX, MIN, AVG, COUNT
  • 그룹 내 행 순서 관련 함수 : FIRST_VALUE, LAST_VALUE, LAG(이전 행의 값), LEAD(다음 행의 값) (오라클)
  • 그룹 내 비율 관련 함수 : CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT

2) OVER : over은 윈도우 함수에서 꼭 들어가야 하며 over 내부에 partition by 절과 order by 절이 들어감

3) partition by : 전체 집합은 어떤 기준(컬럼)에 따라 나눌지를 결정하는 부분

4) order by : 어떤 항목(컬럼)을 기준으로 순위를 정할 지 결정하는 부분

 

  GROUP BY WINDOW FUNCTION
기능 자르기 + 집약 자르기
특징 1. GROUP BY 구에 지정된 컬럼으로 데이터를 자르고 집계함수를 이용해 집약시킨다. PARTITION BY구에 지정된 컬럼으로 데이터를 자른다.
차이점 행의 수가 줄어든다 행의 수가 유지된다.

 

3. 다음 중 아래의 SQL 수행 결과로 가장 적절한 것은?

SELECT COUNT(DISTINCT A||B)
FROM EMP
WHERE D = (SELECT D FROM DEPT WHERE E = 'i');

EMP 테이블

A B C D
1 a 1 x
2 a 1 x
3 b 2 y

DEPT 테이블

D E F
x i 5
y m 6

결과

1a
2a

▶︎ count : 2

답 : 2

 

4. 아래는 서브쿼리에 대한 설명이다. 다음 중 올바른 것끼리 묶인 것은?

가) 서브쿼리는 단일 행(single row) 또는 복수 행(multi row) 비교연산자와 함께 사용할 수 있다.

나) 서브쿼리는 select절, from 절, having절, order by 절 등에서 사용 가능하다. * group by 절에는 사용 불가!!!

--select 절
SELECT A,B,(SELECT TOP 1 A FROM EMP)
FROM EMP;

--from 절
SELECT T1.A,
	T1.B,
    T2.A
FROM EMP T1, (SELECT TOP 1 A FROM EMP) T2
WHERE T1.A = T2.A; 

--order by절
--having 절
SELECT A
FROM EMP
GROUP BY A
HAVING A = (SELECT A FROM EMP WHERE A = 1)
ORDER BY (SELECT A FROM EMP WHERE A=1)

다) 서브쿼리의 결과가 복수 행(multi row)결과를 반환하는 경우에는 '=','<=','=>'등의 연산자와 함께 사용이 가능하다. ▶︎ 단일 행 일때만 가능. 복수 행 일때는 IN 등

라) 연관(correlated) 서브쿼리는 서브쿼리가 메인 쿼리 컬럼을 포함하고 있는 형태의 서브쿼리이다.

SELECT A
FROM EMP TAB1
WHERE A IN (SELECT F
			FROM DEPT TAB2
            WHERE TAB1.A = TAB2.F)

마) 다중 컬럼 서브쿼리는 서브쿼리의 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미하며 oracle 및 sql server등의 DBMS에서 사용할 수 있다. ▶︎SQL Server 에서는 지원 안됨

SELECT A
FROM EMP TAB1
WHERE (A,B) IN (SELECT D, F
			FROM DEPT TAB2
                WHERE TAB1.A = TAB2.F)

 

5. 아래 테이블은 어느 회사의 사원들과 이들이 부양하는 가족에 대한 것으로 밑줄 친 칼럼은 기본키(Primary Key)를 표시한 것이다. 다음 중 '현재 부양하는 가족들이 없는 사원들의 이름을 구하라는 질의에 대해 아래 SQL 문장의 ㄱ, ㄴ 에 들어 갈 내용으로 가장 적절한 것은?

[테이블]

사원(사번, 이름, 나이)
가족(이름, 나이, 부양사번) - 부양사번은 사원 테이블의 사번을 참조하는 외래키이다.

[SQL문장]

SELECT 이름
FROM 사원
WHERE ㄱ (SELECT * FROM 가족 WHERE ㄴ)

ㄱ : NOT EXISTS

ㄴ : 사번 = 부양사번

 

반응형

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

SQLD 문제 풀이 11  (1) 2023.05.30
SQLD 문제 풀이 10  (0) 2023.05.30
SQLD 문제 풀이 8  (0) 2023.05.22
SQLD 문제 풀이 7  (0) 2023.05.15
SQLD 문제 풀이 6  (0) 2023.05.15

댓글