본문 바로가기
Tutorial/Database

SQL 기본 문법: SELECT, INSERT, UPDATE, DELETE

by CLJ 2025. 3. 29.

데이터베이스와 상호작용하기 위해 SQL을 배우는 것은 데이터 관리의 기초를 다지기 위한 필수적인 첫 걸음이다. 이 글에서는 SQL 초보자들이 반드시 알아야 할 기본적인 SQL 쿼리문들을 다룬다. 기본적인 SELECT 쿼리부터 데이터를 삽입, 수정, 삭제하는 방법까지, SQL의 핵심 개념과 기초 문법을 실습을 통해 익힐 수 있도록 돕는다. 또한, 데이터 분석 및 관리에 있어 SQL이 왜 중요한지를 이해하고, 실제로 SQL을 어떻게 활용할 수 있는지 배울 수 있다. SQL을 처음 접하는 사람이라면 이 글을 통해 SQL의 기초부터 차근차근 배워가며, 실무에서 바로 활용할 수 있는 능력을 기를 수 있을 것이다.
 

목차

 

1. 기본 SQL 문법

 
SQL의 기본은 데이터를 조회하는 SELECT 쿼리문에서 시작된다. 이 쿼리문은 데이터베이스에서 원하는 데이터를 선택하는 가장 기본적인 방법으로, SQL을 배우는 데 있어서 첫 번째로 익혀야 하는 쿼리이다. SELECT 문을 사용하면 데이터베이스의 테이블에 저장된 데이터를 조회할 수 있다.
 

1. SELECT: 데이터 조회

 
SELECT 문은 데이터베이스에서 데이터를 조회하는 데 사용되는 기본적인 명령어이다. SELECT 문을 사용하여 데이터베이스에서 원하는 데이터를 선택할 수 있다. SQL을 배우는 사람이라면 가장 먼저 익혀야 하는 명령어로, 데이터를 조회하는 데 필수적으로 사용된다.

SELECT * FROM users;

 
이 쿼리문은 users 테이블에 저장된 모든 데이터를 조회하는 쿼리문이다. *은 "모든 열"을 의미하며, 데이터를 조회할 때 주로 사용된다.
 
SELECT 문을 사용하면, 특정 열만 선택하여 조회할 수도 있다. 예를 들어, users 테이블에서 이름이메일만 조회하고 싶다면, 아래와 같이 쿼리문을 작성할 수 있다.

SELECT name, email FROM users;

 
이렇게 SELECT문에 특정 열을 지정하면 불필요한 데이터의 조회를 피하고, 필요한 정보만 정확하게 조회할 수 있다.

 

2. WHERE: 조건 지정

 
WHERE 절은 데이터를 조회할 때 조건을 추가하여, 특정 조건에 맞는 데이터만 선택하는 데 사용된다. 예를 들어, age가 30 이상인 사용자만 조회하려면 아래와 같은 쿼리문을 작성한다.

SELECT name, email FROM users WHERE age >= 30;

 
이 쿼리문은 users 테이블에서 age가 30 이상인 사용자들의 name과 email만 조회한다. WHERE 절을 사용하면 데이터를 필터링할 수 있어, 원하는 데이터만 쉽게 찾을 수 있다.
 

여러 조건 결합하기

WHERE 절에서는 여러 조건을 결합할 수 있다. AND와 OR을 사용하여 여러 조건을 동시에 적용할 수 있다.

SELECT name, email FROM users WHERE age >= 30 AND city = 'Seoul';

 
이 쿼리문은 age가 30 이상이고, city가 'Seoul'인 사용자들의 이름과 이메일을 조회한다. AND를 사용하면 두 조건을 모두 만족하는 데이터를 조회할 수 있다. 반대로, OR을 사용하면 조건 중 하나라도 만족하는 데이터를 선택할 수 있다.


AND와 OR의 차이

AND와 OR의 차이를 이해하는 것은 중요하다. AND는 모든 조건을 만족하는 데이터만을 필터링하고, OR은 조건 중 하나라도 만족하는 데이터가 조회된다.
 

3. ORDER BY: 데이터 정렬

 

ORDER BY 절은 데이터를 조회한 후 정렬하는 데 사용된다. ORDER BY를 사용하여 데이터를 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있다. 기본적으로 ORDER BY는 오름차순으로 정렬되며, 내림차순으로 정렬하려면 DESC를 사용해야 한다.

SELECT name, email FROM users ORDER BY age DESC;

 
이 쿼리문은 users 테이블에서 age를 기준으로 내림차순(DESC)으로 정렬된 name과 email을 조회한다. ORDER BY 절은 데이터를 정렬하는 데 매우 유용하다.
 

