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 AVG(점수)>=80은 오류이며 HAVING에 써야 합니다.
3. 특수 연산자와 하위 질의
연산자예의미
INWHERE 학과 IN ("경영", "전산")목록 중 하나와 같음 (= OR 조건)
BETWEENWHERE 점수 BETWEEN 70 AND 8970 이상 89 이하 (= AND 조건, 양 끝 포함)
LIKEWHERE 이름 LIKE "김*"패턴 일치 — * 또는 % 여러 글자, ? 또는 _ 한 글자, # 숫자 한 자리
IS NULLWHERE 전화 IS NULL값이 비어 있는 레코드
NOTWHERE 학과 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"입니다. 엑셀 함수와 이름은 같아도 인수 순서·형식이 다르니 주의하세요.

확인 문제

1 / 5
문제 1
<성적> 테이블에서 학과별 평균 점수가 80점 이상인 학과만 조회하려 할 때 빈칸에 들어갈 내용으로 옳은 것은?
SELECT 학과, AVG(점수) FROM 성적
GROUP BY 학과 ( ㉠ );
①
WHERE AVG(점수) >= 80
②
HAVING AVG(점수) >= 80
③
ORDER BY AVG(점수) >= 80
④
WHERE 점수 >= 80
💡 정답 ② 해설: 그룹에 대한 조건은 GROUP BY 뒤의 HAVING 절에 씁니다. WHERE 절에는 집계 함수를 쓸 수 없고, ④는 개별 점수 조건이라 의미가 다릅니다.
문제 2
다음 SQL문의 결과에 대한 설명으로 옳은 것은?
SELECT 학생.이름, 학과.학과명
FROM 학생 LEFT JOIN 학과
ON 학생.학과코드 = 학과.학과코드;
①
학과코드가 일치하는 학생만 표시된다.
②
모든 학과가 표시되고 학생이 없는 학과는 이름이 비어 있다.
③
모든 학생이 표시되고 학과가 일치하지 않는 학생은 학과명이 비어 있다.
④
두 테이블의 모든 레코드 조합이 표시된다.
💡 정답 ③ 해설: LEFT JOIN은 왼쪽 테이블(학생)의 레코드를 모두 표시하고, 오른쪽(학과)은 일치하는 것만 가져오므로 일치하지 않으면 학과명이 Null로 표시됩니다.
문제 3
WHERE 이름 LIKE "김??" 조건으로 검색되는 이름은?
①
김하늘별
②
김하늘
③
김
④
이김수
💡 정답 ② 해설: ?는 한 글자를 대신하므로 '김'으로 시작하는 정확히 세 글자 이름이 검색됩니다.
문제 4
크로스탭 쿼리에 대한 설명으로 옳지 않은 것은?
①
필드의 합계, 개수, 평균 등을 행과 열 형태로 요약한다.
②
엑셀의 피벗 테이블과 비슷한 형태이다.
③
행 머리글로 사용할 필드는 여러 개 지정할 수 있다.
④
열 머리글로 사용할 필드도 여러 개 지정할 수 있다.
💡 정답 ④ 해설: 크로스탭 쿼리에서 열 머리글로 사용할 필드는 하나만 지정할 수 있습니다.
문제 5
<학생> 테이블에서 학년이 4인 학생을 모두 삭제하는 SQL문으로 옳은 것은?
①
DROP FROM 학생 WHERE 학년 = 4;
②
DELETE FROM 학생 WHERE 학년 = 4;
③
DELETE 학생 SET 학년 = 4;
④
UPDATE 학생 DELETE 학년 = 4;
💡 정답 ② 해설: 레코드 삭제는 DELETE FROM 테이블 WHERE 조건; 형식입니다. DROP은 테이블 구조 자체를 삭제하는 DDL입니다.
0/5
훌륭합니다!
모든 문제를 정확히 풀었습니다.

17차시 문제 더 풀기

확인문제와 실전 모의고사에서 이 차시 범위 문제만 모아 해설과 함께 볼 수 있습니다.

주제별 문제 보기
이전 차시
16차시. 기본키·인덱스·관계·외부 데이터
다음 차시
18차시. 폼·컨트롤