Oracle SQL(2)

YangJiWon·2021년 1월 6일
0

DB

목록 보기
2/12

WHERE

  • SELECT와 FROM과 같이 쓰이며, 조건을 붙이고 싶을 때 쓴다.
SELECT empno, ename, sal
FROM emp
WHERE sal <= 1000;

SELECT empno, ename, sal, hiredate
FROM emp
WHERE hiredate > '81/01/01';
  • WHERE절에서 조건식을 이용하여 데이터를 검색할 때는 반드시 문자 데이터와 날짜 데이터는 ' '을 감싸서 사용해야 한다.
SELECT empno, ename, sal
FROM emp
WHERE sal BETWEEN 1000 AND 2000;
-- 1000과 2000 사이의 연봉
-- BETWEEN a AND b : a와 b 사이에 포함되는

SELECT empno, ename, hiredate
FROM emp
WHERE hiredate BETWEEN '81/01/01' AND '81/12/31';
-- 날짜 연산도 가능하다.
  • BETWEEN을 사용할 때 주의해야 할 점은 a < b여야 한다.
  • BETWEEN a AND b <==> a <= x <= b

비교 할때 대소문자 주의점

  • SQL문은 대소문자를 구별하지 않는다. 하지만 테이블에 저장된 데이터 값인 리터럴은 대소문자를 구별한다.
  • 따라서 테이블에 저장된 데이터 값이 대문자인 경우에는 조건식에 사용하는 리터럴 값도 반드시 대문자로 지정해야 원하는 데이터를 얻을 수 있다.

IN 연산자

  • 하나의 값이 아닌 목록에 지정된 여러 개의 값을 한꺼번에 비교할 때 사용하는 연산자로서 내부적으로 OR 연산자로 실행된다.
  • 비교가능한 값은 수치 데이터뿐만 아니라 문자 및 날짜 데이터 비교에 모두 사용 가능하다.
SELECT ename
FROM emp
WHERE sal IN (1250, 5000);

-- 사원테이블에서 JOB이 MANAGER이면서 20번 부서에 속하거나
-- JOB이 CLERK이면서 30번 부서에 속하는 사원의 정보를 출력 
SELECT ename, job, deptno
FROM emp
WHERE (JOB, DEPTNO) IN ( ('MANAGER', 20), ('CLERK', 30) );

SELECT empno, ename
FROM emp
WHERE hiredate IN ('81/04/02', '81/12/03', '81/09/08');

NULL 비교

SELECT comm
FROM emp
WHERE comm = null;
-- null 값 비교가 안됌

SELECT comm
FROM emp
WHERE comm is null;
-- null 비교는 이렇게 해야 함

SELECT comm
FROM emp
WHERE comm is not null;
-- null이 아닐 때는 이렇게 비교

LIKE 연산자

  • 검색하고자 하는 문자열을 정확히 알 수 없는 경우에 사용한다.
  • 전체가 아닌 임의의 문자만 일치하더라도 데이터 검색이 가능하다.
와일드 카드 문자설명
%%위치에 0개 이상의 문자(열)과 대체
__ 위치에반드시 1개 문자와 대체
  • 검색하고자 하는 문자열에 패턴 매칭 연산자(와일드 카드)가 포함되어 있을 때에는 ESCAPE 옵션을 사용한다.
WHERE 컬럼명 LIKE '%$_%' ESCAPE '$';

위 코드에서는 ESCAPE 문자로 $문자를 설정했다. 따라서 ESCAPE 문자인 $뒤의 한 글자는 와일드카드로 인식하지 않고 글자 그대로 인식하라는 뜻이다.
따라서 위 코드 실행 시 _ 문자가 포함된 레코드가 검색된다.

  • ESCAPE는 사용자가 임의의 문자로 지정할 수 있기 때문에 '@' 또는 'E'같은 사용자가 원하는 문자로 대체될 수 있다.
SELECT empno, ename, job
FROM emp
WHERE job LIKE '%E___' ESCAPE 'E';

위 코드를 보면 __문자가 3개가 있으나 ESCAPE 옵션을 사용했기 때문에 ESCAPE 문자 E 뒤에 오는 는 문자가 아닌 일반문자로 처리가 된다.
따라서 뒤에서 3번째 문자로 _를 가진 사원을 조회할 수 있다.

