22|SQL DML 명령어·SELECT·하위 질의·NoSQL

글 요약

사무자동화산업기사 – SQL DML 명령어의 SELECT·INSERT·UPDATE·DELETE 문법과 WHERE·LIKE·BETWEEN·집계 함수·GROUP BY·HAVING·ORDER BY·하위 질의, NoSQL을 정리합니다.

관계형 데이터베이스에서는 SQL을 사용하여 필요한 데이터를 검색하고 새로운 행을 삽입하며, 기존 값을 수정하거나 삭제합니다. 이러한 작업은 데이터베이스 구조를 만드는 DDL과 달리 테이블에 저장된 실제 데이터를 대상으로 수행됩니다.

이 장에서는 SQL DML 명령어인 SELECT·INSERT·UPDATE·DELETE의 기본 문법을 정리합니다. SELECT문의 WHERE·LIKE·BETWEEN, 집계 함수, GROUP BY·HAVING·ORDER BY와 하위 질의를 예제로 살펴보고, 마지막으로 관계형 데이터베이스와 구분되는 NoSQL의 기본 개념을 정리합니다.

이 장의 핵심 내용

  • DML은 테이블에 저장된 데이터의 검색·삽입·수정·삭제에 사용하는 언어입니다.
  • SELECT는 필요한 열과 행을 조회하며 ALL은 전체 결과, DISTINCT는 중복을 제거한 결과를 반환합니다.
  • WHERE는 개별 행을 제한하고 LIKE는 문자 패턴, BETWEEN은 양 끝값을 포함한 범위를 검사합니다.
  • COUNT·SUM·AVG·MAX·MIN은 여러 행을 하나의 결과로 요약하는 집계 함수입니다.
  • GROUP BY는 같은 값을 가진 행을 그룹화하고 HAVING은 만들어진 그룹을 조건으로 제한합니다.
  • ORDER BY는 조회 결과를 ASC 또는 DESC 순서로 정렬합니다.
  • 하위 질의는 안쪽 SELECT문의 결과를 바깥 질의의 조건이나 값으로 사용합니다.
  • INSERT는 행 추가, UPDATE는 값 변경, DELETE는 행 삭제에 사용합니다.
  • NoSQL은 관계형 테이블 이외의 다양한 데이터 모델을 사용하는 비관계형 데이터베이스 계열입니다.

DML은 어떤 SQL 명령을 포함하는가?

DML(Data Manipulation Language)은 데이터베이스에 저장된 데이터를 검색하고 삽입·수정·삭제하는 데 사용하는 데이터 조작어입니다. 사용자가 DBMS를 통해 실제 업무 데이터를 다루는 인터페이스 역할을 합니다.

명령기능대상대표 형태
SELECT데이터 검색열과 행SELECT … FROM … WHERE …
INSERT새로운 행 삽입튜플INSERT INTO … VALUES …
UPDATE기존 값 수정열의 값UPDATE … SET … WHERE …
DELETE기존 행 삭제튜플DELETE FROM … WHERE …
시험 교재에서는 SELECT·INSERT·UPDATE·DELETE를 DML의 대표 명령으로 정리합니다.

분류 주의: 일부 자료에서는 SELECT를 데이터 질의어인 DQL로 별도 구분합니다. 사무자동화산업기사 문제에서는 교재에 제시된 분류 기준을 우선 확인합니다.

SELECT문의 기본 구조와 작성 순서는?

SELECT문은 조회할 열, 데이터를 가져올 테이블, 행 조건, 그룹화 조건과 정렬 기준을 순서대로 작성합니다. 각 절은 필요하지 않으면 생략할 수 있지만 절의 작성 순서는 지켜야 합니다.

SELECT [ALL | DISTINCT] 열_이름, ...
FROM 테이블_이름
[WHERE 행_조건]
[GROUP BY 그룹_기준]
[HAVING 그룹_조건]
[ORDER BY 정렬_기준 [ASC | DESC]];
역할주요 내용
SELECT출력 열 결정조회할 열, 계산식, 별칭 지정
FROM데이터 원본 결정테이블, 뷰, 결합 결과 지정
WHERE개별 행 필터링비교·논리·범위·패턴 조건
GROUP BY행 그룹화같은 값을 가진 행을 하나의 그룹으로 묶음
HAVING그룹 필터링집계가 끝난 그룹에 조건 적용
ORDER BY결과 정렬ASC 오름차순, DESC 내림차순

ALL

