SQL 독학 시리즈 두 번째 글! 이번 글은 SQLZoo 튜토리얼 #6,7, SQLBolt #6,7 정리한 내용이다.
내 독학 계획 및 SQL 공부 사이트 추천은 아래 글에서 ↙↙
SQL 독학 시작! 나만의 커리큘럼, 연습 문제 사이트 추천
현재 일에서는 SQL을 사용하지 않지만, 대부분의 데이터 과학 관련 직무에서 SQL은 필수로 요구되는 기술이라는 것을 알 수 있다.올해 말이나 내년에는 이직을 준비해야 하기 때문에, 새해 결심으
benn.tistory.com
데이터베이스 정규화 (Normalization):
- 정규화는 데이터베이스 설계 과정에서 중복 데이터를 제거하고 데이터의 일관성과 독립성을 유지하기 위해 데이터를 여러 테이블로 분리하는 작업입니다.
- 아래 예를 들어, 직원 정보와 부서 정보를 하나의 테이블에 저장하면 중복된 부서 데이터가 여러 번 반복될 수 있지만, 이를 정규화하면 직원, 부서, 기술 데이터를 각각 독립적인 테이블로 나누고, 각 테이블을 고유 키(Primary Key)로 연결하여 관리할 수 있다. 결과적으로, 정규화는 데이터베이스의 저장 공간을 절약하고, 데이터 변경 시 효율성을 높인다.
- 단점: 쿼리가 더 복잡해지고, 많은 테이블에서 데이터를 처리할 경우 성능 문제가 발생할 수 있음.
JOIN:
- 여러 테이블에 걸친 데이터를 조회하려면 JOIN을 사용해 데이터를 결합하는 쿼리를 작성해야 한다.
- 각 테이블은 데이터를 식별하는 고유 키(Primary Key)를 가져야 하며, 이 키를 기준으로 테이블을 연결한다.
INNER JOIN:
- INNER JOIN은 두 테이블에서 동일한 키를 가진 행을 매칭하여 하나의 결과 행으로 결합합니다.
- ON: 두 테이블에서 어떤 열을 기준으로 결합할지 정의.
- INNER JOIN은 간단히 JOIN으로 작성할 수 있지만, 다른 종류의 JOIN과 혼동을 줄이기 위해 INNER JOIN이라고 명시하는 것이 좋음.
SELECT 열1, 열2, …
FROM 테이블이름
INNER JOIN 다른테이블
ON 테이블이름.열이름 = 다른테이블.열이름;
예제)
- Movies 테이블:
- 영화 ID, 제목(Title), 감독(Director), 제작 연도(Year), 길이(Length_minutes)를 포함.
- 영화마다 고유한 Id가 있음.
- Boxoffice 테이블:
- 영화 ID(Movie_id), 평점(Rating), 국내 수익(Domestic_sales), 해외 수익(International_sales)을 포함.
- Movie_id가 Movies 테이블의 Id와 연결되어 있음.
각 영화의 수익 정보를 가져오려면, Movies 테이블과 Boxoffice 테이블을 JOIN 하여 데이터를 결합해야 한다.
Movies 테이블에는 영화의 제목 (title)과 ID 정보가 저장되어 있고, Boxoffice 테이블에는 ID(movie_id)를 기준으로 영화의 수익 정보가 저장되어 있다. 이 두 테이블을 공통 키인 Movies.id와 Boxoffice.movie_id를 사용해 연결해야만 영화 제목과 수익 정보를 함께 조회할 수 있습니다.
SELECT title, domestic_sales, international_sales
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id;
쿼리 결과:
OUTER JOIN:
- INNER JOIN은 두 테이블에 공통으로 존재하는 데이터만 결과로 반환하기 때문에, 일부 필요한 데이터가 누락될 수 있음.
- 특히 두 테이블의 데이터가 비대칭적일 경우, 다른 종류의 JOIN이 필요함.
- 다른 JOIN 종류:
- LEFT JOIN: 첫 번째 테이블(A)의 모든 행을 포함하며, 두 번째 테이블(B)에 매칭되는 데이터가 없는 경우에도 A의 데이터는 유지.
- RIGHT JOIN: 두 번째 테이블(B)의 모든 행을 포함하며, 첫 번째 테이블(A)에 매칭되지 않는 데이터도 유지.
- FULL JOIN: 두 테이블(A와 B)의 모든 데이터를 포함하며, 매칭되지 않는 행도 결과에 포함.
- LEFT/RIGHT/FULL JOIN을 사용할 경우, 매칭되지 않는 데이터로 인해 결과에 NULL 값이 포함될 수 있음.
SELECT 열1, 열2, …
FROM 테이블이름
LEFT/RIGHT/FULL JOIN 다른테이블
ON 테이블이름.열이름 = 다른테이블.열이름;
예제)
- buildings 테이블:
- 영화 스튜디오의 사무실 건물 정보를 저장.
- 컬럼:
- building_name: 건물 이름.
- capacity: 건물의 수용 가능 인원.
- employees 테이블:
- 영화 스튜디오의 직원 정보를 저장.
- 컬럼:
- role: 직원의 직무(예: 아티스트, 매니저 등).
- name: 직원 이름.
- building: 직원이 배정된 건물 이름 (buildings 테이블의 building_name과 연결).
- years_employed: 직원의 근속 연수.
직원이 있는 모든 빌딩 조회:
- 직원이 근무 중인 건물 목록만 확인
- 직원이 없는 건물은 결과에 포함되지 않는다.
SELECT DISTINCT building FROM employees;
쿼리 결과물:
모든 건물과 각 건물의 직원 역할 조회 (빈 건물 포함)
SELECT DISTINCT building_name, role
FROM buildings
LEFT JOIN employees
ON building_name = building;
결과물:
- buildings 테이블과 employees 테이블을 LEFT JOIN으로 연결하여, 모든 건물의 이름(building_name)과 해당 건물에 배정된 직원의 역할(role)을 조회한다.
- LEFT JOIN을 사용했기 때문에, 직원이 없는 건물도 결과에 포함된다.
'ᐧ༚̮ᐧ Data Science | AI > SQL' 카테고리의 다른 글
SQL 독학 #1. 기본 of 기본 SELECT + 조건 (0) | 2025.01.18 |
---|---|
SQL 독학 시작! 나만의 커리큘럼, 연습 문제 사이트 추천 (1) | 2025.01.17 |
파이썬에서 SQLite 사용하기 (연결, 데이블 생성, 데이터 입력, 데이터 조회) (0) | 2023.02.14 |
[SQL 독학] SQLite 설치하기 (GUI 추천) (0) | 2023.02.10 |
[윈도우] MySQL 다운로드 & 설치하기 (0) | 2022.08.23 |