본문 바로가기
Database

4/21 - SQL 데이터 정의어, 오라클 함수

by Jiwon_Loopy 2025. 4. 27.
반응형

목차


SELECT


  • 구조
SELECT 컬럼 명
FROM 테이블 명
WHERE 조건
GROUP BY 컬럼명
HAVING 조건 (그룹의 조건 != WHERE)
ORDER BY 컬럼명;

모델링


  • Entity (개체) - table
  • Attribute (속성) - column
  • Relation (관계) - fk

PK (Primary Key, 기본키)


  • 데이터 식별을 위한 키
  • 중복 불가 (유니크 제약 조건)
  • 인덱스 자동 추가

FK (Foreign Key, 외래키)


  • 다른 데이터의 PK를 참조하는 키
  • 정규화로 인해 생성
  • 이 컬럼으로 조인

식별, 비 식별 관계


  • 식별 관계 - PK ↔ FK
    • 개별 테이블 삭제 가능
  • 비 식별 관계 - PK ↔ 일반 컬럼
    • 테이블 삭제 시 연관된 테이블까지 같이 삭제
    • 점선

별칭


  • 최종 출력되는 열 이름을 임의로 지정할 수 있음
  • NULL값 존재 시 연산을 아예 수행하지 않음
select ename, sal, sal*12+comm, comm
from emp;

출력 결과

ename sal sel*12+comm comm
SMITH	800		
ALLEN	1600	19500	300
WARD	1250	15500	500
JONES	2975  (null) (null)
MARTIN	1250	16400	1400
BLAKE	2850		(null) (null)
CLARK	2450		(null) (null)
SCOTT	3000		(null) (null)
KING	5000		(null) (null)
TURNER	1500	18000	0
ADAMS	1100		(null) (null)
JAMES	950		(null) (null)
FORD	3000		(null) (null)
MILLER	1300		(null) (null)
  • AS를 사용하여 별칭 지정
    • as를 생략할 수도 있다.
    • as를 기준으로 뒤의 이름이 별칭으로 지정된다.
    • 컬럼명 뒤, 테이블명 뒤, 서브쿼리 뒤
    • result set (결과 뒤 집합)에 표시
    • 컬럼명에 사용 가능하다.
select ename, sal, sal*12+comm as annsal, comm
from emp;

출력 결과

ename sal  annsal comm
SMITH	800		
ALLEN	1600	19500	300
WARD	1250	15500	500
JONES	2975	(null) (null)
MARTIN	1250	16400	1400
BLAKE	2850		(null) (null)
CLARK	2450		(null) (null)
SCOTT	3000		(null) (null)
KING	5000		(null) (null)
TURNER	1500	18000	0
ADAMS	1100		(null) (null)
JAMES	950		(null) (null)
FORD	3000		(null) (null)
MILLER	1300		(null) (null)

ORDER BY(순서)


  • 데이터의 순서를 정렬 할 때 사용
  • (열)번호로도 정렬할 수 있다.
  • 오라클에서 Sql 구문의 가장 끝 부분에 작성한다.
ORDER BY 컬럼 명
FROM 테이블 명
ORDER BY 컬럼명 [, 컬럼명...(여러 열 지정 가능)] [정렬 옵션]
  • 정렬하려는 열 이름 하나 이상을 지정해야 함
  • 종류
    • ASC - 오름차순
    • DESC - 내림차순
    • 기본 값은 오름차순
  • 여러 개 사용 시, 앞에 정렬 후 뒤에 정렬
select *
from emp
order by sal;

출력 결과

EMPNO ENAME  JOB  MGR   HIREDATE  SAL  COMM  DEPTNO
7369	SMITH	CLERK	7902	80/12/17	800		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7876	ADAMS	CLERK	7788	87/05/23	1100		20
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7934	MILLER	CLERK	7782	82/01/23	1300		10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7788	SCOTT	ANALYST	7566	87/04/19	3000		20
7902	FORD	ANALYST	7566	81/12/03	3000		20
7839	KING	PRESIDENT		81/11/17	5000		10

