분류 전체보기 73

SQL 정규화와 비정규화

정규화정규화란 데이터의 중복성을 제거하거나 줄이기 위해 크고 조직화 되지 않은 테이블들과 관계들을잘 조직된 테이블과 관계들로 나누는 과정이다.예시를 통해 이해해보자.위의 예시 데이터는 아래의 단점이 있다중복된 정보가 많아서 데이터가 비효율적으로 저장되어 있음중복된 정보 사이에 실수로 오류가 발생할 확률이 높음특정 구매 이력의 고유 값이 없어서 어떤 내역을 간단하게 특정 지을수 없음예시 데이터를 정규화 해보면위와 같이 3개 테이블로 나누어지고 각각의 테이블에 프라이머리 키 id값을 추가하게 된다.앞의 테이블보다 복잡해보이지만, 데이터의 중복이 최소화되어 있고, 더 적은 양의 데이터로 같은 내용을 저장한다.비정규화정규화의 반대로 데이터의 중복을 허용하여 테이블과 관계로 표현한다.정규화된 테이블은 정보가 여러..

SQL 2025.02.11

SQL 데이터 모델링

데이터베이스에서 하드웨어 개선 없이도 내부 구조나 기능을 활용하여 속도를 향상시키는 방법이 있는데,대표적인 방법이 데이터 모델링과 데이터 인덱싱이다. 그 중, 데이터 모델링을 살펴보자.인터넷 커뮤니티 사이트를 만든다고 가정해보자. 아래와 같은 조건이 필요할것이다.사용자는 이름과 생년월일, 그리고 점수를 가진다.게시판은 이름을 가진다.게시글은 사용자가 게시판에 작성 가능하고, 제목과 내용 조회수를 표시한다.조회수는 사용자당 1씩만 올릴 수 있고, 다시 게시글을 읽어도 조회수가 오르지 않는다각 상자는 테이블을 의미하고, 상자 안의 항목들은 테이블이 가지는 컬럼을 의미.각 테이블의 id 컬럼은 그 테이블의 프라이머리 키.게시글과 조회 테이블은 다른 테이블의 id값을 저장하여 서로 다른 테이블과 관계를 형성.게..

SQL 2025.02.11

SQL django와 연동

책에선 로컬환경에서 진행.나는 도커에서 연동.django, postgresql 이미지 다운# DockerfileFROM python:3.9.13-slimLABEL maintainer="https://github.com/spring0691"RUN pip install --no-cache-dir django==2.2.28 psycopg2-binary==2.8.6EXPOSE 8000# 이미지 다운로드docker build . -t django2# 이미지 다운로드(버전 변경가능)docker pull postgres:11.22-alpine3.19docker network 생성후 컨테이너 실행docker network create studySQL# django 실행 & 접속docker run --name djang..

SQL 2025.02.06

SQL 6장 실습문제

소스파일 : https://github.com/bjpublic/postgresql1교차로에서 사고자(다치거나 사망한 사람)가 5명 이상인 대형 사고는 어느 시도, 시군구에서 발생했는지 사고발생 수로 내림차순 출력# 사고자가 5명 이상인 대형 사고는 어느 시도, 시군구에서 발생했는지 사고자 수로 내림차순 출력 select 시도, 시군구, count(*) as 사고횟수 from accident where (사망자수+부상자수+중상자수+경상자수+부상신고자수)>=5 group by 1,2 order by 3 desc; 시도 | 시군구 | 사고횟수------+----------+---------- 경기 | 용인시 | 9 경기 | 화성시 | 7 경기 | 평택시 ..

SQL 2025.02.05

SQL 테이블 열연결(JOIN)

서로 다른 테이블을 가로 방향으로 합쳐보자.JOINselect rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicyfrom rating, ramenwhere ramen.id = rating.item_id and rating.item_type = 'ramen';위 쿼리는 아래와 같이 사용가능하다select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicyfrom ( rating join ramen on ramen.id = rating.item_id and rating.item_type = 'ramen');두 쿼리문의 성능차이는 전혀 ..

SQL 2025.02.05

SQL 테이블 행연결(EXCEPT, EXCEPT ALL)

서로 다른 테이블을 세로 방향으로 합치기 위해선 2개의 쿼리문 사이에 연결 명령어를 추가하면 된다.이때 2가지 조건을 충족해야한다.1.두 SQL은 서로 컬럼의 개수가 동일할것2.두 SQL의 컬럼의 타입이 동일할 것EXCEPT, EXCEPT ALL# EXCEPT두 테이블 차집합. 서로 중복되는 행은 1개만 출력( (select id, name, quantity from drink) union all (select id, name, quantity from ramen) union all (select id, name, quantity from drink))except( (select id, name, quantity from drink) union all (select id, name, qua..

SQL 2025.02.05

SQL 테이블 행연결(UNION, UNION ALL)

서로 다른 테이블을 세로 방향으로 합치기 위해선 2개의 쿼리문 사이에 연결 명령어를 추가하면 된다.이때 2가지 조건을 충족해야한다.1.두 SQL은 서로 컬럼의 개수가 동일할것2.두 SQL의 컬럼의 타입이 동일할 것UNION, UNION ALL# UNION두 테이블 합집합. 서로 중복되는 행은 1개만 출력(select * from drink)union(select * from drink); id | name | quantity | shelf_life | volume----+--------------+----------+------------+-------- 3 | 무안단물 | 41 | 35 | 600 1 | 에너지드링크 | 36 | ..

SQL 2025.02.05