본문 바로가기

SQLD

[SQLD 공부] 2024년 변경과목 공부(2과목 - 정규표현식, TOP N 쿼리)


SQLD 2과목 PART2. SQL 활용 완벽 정리(2024 신유형 반영) 유튜브 참조

https://youtu.be/EXx6fjxycSY?si=LDA1D5zpCfGQjiBs 

 

 

 


 


TOP N 쿼리

- https://work-01.tistory.com/394 참조

- 조회결과 상위 N개 추출

 

 

  • 문법
TOP(N) [PERCENT] [WITH TIES]

- 쿼리 결과 집합에서 처음 expression%의 행만 반환

- WITH TIES : 동일 수치의 데이터를 추가로 더 추출하는 옵션 (ORDER BY절 지정했 때만 가능)

 

 

 

 

  • 예제
SELECT TOP(2) ENAME, SAL
FROM EMP
ORDER BY SAL DESC;

- 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력

 

SELECT TOP(2) WITH TIES ENAME, SAL
FROM EMP
ORDER BY SAL DESC;

- 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력하는데, 같은 급여를 받는 사원이 있으면 같이 출력



 

 

 

  • 잘못사용 예제 (TOP N 미사용)
SELECT ENAME, SAL
FROM EMP
WHERE ROWNUM <4
ORDER BY SAL DESC;

- 위 예제를  실행 결과, 나온 3명은 급여가 상위인 3명을 출력한 것이 아니라

급여 순서에 상관없이 무작위로 추출된 3명에 한해서 급여를 내림차순으로 정렬한 것이라 x

- TOP N을 사용하지 않을거라면 FROM절에서 서브쿼리(인라인뷰)로 데이터 정렬 후 사용해야 함

 

 

SELECT ENAME, SAL
FROM (SELECT ENAME, SAL
	FROM EMP
	ORDER BY SAL DESC)
WHERE ROWNUM <4 ;

 

 

 

 


 

 


정규표현식

- 문자열의 공통된 규칙을 보다 일반화 하여 표현하는 방법

 


- 단어 : 특수문자 제외, _(언더바)는 단어

- \d : 숫자 한자리 (= [ [ : digit ] ] )

- \W : _제외 모든 특수문자  (= [ [ : punct ] ] )

 

 

 

 

 

REGEXP_REPLACE

- 정규식 사용해 문자열 치환

 

  • 문법
(대상, 찾을문자열, [바꿀문자열], [검색위치], [발견횟수], [옵션] )

- 바꿀 문자열 생략 시 문자열 삭제처리

- 검색위치 생략 시 1

- 발견횟수 생략 시 0 (모든 것 치환)

 

  • 옵션

- c : 대소를 구분하여 검색

- i : 대소를 구분하지 않고 검색

- m : 패턴을 다중라인으로 선언 가능 

 

상품명에서 괄호포함, 괄호 안 모든 글 삭제

 

- \ ( . + \ ) : ()안 엔터 제외 모든 값

 

 



 

REGEXP_SUBSTR

- 정규식 표현식을 사용한 문자열 추출

 

 

  • 문법
REGEXP_SUBSTR(대상, 패턴, [검색위치], [발견횟수], [옵션], [추출그룹])

- 검색위치 생략 시 1

- 발견횟수 생략 시 1

- 추출그룹은 서브패턴 추출 시 그 중 추출할 서브패턴번호

- 옵션은 위와 동일

 

  • 예제 - 전화번호 분리
SELECT TEL,
	REGEXP_SUBSTR(
    	TEL,				-- 원본
        '(\d+) \) (\d+) - (\d+)' ,	-- 패턴 (+서브패턴)
        1,				-- 시작위치
        1,				-- 발견횟수
        null,				-- 옵션 
        1				-- 추출할 서브패턴(그룹) 번호
	) AS 지역번호
FROM STUDENT;

=> 서브패턴 번호 1로 지정했으니  TEL이 062)123-4567이면 결과값은 062가 나옴

 

- 추출할 패턴번호 쓰려면 앞의 옵션들도 모두 작성해야함.

- 사용할 옵션 없을 시 NULL가능

 

 

 

 

 

 

REGEXP_INSTR

- 특정 패턴의 시작위치 반환

 

 

  • 문법
REGEXP_INSTR(원본, 찾을 문자열, [시작위치], [발견횟수], [옵션])

- 시작위치 생략 시 처음부터 확인(기본값 : 1)

- 발견횟수 생략 시 처음 발견된 문자열 위치 리턴

- 위와 옵션 동일

 

  • 예제
SELECT REGEXP_INSTR('500 ORACLE PARKWAY, REDWOOD SHORES, CA',
		'[^ ]+', 1, 2) AS "REGEXT_INSTR"	-- 두번째로 찾은 공백없이 이어진 단어의 시작위치
        
RESULT => 5

- [^ ] + : 공백 없이 이어져있는 단어(숫자,문자,특수문자)

- 두번째 단어인 ORACLE의 시작위치는 5

 

 

 

 

 

 

REGEXP_LIKE

- 주어진 문자열에서 특정 패턴을 갖는 경우 반환
  (WHERE절만 사용 가능)

 

 

  • 문법
REGEXP_LIKE(원본, 찾을문자열, [옵션])

- 옵션 위와 동일

 

 

  • 예제
SELECT *
FROM PROFESSOR
WHERE REGEXP_LIKE(ID, '\D$');		-- ID값이 숫자로 끝나는 정보 출력

 

 

 

 

 

 

REGEXP_COUNT

- 주어진 문자열에서 특정 패턴의 횟수를 반환

 

 

 

  • 문법
REGEXP_COUNT(원본, 찾을문자열, [옵션])

 

 

 

 

  • 예제
SELECT ID,
	REGEXP_COUNT(ID, '\d') AS RESULT1,	-- 한자리 숫자의 개수 반환
    	REGEXP_COUNT(ID, '\d+') AS RESULT2	-- 연속된 숫자 개수 반환
FROM PROFESSOR;

- ID가 angel1004 일때 result1 = 4, result2 = 1