WHERE


  • 더 정확하고 다양한 결과를 출력
  • 특정 조건을 기준으로 원하는 행을 출력
SELECT [조회할 열]
FROM [조회할 테이블]
WHERE [조건식]
SELECT *
FROM EMP
WHERE DEPTNO = 30;

출력 결과

EMPNO ENAME  JOB  MGR   HIREDATE  SAL  COMM  DEPTNO
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7900	JAMES	CLERK	7698	81/12/03	950		30
  • 여러 조건 식
  • AND, OR 연산자 사용 가능
    • AND
      • 둘 다 참일 경우
      • 조건이 ~중에서 이거
      • ~하고
      SELECT *
      FROM EMP
      WHERE DEPTNO = 30 AND JOB = 'SALESMAN';
      
      출력 결과
      
      EMPNO ENAME  JOB  MGR   HIREDATE  SAL  COMM  DEPTNO
      7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
      7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
      7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
      7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
      
    • OR
      SELECT *
      FROM EMP
      WHERE DEPTNO = 30 OR JOB = 'CHECK';
      
      출력 결과
      
      EMPNO ENAME  JOB  MGR   HIREDATE  SAL  COMM  DEPTNO
      7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
      7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
      7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
      7698	BLAKE	MANAGER	7839	81/05/01	2850		30
      7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
      7900	JAMES	CLERK	7698	81/12/03	950		30
      ​
      • 하나라도 참인 경우
      • 조건이 ~랑 ~
      • ~하거나

 

연산자


  • 연산자를 사용할 수도있다.
SELECT *
FROM EMP
WHERE SAL * 12 = 36000;

출력 결과

EMPNO ENAME  JOB  MGR   HIREDATE  SAL  COMM  DEPTNO
7788	SCOTT	ANALYST	7566	87/04/19	3000		20
7902	FORD	ANALYST	7566	81/12/03	3000		20
  • NOT 연산자는 값이 다르면 출력한다.
  • 문자열을 등호로 비교하면 사전 순으로 비교한다.
    • <>, ! =, ^= 이 세가지는 같다. (서로 다름을 나타내는 연산자)
SELECT *
FROM EMP
WHERE SAL != 3000;

출력 결과