여러 조건으로 정렬하기
ORDER BY는 여러 조건을 동시에 적용할 수 있다. 예를 들어, 먼저 나이로 정렬하고, 그다음 이름으로 정렬하려면 다음과 같이 작성할 수 있다.

SELECT name, email FROM users ORDER BY age DESC, name ASC;

 
이 쿼리문은 age를 기준으로 내림차순으로 정렬한 후, 동일한 나이대의 사용자들에 대해서는 name을 오름차순(ASC)으로 정렬한다.
 

4. LIMIT: 조회 개수 제한

 
LIMIT 절은 조회된 데이터의 개수를 제한할 때 사용된다. LIMIT을 사용하면 쿼리 결과에서 반환되는 행의 수를 제한할 수 있다.

SELECT name, email FROM users LIMIT 5;

 
이 쿼리문은 users 테이블에서 상위 5명의 사용자만 조회한다. LIMIT을 사용하면 데이터가 많은 테이블에서 일부만 빠르게 조회할 수 있어 성능을 높이는 데 유용하다.

 

OFFSET과 함께 사용하기
LIMIT은 OFFSET과 함께 사용하여 결과의 시작 지점을 지정할 수 있다. 예를 들어, 두 번째 페이지의 데이터를 조회하려면 LIMIT과 OFFSET을 조합하여 사용할 수 있다.

SELECT name, email FROM users LIMIT 5 OFFSET 5;

 
이 쿼리문은 users 테이블에서 6번째부터 10번째까지의 사용자 정보를 조회한다. OFFSET은 처음 5개의 데이터를 건너뛰고, LIMIT 5는 그 이후의 5개 데이터를 반환한다. OFFSET은 건너뛸 데이터의 개수를 지정하고, LIMIT은 반환할 데이터의 개수를 설정한다.
 
기본적인 SQL 문법과 쿼리문을 익히는 것은 데이터베이스 작업을 하는 데 있어 매우 중요한 첫 걸음이다. SELECT 문을 시작으로 데이터 필터링, 정렬, 조회 제한을 다루는 방법까지 배웠다. 이제 데이터 조작을 알아본다. 
 

2. 데이터 조작

 
SQL을 배우는 데 있어 데이터를 조회하는 것 외에도, 데이터를 삽입, 수정, 삭제하는 작업은 매우 중요한 부분이다. SQL을 사용하여 데이터를 조작하는 기본적인 방법을 익히면 데이터베이스에서 데이터를 더 효율적으로 관리하고 제어할 수 있다. 이 섹션에서는 SQL에서 자주 사용되는 데이터 조작 쿼리문인 INSERT INTO, UPDATE, DELETE에 대해 다룬다.
 

 

1. INSERT INTO

 

INSERT INTO 쿼리문은 테이블에 새로운 데이터를 추가할 때 사용된다. 데이터를 삽입할 때는 열 이름삽입할 데이터를 명시해야 한다. INSERT INTO를 사용할 때는 반드시 삽입할 데이터의 순서열 이름 순서가 일치해야 한다.

INSERT INTO users (name, email, age)
VALUES ('John Doe', 'john.doe@example.com', 28);

 
이 쿼리문은 users 테이블에 name, email, age를 삽입한다. VALUES 절 뒤에 삽입할 데이터를 나열하며, 각 값은 열 이름 순서에 맞게 입력해야 한다.
 

여러 데이터 삽입하기

여러 명의 사용자 데이터를 한 번에 삽입하려면, 여러 VALUES를 쉼표로 구분하여 작성할 수 있다. 예를 들어, 두 명의 사용자를 한 번에 추가하려면 다음과 같은 쿼리문을 사용할 수 있다.

INSERT INTO users (name, email, age) 
VALUES 
('Alice Smith', 'alice.smith@example.com', 35),
('Bob Johnson', 'bob.johnson@example.com', 40);

 
이 쿼리문은 users 테이블에 두 명의 사용자 데이터를 한 번에 삽입한다. VALUES 뒤에 여러 데이터 항목을 콤마로 구분하여 나열하면 된다.
 

2. UPDATE

 

UPDATE 쿼리문은 테이블에서 이미 존재하는 데이터를 수정하는 데 사용된다. 데이터를 수정할 때는 SET 절을 사용하여 수정할 열을 지정하고, WHERE 절을 사용하여 어떤 데이터를 수정할 것인지 조건을 지정해야 한다.