조건을 만족하는 모든 결과 행을 반환합니다. SELECT에서 생략하면 일반적으로 ALL이 기본 동작입니다.

DISTINCT

SELECT 결과에서 지정한 열 조합이 완전히 같은 중복 행을 하나로 줄입니다.

논리적인 처리 흐름: 기본적인 SELECT 질의는 FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY 순서로 이해하면 WHERE와 HAVING의 차이를 구분하기 쉽습니다.

SELECT 예제에는 어떤 테이블을 사용할까?

이 글에서는 학생 기본 정보를 저장한 R1 테이블과 학생별 과목 성적을 저장한 R2 테이블을 사용하여 SELECT문의 각 기능을 확인합니다.

R1 학생 테이블

학번이름학년학과주소
1000홍길동1컴퓨터공학서울
2000김철수1전기공학경기
3000강남길2전자공학경기
4000오일자2컴퓨터공학경기
5000장미화3전자공학서울

R2 수강 성적 테이블

학번과목번호과목이름학점점수
1000C100컴퓨터 구조A91
2000C200데이터베이스A+99
3000C100컴퓨터 구조B+89
3000C200데이터베이스B85
4000C200데이터베이스A93
4000C300운영체제B+88
5000C300운영체제B82

두 테이블에서 원하는 결과는 어떻게 조회하는가?

R1과 R2는 학번을 공통 속성으로 가집니다. 전자공학과 학생 강남길이 수강한 과목번호와 과목이름을 구하려면 두 테이블을 학번으로 결합한 뒤 학과와 이름 조건을 적용합니다.

SELECT R2.과목번호, R2.과목이름
FROM R1
JOIN R2
  ON R1.학번 = R2.학번
WHERE R1.학과 = '전자공학'
  AND R1.이름 = '강남길';
과목번호과목이름
C100컴퓨터 구조
C200데이터베이스
강남길 학생의 R2 레코드에서 과목번호와 과목이름을 조회한 결과

결합 문법: FROM R1, R2 WHERE R1.학번 = R2.학번 형태도 내부 결합을 표현할 수 있지만, 결합 조건과 일반 검색 조건을 분리하는 명시적 JOIN 문법이 구조를 이해하기 쉽습니다.

WHERE절은 행을 어떻게 제한하는가?

WHERE절은 FROM에서 가져온 행 가운데 조건식의 결과가 참인 행만 다음 단계로 전달합니다. 비교 연산자와 논리 연산자를 조합하여 여러 조건을 표현할 수 있습니다.

구분연산자의미
비교=같음
비교<> 또는 !=같지 않음
비교>, <초과, 미만
비교>=, <=이상, 이하
논리AND모든 조건이 참
논리OR하나 이상의 조건이 참
논리NOT조건의 결과를 반대로 바꿈
SELECT 학번, 이름, 학과
FROM R1
WHERE 학과 = '전자공학'
  AND 주소 = '경기';
학번이름학과
3000강남길전자공학

NULL 비교: NULL은 값이 없거나 알려지지 않은 상태이므로 = NULL이나 <> NULL이 아니라 IS NULLIS NOT NULL을 사용합니다.

LIKE와 BETWEEN은 어떤 조건에 사용하는가?

LIKE는 문자 패턴을 검색한다

LIKE는 문자열이 지정한 패턴과 일치하는지 검사합니다. 퍼센트 기호(%)는 길이가 0개 이상인 임의의 문자열을, 밑줄(_)은 임의의 문자 한 개를 의미합니다.

패턴의미예시
‘홍%’홍으로 시작홍길동, 홍서준
‘%길%’중간에 길 포함홍길동, 길하나
‘_길동’첫 글자 1개 뒤에 길동홍길동
SELECT *
FROM R1
WHERE 이름 LIKE '홍%';
학번이름학년학과주소
1000홍길동1컴퓨터공학서울

BETWEEN은 양 끝값을 포함한 범위를 검사한다

BETWEEN A AND B는 값이 A 이상이고 B 이하인지 검사합니다. 숫자뿐 아니라 날짜와 정렬 가능한 문자열에도 사용할 수 있습니다.

SELECT 학번, 점수
FROM R2
WHERE 점수 BETWEEN 80 AND 85;
학번점수
300085
500082

동일한 조건: 점수 BETWEEN 80 AND 85점수 >= 80 AND 점수 <= 85와 같은 범위를 의미합니다.

집계 함수는 여러 행을 어떻게 하나의 값으로 요약하는가?

