[SQL/ORACLE] SQL 스터디_2일차

DANI·2023년 8월 26일
0

ORACLE_SQL

목록 보기
2/10
post-thumbnail

📕 2day 요약

1. 파일시스템 포맷 방식

2. 연산자 종류와 활용

3. 오라클 함수 - 문자함수

4. 오라클 함수 - 숫자함수

5. 오라클 함수 - 날짜함수




📝 간략복습

📕 파일과 데이터베이스의 차이는?

✏️ 파일은 공유가 안되는데 데이터베이스는 공유가 되서 중복을 제거할수 있다.

✔️ 파일시스템

  1. 응용 프로그램이 개별 데이터를 직접 관리함
  2. 데이터가 중복 될 수 있음
  3. 응용 프로그램이 데이터를 쓰는 방식이 각각 다름
  4. 데이터가 응용 프로그램에 종속되어 있으므로 응용 프로그램을 변경하면 기존 데이터를 사용할 수 없음

✔️ 데이터베이스

  1. 하나의 소프트웨어가 데이터를 관리하므로 중복을 피할 수 있음
  2. 여러 응용프로그램이 DBMS를 통해 사용하므로 데이터를 공유할 수 있음
  3. 하나의 DBMS에서 데이터를 관리하기 때문에 각 응용 프로그램이 데이터를 관리하는 방식이 통합됨
  4. 응용 프로그램과 별도로 데이터가 DBMS에 의해 관리, 보관되기 때문에 업데이트 또는 변경과 관계없이 데이터를 사용할 수 있음

📕 관계형 데이터베이스에서 제품의 종류는?

✏️ Oracle / MySQL / Microsoft SQL / Hive

📕 NoSQL 이란?

✏️ Not only sql 관계형데이터베이스가 아닌 Document, key-value등 비정형데이터베이스도 다룰 수 있는 DBMS

📕 관계형 데이터베이스에서 관계형이란?

✏️ 테이블 형태로 저장되어 기본키와 외래키로 관계를 만들고 키로 식별함

📕 릴레이션(Relation)이란?

✏️ 테이블

📕 관계는 영어로?

✏️ Relationship

📕 DBMS의 약자는?

✏️ Data Base Management System

📕 SQL의 약자는?

✏️ Structured Query Language

📕 SCOTT의 비밀번호를 tiger로 바꾸는 쿼리는?

✏️ IDENTIFIED BY tiger




📖 1. 파일시스템 포맷 방식

❓ 파일시스템이란?

파일 시스템 또는 fs 라고도 하는 파일 시스템은 운영 체제가 데이터 저장 및 검색 방법을 제어하는 데 사용하는 방법 및 데이터 구조이다. 데이터를 조각으로 분리하고 각각에 이름을 지정하면 데이터를 쉽게 분리하고 식별할 수 있다. 종이 기반 데이터 관리 시스템의 이름을 따서 각 데이터 그룹을 '파일'이라고하며 데이터 그룹과 그 이름을 명명하는 데 사용되는 구조 및 논리 규칙을 '파일 시스템'이라고 합니다.

❓ 파일시스템의 유형

  • Windows 파일 시스템 - FAT, NTFS, exFAT
  • macOS - HFS, APFS, HFS+
  • 리눅스 - EXT2/3/4, XFS, JFS, Btrfs

📌 파일시스템 포맷 방식 비교

구분FATNTFSexFAT
볼륨 최대 크기32GB2TB512TB
최대 파일 크기4GB볼륨 크기볼륨 크기
호환성
보안
안정성
속도

☑️ 컴퓨터 관리에서 내 컴퓨터 포맷 방식 확인 : NTFS

[참고]https://www.easeus.co.kr/diskmanager/file-system.html
https://iboxcomein.com/file-system-ntfs-fat32-exfat/#ftoc-heading-4

💡 이모저모

WindowsNT : ms에서 만든 서버임 (안정성을 강조 / 운영체제임)
IIS : ms에서 만든 웹서버
MS-SQL : ms에서 만든 DBMS
IBM : 메인프레임 (역사상 가장 뛰어남 / 비쌈)




📖 2. 연산자 종류와 활용

📌 할당연산자

"="

  • A = 1 1을 A에 할당한다. ( 같다는 의미X )
  • A <- 1 언어에 따라서 화살표로 표현하는 경우도 있음

📌 산술연산자, 비교연산자, 논리부정연산자

산술연산자 : +, -, *, /...

비교연산자 : >, <, <=, >=, !=, <>, ^=

논리부정연산자 : NOT

1. 🔍 연봉이 10,000이상이고, 직업이 ANALYST인 사원이름, 월급, 직업, 연봉 출력하기

