DB /day16 / 23.09.13(수) / (핀테크) Spring 및 Ai 기반 핀테크 프로젝트 구축

허니몬·2023년 9월 13일
post-thumbnail

DYA02


01_SELECT.SQL

-- 01_SELECT.SQL
-- 현재 접속중인 유저 이름
SHOW USER;

-- 테이블 목록 확인
SELECT * FROM TAB;

-- 테이블 구조 확인
-- DESC 테이블명
-- : 테이블의 컬럼 이름, 데이터 타입, 길이, NULL 허용 여부 등 특정 데이터 정보 확인
DESC DEPT;
-- DEPT 테이블 : 부서 정보
-- DEPTNO NOT NULL NUMBER(2)    -> 부서 번호
-- DNAME           VARCHAR2(14) -> 부서명
-- LOC             VARCHAR2(13) -> 부서 지역

DESC EMP;
-- EMP 테이블 : 사원 정보
-- EMPNO    NOT NULL NUMBER(4)    -> 사원번호
-- ENAME             VARCHAR2(10) -> 사원 명
-- JOB               VARCHAR2(9)  -> 담당 업무
-- MGR               NUMBER(4)    -> 상사 사원번호
-- HIREDATE          DATE         -> 입사일
-- SAL               NUMBER(7,2)  -> 급여
-- COMM              NUMBER(7,2)  -> 커미션
-- DEPTNO            NUMBER(2)    -> 부서번호

/*
# 오라클 자료형
- NUMBER : 숫자 데이터를 저장
  > NUMBER ( percision, scale )
    : percision 은 소수점을 포함한 전체 자릿수를 의미, scale 은 소숫점 이하 자릿수 지정
    Ex) 정수 - NUMBER(5)
        실수 - NUMBER(10, 2) -> 10 : 소숫점 포함 전체 자리 / 2 : 소숫점 이하 자릿수
    
    VARCHAR2 : 가변길이의 문자열 저장
    > VARCHAR2( 가변형 ) 
      Ex) VARCHAR2( 10 ) : 최대 10글자 까지 가능, 저장되는 문자 수 만큼 사용
      
    CHAR : 고정된 길이의 문자 데이터 저장
    > CHAR( 고정형 )
    Ex) CHAR(10) -> 10 글자 확정 / 1글자를 써도 공간이 10개의 공간을 사용
    
    DATE : 날짜 및 시간   
*/
/*
# SELECT
- 데이터를 조회하기 위한 SQL 명령어

# 형식
SELECT [DISTINCT] { *, COLUMN,...}
FROM TABLE_NAME;
-> SELECT 문은 반드시 FROM이라는 2개의 키워드로 구성
   SELECT 절 뒤에는 출력하고자 하는 컬럼 이름
   * : 전체

   FROM 절 다음에는 조회하려는 테이블 이름
*/
-- DEPT 테이블 전체 목록
SELECT * FROM DEPT;

-- 특정 데이터만 보기
-- : DEPT 테이블의 부서번호, 부서이름 조회
SELECT DEPTNO, DNAME
FROM DEPT;

-- EMP 테이블 전체 목록
SELECT * FROM EMP;

-- 산술연산 // NULL 값은 연산 불가
SELECT SAL + COMM "연산"
FROM EMP;

SELECT SAL + 100 "연산+100"
FROM EMP;

SELECT SAL - 100 "연산-100"
FROM EMP;

SELECT SAL * 100 "연산*100"
FROM EMP;

SELECT SAL / 100 "연산/100"
FROM EMP;

/*
# NULL
- 행의 특정 열의 값이 없는 경우, 해당 값이 NULL 이거나 NULL 을 포함 한다고 함
- 모든 데이터 유형은 NULL 을 포함 할 수 있음
- 0 도 아니고, 빈 공간도 아님
  미확정, 알수 없는 값을 의미
  >> ? 혹은 무한의 의미이므로 연산, 할당, 비교가 불가능
*/
SELECT ENAME, SAL, JOB, COMM, SAL*12 "SAL연산", SAL*12+COMM "SAL플곱연산"
FROM EMP;

/*
# NVL 함수
- 컬럼의 값이 NULL 인 경우 지정한 값으로 출력되고,
  NULL 이 아니면 원래 값을 그대로 출력
  
- NVL( 컬럼명, 지정 값 ) 
*/
SELECT ENAME, SAL, COMM, NVL(COMM,0) AS "NULL 0처리", SAL*12+NVL(COMM,0) AS Annsal -- AS 안써도됨
FROM EMP;
/*
# ALIAS
- 열 머리글의 이름을 변결할 때 사용
- 컬럼 이름 대신 별칭을 출력하고자 하면, 컬럼을 기술한 바로 뒤에 AS 기워드를 사요한 후 별칭을 기술
*/

-- 소문자를 쓰고 싶으면 쌍따옴표 처리 해야함 / 한글도 됨 -> 다른쪽에서는 안될수도??? 그땐 쌍따옴표
SELECT ENAME, SAL*12+NVL(COMM,0) AS "Annsal 공백" 
FROM EMP;

