오라클에서 분석함수를 사용할 때 PARTITION BY를 사용하여 그룹으로 묶어서 연산을 할 수 있다. GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION BY 절을 사용하면 된다. 위의 예제를 보면 데이터를 조회한 각 행에 분석함수로 집계한 값을 추가로 각 행에 표시하며, 조회된 데이터는 GROUP BY 절을 사용하지 않았기 때문에 데이터가 변형되지 않는다. 집계된 값은 GROUP BY 절을 사용할 때와 동일한 값이며, 분석함수를 사용하지 않고 값을 표시할 때는 서브 쿼리를 사용하여 해당 값을 표시해야 하기 때문에 쿼리문이 복잡해진다. 분석함수([칼럼]) OVER(PARTITION BY 칼럼1, 칼럼2... [ORDER BY 절] ..
오라클에서 검색된 결과의 행을 정렬할 때는 ORDER BY 절을 사용한다. 정렬 방법에는 오름차순 정렬(ascending sort)과 내림차순(descending sort) 정렬 두 가지가 있다. 오름차순은 작은 값부터 큰 값으로 정렬하며, 내림차순은 큰 값부터 작은 값으로 정렬된다. SELECT 컬럼명 FROM 테이블명 WHERE 조건식 GROUP BY 컬럼명 ORDER BY 컬럼명1 [ASC|DESC], 컬럼명2 [ASC|DESC], 컬럼명3 [ASC|DESC] ... 아래는 자주 사용하는 정렬 방법을 정리하였다. 기본 사용법 오름차순 정렬 (ASC) SELECT empno , ename , job , sal FROM emp WHERE deptno = 30 ORDER BY sal -- ORDER BY..
SQL Server에서 날짜 데이터의 년, 월, 일을 추출할 때 사용하는 기본적인 함수는 YEAR, MONTH, DAY이며, 정수로 결과를 반환한다. 앞의 세 가지 함수 외에도 DATENAME, DATEPART라는 함수도 있는데 DATENAME 함수는 결과를 문자로 반환하고 DATEPART 함수는 결과를 정수로 반환한다. YEAR, MONTH, DAY 함수 사용법 SELECT YEAR(GETDATE()) AS [YEAR] , MONTH(GETDATE()) AS [MONTH] , DAY(GETDATE()) AS [DAY] 위의 세 가지 함수를 사용하여 날짜에서 쉽게 년, 월, 일을 추출할 수 있다. 그러나 반환 값이 정수이므로 문자열과 합치게 되면 오류가 발생한다. 반환 값을 문자열과 합치는 방법 SELE..
SQL Server에서 중복된 행을 제거하고 한 번만 표시하고 싶다면 DISTINCT를 사용하면 된다. 중복 행을 제거하는 방법은 DISTINCT 사용하는 방법 외에도 GROUP BY 절을 사용해서 중복 행을 제거할 수 있다. GROUP BY를 사용하면 속도가 조금 빠르다는 얘기가 있으나 큰 차이를 느끼지 못했다. GROUP BY를 사용해야 할 특별한 경우가 아니면 중복 행을 제거할 때는 DISTINCT를 사용할 것을 권장한다. DISTINCT를 사용해도 중복을 제거한 결과가 오름차순으로 정렬되어서 조회된다. (SQL Server 2019) DISTINCT DISTINCT를 사용하여 중복 제거 SELECT DISTINCT deptno, job FROM emp WHERE deptno in (20, 30) ..
SQL Server에서 문자열을 합칠 때는 CONCAT 함수와 더하기(+) 연산자를 사용한다. 문자열을 합칠 때는 되도록이면 CONCAT 함수를 사용할 것을 권장하지만, 더하기 연산자를 사용하는 것이 더 익숙하기 때문에 더 많이 사용하는 듯하다. 더하기 연산자를 사용할 때는 주의사항이 있으니 아래를 참고하기 바란다. CONCAT 함수 사용하여 문자열 합치기 SELECT CONCAT('SQL', 'Server', '2019') AS str1 , CONCAT(2021, 12, 31, 23, 59, 59) AS str2 CONCAT 함수는 많은 데이터베이스에서 사용 가능한 ANSI SQL 함수이며, CONCAT 함수에 입력된 값은 문자형으로 변환 후 합치는 작업이 이뤄진다. 숫자와 문자가 함께 입력되어도 오류..
SQL Server에서 문자열을 자르기 위해서는 SUBSTRING, LEFT, RIGHT 세 가지 함수를 사용할 수 있다. 오라클에서는 SUBSTR 함수 하나로 위의 세 가지 함수 기능을 모두 할 수 있지만, SQL Server에서는 위의 세 가지 함수를 적절히 잘 사용해야 한다. SUBSTRING("문자열", "시작위치", "길이") : 지정한 위치에서 지정한 문자열 길이만큼 자를 때 사용 LEFT("문자열", "길이") : 왼쪽에서부터 지정한 문자열의 길이만큼 자를 때 사용 RIGHT("문자열", "길이") : 오른쪽에서부터 지정한 문자열의 길이만큼 자를 때 사용 기본 사용법 SUBSTRING 함수 SELECT SUBSTRING('SQL Server 2019', 1, 3) AS str1 , SUBST..
SQL Server에서는 조건에 따라 서로 다른 값을 반환할 수 있는 CASE 표현식을 사용할 수 있다. 프로그래밍 언어에서 if 문과 비슷하다고 생각하면 된다. 오라클의 DECODE 함수와 비슷한 기능을 하며, CASE 표현식은 ANSI SQL 이므로 대부분의 데이터베이스에서 동일하게 사용할 수 있다. CASE 표현식은 if 문 방식과 swith 문 방식으로 사용할 수 있다. 주로 if 문과 유사한 방식으로 많이 사용하지만 상황에 따라서 swith 문 방식으로 사용하면 쿼리문을 단순화시킬 수도 있을 듯하다. 기본 사용법 if 문 방식 SELECT employee_id , first_name , job_id , CASE WHEN job_id = 13 THEN 'CLERK' WHEN job_id = 14 ..
SQL Server에서는 현재 날짜와 시간을 가져오기 위해서는 GETDATE 함수를 사용한다. 다른 데이터베이스의 SYSDATE나 NOW() 함수와 비슷하다. SQL Server 2012부터 SYSDATETIME 함수가 추가되었으며 GETDATE 함수보다 더 정밀한 시간을 반환한다. 아래는 두 함수를 간단하게 비교하여 정리한 내용이다. GETDATE() vs SYSDATETIME() SELECT GETDATE() AS [GETDATE] , SYSDATETIME() AS [SYSDATETIME] GETDATE 함수는 datetime 타입의 밀리초(3자리)를 반환한다. SYSDATETIME 함수는 datetime2 타입의 100나노초(7자리)를 반환한다. SYSDATETIME 함수가 조금 더 정밀한 시간을 ..
SQL Server 2012부터 이전 행과 다음 행의 값을 가져올 수 있는 LAG, LEAD 함수가 추가되었다. LAG 함수를 사용하면 이전 행의 값과 현재 행의 값을 비교하여 값이 변경되었는지 쿼리상에서 쉽게 판별이 가능하다. 기본 사용법 이전 행 값 (LAG) SELECT empno , ename , job , LAG(job) OVER(ORDER BY job, empno) AS job_prev FROM emp WHERE job IN ('MANAGER', 'ANALYST', 'SALESMAN') ORDER BY job, empno LEAD 함수를 사용하여 이전 행의 값을 가져올 수 있다. WHERE 절 하단의 ORDER BY의 정렬 순서와 상관없이 OVER 절 내부의 ORDER BY 기준으로 정렬 후 ..
SQL Server에서 시작일자와 종료일자 사이의 일수 또는 시간, 분, 초 등의 차이를 계산할 때 DATEDIFF 함수를 사용한다. DATEDIFF 함수는 두 날짜를 비교하여 DATEPART 구분자에 따라서 차이를 계산하여 결과를 정수로 반환한다. 날짜 차이 계산 SELECT DATEDIFF(DAY, '2021-06-12', '2021-07-13') AS [일차이] , DATEDIFF(MONTH, '2021-06-12', '2021-07-13') AS [개월차이] , DATEDIFF(YEAR, '2021-06-12', '2021-07-13') AS [년차이] DAY : 시작일자와 종료일자 사이의 일수를 반환 MONTH, YEAR : 월, 년이 바뀐 횟수를 반환 (주의: 30일을 1개월 또는 365일을 ..