💚 입력

SELECT ENAME, SAL, JOB, SAL*12 AS YEAR_SAL 
FROM EMP
WHERE SAL*12 >= 10000 AND JOB='ANALYST';

💙 출력!


2. 🔍 사원 이름이 "F"이후로 시작되거나, 월급이 3000이 아닌 사원 출력하기

💚 입력

SELECT ENAME, SAL 
FROM EMP
WHERE ENAME >= 'F' OR SAL <> 3000;

WHERE ENAME >= 'F' OR SAL <> 3000; 사원 이름이 "F"이상 이거나("F"포함하여 이후 알파벳으로 시작함을 뜻함) 월급이 3000이 아닌 사원 이름, 월급 데이터 출력

💙 출력!


3. 🔍 문자열 여러개 비교하기

💚 입력

SELECT ENAME
FROM EMP
WHERE ENAME <= 'FORZ'
ORDER BY ENAME DESC;

WHERE ENAME <= 'FORZ' 사원이름이 "FORZ"이하인 사원(시작 A,B,C,D,E, "F"일경우 2,3,4번째 O,R,Z까지 비교)

💙 출력

☑️ 알파벳도 비교연산자 사용이 가능하며, 비교문자열이 여러개일 때도 사용할 수 있음.

☑️ 등가비교 연산자 DB에서는 "<>"를 자주 사용함


📌 IN 연산자

WHERE COLUMN_NAME IN ( A, B, C )

  • WHERE COLUMN_NAME IN ( A, B, C )
    = WHERE COLUMN_NAME = A OR COLUMN_NAME = B, COLUMN_NAME = C

1. 🔍 부서번호가 10이거나 30인 데이터 출력하기

💚 입력

SELECT DEPTNO, ENAME 
FROM EMP
WHERE DEPTNO IN (10, 30);

WHERE DEPTNO IN (10, 30) 부서번호가 10이거나 30인 데이터 출력

💙 출력


📌 BETWEEN A AND B 연산자

WHERE COLUMN_NAME BETWEEN 최솟값 AND 최댓값

  • 최솟값 이상 최댓값 이하인 데이터 출력

1. 🔍 월급이 1000초과거나 2000미만 사원정보 출력하기

💚 입력

SELECT ENAME, SAL
FROM EMP
WHERE SAL NOT BETWEEN 1000 AND 2000;

WHERE SAL NOT BETWEEN 1000 AND 2000 BETWEEN A AND B의 차집합NOT을 이용하여 출력함

💙 출력


📌 LIKE 연산자와 와일드카드

WHERE COLUMN_NAME LIKE 'S%'

  • WHERE COLUMN_NAME LIKE 'S%' S로 시작하는 데이터 출력
종류의미
_어떤 값이든 상관없이 한 개의 문자 데이터를 의미
%길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를의미

1. 🔍 이름에 "AM"이 포함된 사원 출력하기

💚 입력

SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%AM%';

WHERE ENAME LIKE '%AM%' 이름에 "AM"이 포함된 사원

💙 출력!


2. 🔍 뒤에서 두번째 글자가 "T"인 사원 데이터 출력하기

💚 입력

SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%T_';

❔ WHERE ENAME LIKE '%T_' "T" 앞쪽은 자리 상관 없는 모든 데이터, "_" 는 뒷자리 고정데이터

💙 출력!

📌 IS NULL 연산자

WHERE COLUMN_NAME IS NULL;

COLUMN_NAME의 값이 NULL인 데이터 출력

🚫 WHERE COLUMN_NAME = NULL (X) 잘못된 표현! 🚫

1. 🔍 COMM이 NULL값 이거나 직속상관이 있는 사원 출력하기

💚 입력

SELECT ENAME, COMM, MGR 
FROM EMP
WHERE COMM IS NULL
OR MGR IS NOT NULL;

💙 출력


📌 집합연산자

SELECT COLUMN_NAME1, COLUMN_NAME2, COLUMN_NAME3 FROM TABLE_NAME1 WHERE 조건1

UNION, UNION ALL, MINUS, INTERSECT

SELECT COLUMN_NAME1, COLUMN_NAME2, COLUMN_NAME3 FROM TABLE_NAME2 WHERE 조건2

종류설명
UNION연결된 SELECT문의 결과 값을 합집합으로 묶어주며, 중복값은 제외된다.
UNION ALL  연결된 SELECT문의 결과 값을 합집합으로 묶어주며, 중복값은 포함된다.
MINUS먼저 작성한 SELECT문의 결과 값에서 다음 작성한 SELECT문의 결과 값을 차집합처리 한다.
INTERSECT연결된 SELECT문의 결과 값의 교집합을 출력한다.

