매일 업데이트
2023-07-17 04:31 8 min

SQL UPDATE 명령 디코딩

데이터베이스 테이블 레코드 업데이트: SQL UPDATE 명령

관계형 데이터베이스를 다루는 개발자라면 SQL(구조적 질의어)에 익숙해야 합니다. SQL은 배우기 쉽고 구문이 간단하여 초보자도 쉽게 사용할 수 있는 언어입니다. SQL을 통해 데이터베이스 객체를 생성하고 관계형 데이터베이스 테이블을 조작할 수 있습니다.

SQL 쿼리를 사용하여 데이터베이스 테이블에서 레코드를 생성, 조회, 수정 및 삭제할 수 있습니다. 이러한 작업을 흔히 CRUD 작업이라고 합니다.

데이터베이스 테이블에 저장된 레코드를 변경하려면 SQL에서 UPDATE 명령어를 사용할 수 있습니다.

이 가이드에서는 다음 내용을 다룹니다:

  • UPDATE 명령어의 구조
  • 논리 연산자를 사용하여 여러 조건을 결합하거나 특정 기준에 따라 레코드를 업데이트하는 방법
  • SQL UPDATE 명령어를 사용할 때 주의해야 할 일반적인 사항

SQL UPDATE 명령어의 구문

SQL UPDATE 명령어의 기본 구조는 다음과 같습니다.

UPDATE table_name
SET column = new_value
WHERE condition;

위 쿼리는 지정된 조건이 참인 모든 레코드의 열 값을 변경합니다.

여러 열을 한 번에 수정하려면 다음과 같이 사용합니다.

UPDATE table_name
SET column_1 = new_value_1, column_2 = new_value_2, ..., column_k = new_value_k
WHERE condition;

관계형 데이터베이스에서 다음 사항을 기억해야 합니다.

  • 테이블은 엔티티를 표현합니다.
  • 테이블의 각 행은 레코드이며, 엔티티의 특정 인스턴스를 나타냅니다.
  • 열은 필드 또는 속성이라고도 하며, 본 문서에서는 열과 필드를 같은 의미로 사용합니다.

SQL UPDATE 명령어 활용 예시

이제 몇 가지 실제 예시를 통해 SQL UPDATE 명령어를 사용해 보겠습니다.

사전 준비

실습을 시작하기 전에 다음과 같은 사항을 확인하세요.

  • 본 튜토리얼에서는 SQLite를 사용합니다. SQLite 데이터베이스 브라우저 (권장)와 함께 사용합니다. MySQL 또는 PostgreSQL과 같은 다른 데이터베이스 시스템도 사용할 수 있습니다.
  • 예제 코드를 실행하려면 Python과 Faker Python 패키지가 필요합니다.

레코드가 포함된 데이터베이스 테이블 생성

본 튜토리얼을 따라 하려면 다음 코드를 실행하여 'customer_db.db'라는 고객 데이터베이스를 만들고 연결할 수 있습니다. Faker 라이브러리를 사용하여 고객 테이블에 삽입할 임의의 데이터를 생성합니다.

import sqlite3
from faker import Faker
import random

# 데이터베이스 연결
conn = sqlite3.connect('customer_db.db')
cur = conn.cursor()

# 테이블 생성
cur.execute('''CREATE TABLE customers (
                  customerID INTEGER PRIMARY KEY,
                  name TEXT,
                  city TEXT,
                  email TEXT,
                  num_orders INTEGER,
                  discount INTEGER DEFAULT 2)''')

# Faker 객체 생성
fake = Faker()
Faker.seed(42)

for _ in range(15):
    name = fake.name()
    city = fake.city()
    domain = fake.domain_name()
    email = f"{name[:2]}.{city[:2]}@{domain}"
    num_orders = random.choice(range(200))
    cur.execute('INSERT INTO customers (name, city, email, num_orders) VALUES (?,?,?,?)', (name, city, email, num_orders))

# 변경 사항 저장 및 연결 종료
conn.commit()
cur.close()
conn.close()

이 코드가 정상적으로 실행되려면 Python 3.7 이상 버전이 설치되어 있어야 하며, 개발 환경에 Faker 패키지가 설치되어 있어야 합니다. pip를 사용하여 설치할 수 있습니다.

pip install faker

이미 연결 및 쿼리가 가능한 데이터베이스 테이블이 있다면, 그대로 사용해도 좋습니다.

첫 SQL 쿼리 실행

고객 테이블에는 다음과 같은 필드가 있습니다.

  • customerID: 각 레코드를 고유하게 식별하는 기본 키
  • name: 고객 이름
  • city: 고객이 거주하는 도시
  • email: 고객 이메일 주소
  • num_orders: 고객의 총 주문 수
  • discount: 고객에게 적용되는 할인율 (기본값은 2)

SQLite 명령줄 클라이언트를 사용하거나 SQLite 데이터베이스 브라우저를 사용하여 쿼리를 실행하고 결과를 확인할 수 있습니다. 여기서는 이해하기 쉽도록 SQLite DB Browser의 출력 결과를 보여드리겠습니다.

