도서/모두를 위한 postgreSQL 17

Day17. 데이터 모델링과 인덱싱- 인덱싱이란?

1. 인덱스의 사전적 의미는 색인이며, 각각의 데이터에 대한 색인이라고 생각하면 된다. 2. 인덱스의 특징 쿼리를 수행할 때, 인덱스가 없다면 모든 로우를 일일히 조회해야 한다. 인덱스는 쿼리 작업을 매우 효율적으로 만들어준다. 인덱스를 만들면 새로운 로우를 생성하거나 제거하는 작업을 빈번하게 할 때 속도의 저하가 일어날 수 있다. 매번 인덱스를 업데이트 해야하기 때문이다. 단순 인덱스를 만들면 해당 컬럼만 조회할 때 사용할 수 있고, 다수의 컬럼을 대상으로 조회할 때는 복합 인덱스가 효율적이다. 복합 인덱스는 순서가 중요하다. a-b 복합 인덱스는 a 단순 인덱스와 같은 기능을 하기 때문에 대체할 수 있다. 3. 인덱스의 구조 : 대표적인 인덱스의 구조로는 B-Tree 인덱스, 해시 인덱스, GIN 인..

Day16. 데이터 모델링과 인덱싱- 정규화와 비정규화

1. 정규화 : 정규화란 데이터의 중복성을 제거하거나 줄이기 위해 데이터를 구성하는 과정을 의미한다. : 정규화란 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고, 잘 조직된 관계들로 나누는 것을 의미한다. : 정규화의 과정을 거치게 되면, 데이터의 중복이 최소화되고, 더 적은 양의 데이터로 같은 내용을 저장하게 된다. 2. 비정규화 : 정규화된 테이블들은 정보가 여러 테이블에 분산되어 있는 특징을 가지게 되는데, 이런 특징은 너무 많은 JOIN문을 사용하게 만들어 성능이 저하되게 만드는 원인이 될 수 있다. 따라서 모든 테이블을 반드시 정규화 시켜야 하는 것은 아니다. : 하지만, 비정규화 된 테이블의 경우, 데이터의 중복이 있어 쓰기 작업 시 더 불리해지는 경향이 있고, 쓰기 작업 시 잘못된 코..

Day15. 데이터 모델링과 인덱싱- 테이블 사이의 관계

1. 일대다 관계 : 하나의 게시판에는 여러 개의 게시글이 존재하고, 각각의 게시글은 하나의 게시판에 속해 있어야 한다.이와 같이 하나의 테이블이 다른 테이블에 속하는 관계를 일대다 관계라고 한다. : 일대다 관계의 경우 정보의 중복을 최소화하면서 정보를 저장할 수 있다. 이와 같이 서로간의 불필요한 정보의 중복이 없는 상태를 정규화된 상태라고 한다. : 여러 개의 테이블에 정규화된 상태로 일대다 관계를 표현할 수 있지만, 하나의 테이블에 중복된 정보를 담아 일대다 관계를 표현할 수도 있다. 1.1 여러 개의 테이블을 이용해 정규화된 상태로 일대다 관계를 표현하는 경우 : JOIN문을 이용해 읽기 성능은 하나의 테이블을 이용할 때보다 떨어지지만 정보를 수정할 때 효율성이 높고, 정보의 일관성이 깨질 가능..

Day14. 다양한 상황에서의 데이터 결합

