jineecode
SQL 오답노트 본문
SQL을 연습해볼 수 있는 좋은 사이트
www.tutorialspoint.com/execute_sql_online.php
1.
132. 다음은 학생 테이블이다. 아래 결과와 같이 가장 높은 성적을 출력하는 쿼리를 작성하시오.
학생 테이블
학번 |
이름 |
성적 |
2001 |
안창호 |
90 |
2002 |
김정호 |
85 |
2003 |
김유신 |
75 |
2004 |
허준 |
80 |
2005 |
이성계 |
95 |
[결과]
학번 |
성적 |
2005 |
95 |
정답:
답)
select 학번, 성적
from 학생
where 성적 = (select max(성적) from 학생)
내가 쓴 오답:
SELECT 학번, MAX(성적) as 성적 from 학생 group by 학번;
group by를 쓰게 되면 해당 그룹의 모든 것이 출력된다.
group by 를 하게 되면 전부 출력 되겠죠
왜냐하면 group by 라고 하는건 그룹으로 지정한 컬럼(예:학번)에서
max() 함수로 "그룹별"로 가장 높은 값을 가져 오기 때문이에요
그러므로 이 문제는 서브쿼리를 써야 한다.
select 학번, 성적
from 학생
where 성적 = (select max(성적) from 학생)
[출처] [2020년 제4회 기사 실기 출제예상 문제] (11과목) 응용 SW 기초 기술 활용 - 132 (수제비- IT 커뮤니티 (정보처리기사,빅데이터분석기사 등)) | 작성자 보안쌤
2.
성적 테이블
학번 |
과목 |
성적 |
1000 |
보안 |
A |
1001 |
운영체제 |
B |
1002 |
통계 |
A+ |
1003 |
암호학 |
B+ |
1005 |
알고리즘 |
A |
1006 |
보안 |
A+ |
select 과목
from
(
select 과목, count(과목)
from 성적
group by 과목
having count(과목) > 1
) a;
실행결과
과목 |
( ) |
답) 보안
정답 및 해설)
먼저 아래의 쿼리가 실행이 된다.
select 과목, count(과목)
from 성적
group by 과목
having count( 과목) > 1;
-- group by 를 이용하여 과목별로 건수(count)를 집계한 후, 과목의 건수가 1보다 큰 데이터만 추출한다.
MariaDB [test2]> select 과목, count(과목)
-> from 성적
-> group by 과목
-> having count(과목) > 1;
+--------+---------------+
| 과목 | count(과목) |
+--------+---------------+
| 보안 | 2 |
+--------+---------------+
1 row in set (0.00 sec)
위 결과를 다시 select 명령으로 과목만 추출한다.
MariaDB [test2]> select 과목
-> from
-> (
-> select 과목, count(과목)
-> from 성적
-> group by 과목
-> having count( 과목) > 1
-> ) a;
+--------+
| 과목 |
+--------+
| 보안 |
+--------+
1 row in set (0.00 sec)
[출처] [2020년 제4, 5회 기사 실기 출제예상 문제] (11과목) 데이터베이스 - 149 (수제비- IT 커뮤니티 (정보처리기사,빅데이터분석기사 등)) | 작성자 보안쌤
3.
16. [학과] 테이블에서 ‘교수명’의 이름이 “황”으로 시작하는 튜플의 ‘학과번호’를 777로 업데이트하는 SQL 구문을 작성하시오.
[학과] 테이블
학과 |
학과번호 |
학과정원 |
교수명 |
전산과 |
110 |
300 |
김일등 |
국문과 |
310 |
250 |
황이등 |
수학과 |
120 |
400 |
이삼등 |
전산과 |
120 |
300 |
김사등 |
수학과 |
420 |
180 |
황오등 |
답)__________________________________________________________________________________
정답)
UPDATE 학과
SET 학과번호 = 777
WHERE 교수명 LIKE ‘황%’;
[출처] [2021년 제1회 기사 실기 출제예상 문제] (7과목) SQL 응용 - 16 (수제비- IT 커뮤니티 (정보처리기사,빅데이터분석기사 등)) | 작성자 수제비쌤
4.
[성과금] 테이블의 '부서', '성과금등급', '성과금'에 대해서 부서별 소계와 전체 합계를 검색하는 SQL 구문을 작성하시오.
[조건]
- [성과금] 테이블의 속성에는 부서, 성과금등급, 성과금이 있다.
- 속성명은 '성과금합계'로 하고, ROLLUP 함수를 사용한다.
[결과]
부서 |
성과금등급 |
성과금합계 |
인사과 |
B |
100 |
인사과 |
A |
200 |
인사과 |
C |
50 |
인사과 |
|
350 |
회계과 |
B |
100 |
회계과 |
C |
50 |
회계과 |
A |
200 |
회계과 |
|
350 |
정보보안과 |
A |
200 |
정보보안과 |
B |
100 |
정보보안과 |
|
300 |
|
|
1,000 |
답)__________________________________________________________________________________
SELECT 부서, 성과금등급, SUM(성과금) AS 성과금합계
FROM 성과금
GROUP BY ROLLUP(부서, 성과금등급);
*ROLLUP에 대하여
SELECT 컬럼1, 컬럼2, ..., 집계함수 FROM 테이블명 [WHERE절] GROUP BY [컬럼 ...] ROLLUP 컬럼 [해빙절][오더바이절]
중간 집계 값을 산출하기 위한 그룹 함수. ROLLUP의 지정 컬럼은 계층별로 구성되기 때문에 순서가 바뀌면 수행 결과가 바뀜을 주의한다.
해당 영상이 많이 참조되었다.
0. 스키마 준비
CREATE TABLE STARBUCKS_ORDER (
ORDER_NO NUMBER(5) NOT NULL,
ORDER_DT VARCHAR2(8) NOT NULL,
BRANCH VARCHAR2(10),
ORDER_ITEM VARCHAR2(100),
REG_NAME VARCHAR2(20),
REG_DTS DATE,
CONSTRAINT ORDER_PK PRIMARY KEY (ORDER_NO)
);
COMMENT ON COLUMN STARBUCKS_ORDER.ORDER_NO IS '주문번호';
COMMENT ON COLUMN STARBUCKS_ORDER.ORDER_DT IS '주문일자';
COMMENT ON COLUMN STARBUCKS_ORDER.BRANCH IS '지점';
COMMENT ON COLUMN STARBUCKS_ORDER.ORDER_ITEM IS '주문상품';
COMMENT ON COLUMN STARBUCKS_ORDER.REG_NAME IS '담당 파트너';
COMMENT ON COLUMN STARBUCKS_ORDER.REG_DTS IS '등록일시';
INSERT INTO STARBUCKS_ORDER VALUES ( 1,'20190801','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 2,'20190801','강남점','카페라떼','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 3,'20190801','강남점','자바칩 프라푸치노','테스',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 4,'20190801','강남점','바닐라 프라푸치노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 5,'20190801','강남점','아메리카노','무드',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 6,'20190801','강남점','아메리카노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 7,'20190801','강남점','쿨라임 피지오','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 8,'20190801','강남점','카페라떼','테스',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 9,'20190802','강남점','아메리카노','무드',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 10,'20190802','강남점','콜드브루','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 11,'20190802','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 12,'20190802','강남점','아메리카노','마샤',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 13,'20190802','강남점','한라봉주스','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 14,'20190802','강남점','카페모카','테스',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 15,'20190802','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 16,'20190802','강남점','아메리카노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 17,'20190802','강남점','그린티크림 프라푸치노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 18,'20190802','강남점','카페라떼','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 19,'20190802','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 20,'20190802','강남점','콜드브루','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 21,'20190802','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 22,'20190803','강남점','카페라떼','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 23,'20190803','강남점','자바칩 프라푸치노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 24,'20190803','강남점','바닐라 프라푸치노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 25,'20190803','강남점','아메리카노','무드',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 26,'20190803','강남점','아메리카노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 27,'20190803','강남점','쿨라임 피지오','마샤',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 28,'20190803','강남점','한라봉주스','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 29,'20190803','강남점','아메리카노','마샤',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 30,'20190804','강남점','콜드브루','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 31,'20190804','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 32,'20190804','강남점','카페라떼','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 33,'20190804','강남점','자바칩 프라푸치노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 34,'20190804','강남점','바닐라 프라푸치노','마샤',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 35,'20190804','강남점','아메리카노','릴리',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 36,'20190804','강남점','아메리카노','봄',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 37,'20190804','강남점','아메리카노','테스',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 38,'20190804','강남점','카페라떼','무드',SYSDATE);
INSERT INTO STARBUCKS_ORDER VALUES ( 39,'20190804','강남점','아메리카노','마샤',SYSDATE);
1. 먼저 GROUP BY를 해본다.
SELECT * FROM STARBUCKS_ORDER;
-- 날짜별
SELECT ORDER_DT, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ORDER_DT ORDER BY ORDER_DT;
-- 주문음료별
SELECT ORDER_ITEM, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ORDER_ITEM;
-- 파트너별
SELECT REG_NAME , COUNT(*) FROM STARBUCKS_ORDER GROUP BY REG_NAME;
2. 이것을 통계내본다.단순히 GROUP BY 앞에 ROLLUP을 해주고 괄호로 묶으면 합해서 결과가 나온다. 즉 엑셀함수의 SUM 같은 역할을 해주는 것이 ROLLUP.
SELECT * FROM STARBUCKS_ORDER;
-- 날짜별
SELECT ORDER_DT, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ROLLUP(ORDER_DT) ORDER BY ORDER_DT;
-- 주문음료별
SELECT ORDER_ITEM, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ROLLUP(ORDER_ITEM);
-- 파트너별
SELECT REG_NAME , COUNT(*) FROM STARBUCKS_ORDER GROUP BY ROLLUP (REG_NAME);
3. 두 개 이상의 컬럼으로 그룹 바이를 할 경우
SELECT * FROM STARBUCKS_ORDER;
-- DT와 ITEM으로 그룹바이
SELECT ORDER_DT, ORDER_ITEM, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ORDER_DT, ORDER_ITEM ORDER BY ORDER_DT;
ORDER_DTORDER_ITEMCOUNT(*)
20190801 | 바닐라 프라푸치노 | 1 |
20190801 | 아메리카노 | 3 |
20190801 | 자바칩 프라푸치노 | 1 |
20190801 | 카페라떼 | 2 |
20190801 | 쿨라임 피지오 | 1 |
20190802 | 그린티크림 프라푸치노 | 1 |
20190802 | 아메리카노 | 7 |
20190802 | 카페라떼 | 1 |
20190802 | 카페모카 | 1 |
20190802 | 콜드브루 | 2 |
20190802 | 한라봉주스 | 1 |
20190803 | 바닐라 프라푸치노 | 1 |
20190803 | 아메리카노 | 3 |
20190803 | 자바칩 프라푸치노 | 1 |
20190803 | 카페라떼 | 1 |
20190803 | 쿨라임 피지오 | 1 |
20190803 | 한라봉주스 | 1 |
20190804 | 바닐라 프라푸치노 | 1 |
20190804 | 아메리카노 | 5 |
20190804 | 자바칩 프라푸치노 | 1 |
20190804 | 카페라떼 | 2 |
20190804 | 콜드브루 | 1 |
SELECT * FROM STARBUCKS_ORDER;
-- DT와 ITEM으로 그룹바이와 롤업
SELECT ORDER_DT, ORDER_ITEM, COUNT(*)
FROM STARBUCKS_ORDER GROUP BY ROLLUP(ORDER_DT, ORDER_ITEM) ORDER BY ORDER_DT;
ORDER_DTORDER_ITEMCOUNT(*)
20190801 | 바닐라 프라푸치노 | 1 |
20190801 | 아메리카노 | 3 |
20190801 | 자바칩 프라푸치노 | 1 |
20190801 | 카페라떼 | 2 |
20190801 | 쿨라임 피지오 | 1 |
20190801 | (null) | 8 |
20190802 | 그린티크림 프라푸치노 | 1 |
20190802 | 아메리카노 | 7 |
20190802 | 카페라떼 | 1 |
20190802 | 카페모카 | 1 |
20190802 | 콜드브루 | 2 |
20190802 | 한라봉주스 | 1 |
20190802 | (null) | 13 |
20190803 | 바닐라 프라푸치노 | 1 |
20190803 | 아메리카노 | 3 |
20190803 | 자바칩 프라푸치노 | 1 |
20190803 | 카페라떼 | 1 |
20190803 | 쿨라임 피지오 | 1 |
20190803 | 한라봉주스 | 1 |
20190803 | (null) | 8 |
20190804 | 바닐라 프라푸치노 | 1 |
20190804 | 아메리카노 | 5 |
20190804 | 자바칩 프라푸치노 | 1 |
20190804 | 카페라떼 | 2 |
20190804 | 콜드브루 | 1 |
20190804 | (null) | 10 |
(null) | (null) | 39 |
날짜별로 소계가 나오고, 마지막엔 총합이 나온다.
이것은 즉,
GROUP BY ORDER_DT, ORDER_ITEM + GROUP BY ORDER_DT + 총 합계
이라고 보면 이해하기 쉽다.
*CUBE에 대하여
SELECT 컬럼1, 컬럼2, ..., 집계함수 FROM 테이블명 [WHERE절] GROUP BY [컬럼 ...] CUBE 컬럼 [해빙절][오더바이절]
결합 가능한 모든 값에 대해 다차원 집계를 생성하는 그룹 함수
1. 먼저 GROUP BY를 해본다.
SELECT * FROM STARBUCKS_ORDER;
-- 날짜별
SELECT ORDER_DT, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ORDER_DT ORDER BY ORDER_DT;
-- 주문음료별
SELECT ORDER_ITEM, COUNT(*) FROM STARBUCKS_ORDER GROUP BY ORDER_ITEM;
-- 파트너별
SELECT REG_NAME , COUNT(*) FROM STARBUCKS_ORDER GROUP BY REG_NAME;
2. 마찬가지로 통계 내본다.단순히 GROUP BY 앞에 CUBE를 해주고 괄호로 묶으면 합해서 결과가 나온다. 여기까지는 ROLLUP과 차이가 없다.
SELECT * FROM STARBUCKS_ORDER;
-- 날짜별
SELECT ORDER_DT, COUNT(*) FROM STARBUCKS_ORDER GROUP BY CUBE(ORDER_DT) ORDER BY ORDER_DT;
-- 주문음료별
SELECT ORDER_ITEM, COUNT(*) FROM STARBUCKS_ORDER GROUP BY CUBE(ORDER_ITEM);
-- 파트너별
SELECT REG_NAME , COUNT(*) FROM STARBUCKS_ORDER GROUP BY CUBE (REG_NAME);
3. 두 개 이상의 컬럼으로 cube를 할 경우
SELECT * FROM STARBUCKS_ORDER;
-- DT와 ITEM으로 그룹바이와 큐브
SELECT ORDER_DT, ORDER_ITEM, COUNT(*)
FROM STARBUCKS_ORDER GROUP BY CUBE(ORDER_DT, ORDER_ITEM) ORDER BY ORDER_DT;
ORDER_DTORDER_ITEMCOUNT(*)
20190801 | 바닐라 프라푸치노 | 1 |
20190801 | 아메리카노 | 3 |
20190801 | 자바칩 프라푸치노 | 1 |
20190801 | 카페라떼 | 2 |
20190801 | 쿨라임 피지오 | 1 |
20190801 | (null) | 8 |
20190802 | 그린티크림 프라푸치노 | 1 |
20190802 | 아메리카노 | 7 |
20190802 | 카페라떼 | 1 |
20190802 | 카페모카 | 1 |
20190802 | 콜드브루 | 2 |
20190802 | 한라봉주스 | 1 |
20190802 | (null) | 13 |
20190803 | 바닐라 프라푸치노 | 1 |
20190803 | 아메리카노 | 3 |
20190803 | 자바칩 프라푸치노 | 1 |
20190803 | 카페라떼 | 1 |
20190803 | 쿨라임 피지오 | 1 |
20190803 | 한라봉주스 | 1 |
20190803 | (null) | 8 |
20190804 | 바닐라 프라푸치노 | 1 |
20190804 | 아메리카노 | 5 |
20190804 | 자바칩 프라푸치노 | 1 |
20190804 | 카페라떼 | 2 |
20190804 | 콜드브루 | 1 |
20190804 | (null) | 10 |
(null) | 그린티크림 프라푸치노 | 1 |
(null) | 바닐라 프라푸치노 | 3 |
(null) | 아메리카노 | 18 |
(null) | 자바칩 프라푸치노 | 3 |
(null) | 카페라떼 | 6 |
(null) | 카페모카 | 1 |
(null) | 콜드브루 | 3 |
(null) | 쿨라임 피지오 | 2 |
(null) | 한라봉주스 | 2 |
(null) | (null) | 39 |
CUBE는 ROLLUP 과는 달리 음료별로도 그룹바이 한 것의 소계가 나온다.
그러므로 CUBE는 컬럼의 순서가 결괏값이 영향을 미치지 않는다.
[출처] [2021년 제1회 기사 실기 출제예상 문제] (7과목) SQL 응용 - 19 (수제비- IT 커뮤니티 (정보처리기사,빅데이터분석기사 등)) | 작성자 수제비쌤
'지식 > 정보처리기사' 카테고리의 다른 글
기사 실기 오답노트. (0) | 2021.04.21 |
---|---|
정보처리기사 실기 도움 되었던 사이트 및 강의 (0) | 2021.04.20 |
프로그래밍 언어 활용 오답노트 (0) | 2021.04.17 |
파이썬 (0) | 2021.04.17 |
프로그래밍 활용 개행 구분하기 (0) | 2021.04.16 |