UPDATE users
SET email = 'new.email@example.com'
WHERE name = 'John Doe';

 
이 쿼리문은 users 테이블에서 name이 'John Doe'인 사용자의 email을 'new.email@example.com'으로 수정한다. UPDATE 문에서 중요한 점은 WHERE 절을 명확하게 사용하여 수정할 데이터를 특정하는 것이다. 만약 WHERE 절을 생략하면 모든 데이터가 수정될 수 있다.


여러 열을 동시에 수정하기

한 번에 여러 열을 수정하고자 할 때는 SET 절에 여러 열을 쉼표로 구분하여 나열할 수 있다. 예를 들어, users 테이블에서 John Doe의 이메일나이를 동시에 수정하려면 다음과 같이 작성할 수 있다.

UPDATE users
SET email = 'john.doe123@example.com', age = 29
WHERE name = 'John Doe';

이 쿼리문은 name이 'John Doe'인 사용자의 이메일나이를 동시에 수정한다.
 

3. DELETE

 

DELETE 쿼리문은 테이블에서 데이터를 삭제할 때 사용된다. 데이터를 삭제할 때는 반드시 삭제할 데이터에 대한 조건을 명확히 지정해야 한다. 조건을 지정하지 않으면 모든 데이터가 삭제될 수 있다.

DELETE FROM users WHERE age < 30;

이 쿼리문은 users 테이블에서 age가 30 미만인 사용자들을 삭제한다. WHERE 절을 사용하여 삭제할 데이터를 정확하게 지정해야 한다. 만약 WHERE 절을 생략하면 모든 행이 삭제되므로 주의해야 한다.
 

모든 데이터 삭제

DELETE 문을 사용할 때, 조건을 생략하면 테이블에 있는 모든 데이터가 삭제된다. 예를 들어, users 테이블의 모든 데이터를 삭제하고 싶다면 아래와 같이 작성할 수 있다.

DELETE FROM users;

 
이 쿼리문은 users 테이블에 있는 모든 데이터를 삭제한다. 이 작업은 되돌릴 수 없으므로 항상 주의해서 사용해야 한다.

 

데이터 조작 실습

 
이제 SQL에서 배운 기본적인 데이터 조작을 직접 실습해보자. 자신의 데이터베이스 환경에서 INSERT INTO, UPDATE, DELETE 쿼리문을 실행하면서 실력을 쌓을 수 있다.
 

실습 예제 1: 사용자 추가하기

users 테이블에 새 사용자를 추가하는 쿼리문을 실행해보자.

INSERT INTO users (name, email, age)
VALUES ('Charlie Brown', 'charlie.brown@example.com', 32);


실습 예제 2: 사용자 정보 수정하기

name이 'Charlie Brown'인 사용자의 나이를 수정하는 쿼리문을 실행해보자.

UPDATE users
SET age = 33
WHERE name = 'Charlie Brown';


실습 예제 3: 사용자 삭제하기

age가 30 미만인 사용자를 삭제하는 쿼리문을 실행해보자.

DELETE FROM users WHERE age < 30;

 
INSERT INTO, UPDATE, DELETE와 같은 SQL 명령어를 실습을 통해 익히면, 데이터베이스 관리에 필요한 핵심 기술을 습득할 수 있다. SQL을 잘 활용하면 효율적이고 정확한 데이터 관리가 가능해지며, 실제 업무에서 SQL을 효과적으로 사용할 수 있다.
 

3. 집계 함수

 
SQL에서는 집계 함수를 사용하여 데이터를 집계하거나 요약할 수 있다. 집계 함수는 주로 여러 행에 대한 값을 계산하여 하나의 결과를 반환하는데 유용하며, 데이터 분석에서 매우 중요한 역할을 한다. 이 섹션에서는 COUNT(), AVG(), SUM(), MAX(), MIN()과 같은 기본적인 집계 함수들을 다룬다.
 

1. COUNT()

 

COUNT() 함수는 특정 컬럼이나 조건에 맞는 데이터의 개수를 구할 때 사용된다. 예를 들어, users 테이블에서 전체 사용자 수를 구하려면 다음과 같이 사용할 수 있다.

SELECT COUNT(*) FROM users;

 
이 쿼리문은 users 테이블에 있는 모든 행의 개수를 반환한다. *는 "모든 열"을 의미하며, 행의 개수를 계산할 때 사용된다.
COUNT() 함수는 특정 컬럼에 대해 NULL이 아닌 값의 개수를 셀 수도 있다. 예를 들어, email 컬럼에서 NULL이 아닌 데이터의 개수를 구하고 싶다면 다음과 같이 작성할 수 있다.

SELECT COUNT(email) FROM users;

 
이 쿼리문은 users 테이블에서 email 값이 NULL이 아닌 행의 개수를 반환한다.
 

