DATA PROGRAMMING/SQL(18)
-
[SQL] DML 다중 테이블 검색문 - 집합 연산자
SQL 집합 연산자에서는 수학에서 집합을 공부했다면, 쉽게 이해할수 있는 연산자이다. 하지만 수학에서의 집합과 사용 방법이나 특징에서 조금 더 숙지해야할 내용이 있는데 그 부분들을 정리해 보려고 한다. SQL DML - 집합 연산자 UNION VS UNION ALL 기본적으로 둘 다 합집합 연산자이지만 차이점이 존재한다. 우선은 union은 합집합할 두 SELECT 문을 각각 정렬하고 중복된 데이터를 한 번 빼서 출력한다. 즉, 수학에서 우리가 알고 있는 합집합 연산에 가깝다. 반면에 union all은 중복된 집합을 한번 빼지 않는다. 그렇기에 합집합할 테이블을 각각 정렬할 필요도 없어진다. UNION 연산 결과의 테이블 명과 정렬 SELECT email '이메일/고객', concat(firstName..
2023.08.31 -
SQL 반정규화 정리
SQL에서 반정규화란 정규화의 반대되는 표현이다. SQL 반정규화 보통 정규화는 하나의 테이블을 쪼갬으로써 조회를 함에 있어서 성능을 올리기 위해 사용한다. 반대로 반정규화는 필요에 의해 데이터를 중복하여 성능을 향상시키기 위한 기법인데, 이때 중복을 하다보니 데이터 무결성이 깨질수도 있다는 위험이 존재한다. 하지만 지나치게 정규화 된 데이터는 디스크 I/O량이 많아 성능이 저하되거나 많은 조인 연산으로 계산량이 증가하여 선능이 감소할수 있다. 이를 방지하기 위해 사용할수 있는 하나의 선택지가 반정규화인것이다. 반정규화 절차 반정규화는 치명적인 오류가 생길수 있어 난이도 높은 데이터 모델링 기술이라고 볼 수 있다. 반정규화의 절차를 보면, 1. 반정규화 대상 조사 2. 다른 방법 유도 검토 3. 반정규화..
2023.08.31 -
[SQL] 정규표현식 함수 REGEXP_SUBSTR()의 이해
REGEXP_SUBSTR()의 이해를 위해 예시를 들자면, dmurphy@classicmodelcars.com 이라는 이메일에서 dmurphy 부분과 classicmodelcars 부분을 추출하는 코드를 짜보면, 여기서 [^@]+는 @이 아닌 문자가 1개 이상 있는 문자열을 뜻한다. SELECT REGEXP_SUBSTR(email, '[^@]+') -- 결과 : dmurphy SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(email, '[^@]+',1,2), '[^\\.]+') -- 결과 : classicmodelcars 첫번째 코드는 뒤의 파라미터 값이 없기 때문에 가장 먼저 등장하는 문자열인 dmurphy가 출력된다. 두번째 코드에서는 1, 2의 파라미터 값이 입력했는데 이는 첫번째에..
2023.08.30 -
[SQL] INSTR 함수와 SUBSTR 함수를 활용한 문자열 내의 특정 문자 추출
SQL을 활용해 코딩을 하다보면 문자열로 이루어진 컬럼에서 특정 문자를 뽑아내 쓰고싶은 경우가 있다. 대표적으로 핸드폰 전화번호의 맨뒷자리, 이메일에서 @ 표시 뒤, 즉 사이트 관련 정보를 담은 부분 등이 있다. INSTR 함수와 SUBSTR 함수를 활용하여 그 기능을 수행할 수 있다. INSTR(str, substr) : str에서 첫번째 나타나는 부분 문자열 substr의 시작 위치를 리턴함. ex) INSTR(99-999-9999, '-') = 3 여기서 -는 문자열 내에서 총 두 번 등장하지만, 첫번째로 등장하는 위치의 인덱스 3이 도출된다 SUBSTR(str, position[ , length]) : str의 position부터 length 만큼의 문자열을 리턴함. length가 생략되면, 마지..
2023.08.26 -
[SQL] GROUP BY와 집계 함수를 사용할 때 주의할 점
문제 위 문제는 집계함수를 활용해 여러 값들을 출력하는 문제인데, 주문 별로 GROUP BY한 이후 집계함수를 적용한다면 상품수의 평균은 count() 함수와 AVG()함수를 함께 사용해야 하고, 주문액합계의 평균은 SUM()과 AVG()함수를 함께 사용해야 한다. 이때, 하나의 테이블에서 두개의 집계함수를 모두 사용한다면, 에러가 발생한다. WITH temp AS ( SELECT orderNo,count(quantity) '상품수', sum(priceEach * quantity) '주문액합계' FROM s_orderDetails GROUP BY orderNo ) SELECT count(orderNo) '주문수', AVG(상품수) '상품수의 평균', AVG(주문액합계) '주문액합계의 평균' FROM te..
2023.08.25 -
[SQL] GROUP BY, HVING 절 간단한 응용
포인트는 proudctLine컬럼을 기준으로 group by를 할 때, HVING 절을 활용해 상품수가 20개인 productLine만을 선택해야 하는 것이다. -- 코드를 입력하세요 SELECT productLine, count(*) '상품수', avg(buyPrice) '평균 구매단가', min(buyPrice) '최소 구매단가', max(buyPrice) '최대 구매단가' FROM s_products GROUP BY productLine HAVING count(*) >= 20 ; 이때 상품수에 대해 고민하는게 아니라 그냥 HAVING count(*) >= 20 을 사용한다면 productLine별로 새롭게 분류된 값들이 각 proudctLine별로 몇개나 있는지를 바로 적용할 수 있다.
2023.08.24