1. 🔍 부서번호가 10번, 20번인 결과값을 합집합 하기.

💚 입력

SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

💙 출력


2. 🔍 연결된 SELECT문의 COLUMN의 갯수가 맞지 않을 경우

💚 입력

SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME
FROM EMP
WHERE DEPTNO = 20;

💙 출력

ORA-01789: 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다.
01789. 00000 -  "query block has incorrect number of result columns"
*Cause:    
*Action:

☑️ 연결된 SELECT문의 COLUMN갯수가 같아야 함!


3. 🔍 연결된 SELECT문의 COLUMN의 순서가 맞지 않을 경우(데이터타입이 같은 경우)

💚 입력

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, DEPTNO, SAL
FROM EMP
WHERE DEPTNO = 20;  

❔ SELECT EMPNO, ENAME, SAL, DEPTNO
❔ SELECT EMPNO, ENAME, DEPTNO, SAL
연결된 SELECT문의 COLUMN 순서가 바뀜( 데이터 형태는 같음 : NUMBER(7, 2) )

💙 출력

☑️ 순서는 바뀌었지만, 데이터 타입이 같은 경우 뒤죽박죽 되어 출력 됨


4. 🔍 연결된 SELECT문의 COLUMN의 순서가 맞지 않을 경우(데이터타입이 다른 경우)

💚 입력

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, EMPNO, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

❔ SELECT EMPNO, ENAME, SAL, DEPTNO (데이터 타입: VARCHAR2)
❔ SELECT ENAME, EMPNO, SAL, DEPTNO (데이터 타입: NUMBER)

💙 출력

ORA-01790: 대응하는 식과 같은 데이터 유형이어야 합니다
01790. 00000 -  "expression must have same datatype as corresponding expression"
*Cause:    
*Action:
28행, 8열에서 오류 발생

☑️ 데이터 타입이 다른 경우 출력되지 않음!


5. 🔍 부서번호 20번인 사원 제외하고 출력하기(차집합)

💚 입력

SELECT EMPNO, DEPTNO
FROM EMP
MINUS
SELECT EMPNO, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

💙 출력


6. 🔍 부서번호 20번인 사원 출력하기(교집합)

💚 입력

SELECT EMPNO, DEPTNO
FROM EMP
INTERSECT
SELECT EMPNO, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

💙 출력

7. 🔍 급여가 2500을 초과하고 부서번호가 10번이거나 20번인 사원정보 출력하기

💚 입력

SELECT ENAME, DEPTNO, SAL
FROM EMP
WHERE SAL > 2500 AND DEPTNO IN (10, 20);

💙 출력



📖 3. 오라클 함수 - 문자함수

문자 데이터를 가공해주는 문자함수

📌 UPPER, LOWER, INITCAP함수

SELECT UPPER(COLUMN_NAME), LOWER(COLUMN_NAME), INITCAP

FROM TABLE_NAME;

  1. UPPER() : 소문자를 대문자로 변환
  2. LOWER() : 대문자를 소문자로 변환
  3. INITCAP() : 첫글자는 대문자로 나머지는 소문자로 변환

1. 🔍 UPPER, LOWER, INITCAP 함수 사용해보기

💚 입력

SELECT ENAME, LOWER(ENAME) AS LOWER, UPPER(ENAME) AS UPPER, INITCAP(ENAME) AS INITCAP 
FROM EMP; 

💙 출력


📌 LENGTH, LENGTHB 함수

SELECT LENGTH(), LENGTHB()

FROM TABLE_NAME;

  1. LENGTH() : 문자열의 길이를 반환
  2. LENGTHB() : 문자열의 바이트 수를 반환

1. 🔍 LENGTH, LENGTHB 함수 사용해보기

💚 입력

SELECT ENAME, LENGTH(ENAME) AS LENGTH, LENGTHB(ENAME) AS LENGTHB
FROM EMP; 

💙 출력

2. 🔍 LENGTH, LENGTHB 함수 사용해보기(한글)

💚 입력

SELECT LENGTH('한글'), LENGTHB('한글')
FROM DUAL;

💙 출력

☑️ 영어는 1글자에 1바이트 / 한글은 1글자에 2바이트!


❓ DUAL 테이블이란?

DUAL 테이블은 오라클의 최고 권한 관리자 계정인 SYS 소유의 테이블로 SCOTT계정도 사용할 수 있는(dummy)테이블이다. 데이터 저장공간이 아닌 임시 연산이나 함수의 결과 값 확인 용도로 종종 사용한다.


📌 SUBSTR 함수

