실기 SQL: 쿼리 직접 쓰기
쉽게 말하면
필기에서는 보기 중에 맞는 SQL을 골랐지만, 실기에서는 빈 칸에 SQL을 직접 써요. 요령은 문제 문장을 SQL 절로 하나씩 옮기는 거예요. '어느 표에서'는 FROM, '어떤 행만'은 WHERE, '무엇별로'는 GROUP BY, '묶은 뒤 조건'은 HAVING, '무엇을 보여 줄지'는 SELECT, '어떤 순서로'는 ORDER BY예요. 아래 모의 SQL 창에 직접 쳐서 결과를 확인해 봐요.
시험용 정의
실기 SQL은 문제 문장을 절로 나눠 옮겨 쓴다: 대상 표 → FROM, 행 조건 → WHERE, '~별' → GROUP BY, 그룹 조건 → HAVING, 보여 줄 열 → SELECT, 정렬 → ORDER BY. 두 표의 정보를 함께 보려면 조인(FROM A JOIN B ON A.키 = B.키)이나 하위 질의(WHERE 열 IN (SELECT ...), WHERE 열 > (SELECT AVG(...) ...))를 쓴다. 데이터 변경은 INSERT INTO 표 VALUES (...), UPDATE 표 SET 열 = 값 WHERE ..., DELETE FROM 표 WHERE ..., 구조 변경은 ALTER TABLE 표 ADD 열 형식, 가상 표는 CREATE VIEW 이름 AS SELECT ...다. 집계 함수 COUNT(열)·SUM·AVG·MAX·MIN은 NULL을 빼고 계산하고, COUNT(*)는 NULL이 있는 행도 센다. 자주 하는 실수: 문자열에 작은따옴표 빼먹기, UPDATE·DELETE에서 WHERE 빼먹기, 집계 조건을 WHERE에 쓰기, GROUP BY에 없는 열을 SELECT에 쓰기.
비유로 이해하기
문제 문장은 주문서, SQL은 주방 지시서다. '전자 학과 학생 중(WHERE) 학년별로(GROUP BY) 두 명 이상인 곳만(HAVING) 평균 점수를(SELECT) 높은 순서로(ORDER BY)'처럼 주문서의 구절을 지시서 칸에 하나씩 옮겨 적으면 된다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 집계 함수 | 여러 행을 하나의 값으로 모으는 함수 (COUNT, SUM, AVG, MAX, MIN) |
| 조인 | 두 표를 공통 열로 이어 붙여 한 번에 조회하는 것 |
| 하위 질의 | SQL 안에 괄호로 넣은 또 다른 SELECT |
| 별칭 | 표나 열에 붙이는 짧은 이름 (STUDENT S 의 S) |
| 뷰 | SELECT 결과에 이름을 붙인 가상 표 |
이 실습의 표
STUDENT(SNO 학번, NAME, DEPT 학과, YEAR 학년, SCORE 점수): 김하늘(컴퓨터 3 88), 이바다(전자 2 72), 박산(컴퓨터 4 95), 최들(경영 1 65), 정숲(컴퓨터 2 NULL), 한별(전자 3 81)
COURSE(CNO, CNAME, CREDIT): C101 데이터베이스, C102 운영체제, C103 자료구조
ENROLL(SNO, CNO, GRADE): 누가 어떤 과목을 어떤 성적으로 들었는지
문장을 SQL로 옮기기
| 문제 문장 | SQL |
|---|---|
| 학과별 학생 수 | SELECT DEPT, COUNT(*) FROM STUDENT GROUP BY DEPT |
| 학생이 2명 이상인 학과만 | ... GROUP BY DEPT HAVING COUNT(*) >= 2 |
| 평균보다 점수가 높은 학생 | WHERE SCORE > (SELECT AVG(SCORE) FROM STUDENT) |
| C101을 수강한 학생 | WHERE SNO IN (SELECT SNO FROM ENROLL WHERE CNO = 'C101') |
| 학생 이름과 들은 과목명 | FROM STUDENT S JOIN ENROLL E ON S.SNO = E.SNO JOIN COURSE C ON E.CNO = C.CNO |
| 점수를 5점 올려라 | UPDATE STUDENT SET SCORE = SCORE + 5 WHERE ... |
| EMAIL 열을 추가하라 | ALTER TABLE STUDENT ADD EMAIL VARCHAR2(30) |
자주 하는 실수
- 문자열은
'전자'처럼 작은따옴표. 큰따옴표는 열 이름용이다 - UPDATE·DELETE에 WHERE가 없으면 모든 행이 바뀌거나 지워진다
- 집계 함수 조건(
COUNT(*) >= 2)을 WHERE에 쓰면 오류. HAVING에 쓴다 - GROUP BY로 묶었으면 SELECT에는 묶은 열과 집계 함수만 쓴다
- 표 구조를 바꾸는 것은 ALTER, 데이터를 바꾸는 것은 UPDATE
시험에 이렇게 나와요
- 문장을 FROM·WHERE·GROUP BY·HAVING·SELECT·ORDER BY로 옮기기
- 그룹 조건은 HAVING
- 하위 질의(IN, 비교)와 조인(ON)
- INSERT·UPDATE·DELETE, ALTER TABLE ADD, CREATE VIEW 문법
- 집계 함수는 NULL 제외, COUNT(*)는 모든 행
출제기준 기반
확인 문제
Q1. '학과별 평균 점수가 80점 이상인 학과'를 구할 때 평균 80점 이상 조건을 넣는 절은?
- HAVING
- SELECT
- WHERE
- ORDER BY
정답 보기
1번 HAVING
WHERE는 묶기 전 행 하나하나를 거르고, HAVING은 GROUP BY로 묶은 뒤 그룹을 걸러요. 평균은 묶어야 나오니 HAVING.
Q2. STUDENT 표에 학과별 최고 점수를 구하는 SQL로 알맞은 것은?
- SELECT MAX(SCORE) FROM STUDENT ORDER BY DEPT
- SELECT DEPT, MAX(SCORE) FROM STUDENT GROUP BY DEPT
- SELECT DEPT, MAX(SCORE) FROM STUDENT
- SELECT DEPT, SCORE FROM STUDENT GROUP BY MAX(SCORE)
정답 보기
2번 SELECT DEPT, MAX(SCORE) FROM STUDENT GROUP BY DEPT
'학과별'은 GROUP BY DEPT. 묶지 않고 DEPT와 집계 함수를 함께 쓰면 오류예요.
Q3. 점수가 NULL인 학생이 있을 때 COUNT(SCORE)와 COUNT(*)의 관계는?
- 항상 같다
- COUNT(*)가 NULL 행만큼 더 크다
- COUNT(SCORE)가 더 크다
- COUNT(SCORE)는 오류다
정답 보기
2번 COUNT(*)가 NULL 행만큼 더 크다
COUNT(열)은 NULL을 빼고, COUNT(*)는 모든 행을 세요.
Q4. 기존 표에 새 열을 추가하는 SQL은?
- ALTER TABLE … ADD
- UPDATE TABLE … ADD
- CREATE COLUMN …
- INSERT COLUMN …
정답 보기
1번 ALTER TABLE … ADD
구조 변경은 DDL인 ALTER TABLE.
헷갈리기 쉬운 O·X
집계 함수를 쓴 조건 COUNT(*) >= 2는 WHERE 절에 쓸 수 있다.
정답 보기
X 집계 조건은 HAVING에 써요.
AVG(SCORE)는 SCORE가 NULL인 행을 빼고 평균을 낸다.
정답 보기
O
문자열 값은 큰따옴표로 감싸도 된다.
정답 보기
X SQL에서 문자열은 작은따옴표예요. 큰따옴표는 열·표 이름에 써요.