1. 어느 기업의 직원 테이블(EMP)이 직급(GRADE)별로 사원 500명, 대리 100명, 과장 30명, 차장 10명, 부장 5명, 직급이 정해지지 않은(NULL) 사람 25명으로 구성되어 있을 때, 다음 SQL문의 결과는?
1) SELECT COUNT(GRADE) FROM EMP; ▷ NULL 값을 제외한 값들 카운트 : 645
2) SELECT GRADE FROM EMP WHERE GRADE IN ('차장','부장','널'); ▷ 차장, 부장 카운트 : 15
3) SELECT GRADE, COUNT(*) FROM EMP GROUP BY GRADE; ▷group by grade로 null 제외 grade 개수 : 6
2. 아래는 어느 회사의 광고에 대한 데이터 모델이다. 다음 광고매체 ID별 / 최초로 게시한 광고명과 광고시작일자를 출력하기 위한 SQL문을 완성하시오
SELECT C.광고매체명
, B.광고명
, A.광고시작일자
FROM 광고게시 A, 광고 B, 광고매체 C, (
--빈칸
SELECT 광고매체ID, MIN(광고시작일자) AS 광고시작일자
FROM 광고게시
GROUPBY 광고매체ID
) D
WHERE A.광고시작일자 = D.광고시작일자
AND A.광고매체ID = D.광고매체ID
AND A.광고ID = B.광고ID
AND A.광고매체ID = C.광고매체ID
ORDER BY C.광고매체명;
3. 다음 중 오류가 발생하는 SQL 문장인 것은?
--1
SELECT 회원ID, SUM(주문금액) AS 합계
FROM 주문
GROUP BY 회원ID
HAVING COUNT(*) > 1 ;
--2
SELECT SUM(주문금액) AS 합계
FROM 주문
HAVING AVG(주문금액) > 100;
--GROUP BY절이 없어도 가능
--3
SELECT 메뉴ID, 사용유형코드, COUNT(*) AS CNT
FROM 시스템사전예약
WHERE 시작일시 BETWEEN SYSDATE - 1 AND SYSDATE
GROUP BY 메뉴ID, 사용유형코드
HAVING 메뉴ID = 3 AND 사용유형코드 = 100;
--4
SELECT 메뉴ID, 사용유형코드, AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용예약
GROUP BY 메뉴ID, 사용유형코드;
--중첩 그룹함수로 오류 발생
--맞는 예시
SELECT AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용예약
GROUP BY 메뉴ID, 사용유형코드;
4. 다음 SQL문의 결과는?
A테이블
SELECT MAX(가) AS 가, 나, SUM(다) AS 다
FROM A
GROUP BY 나
HAVING COUNT(*) > 1
ORDER BY 다 DESC;
SELECT 나,COUNT(*) FROM A GROUP BY 나
A001 | 2 |
A002 | 3 |
A003 | 4 |
A004는 1개이므로 HAVING COUNT(*) > 1 조건에 부합하지 않아 빠진다.
MAX(가) | 나 | SUM(다) |
002 | A001 | 300 |
005 | A002 | 500 |
009 | A003 | 600 |
DESC
009 | A003 | 600 |
005 | A002 | 500 |
002 | A001 | 300 |
5. 다음 SQL의 실행 결과는?
TBL
ID |
100 |
100 |
200 |
200 |
200 |
999 |
999 |
SELECT ID FROM TBL
GROUP BY ID
HAVING COUNT(*) = 2
GROUP BY (CASE WHEN ID = 999 THEN 0 ELSE ID END)
100200
999 → 0 으로 치환되어 999 값이 먼저 나옴
답 :
ID |
999 |
100 |
6. 다음 SQL 중 오류가 발생하는 것은?
--1
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 매출금액 DESC;
--2
SELECT 지역, 매출금액
FROM 지역별매출
ORDER BY 년 ASC;
--3
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 년 DESC;
-- 년은 GROPU BY 절에 기준이 되는 컬럼과 다르고, 그룹함수에 대한 컬럼도 아니기에 오류 발생
--4
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
HAVING SUM(매출금액) > 1000
ORDER BY COUNT(*) ASC;
7. 다음 중 ORDER BY 절에 대한 설명으로 가장 부적절한 것은?
1) SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 컬럼을 기준으로 정렬하는데 사용한다.
2) DBMS마다 NULL값에 대한 정렬 순서가 다를 수 있으므로 주의하여야 한다.
3) ORDER BY절에서 칼럼명 대산 Alias명이나 컬럼 순서를 나타내는 정수도 사용이 가능하나, 이들을 혼용하여 사용할 수 없다. 혼용해서 사용 가능하다.
4) GROUP BY 절을 사용하는 경우 ORDER BY 절에 집계 함수를 사용할 수도 있다.
8. 다음 SQL의 실행 결과는?
TBL
ID | AMT |
A | 50 |
A | 200 |
B | 300 |
C | 100 |
SELECT ID, AMT
FROM TBL
ORDER BY (CASE WHEN ID = 'A' THEN 1 ELSE 2 END), AMT DESC
A | 200 |
A | 50 |
B | 300 |
C | 100 |
Oracle 에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다.
반면, SQL Server에서는 NULL값을 가장 작은 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 먼저, 내림차순으로 정렬했을 경우에는 가장 마자막에 위치한다.
9. SELECT 문장의 실행 순서
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
1) 발췌 대상의 테이블을 참조한다.(FROM)
2) 발췌 대상 데이터가 아닌 것은 제거한다. (WHERE)
3) 행들을 소그룹화한다. (GROUP BY)
4) 그룹핑된 값의 조건에 맞는 것 만을 출력한다.(HAVING)
5) 데이터 값을 출력/계산한다. (SELECT)
6) 데이터를 정렬한다. (ORDER BY)
10. 아래의 팀별성적 테이블에서 승리건수가 높은 순으로 3위까지 출력하되 3위의 승리건수가 동일한 팀이 있다면 함께 출력하기 위한 SQL문장은?
오라클에서는 TOP 함수가 없다!
SQL SERVER 에서는 ROWNUM이 없다!
팀명 | 승리건수 | 패배건수 |
A | 120 | 80 |
B | 20 | 180 |
C | 10 | 190 |
D | 100 | 100 |
E | 110 | 90 |
F | 100 | 100 |
G | 70 | 130 |
SELECT TOP(3) * FROM 팀별성적 ORDER BY 승리건수 DESC;
-- 오라클 : SELECT * FROM ( SELECT * FROM 팀별성적 ORDER BY 승리건수 DESC) WHERE ROWNUM < 4;
팀명 | 승리건수 |
A | 120 |
E | 110 |
D | 100 |
SELECT TOP(3) WITH TIES 팀명, 승리건수 FROM 팀별성적 ORDER BY 승리건수 DESC;
팀명 | 승리건수 |
A | 120 |
E | 110 |
F | 100 |
D | 100 |
'Database > SQLD' 카테고리의 다른 글
SQLD 문제 풀이 8 (0) | 2023.05.22 |
---|---|
SQLD 문제 풀이 7 (0) | 2023.05.15 |
SQLD 문제 풀이 5 (1) | 2023.05.13 |
SQLD 문제 풀이 4 (0) | 2023.05.11 |
SQLD 문제 풀이 3 (0) | 2023.05.10 |
댓글