다음 쿼리를 실행하여 고객 테이블의 모든 레코드를 가져옵니다.

SELECT * FROM customers;

실제로는 특별한 경우가 아니면 'SELECT *'를 사용하는 것은 권장하지 않습니다. 하지만 이 예시에서는 레코드 수가 적고 필드가 많지 않으므로 사용했습니다.

단일 조건에 따른 레코드 업데이트

이제 테이블 구조를 확인했으니, 필요한 조건에 따라 레코드를 업데이트하는 몇 가지 UPDATE 쿼리를 실행해 보겠습니다.

참고: UPDATE 문을 실행한 후 'SELECT * FROM customers'를 실행하여 변경된 레코드를 확인하세요.

단일 필드 업데이트

먼저, customerID가 7인 레코드의 'city' 필드를 변경해 보겠습니다.

UPDATE customers
SET city='Codeshire'
WHERE customerID=7;

이제 전체 테이블을 조회해 보겠습니다.

SELECT * FROM customers;

Danielle Ford(customerID=7)의 'city' 필드가 변경된 것을 확인할 수 있습니다.

여러 필드 업데이트

이전 예시에서는 하나의 필드만 수정했지만, 여러 필드를 동시에 업데이트할 수도 있습니다. 여기서는 customerID가 1인 레코드의 'city'와 'email' 필드를 동시에 변경합니다.

UPDATE customers
SET city='East Carlisle',email="[email protected]"
WHERE customerID=1;

결과를 확인해 보겠습니다.

SELECT * FROM customers;

여러 레코드 업데이트

지금까지 customerID라는 기본 키를 사용하여 쿼리를 실행했기 때문에 하나의 레코드만 변경되었습니다. 하지만 조건에 부합하는 레코드가 여러 개라면 SQL UPDATE 명령어를 통해 여러 레코드를 동시에 변경할 수 있습니다.

예를 들어, 다음 쿼리를 사용해 보겠습니다.

UPDATE customers 
SET discount=10
WHERE num_orders > 170;

다음 쿼리로 결과를 확인합니다.

SELECT * FROM customers;

'num_orders' 값이 170보다 큰 세 개의 레코드의 'discount' 값이 10으로 변경된 것을 확인할 수 있습니다.

여러 조건에 따른 레코드 업데이트

지금까지 WHERE 절에 단순한 조건만 사용했지만, 실제로는 논리 연산자로 결합된 여러 조건을 사용하여 필터링하는 경우가 많습니다.

이해를 돕기 위해 두 가지 조건을 결합하여 할인율을 5로 설정해 보겠습니다.

  • city LIKE 'New%': 도시 이름이 'New'로 시작하는 레코드만 선택합니다.
  • num_orders > 100: 주문 수가 100보다 큰 레코드만 선택합니다.

UPDATE 명령어는 다음과 같습니다.

UPDATE customers
SET DISCOUNT=5
WHERE city LIKE 'New%' AND num_orders>100;

WHERE 절에 논리 연산자 AND로 결합된 두 가지 조건이 있습니다. 두 조건이 모두 참인 레코드만 업데이트됩니다.

결과를 확인해 보겠습니다.

SELECT * FROM customers;

출력 결과에서 두 가지 조건을 모두 만족하는 레코드의 할인 필드만 업데이트된 것을 확인할 수 있습니다.

SQL UPDATE 명령 사용 시 주의사항

지금까지 실행한 모든 UPDATE 문에는 WHERE 절이 포함되었습니다. 특정 고객의 할인율을 25로 변경하려고 할 때, WHERE 절을 사용하여 customerID로 필터링하는 것을 잊었다고 가정해 보겠습니다.

UPDATE customers
SET DISCOUNT=25;

이제 전체 테이블을 조회합니다.

SELECT * FROM customers;

테이블의 모든 레코드가 업데이트된 것을 볼 수 있습니다. 이는 의도한 결과가 아닐 수 있습니다.

조건에 따라 레코드의 일부만 수정해야 하는 경우 WHERE 절을 반드시 포함해야 합니다. 테이블의 모든 레코드에 특정 값을 일괄적으로 적용하려면 WHERE 절을 생략할 수 있습니다.

예를 들어, 블랙 프라이데이 세일을 맞이하여 모든 고객에게 25% 할인을 제공하고 싶다면 위와 같이 WHERE 절 없이 UPDATE 명령을 실행하면 됩니다.

결론

정리하자면, 다음 내용을 기억해야 합니다.

  • 데이터베이스 테이블의 레코드를 변경하려면 SQL UPDATE 명령어를 사용합니다.
  • SQL UPDATE 문은 일반적으로 변경할 레코드(테이블의 행)를 결정하는 조건과 함께 WHERE 절을 사용합니다.
  • UPDATE 문에서 WHERE 절을 생략하면 테이블의 모든 레코드가 수정됩니다. 따라서 특정 레코드만 수정해야 할 경우 WHERE 절을 생략하지 않도록 주의해야 합니다.

다음으로, 빠른 참조를 위해 SQL 치트 시트를 참조하십시오.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.