1. 그룹화 이후 데이터 결합하기 : union_example 데이터베이스에서 모든 상품의 평균 평점을 상품 이름, 상품 종류와 함께 출력한다고 가정하면 아래의 작업이 필요하다. 평점 테이블을 상품 종류와 상품 이름으로 그룹화한다(GROUP BY) 모든 상품을 하나의 테이블로 결합한다.(UNION) 모든 상품 테이블과 평점 테이블을 결합한다(JOIN) : 각 단계의 쿼리들은 아래와 같이 작성될 수 있다. SELECT item_type, item_id, avg(rating.rating) AS rating FROM rating GROUP BY item_type, item_id; (SELECT name, id AS item_id, 'drink' AS item_type FROM drink) UNION ALL (..

Day13. 여러 개의 테이블을 컬럼으로 연결하기

1. FROM 절과 WHERE절을 이용한 데이터 결합 두 개의 테이블을 모두 FROM 절에 불러오는 의미 = CROSS JOIN을 한다는 의미이다. CROSS JOIN이란 두 테이블의 각각의 로우가 서로 한 번씩 결합시키는 것을 의미한다. 따라서, SELECT * FROM rating,ramen; 쿼리문은 SELECT * FROM rating CROSS JOIN ramen; 쿼리문을 실행시키는 것과 같다 2. WHERE 절로 결합된 데이터 고르기 : FROM 절로 두 개의 테이블을 결합한 데이터베이스에 WHERE절을 사용하면, 결합된 데이터에서 필요한 정보만 걸러내어 가져올 수 있다. SELECT rating.user_id, rating.rating, ramen.name, ramen.quantity, r..

Day12. 여러 개의 테이블을 로우로 연결하기

1. 명령어의 전제조건 두 sql은 서로 컬럼의 개수가 동일해야 한다. 같은 위치에 동일한 형식과 의미의 정보가 담겨야 한다. 2. UNION, UNION ALL절 : 두 테이블의 데이터를 합칠 때 사용 : UNION의 경우 중복된 데이터를 한 줄로 합쳐서 표시하고, UNION ALL의 경우 중복된 데이터를 합치지 않고 반복해서 표시한다. : UNION의 경우 두 개의 데이터를 합치고 난 후 합친 로우들을 모두 검사해 중복을 제거하는 방식이라 UNION ALL에 비해 속도가 느리다. 3. INTERSECT, INTERSECT ALL절 : 두 테이블의 공통된 영역만 남길 때 사용 : INTERSECT의 경우 중복된 데이터를 한 줄로 합쳐서 표시하고, INTERSECT ALL의 경우 중복 제거를 하지 않는다..

Day11. 데이터 그룹화

1. DISTINCT : 테이블에서 중복되는 데이터를 없애는 명령어 SELECT DISTINCT item_type FROM rating 2. GROUP BY : 원하는 자료를 그룹화하는 명령어 : DISTINCTI 함수와 달리 집계함수(count()..)를 사용할 수 있고, 집계 연산 이후에 HAVING 절로 조건에 맞는 정보를 걸러낼 수 있다. : 집계함수를 이용한다는 의미는 새로운 관계를 갖고 있는 가상의 결과를 만들어 낸다는 의미와 같다. SELECT item_type FROM rating GROUP BY item_type; SELECT item_type, count(*) FROM rating GROUP BY item_type; 3. HAVING : 집계를 완료한 데이터에서 원하는 조건만 검색할 수..

Day10. 쿼리에 사용되는 연산자와 함수4

1. 서브쿼리에서 사용되는 연산자: 다음의 연산자들은 서브쿼리에 이용되며, boolean 타입을 반환EXISTS (서브쿼리) : 서브쿼리의 로우가 존재하면 참 IN (서브쿼리) : 서브쿼리의 로우 값 중 하나라도 표현식과 같다면 참 NOT IN (서브쿼리) : 서브쿼리의 로우 값 중 하나라도 표현식과 다르면 참 ANY (서브쿼리) : 서브쿼리의 로우 값 중 하나라도 표현식과 같다면 참 ALL (서브쿼리) : 서브쿼리의 로우 값 모두가 표현식과 같다면 참 2. 패턴매칭 연산자2.1  LIKE 연산자: 특정한 패턴을 가지고 있는 값들만을 조회할 수 있도록 도와줌: 대소문자를 구분하지 않는다: LIKE, NOT LIKE, ILIKE, NOT ILIKE 연산자와 동일 연산자로  ~~, !~~, ~~*, !~..

Day9. 쿼리에 사용되는 연산자와 함수3

1. 날짜 및 시간 연산자와 함수 : 덧셈 연산자 SELECT date '2020-07-15' + integer '7' AS result; - '2020-07-22'(DATE 타입) SELECT date '2020-07-15' - time '13:00' AS result; - '2020-07-15 13:00:00'(TIMESTAMP 타입) ; 뺄셈 연산자 SELECT date '2020-07-15' - date '2020-07-01' AS result;- 14 날짜와 정수를 빼면 날짜가 나오고, 시간과 시간을 빼면 INTERVAL 타입의 결과가 출력된다. : 곱셈 연산자 SELECT 60 * interval '1 second' AS result;- 00:01:00 SELECT 2 * time '2:00'..

Day8. 쿼리에 사용되는 연산자와 함수2

1. JSONB 연산자 : 불리언 타입으로 '?' 연산자를 사용해 가장 바깥 단의 JSONB에 해당하는 문자열의 '키 값'이 존재하는지 확인할 수 있다. SELECT '{"username":"sumin","content":"hello world"}'::jsonb ? 'username' AS result;- true : 가장 바깥단의 JSONB에 배열 속 원소가 '키 값'으로 1개 이상 존재하는지 물어볼 때는 '?!' 연산자를 사용한다. SELECT '{"hello":0,"psql":1, "world":2}'::jsonb ?| array ['a','psql'] AS result;- true : 가장 바깥단의 JSONB 배열 속의 원소가 "키 값"으로 모두 존재하는지 물어볼 때는 '?&'연산자를 사용한다. ..