SUBSTR(문자열 데이터, 시작위치, 추출 길이(생략가능))

문자열 중 일부를 추출할 때 사용

1. 🔍 SUBSTR 함수 사용해보기

💚 입력

SELECT JOB, SUBSTR(JOB, 3, 2), SUBSTR(JOB, 5)
FROM EMP; 

💙 출력


2. 🔍 SUBSTR 함수 사용해보기(LENGTH함수 이용)

💚 입력

SELECT ENAME, SUBSTR(ENAME, LENGTH(ENAME)-3), SUBSTR(ENAME, -LENGTH(ENAME)+3)
FROM EMP;

💙 출력

☑️ 오라클은 인덱스가 0부터 시작하지 않고 1부터 시작함!⭐️⭐️⭐️


📌 INSTR 함수

INSTR([대상 문자열 데이터(필수)], [위치를 찾으려는 부분 문자(필수)], [위치 찾기를 시작할 대상 문자열 데이터 위치(선택, 기본값은 1)], [시작 위치에서 찾으려는 문자가 몇 번째인지 지정(선택, 기본값은 1)])

문자열에서 특정문자의 위치를 찾는 함수

1. 🔍 INSTR 함수 사용해보기

💚 입력

SELECT INSTR('HELLO, ORACLE!', 'L'), INSTR('HELLO, ORACLE!', 'L', 5), 
INSTR('HELLO, ORACLE!', 'L', 2, 2) 
FROM DUAL;

💙 출력


2. 🔍 사원이름에 S가 포함된 사원정보 출력하기

💚 입력

SELECT ENAME
FROM EMP
WHERE INSTR(ENAME, 'S') > 0;

💙 출력


📌 REPLACE 함수

REPLACE([문자열 데이터 또는 열이름(필수)], [찾는문자(필수)], [대체할 문자(선택)])

특정 문자다른 문자로 대체하는 함수

1. 🔍 REPLACE 함수 사용해보기

💚 입력

SELECT '0-2-3-4' AS INF, REPLACE('0-2-3-4', '-', '%'), REPLACE('0-2-3-4', '-')
FROM DUAL;

💙 출력

☑️ 대체 문자를 생략할 경우 찾는 문자가 삭제되어 출력됨!


📌 LPAD, RPAD 함수

LPAD([문자열 데이터 또는 열이름(필수)], [채울자리수(필수)], [채울문자(선택)])

RPAD([문자열 데이터 또는 열이름(필수)], [채울자리수(필수)], [채울문자(선택)])

빈 공간특정 문자로 채우는 함수(왼쪽부터 OR 오른쪽부터)

1. 🔍 LPAD, RPAD 함수 사용해보기

💚 입력

SELECT 'ORACLE', LPAD('ORACLE', 10, '%'), RPAD('ORACLE', 10, '%'),LPAD('ORACLE', 10), RPAD('ORACLE', 10)
FROM DUAL;

💙 출력

☑️ 채울 문자를 입력하지 않을 경우 공백으로 채워진다!


📌 CONCAT 함수(CONCATENATE)

CONCAT([문자열 데이터 또는 열이름(필수)], [문자열 데이터 또는 열이름(필수)])

[문자열 데이터 또는 열이름(필수)]||[문자열 데이터 또는 열이름(필수)]

두 문자열연결해주는 함수

1. 🔍 CONCAT 함수 사용해보기

💚 입력

SELECT CONCAT(EMPNO, ENAME), CONCAT(EMPNO, CONCAT(' : ', ENAME))
FROM EMP
WHERE ENAME = 'SCOTT';

💙 출력


2. 🔍 CONCAT 함수 사용해보기(세개의 열 합치기)

💚 입력

SELECT CONCAT(EMPNO, ENAME, DEPTNO)
FROM EMP
WHERE ENAME = 'SCOTT';

💙 출력

ORA-00909: 인수의 개수가 부적합합니다
00909. 00000 -  "invalid number of arguments"
*Cause:    
*Action:
51행, 8열에서 오류 발생

☑️ 세개의 인자는 사용할 수 없음


3. 🔍 CONCAT 함수 사용해보기(세개의 열 합치기)

💚 입력

SELECT CONCAT(CONCAT(EMPNO, ENAME), DEPTNO)
FROM EMP
WHERE ENAME = 'SCOTT';

💙 출력

4. 🔍 CONCAT 함수 사용해보기(세개의 열 합치기)

💚 입력

SELECT EMPNO||ENAME||DEPTNO
FROM EMP
WHERE ENAME = 'SCOTT';

💙 출력

☑️ 세개의 열을 합치고 싶을 땐 이중 CONCAT을 이용하거나 "||"를 사용함!


