17차시
쿼리와 SQL
Part 3. 데이터베이스 일반 · 출제 빈도 ★★★
이 차시를 공부하는 이유
SQL은 3과목에서 가장 많이 출제되는 단원(매회 4~6문제)입니다. 구문의 순서와 WHERE/HAVING, 조인의 방향만 정확히 알면 대부분의 SQL 문제를 풀 수 있습니다.
2급에서 먼저 보면 좋은 내용
1급 전용 과목이지만, 2급의 정렬·필터·부분합 개념이 SQL의 ORDER BY·WHERE·GROUP BY와 그대로 이어집니다.
학습 목표
SELECT 문의 각 절(FROM, WHERE, GROUP BY, HAVING, ORDER BY) 역할과 순서를 설명할 수 있다.
IN, BETWEEN, LIKE 연산자와 하위 질의로 조건을 작성할 수 있다.
내부 조인과 외부 조인의 결과 차이를 구분할 수 있다.
INSERT·UPDATE·DELETE 문과 크로스탭·매개 변수·실행 쿼리를 이해한다.
핵심 개념
1. SELECT 기본 구문
SELECT 구문 (작성 순서)
SELECT [DISTINCT] 필드1, 필드2 [AS 별칭] -- 무엇을 (* 은 모든 필드)
FROM 테이블 -- 어디에서
[WHERE 조건] -- 개별 레코드 조건
[GROUP BY 필드] -- 그룹으로 묶어
[HAVING 그룹 조건] -- 그룹에 대한 조건
[ORDER BY 필드 [ASC | DESC]]; -- 정렬 (생략 시 ASC)
- SQL은 대·소문자를 구분하지 않으며, 문장 끝에 세미콜론(;)을 씁니다.
DISTINCT: 결과에서 중복 레코드를 한 번만 표시합니다.ORDER BY 점수 DESC, 이름 ASC: 점수 내림차순, 같으면 이름 오름차순- 필드 이름에 공백이 있으면
[주문 수량]처럼 대괄호로 묶고, 문자 값은 따옴표, 날짜 값은 #으로 묶습니다(#2026-10-08#).
2. 그룹과 집계 함수: GROUP BY와 HAVING
예: 학과별 평균 점수가 80 이상인 학과만 평균이 높은 순으로
SELECT 학과, AVG(점수) AS 평균, COUNT(*) AS 인원
FROM 성적
WHERE 학년 = 1 -- ① 1학년 레코드만 먼저 고르고
GROUP BY 학과 -- ② 학과별로 묶어
HAVING AVG(점수) >= 80 -- ③ 평균 80 이상 그룹만
ORDER BY AVG(점수) DESC; -- ④ 평균 내림차순
WHERE
GROUP BY 이전, 개별 레코드에 대한 조건. 집계 함수 사용 불가
HAVING
GROUP BY 이후, 그룹에 대한 조건. 집계 함수 사용 가능
- 집계 함수:
SUM,AVG,COUNT,MAX,MIN— AVG·COUNT(필드)는 비어 있지 않은(Null 아닌) 값만 대상으로 합니다.COUNT(*)는 전체 레코드 수입니다.
시험 함정 포인트
'그룹에 대한 조건을 WHERE 절에 쓴다'는 오답입니다.
'그룹에 대한 조건을 WHERE 절에 쓴다'는 오답입니다.
WHERE AVG(점수)>=80은 오류이며 HAVING에 써야 합니다.3. 특수 연산자와 하위 질의
| 연산자 | 예 | 의미 |
|---|---|---|
| IN | WHERE 학과 IN ("경영", "전산") | 목록 중 하나와 같음 (= OR 조건) |
| BETWEEN | WHERE 점수 BETWEEN 70 AND 89 | 70 이상 89 이하 (= AND 조건, 양 끝 포함) |
| LIKE | WHERE 이름 LIKE "김*" | 패턴 일치 — * 또는 % 여러 글자, ? 또는 _ 한 글자, # 숫자 한 자리 |
| IS NULL | WHERE 전화 IS NULL | 값이 비어 있는 레코드 |
| NOT | WHERE 학과 NOT IN ("경영") | 조건의 반대 |
- 하위 질의는 SELECT·INSERT·UPDATE·DELETE 안에 쓸 수 있고, 하위 질의 안에 또 하위 질의를 넣을 수 있습니다. 필드 목록, WHERE, HAVING 절에 사용합니다.
하위 질의 (SELECT 안의 SELECT)
SELECT 이름 FROM 학생
WHERE 학번 IN (SELECT 학번 FROM 수강 WHERE 과목 = "DB");
-- 안쪽 질의 결과(DB 수강 학번 목록)가 바깥 질의의 조건이 된다
SELECT 이름, 점수 FROM 성적
WHERE 점수 > (SELECT AVG(점수) FROM 성적); -- 평균보다 높은 학생
4. 조인 (JOIN)
두 테이블을 연결 필드로 이어 하나처럼 조회합니다. 연결 필드는 데이터 형식이 같거나 호환되어야 하며, 관계가 설정되어 있지 않아도 조인은 가능합니다.
| 조인 | 결과 |
|---|---|
| INNER JOIN (내부) | 양쪽 테이블에서 연결 필드 값이 일치하는 레코드만 |
| LEFT JOIN (왼쪽 외부) | 왼쪽 테이블은 모두 + 오른쪽은 일치하는 것만 (없으면 Null) |
| RIGHT JOIN (오른쪽 외부) | 오른쪽 테이블은 모두 + 왼쪽은 일치하는 것만 |
조인 구문
SELECT 학생.이름, 학과.학과명
FROM 학생 INNER JOIN 학과
ON 학생.학과코드 = 학과.학과코드;
-- 학과가 지정되지 않은 학생까지 모두 보려면
FROM 학생 LEFT JOIN 학과 ON 학생.학과코드 = 학과.학과코드
5. 데이터 조작문: INSERT·UPDATE·DELETE
구문
INSERT INTO 학생 (학번, 이름, 학과코드)
VALUES ("26004", "최구름", "D01"); -- 한 레코드 직접 추가
INSERT INTO 졸업생 (학번, 이름)
SELECT 학번, 이름 FROM 학생 WHERE 학년 = 4; -- 다른 테이블에서 여러 레코드 추가
UPDATE 학생 SET 학년 = 학년 + 1 WHERE 학년 < 4;
DELETE FROM 학생 WHERE 학번 = "26004"; -- DELETE * FROM 도 가능
- INSERT로 여러 레코드를 한 번에 추가할 수 있지만 한 번에 하나의 테이블에만 추가합니다. 모든 필드에 넣을 때는 필드 목록을 생략할 수 있습니다.
- UPDATE·DELETE에서 WHERE를 생략하면 테이블의 모든 레코드가 수정·삭제됩니다.
- DELETE는 레코드를 지우며 테이블 구조는 남습니다(구조 삭제는 DDL의 DROP).
6. 여러 가지 쿼리와 Access 주요 함수
| 쿼리 | 특징 |
|---|---|
| 크로스탭 | 필드 요약값(합계·개수·평균)을 행·열 표 형태로 집계 (피벗 테이블과 유사). 행 머리글은 여러 개 가능, 열 머리글은 1개만 |
| 매개 변수 | 실행할 때 값을 입력받는 대화상자 표시. 조건 행에 [학과를 입력하세요]처럼 대괄호로 입력, 여러 개 가능 |
| 통합(UNION) | 성격이 비슷한 두 테이블/쿼리를 하나로 합침. 필드 개수가 같아야 하며 같은 레코드는 한 번만 |
| 실행 쿼리 | 테이블 만들기, 추가, 업데이트, 삭제 쿼리 — 실행하면 데이터가 실제로 변경됨 |
| 중복 데이터 / 불일치 검색 | 같은 값을 가진 레코드 찾기 / 다른 테이블과 일치하지 않는 레코드 찾기 (쿼리 마법사) |
Access 주요 함수 (쿼리·폼·보고서 공통)
IIf(점수>=60, "합격", "불합격") 조건이 참이면 앞, 거짓이면 뒤
InStr("ITAFTERSCHOOL", "S") → 8 (찾는 문자가 없으면 0)
Left / Mid / Right / Len / Trim / LCase / UCase / Val
Date() 현재 날짜 / Time() 현재 시간 / Now() 날짜와 시간
DatePart("m", #2026-10-08#) → 10
DateAdd("d", 30, [주문일]) 주문일 30일 후
DateDiff("yyyy", [입사일], Date()) 근속 연수
형식: yyyy 연, q 분기, m 월, d 일, ww 주, h 시, n 분, s 초
Weekday(날짜, 2) 월요일 1 ~ 일요일 7
DateSerial(2026, 10, 8) / Format(Date(), "yyyy-mm-dd") / IsNull(필드)
시험 함정 포인트
DateAdd·DateDiff·DatePart에서 분은 "n", 월은 "m"입니다. 엑셀 함수와 이름은 같아도 인수 순서·형식이 다르니 주의하세요.
DateAdd·DateDiff·DatePart에서 분은 "n", 월은 "m"입니다. 엑셀 함수와 이름은 같아도 인수 순서·형식이 다르니 주의하세요.
확인 문제
1 / 5
문제 1
<성적> 테이블에서 학과별 평균 점수가 80점 이상인 학과만 조회하려 할 때 빈칸에 들어갈 내용으로 옳은 것은?
SELECT 학과, AVG(점수) FROM 성적 GROUP BY 학과 ( ㉠ );
💡 정답 ② 해설: 그룹에 대한 조건은 GROUP BY 뒤의 HAVING 절에 씁니다. WHERE 절에는 집계 함수를 쓸 수 없고, ④는 개별 점수 조건이라 의미가 다릅니다.
문제 2
다음 SQL문의 결과에 대한 설명으로 옳은 것은?
SELECT 학생.이름, 학과.학과명 FROM 학생 LEFT JOIN 학과 ON 학생.학과코드 = 학과.학과코드;
💡 정답 ③ 해설: LEFT JOIN은 왼쪽 테이블(학생)의 레코드를 모두 표시하고, 오른쪽(학과)은 일치하는 것만 가져오므로 일치하지 않으면 학과명이 Null로 표시됩니다.
문제 3
WHERE 이름 LIKE "김??" 조건으로 검색되는 이름은?
💡 정답 ② 해설: ?는 한 글자를 대신하므로 '김'으로 시작하는 정확히 세 글자 이름이 검색됩니다.
문제 4
크로스탭 쿼리에 대한 설명으로 옳지 않은 것은?
💡 정답 ④ 해설: 크로스탭 쿼리에서 열 머리글로 사용할 필드는 하나만 지정할 수 있습니다.
문제 5
<학생> 테이블에서 학년이 4인 학생을 모두 삭제하는 SQL문으로 옳은 것은?
💡 정답 ② 해설: 레코드 삭제는 DELETE FROM 테이블 WHERE 조건; 형식입니다. DROP은 테이블 구조 자체를 삭제하는 DDL입니다.
17차시 문제 더 풀기
확인문제와 실전 모의고사에서 이 차시 범위 문제만 모아 해설과 함께 볼 수 있습니다.