/*
# 연결 연산자 - ||
- 여러개의 컬럼을 연결할 때 사용
- 리터럴 : SELECT 리스트에 포함된 문자, 숫자 또는 날짜
  숫자 리터럴은 그냥 사용해도 되지만, 문자 및 날짜 리터럴은 외따옴표(' ')로 작성
*/

SELECT ENAME || '는 이름이고 담당업무는 ' || JOB || '이야' AS "ㅁㄴ"
FROM EMP;

/*
# DISTINCT
- 기본적으로 쿼리 결과에는 중복 행을 포함한 모든 행이 표시   
  이때 중복 행을 제거하려면 SELECT 키워드 바로 뒤에 DISTINCT 키워드를 사요
*/
SELECT DISTINCT DEPTNO "중복제거"
FROM EMP;

-- #1 QUIZ
-- EMP 테이블에서 사원의 이름, 급여, 입사일자만 출력
SELECT ENAME 이름, SAL 급여, hiredate 입사일자
FROM EMP;

-- 부서정보 테이블의 DEPTNO 는 부서번호, DNAME 는 부서명으로 별칭 부여 후 출력
SELECT DEPTNO 부서번호, DNAME 부서명
FROM DEPT;

-- 사원정보 테이블의 담당업무가 중복되지 않고, 한번씩 나열되도록 출력하세요
SELECT DISTINCT JOB
FROM EMP;

-- 데이터 정보를 갖고있는 한 개의 행을 레코드라 함

/*
# WHERE 조건
- 원하는 행만 검색할 때 행을 제한하는 조건을 SELECT 문에 WHERE 절을 추가
- 형식
SELECT * [*, COLUMN,.... ]
FROM TABLE_NAME
WHERE 조건식;
- 조건식에는 비교연산자 : >, >= , <, <=, =, !=
*/

-- 부서번호 = 10
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO =10;

-- 이름이 FORD인 사원의 사원번호, 이름, 급여 확인
-- SQL문에서 문자열이나 날짜는 반드시 ''(외따옴표) 안에 작성
-- 테이블 내에 저장된 값은 대소문자를 구분
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE ENAME ='FORD' OR ENAME ='KING';

-- 1982년 1월 1일 이전에 입사한 사원
SELECT *
FROM EMP
WHERE HIREDATE<'1982/01/01' AND SAL >2000;

/*
# 논리 연산자
- AND, OR, NOT
*/
-- 부서번호가 10 이면서 직급 MANAGER
SELECT * 
FROM EMP
WHERE DEPTNO =10 AND JOB = 'MANAGER';

-- 부서번호가 10 이거나 직급 MANAGER
SELECT * 
FROM EMP
WHERE DEPTNO =10 OR JOB = 'MANAGER';

-- 부서번호가 10 아닌 직원
SELECT * 
FROM EMP
WHERE NOT DEPTNO =10 ;
-- WHERE DEPTNO !=10 ;

-- 급여 2000 ~ 4000 직원
SELECT * 
FROM EMP
WHERE SAL>=2000 AND SAL<=4000 ;

-- BETWEEN AND 연산자 / 날짜도 됨 / 이상 이하O / 미만 초과 X
-- 특정 범위의 값 확인 
-- COLUMN_NAME BETWEEN A AND B
-- A와 B 사이
SELECT * 
FROM EMP
WHERE SAL BETWEEN 1500 AND 3000 ;

SELECT * 
FROM EMP
WHERE HIREDATE BETWEEN '1981/02/22' AND '1981/12/31';

/*
# IN 연산자
- 테이블의 값을 확인
- COLUMN_NAME IN(A, B, C,...) / OR 처럼 쓸 수 있음
*/

-- COMM 300 OR 500 직원
SELECT *
FROM EMP
WHERE COMM IN(300, 500);

/*
# LIKE 연산자와 WILD CARD
- 검색하는 값을 정확히 모를 때 사용 / 검색
- COLUMN_NAME LIKE PATTER
  > % : 0개 이상의 문자
    _ : 임의의 단일 문자
*/

-- 이름 M 시작
SELECT * 
FROM EMP
WHERE ENAME LIKE 'M%';

-- 이름 O 있는 애
SELECT *
FROM EMP
WHERE ENAME LIKE '%O%';

-- 이름 K 시작, 4글자
SELECT * 
FROM EMP
WHERE ENAME LIKE 'K___';

-- 이름 A 있는 없는 애
SELECT *
FROM EMP
WHERE ENAME NOT LIKE '%A%';

-- COMM이 NULL 인 애 / IS
SELECT *
FROM EMP
WHERE COMM IS NOT NULL;

/*
# ORDER BY
- 데이터 정렬
- 오름차순 : ASC ( DEFAULT ) 
- 내림차순 : DESC 
- ORDER BY COLUMN_NAME [DESC]
*/

-- SAL : ASC / DESC
SELECT *
FROM EMP
WHERE MGR IS NOT NULL
ORDER BY SAL DESC;

-- SAL : DESC / SAL 같으면 ENAME ASC
-- 2개 이상의 조건으로 오름, 내림 차순 정렬 시 ' , ' 쉼표 사용
SELECT *
FROM EMP
ORDER BY SAL DESC, ENAME DESC;