EMPNO ENAME  JOB  MGR   HIREDATE  SAL  COMM  DEPTNO
7369	SMITH	CLERK	7902	80/12/17	800		20
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7839	KING	PRESIDENT		81/11/17	5000		10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7876	ADAMS	CLERK	7788	87/05/23	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7934	MILLER	CLERK	7782	82/01/23	1300		10
  • IN, NOTIN 연산자
    • 특정 열에 해당하는 조건을 여러 개 지정
    SELECT [조회할 열 이름]
    FROM [조회할 테이블 이름]
    WHERE 열 이름 IN (데이터1, 데이터2 ...);
    
    SELECT *
    FROM EMP
    WHERE JOB IN ('MANAGER', 'SALESMAN', 'CLERK')
    
    출력 결과
    
    EMPNO ENAME  JOB        MGR   HIREDATE  SAL  COMM  DEPTNO
    7369	SMITH	CLERK	      7902	80/12/17	800		       20
    7499	ALLEN	SALESMAN	  7698	81/02/20	1600	300	   30
    7521	WARD	SALESMAN	  7698	81/02/22	1250	500	   30
    7566	JONES	MANAGER	    7839	81/04/02	2975		     20
    7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	 30
    7698	BLAKE	MANAGER	    7839	81/05/01	2850		     30
    7782	CLARK	MANAGER	    7839	81/06/09	2450		     10
    7844	TURNER	SALESMAN	7698	81/09/08	1500	0	     30
    7876	ADAMS	CLERK	      7788	87/05/23	1100		     20
    7900	JAMES	CLERK	      7698	81/12/03	950		       30
    7934	MILLER	CLERK	    7782	82/01/23	1300		     10
    
  • BETWEEN A AND B 연산자
    SELECT *
    FROM EMP
    WHERE SAL BETWEEN 2000 AND 3000
    
    출력 결과
    
    EMPNO ENAME  JOB    MGR   HIREDATE  SAL  COMM  DEPTNO
    7566	JONES	MANAGER	7839	81/04/02	2975		     20
    7698	BLAKE	MANAGER	7839	81/05/01	2850		     30
    7782	CLARK	MANAGER	7839	81/06/09	2450		     10
    7788	SCOTT	ANALYST	7566	87/04/19	3000		     20
    7902	FORD	ANALYST	7566	81/12/03	3000		     20
    
    • 최솟값 이상 최댓값 이하로 판단한다. (경계값 포함)
    • 날짜를 비교할 때 시간이 들어있으면 검색이 안된다.
      • 예를 들어 '2024-04-03’의 경우 00시 00분 00초 까지만 검색되므로, 23:59:59를 밝혀주거나, 04-04로 해주어야 한다.
      • 날짜의 경우 직접 포맷팅 해주어야 한다. (기본 설정은 81/04/02 형식)
  • SELECT [조회할 열 이름] FROM [조회할 테이블 이름] WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;
  • LIKE 연산자와 와일드카드
    SELECT *
    FROM EMP        
    WHERE ENAME LIKE 'S%';
    
    출력 결과
    
    EMPNO ENAME  JOB    MGR   HIREDATE  SAL  COMM  DEPTNO
    7369	SMITH	CLERK	7902	80/12/17	800		20
    7788	SCOTT	ANALYST	7566	87/04/19	3000		20
    
    • 종류
      • NOTLIKE
      • _
        • 어떤 값이든 상관없이 한 개의 문자 데이터
        • 한 글자
        • 1개
          • ‘_S’ - 끝이 S인 2글자
          • ‘S_’ - S로 시작하는 2글자
          • ‘S’ - S가 포함된 3글자
      • %
        • 길이와 상관없이(문자 없는 경우 포함) 모든 문자 데이터
        • 여러 글자
        • 0개 이상
          • ‘%S’ - 끝이 S
          • ‘S%’ - S로 시작
          • ‘%S%’ - S가 포함된
  • 컬럼명 LIKE '%'

IS NULL


  • NULL값을 찾아준다.

집합 연산자


  • 조회한 결과를 하나의 집합처럼 사용 가능하다.
  • UNION
    • 두 개 이상의 SELECT 결과문을 합쳐서 반환할 수 있다.
    • 타입(열의 자료형)이 다르면 오류가 난다.
    • 갯수가 다르면 오류가 난다.
    • 중복은 제거된다.
    SELECT EMPNO, ENAME, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 10
    UNION
    SELECT EMPNO, ENAME, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 20;
    
    출력 결과
    
    7369	SMITH	800	20
    7566	JONES	2975	20
    7782	CLARK	2450	10
    7788	SCOTT	3000	20
    7839	KING	5000	10
    7876	ADAMS	1100	20
    7902	FORD	3000	20
    7934	MILLER	1300	10
    
  • UNION ALL
    • 중복된 결과 값도 모두 출력
    SELECT EMPNO, ENAME, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 10
    UNION ALL
    SELECT EMPNO, ENAME,DEPTNO , SAL
    FROM EMP
    WHERE DEPTNO = 10;
    
    출력 결과
    
    7782	CLARK	2450	10
    7839	KING	5000	10
    7934	MILLER	1300	10
    7782	CLARK	10	2450
    7839	KING	10	5000
    7934	MILLER	10	1300
    
  • MINUS
    • 차집합의 개념이다.
  • INTERSECT
    • 교집합의 개념이다.

연산자 우선 순위


  • 헷갈릴 때는 괄호로 묶자
  • 가장 높은 연산자는 *,/ 이고, 가장 낮은 것은 OR이다.

데이터 처리와 가공을 위한 오라클 함수


  • 함수
    • X → Y 가 되는 식
    • 오라클도 함수가 존재
    • 내장 함수와 사용자 정의 함수가 존재

문자 데이터 가공 함수


  • UPPER
    • 대문자 변환
  • LOWER
    • 소문자 변환
  • INITCAP
    • 첫 글자는 대문자로, 나머지 문자를 소문자로 반환