집계 함수는 여러 행의 값을 입력받아 개수·합계·평균·최댓값·최솟값과 같은 하나의 결과를 계산합니다. 전체 테이블에 사용할 수도 있고 GROUP BY로 만든 각 그룹에 적용할 수도 있습니다.

함수기능표현 예
COUNT행 또는 NULL이 아닌 값의 개수COUNT(*), COUNT(점수)
SUM수치값의 합계SUM(점수)
AVG수치값의 평균AVG(점수)
MAX최댓값MAX(점수)
MIN최솟값MIN(점수)
SELECT 과목번호,
       ROUND(AVG(점수), 1) AS 평균
FROM R2
GROUP BY 과목번호
ORDER BY 과목번호;
과목번호평균
C10090.0
C20092.3
C30085.0
R2 테이블의 과목번호별 점수 평균

COUNT와 NULL: COUNT(*)는 행 자체의 수를 계산하지만 COUNT(열)는 해당 열의 값이 NULL이 아닌 행만 계산합니다. AVG·SUM·MAX·MIN도 일반적으로 NULL 값을 계산에서 제외합니다.

GROUP BY와 HAVING은 어떻게 구분하는가?

GROUP BY는 지정한 열의 값이 같은 행을 하나의 그룹으로 묶습니다. HAVING은 GROUP BY와 집계 함수로 만들어진 그룹 가운데 조건을 만족하는 그룹만 남깁니다.

비교 항목WHEREHAVING
적용 대상그룹화 의 개별 행그룹화 의 그룹
처리 시점GROUP BY 이전GROUP BY 이후
집계 함수 조건일반적으로 직접 사용하지 않음COUNT·AVG·SUM 등의 결과에 사용
대표 질문점수가 90점 이상인 행은?90점 이상 학생이 2명 이상인 과목은?
SELECT 과목이름,
       COUNT(*) AS 학생수
FROM R2
WHERE 점수 >= 90
GROUP BY 과목이름
HAVING COUNT(*) >= 2;
과목이름학생수
데이터베이스2
WHERE로 90점 이상 행을 고른 뒤 HAVING으로 학생 수가 2명 이상인 그룹만 남긴 결과

작성 규칙: SELECT 목록에 집계 함수가 아닌 일반 열을 함께 출력한다면 그 열은 원칙적으로 GROUP BY의 그룹 기준에 포함해야 합니다.

ORDER BY는 결과를 어떻게 정렬하는가?

ORDER BY는 최종 조회 결과를 하나 이상의 기준으로 정렬합니다. ASC는 오름차순이고 DESC는 내림차순이며, 정렬 방향을 생략하면 일반적으로 ASC가 적용됩니다.

SELECT 학번, 과목번호, 점수
FROM R2
ORDER BY 점수 DESC, 학번 ASC;
정렬 기준의미
점수 DESC점수가 높은 행부터 정렬
학번 ASC점수가 같으면 학번이 작은 행부터 정렬

결과 순서: ORDER BY가 없는 SELECT 결과의 행 순서는 보장되지 않습니다. 특정 순서가 필요하면 정렬 기준을 명시해야 합니다.

하위 질의는 어떤 값을 바깥 질의에 전달하는가?

하위 질의(Subquery)는 하나의 SQL문 안에 포함된 또 다른 SELECT문입니다. 하위 질의는 안쪽 SELECT문의 결과를 바깥 질의의 비교값, 목록, 테이블 또는 열 값으로 사용합니다. 비상관 하위 질의는 논리적으로 안쪽 질의의 결과를 구한 뒤 바깥 질의에서 사용한다고 이해할 수 있습니다.

SELECT 이름
FROM R1
WHERE 학번 IN (
    SELECT 학번
    FROM R2
    WHERE 과목번호 = 'C100'
);
이름
홍길동
강남길
C100 과목을 수강한 학번 목록을 안쪽 질의에서 구한 뒤 R1에서 이름을 조회한 결과
하위 질의 결과주요 연산자사용 예
하나의 값=, >, <, >=, <=평균보다 점수가 높은 학생
여러 값의 목록IN, NOT IN특정 과목을 수강한 학생
존재 여부EXISTS, NOT EXISTS관련 행이 하나라도 존재하는 학생
테이블 형태FROM 안의 하위 질의집계한 결과를 다시 조회