-- #2 QUIZ
-- emp 테이블에서 급여가 3000 이상인 사원의 사원번호, 이름, 직급, 급여를 출력하세요
SELECT EMPNO, ENAME, JOB, SAL 
FROM EMP
WHERE SAL>=3000;

-- emp 테이블에서 직급이 MANAGER 인 사원의 사원번호, 이름, 직급, 급여, 부서번호를 출력하세요
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
WHERE JOB = 'MANAGER';

-- emp 테이블에서 사원번호가 7902, 7782, 7566 인 사원의 사원번호, 성명, 직급, 급여, 입사일자를 출력하세요
SELECT EMPNO, ENAME, JOB, SAL, HIREDATE 
FROM EMP
WHERE EMPNO IN(7902, 7782, 7566);

-- emp 테이블에서 직급이 MANAGER, CLERK 이 아닌 사원의 사원번호, 성명, 직급, 급여, 부서번호를 출력하세요
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
WHERE JOB NOT IN('MANAGER','CLERK');

-- emp 테이블을 부서번호로 오름차순 정렬한 후에
-- 부서번호가 같으면 급여가 많은 순서로 정렬하여 사원번호, 성명, 직급, 부서번호, 급여을 출력하세요
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
ORDER BY DEPTNO ASC, SAL DESC;

02_FUNCTION

/* 02_FUNCTION
# 함수
- 단일행 함수 : 여러건의 데이터를 한 번에 하나씩만 처리하는 함수
- 여러행 함수 : 여러건의 데이터를 입력받아서 결과값 한건을 만들어주는 함수
*/

-- # DUAL TABLE
-- 한 행으로 결과를 출력하기 위한 테이블
-- 결과를 한 줄로 얻기 위해서 오라클에서 제공하는 테이블

-- 연산 등의 결과물 확인할 때 사용
SELECT 23*12
FROM DUAL; 

-- DUAL TABLE은 'DUMMY'라는 한 개의 COLUMN을 갖고있음
DESC DUAL;

-- 출력 시 레코드에 나오는 X 값은 의미없는 값임
SELECT * FROM DUAL;


-- # 숫자 함수
-- ABS : 절댓값
SELECT -10, ABS(-10)
FROM DUAL;

-- FLOOR : 소숫점 아래를 버리는 함수 > 정수
SELECT 12.123, FLOOR(12.123)
FROM DUAL;

-- ROUND : 반올림
SELECT 34.34, ROUND(34.23,1) , ROUND(34.566,2)
FROM DUAL;

-- TRUNC : 지정한 자릿수 이하를 버린 결과 / DEFAULT : 소숫점 삭제
SELECT TRUNC(3123.1234,2), TRUNC(3123.1234)
FROM DUAL;

-- MOD : 나머지
SELECT MOD(10,3), MOD(10,4)
FROM DUAL;

-- # 문자 함수
-- UPPER : 대문자로 변환
SELECT 'Hello Oracle', UPPER('Hello Oracle')
FROM DUAL;

-- LOWER : 소문자로 변환
SELECT 'Hello Oracle', LOWER('Hello Oracle')
FROM DUAL;

-- INITCAP : 문자열의 이니셜만 대문자로 변경 / 이니셜 : 첫문자
SELECT 'hello oracle', INITCAP('hello oracle')
FROM DUAL;

-- LENGTH : 컬럼에 저장된 데이터의 값이 몇개의 문자로 되어 있는지 계산 / 공백 포함
SELECT 'hello oracle', LENGTH('hello    oracle')
FROM DUAL;

-- LENGTHB : 문자열의 길이를 BYTE단위로 처리 / 공백,영문 : 1BYTE / 한글 : 3BYTE
SELECT 'hello oracle', LENGTHB('HELLO 오라클')
FROM DUAL;

-- SUBSTR : 문자열의 시작위치부터 선택 갯수만큼 문자를 추출
-- SUBSTR ( 대상, 시작위치, 추출 갯수 ) / 추출 갯수 DEFAULT : 끝까지
-- 주의사항 : 오라클은 INDEX가 1부터 시작
SELECT SUBSTR('123456 STRING TEST', 3,4)
FROM DUAL;

-- 시작 위치 인자값에 음수 적용 : 문자열의 뒤에서부터 시작 위치 적용
SELECT SUBSTR('123456 STRING TEST', -11,6)
FROM DUAL;

SELECT * FROM EMP;
-- EMP 테이블에서 입사년도, 월, 일 출력
SELECT 19||SUBSTR(HIREDATE,1,2)|| '년' 입사년도, SUBSTR(HIREDATE,4,2)|| '월' 입사월, SUBSTR(HIREDATE,7,2)|| '일' 입사일
FROM EMP;

-- 12월에 입사한 사원을 출력
SELECT SUBSTR(HIREDATE,4,2), ENAME, HIREDATE
FROM EMP
WHERE SUBSTR(HIREDATE,4,2)='12';

profile
Fintech

0개의 댓글