SELECT ENAME, UPPER(ENAME), LOWER(ENAME), INITCAP(ENAME)
FROM EMP;

출력 결과

SMITH	SMITH	smith	Smith
ALLEN	ALLEN	allen	Allen
WARD	WARD	ward	Ward
JONES	JONES	jones	Jones
MARTIN	MARTIN	martin	Martin
BLAKE	BLAKE	blake	Blake
CLARK	CLARK	clark	Clark
SCOTT	SCOTT	scott	Scott
KING	KING	king	King
TURNER	TURNER	turner	Turner
ADAMS	ADAMS	adams	Adams
JAMES	JAMES	james	James
FORD	FORD	ford	Ford
MILLER	MILLER	miller	Miller

문자열 길이


  • LENGTH
    • 길이를 출력
    • SELECT ENAME, LENGTH(ENAME) FROM EMP; 출력 결과 SMITH 5 ALLEN 5 WARD 4 JONES 5 MARTIN 6 BLAKE 5 CLARK 5 SCOTT 5 KING 4 TURNER 6 ADAMS 5 JAMES 5 FORD 4 MILLER 6
  • LENGTHB
    • 바이트 길이 출력
    • SELECT LENGTH('한글'), LENGTHB('한글') FROM DUAL; 출력 결과 LENGTH('한글') LENGTHB('한글') 2 6
  • MySql은 LENGTH가 오라클의 LENGTHB와 같다. (한글이 3byte)

DUAL 테이블


  • 최고 권한 관리자 계정인 SYS의 소유 테이블로, 더미 테이블
  • 주로 실험용, 값 확인 용도로 사용

문자열 추출


  • SUBSTR
    • 문자열 일부 추출
    • 시작 인덱스는 1이다.
    • SUBSTR(문자열, 시작 위치, 추출 길이)
      • 문자열의 시작 위치부터 추출 길이까지 추출
      • 시작 위치가 음수일 경우 마지막 위치에서 거슬러 올라간 위치에서 시작
    • SUBSTR(문자열, 시작 위치)
      • 시작 위치부터 끝까지 추출
      • 음수일 경우 마지막 위치부터 거슬러 올라간 위치에서 끝까지 추출
SELECT JOB, SUBSTR(JOB,1,2), SUBSTR(JOB,3,2), SUBSTR(JOB,5)
FROM EMP;

출력 결과

CLERK	    CL	ER	K
SALESMAN	SA	LE	SMAN
SALESMAN	SA	LE	SMAN
MANAGER	  MA	NA	GER
SALESMAN	SA	LE	SMAN
MANAGER	  MA	NA	GER
MANAGER  	MA	NA	GER
ANALYST	  AN	AL	YST
PRESIDENT	PR	ES	IDENT
SALESMAN	SA	LE	SMAN
CLERK   	CL	ER	K
CLERK	    CL	ER	K
ANALYST 	AN	AL	YST
CLERK	    CL	ER	K
SELECT JOB,
       SUBSTR(JOB, -LENGTH(JOB)),
       SUBSTR(JOB, -LENGTH(JOB),2),
       SUBSTR(JOB, -3)
FROM EMP;

출력 결과

CLERK	     CLERK	  CL	ERK
SALESMAN	SALESMAN	SA	MAN
SALESMAN	SALESMAN	SA	MAN
MANAGER	   MANAGER	MA	GER
SALESMAN	SALESMAN	SA	MAN
MANAGER	   MANAGER	MA	GER
MANAGER	   MANAGER	MA	GER
ANALYST	   ANALYST	AN	YST
PRESIDENT	PRESIDENT	PR	ENT
SALESMAN	SALESMAN	SA	MAN
CLERK	     CLERK	  CL	ERK
CLERK	     CLERK	  CL	ERK
ANALYST	  ANALYST	  AN	YST
CLERK	     CLERK	  CL	ERK
  • 특정 문자 위치를 찾는 함수와 같이 쓰인다

특정 위치 찾는 함수


  • INSTR