2. AVG(), SUM()

 

AVG() 함수는 특정 컬럼의 평균값을 계산하는 데 사용된다. 예를 들어, users 테이블에서 모든 사용자의 나이 평균을 구하려면 다음과 같이 사용할 수 있다.

SELECT AVG(age) FROM users;

 
이 쿼리문은 users 테이블에서 나이(age) 컬럼의 평균값을 계산하여 반환한다.
반대로, SUM() 함수는 특정 컬럼의 합계를 구하는 데 사용된다. 예를 들어, orders 테이블에서 전체 주문 금액의 합을 구하려면 다음과 같은 쿼리문을 작성할 수 있다.
 

SELECT SUM(amount) FROM orders;

 
이 쿼리문은 orders 테이블에서 주문 금액(amount) 의 합계를 계산하여 반환한다.
 

3. MAX(), MIN()

 

MAX() 함수는 특정 컬럼에서 최댓값을 구할 때 사용된다. 예를 들어, products 테이블에서 가장 비싼 제품의 가격을 구하려면 아래와 같은 쿼리문을 작성할 수 있다.

SELECT MAX(price) FROM products;

 
이 쿼리문은 products 테이블에서 가격(price) 컬럼의 최댓값을 계산하여 반환한다. 반대로, MIN() 함수는 특정 컬럼에서 최솟값을 구할 때 사용된다. 예를 들어, employees 테이블에서 가장 적은 연봉을 받는 직원을 구하려면 아래와 같은 쿼리문을 작성할 수 있다.
 

SELECT MIN(salary) FROM employees;

 
이 쿼리문은 employees 테이블에서 연봉(salary) 컬럼의 최솟값을 반환한다.
 

4. GROUP BY

 

GROUP BY 절은 집계 함수와 함께 사용되어, 특정 컬럼을 기준으로 데이터를 그룹화하여 집계 작업을 수행할 수 있도록 한다. 예를 들어, sales 테이블에서 각 제품별 총 판매 금액을 계산하려면 다음과 같은 쿼리문을 작성할 수 있다.

SELECT product_id, SUM(amount)
FROM sales
GROUP BY product_id;

 
이 쿼리문은 sales 테이블에서 product_id를 기준으로 판매 금액(amount)의 합을 계산하고, 각 제품별로 그룹화된 결과를 반환한다. GROUP BY 절은 데이터를 그룹화할 때 유용하며, 그룹화된 데이터에 대해 집계 함수가 작동하도록 한다.
 

5. HAVING

 

HAVING 절은 GROUP BY로 그룹화된 데이터에 조건을 추가할 때 사용된다. WHERE 절은 개별 행에 대해 조건을 지정하지만, HAVING은 그룹화된 데이터에 조건을 적용하는 데 사용된다. 예를 들어, 각 부서별 평균 연봉이 50,000 이상인 부서만 조회하려면 다음과 같은 쿼리문을 사용할 수 있다.

SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) >= 50000;

 
이 쿼리문은 employees 테이블에서 각 부서별로 평균 연봉을 계산하고, 그 평균 연봉이 50,000 이상인 부서만 결과로 반환한다.


간단한 집계 함수 실습

 

이제 배운 집계 함수들을 실습을 통해 직접 실행해보자. SQL을 배우고 실습할 때 중요한 점은 직접 데이터를 다루어보면서 함수의 동작 방식과 결과를 이해하는 것이다.
 

실습 예제 1: 전체 사용자 수 구하기

SELECT COUNT(*) FROM users;

 
실습 예제 2: 평균 나이 구하기

SELECT AVG(age) FROM users;

 
실습 예제 3: 각 부서별 평균 연봉 구하기

SELECT department, AVG(salary)
FROM employees
GROUP BY department;

 
실습 예제 4: 가장 비싼 제품의 가격 구하기

SELECT MAX(price) FROM products;

 
집계 함수는 SQL에서 매우 중요한 역할을 하며, 데이터를 분석하고 요약하는 데 필수적인 도구다. COUNT(), AVG(), SUM(), MAX(), MIN() 등의 함수는 다양한 데이터 분석 작업에서 유용하게 사용된다. 이번 섹션에서 배운 집계 함수들을 실습하고 활용하면서, 데이터를 더 효과적으로 분석할 수 있는 능력을 키워가자.

 

4. 기본 실습

 

SQL을 배우는 데 있어 가장 중요한 부분 중 하나는 실습이다. 이론으로 배운 SQL 쿼리문을 실제로 실행해보고, 그 결과를 확인하면서 SQL에 대한 이해도를 높일 수 있다. 이 섹션에서는 기본 SQL 쿼리문을 실습하는 예제를 제공하고, 실제 데이터베이스에서 데이터를 조회, 수정, 삽입, 삭제하는 방법을 연습할 수 있도록 돕는다.
 

