Programming/SQL

오라클 내장 함수중 문자열 함수. 2021-07-01

최동훈1 2021. 7. 1. 16:31

오늘 내가 처음 인지한 내용은 SELECT 문에서 '행' 을 선별할지, '열'을 선별할지 구분하는 것이다.

SELECT PHONE AS p, NAME FROM MEMEBER WHERE ID LIKE 'ab%';

여기서 FROM 절 앞에 오는 것은 '열(COLUMN)' 의 선별이고 WHERE 절 뒤에 오는 조건은 어떤 '행(ROW)'을 선별하는 조건이다.

 

그런데 내장함수는 FROM 절 앞에서 자주 쓰이며, '칼럼' 을 선별하기 위해서 쓰인다. 물론, WHERE 절뒤 조건절에  행(ROW)를 선별하기 위햇 쓰일 수는 있지만, 만약 테이블이 수만개 되면 모든 행을 조건에 맞는지, 검사할때마다, 함수를 호출해야 하기 떄문에 CPU에 부담이 될수 있어서 가급적, 행을 선별할때는 LIKE, REGEXP_LIKE, OR ,IN, BETWEEN, 등의 연산자를 쓰는 편이 낫다. 

칼럼(열)은 이미 WHERE 조건절에서 걸러진 열(레코드)를 대상으로 하면 필터링이 된다. 그래서 내장함수는 주로 열(칼럼) 조건으로 붙인다. (행과 열의 구조를 잘 생각해보기 바람. )

 

오라클의 문자열 함수는 SUBSTR이 있다.

SUBSTR사용범

백문이 불여일타라고, 문제를 풀면서 익숙해져보자. 백번보는거 보다. 한번 치는게 더 기억에 남는다.

 

1. 첫번째 답. / 테이블명은 MEMBER, 생년칼럼 이름은 BIRTH로 함.

 

SELECT * FROM MEMBER WHERE SUBSTR(BIRTH,6,2) IN('07','08','09');

SELECT * FROM MEMBER WHERE REGEXP_LIKE(BIRTH,'^\d{4}-0[789]-*&');

--둘다 가능 그러나 2번째 방법이 더 바람직함. 이유: 행(ROW)이 많으면 함수호출이 많아져
--CPU에 부담. BUT 연산자는 부담 없음.

그러나 난 처음에 IN 이라는 연산자를 생각하지 못하고, 논리연산자인 | 을 썼다.. 왜 그랬는지 모르겠다. 

 

다시 복습하자면 SQL에서 비교연산자는 =, !=, <=, >=, IS NULL, IS NOT NULL 이 있가.

관계연산자는 AND, OR, BETWEEN, IN, NOT 등만 존재한다. 일반적인 프로그래밍 언어에서 쓰이는 &&나, | 등은 쓰이지 않는다.

(쓰일때도 있는데 그건 "정규식 패턴" 에서만 사용한다. 정규식 패턴에서 사용하는 관계연산자: ^, | 등)

 

2. 두번쨰 답.

SELECT * FROM MEMBER WHERE PHONE IS NULL AND SUBSTR(BIRTH,6,2) IN('07','08','09');

SELECt * FROM MEMBER WHERE PHONE IS NULL AND 
SUBSTR(BIRTH,6,2)='07' OR SUBSTR(BIRTH,6,2)='08' OR SUBSTAR(BIRTH,6,2)='09';

--둘다 같은 기능을 수행한다. 그러나 IN 연산자를 쓰는 것이 훨씬 더 보기좋고 코드도 짧다.

 

다음은 문자열을 처리하는 또 다른 함수들이 있는데, 그나마 많이쓰이는 함수는 UPPER, LOWER 등이다.

UPPER, LOWER 사용법

문제를 풀어보자.

답:

SELECT * FROM MEMBER WHERE (LOWER)ID='newlec';
SELECT * FROM MEMBER WHERE (UPPER)ID= 'NEWLEC'; 

이렇게 조건검색을 할 칼럼(열)을 소문자화 시키거나 대문자화 시켜서 검색해주면 된다.

 

공부시간 2시간.

순공부시간 1시간.

 

오늘은 오라클 내장함수중 문자열에 관련된 함수들을 학습하였다. 또, mySQL을 설치하기 위해 노력중인데.. 결국 설치 못했다. 또 백준 쉬운 계단수 문제를 도전했는데 역시 어려워서 다른 블로그를 참고했다. ㅠㅠ