INSTR([대상 문자열 데이터(필수)]),
			[위치를 찾으려는 부분 문자(필수)],
		  [위치 찾기를 시작할 대상 문자열의 위치(선택, 기본 값 = 1)],
		  [시작 위치에서 찾으려는 문자가 몇 번째인지 지정(선택, 기본 값 = 1)]
SELECT INSTR('HELLO, ORACLE!', 'L') AS INSTR_1,
       INSTR('HELLO, ORACLE!', 'L',5) AS INSTR_2,
       INSTR('HELLO, ORACLE!', 'L',2,2) AS INSTR_3
  FROM EMP;
  
  
  
출력 결과
  
3	12	4
  • INSTR 함수로 사원 이름에 문자 S가 있는 행 구하기
SELECT *
  FROM EMP
WHERE INSTR(ENAME,'S') > 0

또는 LIKE 연산자 예제

SELECT *
FROM EMP
WHERE ENAME LIKE '%S%'

출력 결과

7369	SMITH	CLERK	7902	80/12/17	800		20
7566	JONES	MANAGER	7839	81/04/02	2975		20
7788	SCOTT	ANALYST	7566	87/04/19	3000		20
7876	ADAMS	CLERK	7788	87/05/23	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30

SQL 실행 시 에러


  • DBMS에서 응답하는 에러 메세지 확인
  • 에러가 발생하는 위치 찾아 수정
  • 재실행

메모


  • ORDER BY는 항상 끝에
  • from 안에 select 문 → 서브 쿼리
  • oder by, join 은 연산이 많아 느려질 수 있다.
  • SQL에서 문자열은 홑 따옴표(’’)를 쓴다.
  • 집계 함수는 null연산을 제외한다.
  • 심화 - 각 select문에 해당하는 것을 1,2로 매칭 후 1,2를 오름차순 정렬하고, 6번째 열인 sal을 그 안에서 오름차순 정렬
SELECT emp.*, 1
from emp
where deptno= 10
union
select emp.*, 2
from emp
where deptno = 20
order by 9, 6;

출력 결과

EMPNO ENAME    JOB    MGR   HIREDATE  SAL  COMM  DEPTNO
7934	MILLER	CLERK	7782	82/01/23	1300		10	1
7782	CLARK	 MANAGER	7839	81/06/09	2450		10	1
7839	KING	PRESIDENT		81/11/17	5000		10	1
7369	SMITH	  CLERK	7902	80/12/17	800		20	2
7876	ADAMS	  CLERK	7788	87/05/23	1100		20	2
7566	JONES	 MANAGER	7839	81/04/02	2975		20	2
7788	SCOTT	 ANALYST	7566	87/04/19	3000		20	2
7902	FORD	 ANALYST	7566	81/12/03	3000		20	2
  • SELECT 구문에서 문자 데이터 가공 함수를 쓸 때, 값 불일치가 나게 되면 오류가 난다.
    • 예를 들어 SUM AVG와 같이 UPPER를 썼을 경우, SUM, AVG 같은 함수는 총합으로 1번만 실행하는 반면, 1행 씩 총 14번을 출력하는 UPPER함수는 오류가 남
    • ENAME은 14번 출력, SUM은 1번 출력 이므로
    SELECT ENAME, UPPER(ENAME), SUM(SAL)
    FROM EMP;
    
    출력 결과
    
    ORA-00937: not a single-group group function
    
    <https://docs.oracle.com/error-help/db/ora-00937/00937>. 00000 -  "not a single-group group function"
    *Cause:    A SELECT list cannot include both a group function,
               such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, and an
               individual column expression, unless the individual column
               expression was included in a GROUP BY clause.
    *Action:   Drop either the group function or the individual
               column expression from the SELECT list or add a GROUP BY
               clause that includes all individual column expressions listed.
    1행, 8열에서 오류 발생
    
  • GROUP BY 함수를 이용하여 해결 해야 함
  • 오라클은 무존건 FROM을 써야함
    • 쓸 것이 없을 때 DUAL을 쓰면 됨
  • 중첩해서 함수를 쓸 경우 안쪽 우선
728x90
반응형