DB/SQL

    CTE

    CTE(공통 테이블 식)이란? 임시로 이름이 지정된 논리적인 결과셋들을 CTE(공통 테이블 식)라고 합니다. CTE을 만들기 위해 사용되는 구문인 WITH AS를 소개합니다. 듣기만하면 쓸모없어 보이지만 외외로 활용도가 상당합니다. 원하는 쿼리의 결과를 CTE에 저장하여 다른 쿼리에 활용하기도 하며, 재귀 쿼리에도 CTE이 사용됩니다. 무엇보다 급하게 테스트할 테이블을 가지고 싶다면 CREATE ~ INSERT 와 같은 번거로운 쿼리들을 날리지 않아도 됩니다. 이제 사용방법을 알아봅시다. WITH {alias} AS ( {query} ), {alias} AS ( {query} ), ... 만든 CTE는 다른 쿼리에서 활용이 가능합니다. 간단하게 테스트용 테이블을 만들고 이를 활용하는 예제를 작성해봅시다...

    PIVOT~FOR

    열값들을 컬럼으로 바꾸려 할 때 우리는 PIVOT~FOR을 사용합니다. 하지만 그에 대한 대가가 따르는 법. 강제로 컬럼을 만들기 때문에 테이블 구조가 바뀌게 됩니다. 이때 바뀔 구조는 값들로 쓰일 컬럼(NAME)을 제외한 나머지 컬럼(POSITION, HP) 값들이 서로 그룹화한 조합들로 이루어져 있습니다. 이를 문법으로 표현하면 다음과 같습니다. SELECT * FROM TABLE PIVOT (집계함수(값으로 사용할 컬럼) FOR {열로 변환할 컬럼} IN ([열의 이름], [열의 이름], ...)) AS {별칭} -- 반드시 별칭을 반드시 붙여야 한다!​ 우리는 80, 100, 200을 컬럼으로 바꾸려 합니다. 그러면 먼저 HP를 제외한 컬럼 중 하나를 선택해 80, 100, 200의 값이 되어줄 ..

    STRING_AGG와 STUFF~FOR XML PATH

    위와 같이 같은 값에 따라 그룹화를 시킬수 있는 STRING_AGG에 대해 알아봅시다. NAME컬럼의 값들은 모두 TOP, JG, SUP 이 세가지로 그룹화할 수 있습니다. SELECT {그룹화할 컬럼}, STRING_AGG( {병합할 컬럼}, ',' ) AS {별칭} FROM TABLE WHERE {그룹화할 컬럼} IN ( {그룹화할 값}, {그룹화할 값}, ... ) GROUP BY {그룹화할 컬럼} 위 테이블에 해당 문법을 사용하여 변환한 예제입니다. SELECT POSITION ,STRING_AGG(NAME, ',') AS NAME FROM CHAMPION WHERE POSITION IN ('TOP', 'JG', 'SUP') GROUP BY POSITION-- 탑, 정글, 서폿 포지션 별로 챔피언..

    EXISTS

    특정 조건에 해당하는 컬럼들을 검색하고 싶을 때 우리는 WHERE절을 사용합니다. 그렇다면 검색한 결과를 검색 조건에 반영하고 싶을 때는 어떻게 할까요? 바로 EXISTS를 사용하면 됩니다. 해당 문법은 WHERE절에만 사용이 가능합니다. -- EXISTS SELECT * FROM A WHERE EXISTS ( SELECT 1 FROM B WHERE {A.컬럼ID} = {B.컬럼ID} ) -- NOT EXISTS SELECT * FROM A WHERE NOT EXISTS ( SELECT 1 FROM B WHERE {A.컬럼ID} = {B.컬럼ID} ) 서브쿼리 때문에 복잡해보이지만 실상은 그렇지 않습니다. 서브쿼리의 결과는 무엇이 나오던지 상관이 없으므로 관습적으로 1을 사용합니다. 그리고 조건절에는 서..

    CASE WHEN과 IIF

    DB 중심 아키텍쳐 환경에서 조건에 따라 분기를 주기 위해선 CASE WHEN 사용이 필수적입니다. 사실 DB 중심 아키텍쳐하면 할 말이 많습니다만...이번 주제가 아니니 넘어가기로 하고 쿼리문에서 조건에 따른 분기문을 어떻게 주는지 살펴봅시다. 문법은 다음과 같습니다. -- SELECT절 SELECT CASE WHEN {조건문} THEN {리턴값} WHEN {조건문} THEN {리턴값} ... ELSE {리턴값} END AS {별칭} FROM TABLE -- ORDER BY절 SELECT * FROM TABLE ORDER BY CASE WHEN {조건문} THEN {순서값} WHEN {조건문} THEN {순서값} ... ELSE {순서값} END ORDER BY절도 적었지만 오름차순과 내림차순을 설정할..

    ISNULL

    SQL은 자주 사용하는터라 안 까먹겠지 생각했습니다 그러나 막상 자주 사용하지 않는 상황이 오니 기억이 나질 않는겁니다...그래서 하나씩 천천히 블로그에 정리하고자 합니다. 첫번째는 ISNULL입니다. 사용법은 아주 간단합니다. -- SELECT절 SELECT ISNULL( {컬럼}, {대체할 값} ) FROM TABLE -- WHERE절 SELECT * FROM TABLE WHERE {컬럼} IS NULL SELECT * FROM TABLE WHERE {컬럼} IS NOT NULL NULL값이 허용된 컬럼과 NULL값을 대체할 값을 적으면 됩니다. "이때 컬럼과 대체될 값의 타입은 서로 일치"해야만 합니다. 특히 WHERE 절 사용시엔 IS와 NULL을 붙이지 않는다는 점 주의하셔야 합니다. 실사용 예..