본문 바로가기

Dev Log

SQL 기본 개념 정리2

728x90

실무에서는 종종 “저희는 ANSI SQL을 기준으로 합니다”라는 말을 듣게 되는데, 이럴 때 처음 접하면 당황할 수도 있다.

하지만 걱정할 필요 없다.

 

ANSI SQL은 데이터베이스마다 조금씩 다른 SQL 방언(dialect)을 묶어주는, 가장 기본이 되는 표준 SQL 문법이다.

 

프로젝트를 진행하다 보면 MySQL, PostgreSQL, Oracle 등 다양한 DBMS를 사용할 때가 있다.

이럴 경우 ANSI SQL을 기준으로 쿼리를 작성하면,

DBMS가 바뀌더라도 기본적인 SELECT, INSERT, UPDATE, DELETE 문법은 거의 그대로 적용할 수 있어

기술 스택 변경에도 대응하기 쉽다는 장점을 가지고 있다. 


✅ ANSI SQL? 

ANSI(American National Standards Institute, 미국 국가표준협회)는 1986년에 SQL을 표준으로 승인했으며, 이후 새로운 기능을 반영하면서 여러 차례 개정해 왔다.

 

이식성(Portability)
ANSI SQL 표준을 따르면 대부분의 데이터베이스 시스템에서 기본 SQL 명령과 문법을 인식할 수 있어, 다른 플랫폼으로 이전할 때 코드 변경을 최소화할 수 있다.

 

핵심 구성 요소(Core components)
ANSI SQL에는 주요 SQL 명령어 카테고리가 포함된다.

  • DML (데이터 조작어): SELECT, INSERT, UPDATE, DELETE
  • DDL (데이터 정의어): CREATE, ALTER, DROP
  • DCL (데이터 제어어): GRANT, REVOKE
  • TCL (트랜잭션 제어어): COMMIT, ROLLBACK

테이블 조인 방식 비교

  • ANSI SQL (표준)
FROM table1
JOIN table2 ON table1.column = table2.column
 
  • 비 ANSI SQL
FROM table1, table2
WHERE table1.column = table2.column
 
💡 실무 활용 

 

  • 기본 쿼리는 ANSI SQL 우선
    • SELECT, INSERT, UPDATE, DELETE, JOIN, GROUP BY 등 표준만으로도 대부분 가능
  • 벤더 확장이 필요한 경우만 사용 & 문서화 필수
    • DB별 고유 기능, 대용량 처리, 성능 튜닝 시
    • 비표준 SQL을 쓰면 다른 DB로 이식할 때 수정 필요

 

 

✅ 쿼리를 짤 때 이것만 기억해도 절반은 간다

1️⃣ 인덱싱하기 좋은 구조인지 먼저 생각하기

쿼리의 전반적인 성능은 결국 얼마나 효율적으로 데이터를 찾을 수 있는가에 달려 있다.

인덱스는 검색 속도의 핵심이다.

다만 컬럼을 함수로 감싸면 인덱스가 적용되지 않는다.

-- 비추천: 인덱스 사용 불가
SELECT *
FROM users
WHERE LOWER(email) = 'test@example.com';

-- 추천: 인덱스 사용 가능
SELECT *
FROM users
WHERE email = LOWER('test@example.com');

👉 이유: DB는 인덱스를 “원본 컬럼 값” 기준으로 관리하기 때문이다.

함수로 감싸면 원본 값이 변형되어 인덱스를 탈 수 없다.

인덱싱은 면접에도 많이 등장하는 개념이므로 아래에서 더 자세히 정리해놨다.


2️⃣ 컬럼 추가할 때 단순히 ADD만 하지 않는다

PostgreSQL 등에서는 컬럼을 추가할 때 저장 방식(STORAGE) 설정도 함께 고려해야 한다.

예를 들어 문자열 컬럼은 기본적으로 PLAIN이나 EXTENDED 형태로 저장될 수 있는데,

EXTENDED는 압축 및 외부 저장 가능 옵션으로 대용량 문자열에 유리하다.

ALTER TABLE hime.hm_event ADD landing_url varchar(200) NULL;
ALTER TABLE hime.hm_event ALTER COLUMN landing_url SET STORAGE EXTENDED;
COMMENT ON COLUMN hime.hm_event.landing_url IS '랜딩 URL';

👉 즉, ADD 후에 SET STORAGE EXTENDED를 설정해야

나중에 문자열이 길어질 때 성능 저하를 방지할 수 있다.


🧱 인덱싱이란?

  • *인덱싱(indexing)**이란,

데이터베이스에서 데이터를 더 빨리 찾기 위해 별도의 색인(index) 구조를 만드는 과정이다.

쉽게 말해,

책의 목차처럼 “찾기 빠르게 만드는 기능”

만약 인덱스가 없다면 DB는 특정 값을 찾기 위해 모든 데이터를 처음부터 끝까지 탐색해야 한다.

인덱스가 있다면 필요한 위치를 바로 찾아갈 수 있어 검색 속도가 수십~수백 배 빨라진다.

⚙️ 인덱싱의 원리

대부분의 데이터베이스(PostgreSQL, MySQL, Oracle 등)는

B-Tree(균형 이진 트리) 라는 자료구조를 사용한다.

간단히 원리를 표현하면 다음과 같다👇

1️⃣ 인덱스를 걸면, DB는 해당 컬럼의 값을 정렬된 트리 구조로 따로 저장함.

2️⃣ 검색 시 DB는 전체 테이블을 훑지 않고, 트리를 따라가며 이진 탐색(Binary Search) 으로 빠르게 찾음.

3️⃣ 찾은 위치를 기반으로 실제 데이터를 가져옴 (테이블 접근).

🪄 인덱스를 만든다는 것은?

인덱스를 만든다는 건,

“특정 컬럼의 값을 기준으로 정렬된 탐색용 자료구조를 하나 더 만드는 것”

이건 실제로 SQL 명령어 한 줄로 가능하다 👇

//users 테이블의 email 컬럼을 기준으로 별도의 인덱스 트리를 만들라는 의미다.
CREATE INDEX idx_users_email ON users(email);

❌ 인덱스 없는 경우

SELECT * FROM users WHERE email = 'abc@example.com';
  • DB는 모든 행을 처음부터 끝까지 하나씩 비교함
  • → 수천~수만 건이 넘어가면 매우 느림

✅ 인덱스 있는 경우

CREATE INDEX idx_users_email ON users(email);

SELECT * FROM users WHERE email = 'abc@example.com';

⚠️ 주의할 점

항목 설명

인덱스의 장점 검색 속도 향상 (특히 WHERE, JOIN, ORDER BY에 효과적)
단점 데이터 추가/수정/삭제 시 인덱스도 함께 갱신되어 쓰기 성능 저하
인덱스가 안 먹는 경우 컬럼에 함수 적용, 형 변환, %keyword% 검색 등
권장 자주 검색되는 컬럼, 중복이 적은 컬럼 위주로 설정
728x90