오라클 2일차

0

정규식을 이용한 패턴 연산

정규식(Regular Expression))이란?

  • 특정한 규칙을 가진 문자열ㅇ늬 집합을 표현하는데 사용하는 형식의 언어

  • 문자열을 처리하는 방법 중의 하나로, 특정한 조건의 문자를 검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단이다.

  • RegExLib.com => 정규표현식 참고 사이트

  • 오라클에서는 단순히 LIKE를 사용해서는 안된다.

  • REGEXP_LIKE()
    ex) SELECT * FROM NOTICE WHERE REGEXP_LIKE(TITIE, <정규식>);

<종류>

  • 패턴
    • . : 문자 하나
    • | : 또는(OR), |로 구분된 문자에 해당하는 문자열을 찾음.
    • [] : []안에 나열된 패턴에 해당하는 문자열을 찾음.
    • ^ : 시작하는 문자열을 찾음.
    • $ : 끝나는 문자열을 찾음.
  • 수의 제한
      • : 0회 이상 나타나는 문자
      • : 1회 이상 나타나는 문자
    • {m, n} : m회 이상 n회 이하 나타나는 문자
    • ? : 0~1회 나타나는 문자
  • 문자 그룹
    • [A-z] 또는 [:alpha:] 또는 \a : 알파벳 대문자 또는 소문자인 문자열을 찾음
    • [0-9] 또는 [:digit:] 또는 \d : 숫자인 문자열을 찾음
  • 부정
    • [^문자] : 괄호 안의 문자를 포함하지 않은 문자열을 찾음

문자열 비교를 위한 정규식

링크텍스트

  • 위의 링크를 참고하여 정규식을 공부하자.

ROWNUM 그리고 행 제한하기

  • 옆에 비어있는 열이 ROWNUM에 해당된다.
  • 조회된 순서대로 순번을 매긴다.
-- 5번째까지 추출
SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 1 AND 5;
  • 하지만 위의 코드는 틀렸다.
  • 만약 아래와 같이 쿼리를 작성한다면 아무것도 추출되지 않을 것이다.
SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 2 AND 8;
  • 왜냐하면 ROWNUM은 테이블에서 하나의 ROW를 추출하면서 생성이되는 위의 코드에서는 2부터 8이기에 처음 ROWNUM이 1이여서 해당 ROW는 빼버린다. 그래서 애초에 아무것도 들어가지 못하면서 검색이 안되는 것이다.
  • 아래와 같이 해야한다.
SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 2 AND 5;
  • ROWNUM을 NUM으로 별칭을 붙여 NOTICE 테이블에 삽입하여 새로운 테이블을 형성한다.
  • 그 다음 새로 생성된 테이블에서 NUM에 대하여 BETWEEN으로 ROW를 찾아주면 검색이 된다.

중복 값 제거 DISTINCT

  • DISTINCT : 중복된 값은 하나의 ROW만을 보여준다.

오라클 함수

  • 구글을 통해서 공부하자

SELECT문의 구절

<작성 순서>
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY
<동작 순서>
FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

  • FROM
    • 격자형 테이블이 자리한다.
  • WHERE
    • 필터링 조건
  • GROUP BY(COUNT, AVG)
    • 집계함수(SUM, MIN, MAX, COUNT, AVG)
SELECT WRITER_ID, COUNT(ID) FROM NOTICE GROUP BY WRITER_ID;
  • HAVING
    • 집계 조건
    • WHERE 절에서는 쓸 수 없다.
SELECT WRITER_ID, COUNT(ID) FROM NOTICE
GROUP BY WRITER_ID
HAVING COUNT(ID) <= 2;
  • ORDER BY
    • 정렬 : ASC(오름차순), DESC(내림차순)
    • 아래와 같이 2차 정렬도 가능하다.
      SELECT * FROM NOTICE ORDER BY HIT DESC, REGDATE DESC;

ROW_NUMBER(), RANK(), DENSE_RANK()

  1. ROW_NUMBER()
  • 정렬을 하고 ROWNUM을 붙이고 싶은 경우가 있다.
  • 일반적으로 ROWNUM을 붙인다면 막 섞인다.
  • 정렬을 하고 ROWNUM을 붙이고 싶다면 ROW_NUMBER()함수를 사용하라.
SELECT ROW_NUMBER() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE
ORDER BY HIT;
  1. RANK()
  • RANK 함수는 중복 값들에 대해서는 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 개수만큼 떨어진 순위로 출력하도록 하는 함수이다.
SELECT RANK() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE
ORDER BY HIT;
  1. DENSE_RANK()
  • DENSE_RANK() 함수는 중복 값들에 대해서는 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 값 개수와 상관없이 순차적인 순위 값을 출력하도록 하는 함수이다.
SELECT DENSE_RANK() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE
ORDER BY HIT;

부조회(서브쿼리)

서브 쿼리를 사용하는 경우
--> 구절의 순서를 바꿔야 하는 경우
?. 만약 정렬한 결과에서 1에서 5까지의 ROWNUM을 가진 행을 뽑으려면?

  • 서브쿼리를 사용하여 정렬을 한 결과에서 ROWNUM을 뽑는다.
SELECT *
FROM (SELECT * FROM NOTICE ORDER BY REGDATE DESC) -- 서브쿼리
WHERE ROWNUM BETWEEN 1 AND 5;

?. 나이가 평균 나이 이상인 회원의 ID와 나이 조회

SELECT ID, AGE
FROM MEMBER
WHERE AGE >= (SELECT AVG(AGE) FROM MEMBER);

조인(join)

  • 관계형 DB에서는 중복 데이터를 피하기 위해서 데이터를 쪼개서 여러 테이블로 나눠서 저장한다.
  • 이렇게 분리되어 저장된 데이터에서 원하는 결과를 다시 도출하기 위해서는 여러 테이블을 조합할 필요가 있다.
  • 이때 조합하는 연산을 JOIN이라고 한다.

    JOIN 연산 후

  1. INNER JOIN(내부 조인)
  • 관계가 있는 레코드들만 합치는 조인을 INNER JOIN이라고 한다.
  • 교집합이다.
  • 둘 이상의 테이블에 존재하는 공통 속성의 값이 같은 것을 결과로 추출한다.
  • 관계가 없는 것(OUTER)들은 빼고 관계가 있는(INNER)만 남아서 합쳐진다.
SELECT * 
FROM MEMBER 
INNER JOIN NOTICE ON MEMBER.ID = notice.writer_id;
  1. OUTER JOIN(외부 조인)
  • 조인하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블의 내용을 모두 철력하는 것이다.

  • 종류로는 LEFT/RIGHT/FULL OUTER JOIN이 있다.

    • LEFT OUTER JOIN : 해당 JOIN 식기준 왼쪽 테이블의 OUTER값을 포함
    • RIGHT OUTER JOIN : 해당 JOIN 식기준 오른쪽 테이블의 OUTER값을 포함
    • FULL OUTER JOIN : 두 테이블의 모든 OUTER를 포함
  • 여기서 빈 값들은 NULL값으로 채워진다.

~36강까지

0개의 댓글