다중 행 주의: 하위 질의가 여러 행을 반환할 수 있다면 단일 비교 연산자 = 대신 IN·ANY·ALL·EXISTS 등 결과 형태에 맞는 연산자를 사용해야 합니다.

INSERT문은 새로운 튜플을 어떻게 추가하는가?

INSERT는 테이블에 새로운 행을 추가합니다. 열 목록을 명시하면 VALUES의 각 값은 같은 위치의 열에 대응합니다.

INSERT INTO R2 (학번, 과목번호)
VALUES (6000, 'C100');
  • 열 목록과 VALUES의 값 개수와 순서는 서로 일치해야 합니다.
  • 문자열과 날짜 형식의 값은 일반적으로 작은따옴표로 감쌉니다.
  • 생략한 열은 DEFAULT가 있으면 기본값을 사용하고, 그렇지 않으면 NULL 허용 여부에 따라 삽입 성공 여부가 결정됩니다.
  • 기본키·외래키·NOT NULL·CHECK 등의 제약조건을 위반하면 삽입이 거부될 수 있습니다.

안전한 작성: 테이블의 모든 열에 값을 넣더라도 열 목록을 명시하면 열 순서가 바뀌었을 때 발생할 수 있는 오류를 줄일 수 있습니다.

UPDATE문은 기존 데이터를 어떻게 변경하는가?

UPDATE는 조건을 만족하는 기존 행의 열 값을 변경합니다. SET절에는 바꿀 열과 새로운 값을 지정하고 WHERE절에는 변경할 행의 조건을 작성합니다.

UPDATE R1
SET 학년 = 2
WHERE 이름 = '홍길동';
학번이름변경 전 학년변경 후 학년
1000홍길동12

WHERE 생략 주의: UPDATE문에서 WHERE절을 생략하면 테이블의 모든 행이 같은 방식으로 수정됩니다. 실행 전 조건과 예상 대상 행을 먼저 SELECT로 확인하는 습관이 안전합니다.

DELETE문은 행을 어떻게 삭제하는가?

DELETE는 조건을 만족하는 행을 테이블에서 삭제합니다. 테이블 구조와 열 정의는 유지되며, WHERE절을 생략하면 테이블에 있는 모든 행이 삭제 대상이 됩니다.

DELETE FROM R1
WHERE 이름 = '장미화';
명령삭제 대상테이블 구조WHERE 사용
DELETE조건에 맞는 행유지사용 가능
DROP TABLE테이블 객체 전체삭제사용하지 않음

DELETE와 DROP: DELETE는 DML로 행을 삭제하고, DROP TABLE은 DDL로 테이블 구조 자체를 삭제합니다. 두 명령의 목적을 혼동하지 않아야 합니다.

NoSQL은 관계형 데이터베이스와 어떻게 다른가?

NoSQL은 흔히 ‘Not Only SQL’로 풀이되며, 고정된 행과 열 중심의 관계형 테이블 이외에 문서·키-값·와이드 컬럼·그래프와 같은 다양한 데이터 모델을 사용하는 비관계형 데이터베이스 계열을 의미합니다.

유형저장 방식대표 활용
문서형JSON과 유사한 문서콘텐츠, 상품 정보, 사용자 프로필
키-값형키와 값의 쌍세션, 캐시, 빠른 조회
와이드 컬럼형행마다 유연한 열 집합대규모 로그와 분산 데이터
그래프형노드와 관계소셜 관계, 추천, 경로 탐색
비교 항목관계형 데이터베이스NoSQL
기본 구조테이블·행·열문서·키-값·그래프 등
스키마사전에 정의된 구조 중심유연한 구조를 지원하는 경우가 많음
관계 표현키와 JOIN 사용데이터 모델별 방식 사용
대표 강점정형 데이터, 무결성, 표준 SQL유연한 모델, 수평 확장, 대규모 분산 처리

오해 주의: NoSQL은 SQL을 절대 사용하지 않는다는 뜻이 아니며, 모든 NoSQL 제품이 같은 구조와 일관성 모델을 제공하는 것도 아닙니다. 데이터 특성과 업무 요구에 따라 관계형 DBMS와 함께 사용할 수 있습니다.

시험에서 자주 혼동되는 개념

WHERE와 HAVING

WHERE는 그룹화 전의 개별 행을 제한하고, HAVING은 GROUP BY 이후에 만들어진 그룹을 제한합니다.

ALL과 DISTINCT

ALL은 조건에 맞는 모든 행을 반환하며 기본값입니다. DISTINCT는 SELECT 결과의 중복 행을 제거합니다.