📖 4. 오라클 함수 - 숫자함수

함수설명
ROUND지정된 숫자의 특정 위치에서 반올림한 값을 반환
TRUNC지정된 숫자의 특정 위치에서 버림한 값을 반환
CEIL지정된 숫자보다 같거나 큰 정수 중 가장 작은 정수를 반환
FLOOR지정된 숫자보다 같거나 작은 정수 중 가장 큰 정수를 반환
MOD지정된숫자를 나눈 나머지 값을 반환

📌 ROUND, TRUNC 함수

ROUND([숫자(필수)], [반올림위치(선택)])

TRUNC([숫자(필수)], [버림위치(선택)])

1. 🔍 ROUND, TRUNC 함수 사용해보기

💚 입력

SELECT TRUNC(12.234, -1), ROUND(12.234, 1), TRUNC(12.234, 0)
FROM DUAL;

💙 출력

☑️ 위치 0은 소수점이고 0을 기준으로 1,2...은 소수점 아래 첫째자리, 둘째자리이고 -1, -2는 일의 자리, 십의자리... 이다!


📌 CEIL, FLOOR 함수

CEIL(), FLOOR()

1. 🔍 CEIL, FLOOR 함수 사용해보기

💚 입력

SELECT CEIL(12.234), FLOOR(12.234), FLOOR(-12.234)
FROM DUAL;

💙 출력


📌 MOD 함수

MOD(A,B)

"A"를 "B"로 나눈 나머지의 값을 출력

1. 🔍 MOD 함수 사용해보기

💚 입력

SELECT MOD(15,6) 
FROM DUAL

💙 출력



📖 5. 오라클 함수 - 날짜함수

📌 SYSDATE 함수

SYSDATE함수는 별다른 입력 데이터 없이, 오라클 데이터베이스 서버가 놓인 OS의 현재 날짜와 시간을 보여준다.

1. 🔍 SYSDATE 함수 사용해보기

💚 입력

SELECT SYSDATE AS TODAY, SYSDATE-1 AS YESTERDAY, SYSDATE+1 AS TOMORROW
FROM DUAL;

💙 출력


📌 ADD_MONTHS 함수

ADD_MONTHS(날짜데이터, N)

N개월이후 날짜를 구하는 함수

1. 🔍 입사일자로부터 100일 뒤, 100개월 뒤 날짜 출력하기

💚 입력

SELECT ENAME, HIREDATE, HIREDATE+100, ADD_MONTHS(HIREDATE,100) 
FROM EMP;

💙 출력


📌 MONTHS_BETWEEN 함수

MONTHS_BETWEEN(날짜데이터, 날짜데이터)

두 날짜데이터 사이의 개월 수 차이를 구하는 함수

1. 🔍 MONTHS_BETWEEN 함수 사용하기

💚 입력

SELECT EMPNO, ENAME, HIREDATE, SYSDATE, 
TRUNC(MONTHS_BETWEEN(HIREDATE, SYSDATE), 2), 
ROUND(MONTHS_BETWEEN(SYSDATE, HIREDATE), 2) 
FROM EMP;

💙 출력


💡 오라클에서 날짜 데이터를 사용할 때 기준 포맷값

포맷 모델기준 단위
CC, SCC네 자리 연도의 끝 두자리를 기준으로 사용(2016년 이면 2050이하이므로, 반올림할 경우 2001년으로 처리)
SYYYY, YYYY, YEAR, SYEAR, YYY, YY,Y날짜 데이터의 해당 연, 월, 일의 7월 1일을 기준 (2016년 7월 1일 일 경우, 2017년으로 처리)
IYYY, IYY, IY, IISO 9601에서 제정한 날짜 기준년도 포맷을 기준
Q각 분기의 두번째 달의 16일 기준
MONTH, MON, MM, RM각 달의 16일 기준
WW해당 연도의 몇 주 (1~53번째 주)를 기준
IWISO 8601에서 제정한 날짜 기준 해당 연도의 주(WEEEK)를 기준
W해당 월의 주(1~5번째 주)를 기준
DDD, DD, J해당 일의 정오(12:00:00)을 기준
DAY, DY, D한 주가 시작되는 날짜를 기준
HH, HH12, HH24해당일의 시간을 기준
MI해ㅐ당ㅇㄹ 시간의 분을 기준

💚 입력

SELECT ROUND(SYSDATE, 'CC'), ROUND(SYSDATE, 'YYY'), ROUND(SYSDATE, 'DD'), ROUND(SYSDATE, 'HH')
FROM DUAL;

💙 출력


0개의 댓글