DBA 부트캠프 기록

[패캠 BDA17] 데이터 분석가 필수 툴 SQL_v2 (9주차)

노랑별이 2025. 2. 14. 23:44
반응형

 

사진출처 : 핀터레스 https://kr.pinterest.com/pin/351912464887606/

 

안녕하세요! 부트캠프를 시작한 지 벌써 두달이 넘었어요.

이번 주에는 SQL의 다양한 쿼리와 문법을 학습하면서, 실무에서 데이터베이스를 효율적으로 다루는 방법을 고민해볼 수 있는 시간이었어요. 앞으로 SQL을 활용한 데이터 분석 실습을 더 많이 해보면서 쿼리 최적화 방법도 익혀야겠다고 느꼈습니다.

다음 주에도 꾸준히 학습 내용을 정리해서 공유하겠습니다! 감사합니다 😊


  1. UNION

두 개 이상의 SELECT 결과를 하나의 결과 집합으로 합칠 때 사용

여러 테이블이나 서브쿼리의 데이터를 하나의 테이블처럼 조회

UNION의 종류

  • UNION: 중복을 제거한 후 결과를 반환
  • UNION ALL: 중복을 제거하지 않고 모든 결과를 반환
# 중복값 제거
SELECT * FROM user1
UNION ALL
SELECT * FROM user2;
# 전체 데이터
SELECT * FROM user1
UNION ALL
SELECT * FROM user2;
 

UNION 사용 시 주의할 점

  • 결합하려는 SELECT 문들의 열(column) 개수와 데이터 타입이 동일해야 한다.
  • UNION을 사용할 경우 자동으로 중복이 제거되므로, 필요하지 않다면 UNION ALL을 사용
  • ORDER BY는 최종 결과에서만 적용

 

2. JOIN

두 개 이상의 테이블을 연결하여 데이터를 조회할 때 사용하는 기능

  • INNER JOIN: 두 테이블에서 공통된 데이터를 반환
  • LEFT JOIN : 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 일치하는 데이터를 반환(일치하지 않는 경우 NULL이 포함)
  • RIGHT JOIN : 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 일치하는 데이터를 반환
  • OUTER JOIN: 두 테이블의 모든 데이터를 반환하며, 일치하지 않는 데이터는 NULL로 표시
  • CROSS JOIN: 두 테이블의 모든 조합을 반환 (Cartesian Product)
  • SELF JOIN: 같은 테이블을 JOIN하는 방식
# INNER JOIN
SELECT user.ui, user.un, addr.an
FROM user -- 왼쪽
INNER JOIN addr -- 오른쪽
ON user.ui = addr.ui;

# LEFT JOIN
SELECT user.ui, user.un, addr.an
FROM user -- 왼쪽
LEFT JOIN addr -- 오른쪽
ON user.ui = addr.ui;

# RIGHT JOIN
SELECT addr.ui, user.un, addr.an
FROM user -- 왼쪽
RIGHT JOIN addr -- 오른쪽
ON user.ui = addr.ui;

# OUTER JOIN
SELECT user.ui, user.un, addr.an
FROM user -- 왼쪽
LEFT JOIN addr -- 오른쪽
ON user.ui = addr.ui
UNION
SELECT addr.ui, user.un, addr.an
FROM user -- 왼쪽
RIGHT JOIN addr -- 오른쪽
ON user.ui = addr.ui;
 
 

JOIN을 사용할 때 주의할 점

  • ON 절을 정확하게 지정하는 것
  • 불필요한 데이터까지 포함되지 않도록 하는 것
  • JOIN이 많아질수록 성능이 저하될 수 있기 때문에 이를 고려하여 쿼리를 작성

 

3. INDEX

데이터베이스의 검색 성능을 향상시키기 위해 사용하는 기술

인덱스를 적절히 활용하면 데이터를 빠르게 조회할 수 있지만, 너무 많으면 오히려 성능 저하를 초래

INDEX의 종류

  • PRIMARY INDEX: 기본 키(Primary Key)에 자동으로 생성되는 인덱스
  • UNIQUE INDEX: 중복을 허용하지 않는 인덱스
  • CLUSTERED INDEX: 테이블의 데이터 자체를 정렬하는 인덱스 (일반적으로 Primary Key와 함께 사용)
  • NON-CLUSTERED INDEX: 데이터와는 별도로 저장되는 인덱스로, 보조 인덱스 역할을 함
  • FULL-TEXT INDEX: 텍스트 검색을 빠르게 하기 위한 인덱스

INDEX 사용 시 고려할 점

  • 인덱스를 잘못 사용하면 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 시 오버헤드가 발생할 수 있음
  • 자주 조회하는 컬럼에 인덱스를 설정하면 성능이 향상될 가능성이 큼
  • 너무 많은 인덱스를 설정하면 오히려 성능이 저하될 수 있음

4. SUB QUERY

쿼리 안에 쿼리를 작성하는 문법으로 쿼리의 실행 순서를 변경하고 싶을 때 주로 사용

# 쿼리 실행순서에 따라 오류가 발생하는 코드(FROM > WHERE > SELECT)
SELECT survived, name, TRUNCATE(age, -1) AS ages
FROM titanic
WHERE sub.ages>= 40; -- > ages는 SELECT구문에 있어 오류가 발생한다.

# SUB QUERY를 사용하여 코드 실행
SELECT sub.survived, sub.name, sub.ages
FROM(
	SELECT survived, name, TRUNCATE(age, -1) AS ages
	FROM titanic
) AS sub
WHERE sub.ages>= 40;
 

5. VIEW

가상의 테이블로 실제 데이터를 저장하지 않고, 복잡한 쿼리를 단순하게 변경하기 위해 사용

직접적으로 데이터의 수정, 변경이 불가능하다는 특징이 있다.

# 800만 도시인구를 갖는 도시의 국가코드, 국가이름, 도시이름, 도시인구수 출력
# 뷰생성
CREATE VIEW city_800 AS
SELECT countrycode, name, population 
FROM city
WHERE population >= 800 * 10000;

# 뷰사용
SELECT * FROM world.city_800;
 

6. TRIGGER

특정 테이블의 쿼리 실행을 감시하고 있다가 설정한 쿼리가 실행되면, 미리 작성해 놓은 쿼리가 자동으로 실행되는 문법으로 데이터를 1차적으로 백업한다.

# 작성방법 (DELIMITER : 쿼리의 끝을 나타내는 문자를 변경할 때 사용)
DELIMITER $$
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name FOR EACH ROW
BEGIN 
	trigger query;
END;
$$
 
 

 

반응형