1. 실습 환경 준비

 

먼저 SQL을 실습하기 위한 실습 환경을 준비해야 한다. MySQL, PostgreSQL, SQLite 등 다양한 SQL 데이터베이스를 사용할 수 있으며, phpMyAdmin과 같은 도구를 사용하면 웹 인터페이스를 통해 쉽게 데이터베이스를 관리할 수 있다.
 

실습 환경 준비 방법:

  • SQLite: 간단한 파일 기반 데이터베이스로, 설치가 간편하고 학습용으로 적합하다.
  • MySQL / PostgreSQL: 상대적으로 복잡하지만, 실제 프로젝트에서 많이 사용되는 데이터베이스 관리 시스템이다. 각각 설치 후 커맨드라인 또는 GUI 도구를 통해 관리할 수 있다.
  • DB Browser for SQLite: SQLite를 보다 편리하게 사용할 수 있는 무료 GUI 도구이다.

 
2024.04.13 - [Database] - MySQL 다운로드 및 설치하고 실행하기

 

MySQL 다운로드 및 설치하고 실행하기

웹개발에서 데이터베이스의 관리시스템 중의 하나인 MySQL 무료버전을 다운로드하고 설치해 보겠습니다. MySQL Community Downloads 교육용이나 개인용으로 무료로 사용할 수 있는 MySQL community버전을

it-learner.tistory.com

 

2. 응용실습

 

실습 예제 1: 부서별 평균 연봉과 평균 나이 구하기

각 부서별로 평균 연봉과 평균 나이를 구하는 쿼리문을 작성하라. 부서별로 데이터를 그룹화하고, 각 부서의 평균 연봉과 평균 나이를 계산한다.
 
예시 테이블 구조 (employees):

id name department salary age
1 John Doe HR 45000 29
2 Jane Smith IT 55000 34
3 Bob Johnson HR 42000 27
4 Alice Brown IT 60000 40
5 Charlie Lee Marketing 50000 33

 
SQL 쿼리:

SELECT department, AVG(salary) AS avg_salary, AVG(age) AS avg_age
FROM employees
GROUP BY department;

 
실행 결과 예시:

department avg_salary avg_age
HR 43500 28
IT 57500 37
Marketing 50000 33

 

  • AVG(salary): 각 부서에서 연봉의 평균을 계산한다.
  • AVG(age): 각 부서에서 나이의 평균을 계산한다.
  • GROUP BY department: 각 부서별로 데이터를 그룹화하여 연봉과 나이의 평균을 계산한다.

이 쿼리문은 각 부서별로 연봉과 나이의 평균을 계산한 결과를 반환한다. `AVG()` 함수와 `GROUP BY` 절을 함께 사용하여 그룹화된 데이터를 집계할 수 있다. 


실습 예제 2: 판매 금액이 5000 이상인 제품의 판매 건수와 총 판매 금액 조회

판매 금액이 5000 이상인 제품에 대해 판매 건수와 총 판매 금액을 구하는 쿼리문을 작성하라.
 
예시 테이블 구조 (sales):

product_id amount
1 1000
1 4000
2 6000
2 3000
3 7000

 
SQL 쿼리:

SELECT product_id, COUNT(*) AS sales_count, SUM(amount) AS total_sales
FROM sales
WHERE amount >= 5000
GROUP BY product_id;

 
실행 결과 예시:

product_id sales_count total_sales
2 1 6000
3 1 7000

 

  • COUNT(*): 각 `product_id`별로 판매 건수를 계산한다.
  • SUM(amount): 각 `product_id`별로 판매 금액의 합을 구한다.
  • WHERE amount >= 5000: 판매 금액이 5000 이상인 데이터만 필터링한다.
  • GROUP BY product_id: 각 제품별로 데이터를 그룹화하여 계산한다.

이 쿼리문은 판매 금액이 5000 이상인 제품에 대해 판매 건수와 총 판매 금액을 계산한 결과를 반환한다. `WHERE` 절을 사용하여 조건을 추가하고, `COUNT()`와 `SUM()` 함수를 활용해 데이터를 집계한다. 
 

 

이제까지 기초적인 SELECT 문법, GROUP BY, 집계 함수, 조건 필터링 등을 알아보았다. 이는 실제 데이터 분석이나 비즈니스 로직 구현에 바로 활용될 수 있으며, 다음 단계인 고급 SQL 학습으로 이어지는 데에도 든든한 기초가 된다.