GROUP BY와 ORDER BY

GROUP BY는 집계를 위해 행을 묶고, ORDER BY는 이미 만들어진 최종 결과의 표시 순서를 정합니다.

INSERT와 UPDATE

INSERT는 새로운 행을 만들고, UPDATE는 이미 존재하는 행의 값을 변경합니다.

DELETE와 DROP

DELETE는 테이블의 행을 삭제하지만 구조는 유지합니다. DROP TABLE은 테이블 객체와 구조를 삭제합니다.

SQL과 NoSQL

SQL은 관계형 데이터베이스의 표준 질의 언어이며, NoSQL은 여러 비관계형 데이터 모델을 포괄하는 용어입니다.

SELECT는 검색, INSERT는 삽입, UPDATE는 수정, DELETE는 행 삭제입니다. WHERE는 행 조건, HAVING은 그룹 조건이라는 기준으로 구분합니다.

이번 장 핵심 요약

  1. DML은 데이터의 검색·삽입·수정·삭제에 사용하는 데이터 조작어입니다.
  2. SELECT는 조회할 열과 데이터를 가져올 테이블을 지정합니다.
  3. ALL은 전체 결과를 반환하고 DISTINCT는 중복 결과를 제거합니다.
  4. WHERE는 개별 행을 조건으로 제한합니다.
  5. LIKE의 %는 임의 길이 문자열, _는 한 문자를 의미합니다.
  6. BETWEEN A AND B는 A 이상 B 이하의 범위를 의미합니다.
  7. COUNT·SUM·AVG·MAX·MIN은 대표적인 집계 함수입니다.
  8. GROUP BY는 같은 값을 가진 행을 묶고 HAVING은 그룹에 조건을 적용합니다.
  9. ORDER BY의 ASC는 오름차순, DESC는 내림차순입니다.
  10. 하위 질의는 안쪽 SELECT문의 결과를 바깥 질의에서 사용합니다.
  11. INSERT는 행 추가, UPDATE는 값 변경, DELETE는 행 삭제에 사용합니다.
  12. UPDATE와 DELETE에서 WHERE를 생략하면 모든 행이 대상이 될 수 있습니다.
  13. NoSQL은 문서·키-값·와이드 컬럼·그래프 등의 비관계형 데이터 모델을 포함합니다.

복습 문제

테이블에 저장된 데이터를 검색·삽입·수정·삭제하는 언어는?

DML입니다.

SELECT 결과에서 중복 행을 제거하는 키워드는?

DISTINCT입니다.

개별 행을 그룹화 전에 제한하는 절은?

WHERE절입니다.

그룹화된 결과에 집계 조건을 적용하는 절은?

HAVING절입니다.

LIKE에서 임의 길이의 문자열을 나타내는 기호는?

퍼센트 기호(%)입니다.

BETWEEN 80 AND 85에 80과 85가 포함되는가?

포함됩니다. BETWEEN은 양 끝값을 포함합니다.

전체 행 수를 계산하는 집계 함수 표현은?

COUNT(*)입니다.

조회 결과를 점수 기준 내림차순으로 정렬하는 구문은?

ORDER BY 점수 DESC입니다.

다른 SELECT문 안에 포함된 SELECT문은?

하위 질의 또는 서브쿼리입니다.

새로운 튜플을 삽입하는 명령은?

INSERT입니다.

기존 행의 열 값을 변경하는 명령은?

UPDATE입니다.

조건에 맞는 행을 삭제하지만 테이블 구조는 유지하는 명령은?

DELETE입니다.

문서형·키-값형·와이드 컬럼형·그래프형 데이터베이스를 포괄하는 용어는?

NoSQL입니다.

참고자료

이 글은 사무자동화산업기사 시험 범위에 포함된 DML과 SELECT문, LIKE·BETWEEN, 집계 함수, GROUP BY·HAVING·ORDER BY, 하위 질의, INSERT·UPDATE·DELETE와 NoSQL을 이해하고 복습할 수 있도록 재구성한 정리입니다. SQL 명령의 세부 문법과 함수, 문자열 비교 방식, NoSQL의 기능은 DBMS와 제품에 따라 차이가 있으므로 실제 시험에서는 문제에 제시된 조건과 최신 Q-Net 출제기준을 함께 확인해야 합니다.


같은 주제의 다른 글

이 글과 같은 카테고리에 있는 이전 글과 다음 글을 확인해보세요.