논리 연산자

  1. AND : 두 개의 조건이 TRUE이면 TRUE 리턴
  2. OR : 두 가지 조건 중 한 가지만 만족하더라도 TRUE
  3. NOT : 지정된 조건이 아닌 데이터를 검색
SELECT empno, ename, job, sal
FROM emp
WHERE job = 'SALESMAN'
AND sal >= 1500;

SELECT ename, sal
FROM emp
WHERE NOT sal <= 3000

SELECT DISTINCT job 
FROM emp
WHERE NOT job = 'SALESMAN';

SELECT empno, ename
FROM emp
WHERE (job = 'CLERK' OR job = 'ANALYST')
AND (comm is null and sal > 1000 and sal < 3000);

SELECT ename, job, sal
FROM emp
WHERE sal NOT IN (800, 900);

SELECT ename
FROM emp
WHERE ename NOT LIKE 'J%';

SELECT empno
FROM emp
WHERE sal NOT BETWEEN 1000 AND 2000;

SELECT empno
FROM emp
WHERE hiredate NOT BETWEEN '81/01/01' AND '81/12/31';

연산자 우선순위

연산자 우선순위연산자
1괄호()
2NOT
3비교 연산자
4AND
5OR

AND연산자와 OR연산자를 같이 사용하는 경우에는 AND연산자가 OR연산자보다 먼저 실행되기 때문에 의도하지 않은 결과가 나올 수 있다.

따라서, 괄호를 적절하게 사용해서 가독성도 높이고 우선순위를 조절하는 것이 필요하다.

SELECT ename, job, sal, comm
FROM emp
WHERE job = 'CLERK' OR job = 'ANALYST'
AND comm IS NULL
AND sal >= 1000
AND sal <= 3000;

SELECT ename, job, sal, comm
FROM emp
WHERE (job = 'CLERK' OR job = 'ANALYST')
AND comm IS NULL
AND sal >= 1000
AND sal <= 3000;

위의 두 개의 코드는 서로 결과가 다르다.


ORDER BY 절

  • 기본적으로 테이블에 저장된 데이터는 정렬되어 있지 않은 상태이다.
  • 따라서 데이터를 조회할 때 명시적으로 특정 칼럼을 기준으로 정렬해서 검색해야 한다.
SELECT [DISTINCT] {*, column [Alias], ...}
FROM 테이블명
[WHERE 조건식]
ORDER BY { column, 표현식} [ASC|DESC];

--      1      2      3    4
SELECT empno, ename, job, sal as "월급"
FROM emp
ORDER BY 4 DESC;
  • ORDER BY 절 뒤에는 컬럼명 또는 표현식이 올 수 있는데, 지정 가능한 표현식으로는 컬럼의 alias와 SELECT 절에서 명시된 컬럼의 순서값을 지정할 수 있다.
  • 위의 문장에서 empno 컬럼은 첫 번째 순서기 때문에 1로 지정이 되고, 그 이후부터는 순서대로 지정이 되기 때문에 ORDER BY 4는 sal 기준으로 정렬이 되는 것이다.
  • 문자, 숫자, 날짜 모두 정렬이 가능하다.
SELECT empno
FROM emp
ORDER BY empno ASC; -- ASC 생략 가능

SELECT empno
FROM emp
ORDER BY empno DESC;

SELECT ename, sal
FROM emp
ORDER BY sal DESC;

SELECT empno, ename, hiredate
FROM emp
ORDER BY hiredate DESC;

SELECT ename, empno, sal as "월급"
FROM emp
ORDER BY 월급;

SELECT ename, sal as 월급, sal * 12 as 연봉
FROM emp
ORDER BY 연봉 DESC;
  • 다중 데이터 정렬도 가능하다.
SELECT [DISTINCT] {*, column [Alias], ...}
FROM 테이블명
[WHERE 조건식]
ORDER BY {column, 표현식}[ASC|DESC], {column, 표현식}[ASC|DESC]

SELECT empno, ename, sal, hire_date
FROM emp
ORDER BY sal DESC, hire_date;
  • 첫 번째로 정렬하고자 하는 컬럼을 ORDER BY 절 바로 뒤에 위치하게 하면 되고, 그 뒤로부터 정렬하고자 하는 컬럼들을 써 넣으면 된다.

만약 정렬하는 컬럼이 널 값이 존재하는 경우에 오라클DB는 가장 큰 값으로 인식한다.

SELECT comm
FROM emp
ORDER BY comm DESC;

단일 행 함수

  • 모든 행에 대해서 각각 적용되어 행의 개수와 동일한 개수의 결과를 리턴
  • SELECT, WHERE, ORDER BY 절에 사용 가능하다.

문자처리 함수

1. INITCAP

  • 첫 글자만 대문자로 변환하여 반환한다.
SELECT INITCAP('ORACLE SQL')
FROM dual;  -- 결과 -> Oracle Sql

SELECT deptno, INITCAP(dname), INITCAP(loc)
FROM dept;

2. LOWER

  • 대소문자가 혼합되어 있거나 대문자를 소문자로 변경한다.
SELECT empno,  dname, LOWER(job)
FROM emp, dept
WHERE ename = 'KING'
AND emp.deptno = dept.deptno;

3. UPPER

SELECT UPPER('abc')
FROM dual -- -> ABC

SELECT empno, ename, job, deptno
FROM emp
WHERE ename = UPPER('scott');

4. concat

  • 두 개의 문자열을 연결하여 하나의 문자열로 반환하는 함수이다.
SELECT CONCAT('Oracle', 'Sql')
FROM dual; -- -> OracleSql

5. LENGTH

  • 문자열의 길이를 반환하는 함수이다.
SELECT LENGTH('Oracle')
FROM dual -- -> 6

SELECT LENGTH('Ora cle')
FROM dual -- -> 7

6. INSTR

  • 문자열에서 특정 문자가 나타나는 위치를 반환한다.
  • INSTR(컬럼명 | 표현식, 검색값, [m, n]
  • m은 문자를 검색하기 위한 시작 위치값을 의미하고, n 값은 몇 번째로 나오는 문자를 검색할지를 결정한다.
SELECT INSTR('MILLER', 'L', 1, 2), INSTR('MILLER', 'X', 1, 2)
FROM dual;
-- 4 0
123456
MILLER
  • 위와 같이 없는 문자를 찾으려고 하면 0을 반환한다.

7. SUBSTR

  • 문자열에서 일부분의 문자열을 추출할 때 사용하는 함수이다.
  • SUBSTR(컬럼명|표현식, m [, n])
  • m은 문자열을 검색하기 위한 시작 위치 값을 의미하고 n값은 반환받을 문자열의 개수를 의미한다.
SELECT SUBSTR('900303-1234567', 8, 1)
FROM dual;
-- 1이 출력

SELECT SUBSTR('900303-1234567', 8 )
FROM dual;
-- 1234567이 출력

SELECT SUBSTR('900303-1234567', -8)
FROM dual;
-- -1234567이 출력
  • 시작 위치값이 음수일 때 뒤에서부터 세게 된다. 예를 들어 위의 음수 -8로 지정되어 있을 경우, 뒤에서 여덟 번째부터 시작된다.

8. LPAD

  • 왼쪽에 문자열을 끼워 넣는 역할을 한다.
  • LPAD(컬럼 | 표현식, n, 'string')
  • n은 전체 자릿수를 의미하고, string은 삽입할 문자열을 의미한다. 삽입할 문자가 없는 경우, 공백으로 채워진다.
SELECT LPAD('MILLER', 10, '*')
FROM dual;

9. RPAD

  • 오른쪽에 문자열을 끼워 넣는 역할을 한다.
  • RPAD(컬럼 | 표현식, n, 'string')
  • n은 전체 자릿수를 의미하고, string은 삽입할 문자열을 의미한다. 삽입할 문자가 없는 경우, 공백으로 채워진다.
SELECT RPAD('MILLER', 10, '*')
FROM dual;

10. REPLACE

  • 특정 문자열을 치환할 때 사용하는 함수이다.
  • REPLACE( 컬럼명 | 표현식, 's1', 's2')
  • s1은 이전 문자열을 의미하고 s2는 새로운 문자열을 의미한다.
SELECT REPLACE('JACK and JUE', 'J', 'BL')
FROM dual;

11. LTRIM

  • 문자열에서 특정 문자를 삭제하기 위한 용도로 사용된다.
  • `LTRIM(컬럼명 | 표현식, 'str')
  • str는 문자열에서 삭제할 문자를 의미한다.
SELECT LTRIM('MILLER', 'M')
FROM dual;

다중 행 함수(그룹 함수)

  • 검색되는 모든 행에 대해서 한번만 적용되고 한 건의 결과만을 리턴
profile
데이터데이터데이터!!

0개의 댓글