본문 바로가기

기록/자바_국비

[배운내용정리] 1211 자바 국비교육 _ Oracle

728x90

2020년 12월 11일 9시 ~ 15시 30분 zoom으로 수업 진행

 


기본용어

-학원에서 배운 내용

 행(ROW), 튜플 : 한 줄이 하나의 데이터

 컬럼, 도메인 : 하나의 속성 ( 같은 유형의 데이터만 들어올 수 있음 )

 기본키 : 각 행을 구분할 수 있는 값

 외래키 : 다른 테이블의 값을 참조 할 수 있는 참조 키

 Null  : 값이 없음을 나타낸다.

 컬럼 값, 속성 값 : 데이터 하나를 의미

 

-학교 (데이터베이스 개론)

속성 , 애트리뷰트, 필드 : 테이블의 열을 의미, 서로 다른 이름을 이용해 구별

도메인 : 속성 하나가 가질 수 있는 모든 값의 집합을 해당 속성의 도메인이라고 한다.

              +  쉽게 생각하면 속성이 변수, 도메인이 데이터 타입이라고 생각하면 편하다.

행, 투플 : 테이블의 행을 말한다. 테이블에 들어가는 데이터에 대한 속성 값을 모은 것.

null : 특정 속성에 해당되는 값이 없음을 나타낸다.

 

SQL(Structured Query Language)

 관계형 데이터베이스에서 데이터를 조회하거나 조작하기위해 사용하는 표준 검색 언어

 원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성

 

분류

용도

명령어

DQL(Data Query Language)

데이터 검색

SELECT

DML(Data Manipulation Language)

데이터 조작

INSERT, UPDATE, DELETE

DDL(Data Definition Language)

데이터 정의

CREATE, DROP, ALTER

TCL(Transaction Control Language)

 = DCL

트랜젝션 제어

COMMIT, ROLLBACK

 

데이터 타입

데이터 타입

하위 데이터 타입

설명

NUMBER

 

숫자

CHARACTER

CHAR

고정길이 문자(최대 2000바이트)

VARCHAR2

가변길이 문자(최대 4000바이트)

LONG

가변길이 문자(최대 2기가)

DATE

 

날짜

LOB

CLOB

가변길이 문자(최대 4기가)

BLOB

binary Data

 

NUMBER[ ( 전체 숫자 자리 수  [ , 소수점 이하 자리 수 ] ) ]

 ex)

 NUMBER(7) -> 12345.678 저장

  7자리이지만 정수는 5자리이므로 5개만 표현, 첫번째 소수로 인해 반올림 되어 저장

 NUMBER(7, 1) -> 12345.678 저장

  7자리이지만 정수 7자리와 소수 1자리만 표현, 두번째 소수로 인해 반올림 되어 저장

 

CHAR ( SIZE [ (byte | char ) ]

 SIZE -> 포함 될 문자열의 크기

 지정한 크기보다 작은 문자나 문자열이 입력되면 남는 공간을 공백으로 채운다

 대소문자를 구분한다

 ex)

 CHAR(6) -> KIMCHI 저장 : KIMCHI

 CHAR(9) -> KIMCHI 저장 : KIMCHI*** ( 공백 3칸 3byte)

 CHAR(6) -> 김치 저장 : 김치 (한글은 한 글자 당 3byte 이므로 공간에 딱 맞음)

 

VARCHAR2( SIZE [ (byte | char ) ]

 크기가 0인 값은 NULL로 인식 , 대소문자를 구분함

 ex)

 VARCHAR(6) -> KIMCHI 저장 : KIMCHI

 VARCHAR(10) -> KIMCHI 저장 : KIMCHI (공백저장X , 남는 공간은 버린다)

 VARCHAR(6) -> 김치 저장 : 김치 (한글은 한 글자 당 3byte 이므로 공간에 딱 맞음)

 

DATE

 날짜 연산 및 비교 가능

 일자 및 시간 정보 관리

 

연산 결과 타입 설명
날짜 + 숫자 DATE 날짜에서 숫자만큼 며칠 후인지
날짜 - 숫자 DATE 날짜에서 숫자만큼 며칠 전인지
날짜 - 숫자 NUMBER 두 날짜의 일수 차
날짜 + 숫자/24 DATE 날짜 + 시간

 

 

SELECT

 데이터를 조회한 결과를 Result Set이라고 하는데 SELECT 구문에 의해 반환된 행들의 집합을 의미한다.

 Result Set0개 이상의 행이 포함될 수 있고, Result Set은 특정한 기준에 의해 정렬 가능

 한 테이블의 특정 컬럼, 특정 행/컬럼 또는 여러 테이블의 특정 행/컬럼 조회 가능

 

작성법

SELECT 컬럼 명 [, 컬럼 명 , …]
FROM 테이블 명
WHERE 조건식;

 SELECT

 조회하고자 하는 컬럼 명 기술

 여러 컬럼을 조회하는 경우 컬럼은 쉼표로 구분, 마지막 컬럼의 뒤에는 쉼표를 사용하지 않음.

 모든 컬럼 조회 시 컬럼 명 대신 ‘*’ 기호 사용 가능, 조회 결과는 기술한 컬럼 명 순으로 표시 된다.

FROM

 조회 대상 컬럼이 포함된 테이블 명 기술

WHERE

 행을 선택하는 조건 기술

 여러 개의 제한 조건을 포함할 수 있고, 각각의 제한 조건은 논리 연산자로 연결

 제한 조건을 만족시키는 행들만 Result Set에 포함한다.

 

명령어와 테이블 명은 대소문자 구분x

테이블안에 들어가는 데이터를 대소문자 구분한다.

 


 

--SELECT 사용법
--SELECT *(조회할 컬럼) : 조회하고자 하는 내용
--FROM 테이블명   : 조회하고자 하는 테이블명
--[WHERE 조건]    : 특정 조건
--[ORDER BY 컬럼] : 정렬
--;

-- * 모든 행과 모든 컬럼 조회
SELECT * FROM employee;

--사원의 ID와 사원명, 연락처 조회
SELECT EMP_ID, EMP_NAME, PHONE 
FROM employee;
--나온 결과를 RESULT SET이라고 한다.

--실습--
--사원의 아이디, 사원명, 이메일, 연락처, 부서번호, 직급코드 조회
SELECT EMP_ID, EMP_NAME, EMAIL, PHONE, DEPT_CODE, JOB_CODE FROM employee;


--WHERE
--테이블에서 조건을 만족하는 값을 가진 행을 선택해 조회하는 조건절
--여러 개의 조건을 선택하고자 한다면 AND, OR와 함께 사용 가능하다

--실습2
--직급이 'J1'인 사원의 사번, 사원명, 직급코드, 부서코드 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, DEPT_CODE
FROM EMPLOYEE
WHERE JOB_CODE = 'J1';

--조건이 2개 이상 붙을 경우 (AND, OR 사용)


--컬럼 별칭 만들기
--1. AS 사용하기
SELECT EMP_ID AS "사원번호", EMP_NAME AS "사원명"
FROM employee;

--2.
--이 경우 별칭에 띄어쓰기가 들어갈 경우 반드시 ""로 구분해주어야 한다.
SELECT EMP_ID 사원번호, EMP_NAME "사원 명"
FROM employee;


--컬럼값을 사용하여 계산식을 적용한 정보 조회하기
SELECT EMP_NAME "사원 명",
        (SALARY * 12) 연봉,
        BONUS 보너스,
        (SALARY + (SALARY*BONUS))*12 연봉총합
FROM EMPLOYEE;


--NVL() : 조회한 값이 NULL 일 경우 별도로 설정한 값으로 변경
--NVL(컬럼명, 기본값)
SELECT EMP_NAME "사원 명",
        (SALARY * 12) 연봉,
        NVL(BONUS, 0) 보너스,
        (SALARY + (SALARY * NVL(BONUS, 0) ))*12 연봉총합
FROM EMPLOYEE;


--컬럼에 일반값 사용하기
--단위 컬럼을 추가하고 해당 컬럼의 값으로 '원'을 저장함
--실제 데이터베이스에 저장되는거 아님
SELECT EMP_NAME, SALARY*12, '원' 단위
FROM employee;


--DISTINCT
--만약 해당하는 값이 컬럼에 여러 개 존재할 경우
--중복을 제거하고 한 개만 조회(NULL도 포함)
SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;


--실습5
--DEPARTMENT 테이블을 참조하여
--부서가 '해외영업2부'인 부서코드를 찾고

--EMPLOYEE 테이블에서 해당 부서의 사원들 중 
--급여를 200만원보다 많이 받는 직원의 
--사번, 사원명, 급여를 조회

SELECT * 
FROM department
WHERE dept_title='해외영업2부';
--D6

SELECT EMP_ID 사번, EMP_NAME 사원명, SALARY 급여
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' AND SALARY >= 2000000;

--부서가 '해외영업2부' 이거나 
--급여를 200만원보다 많이 받는 직원의 사번 사원명 급여를 조회
SELECT EMP_ID 사번, EMP_NAME 사원명, SALARY 급여
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' OR SALARY >= 2000000;


--연산자
--연결 연산자 '||' : 여러 컬럼의 결과 값을 하나의 컬럼으로 묶는다
SELECT EMP_ID || '을 가진 사원의 이름은 ' || EMP_NAME || '입니다' 
FROM EMPLOYEE;

--비교연산자
-- < , > , <= , >= : 크기를 비교하는 부등호
-- 자바와 달리 오라클에서는 = 하나만 사용하는게 같다는 의미
-- != , ^= , <> : 같지 않다

SELECT *
FROM EMPLOYEE
--WHERE DEPT_CODE != 'D9';
--WHERE DEPT_CODE ^= 'D9';
WHERE DEPT_CODE <> 'D9';


--EMPLOYEE 테이블에서 
--급여가 350만원 이상 550만원 이하인
--직원의 사번, 사원명, 부서코드, 직급코드, 급여를 조회
SELECT EMP_NO, EMP_NAME, DEPT_CODE, JOB_CODE, SALARY 
FROM EMPLOYEE
WHERE SALARY >= 3500000 AND SALARY <= 5500000
ORDER BY SALARY;
--ORDER BY SALARY : SALARY 값을 기준으로 오름차순으로 정렬하겠다 -> ASC가 오름차순을 뜻하는데 생략되어있다.
--ORDER BY SALARY DESC; => 내림차순


--BETWEEN A AND B
SELECT EMP_NO, EMP_NAME, DEPT_CODE, JOB_CODE, SALARY 
FROM EMPLOYEE
WHERE  SALARY BETWEEN 3500000 AND 5500000;

--위와 똑같은 직원의 정보를 조회할 때
--350만원 미만, 550만원 초과인 직원의 정보를 조회
SELECT EMP_NO, EMP_NAME, DEPT_CODE, JOB_CODE, SALARY 
FROM EMPLOYEE
WHERE  SALARY NOT BETWEEN 3500001 AND 5500000;



--LIKE
--입력한 숫자, 문자가 포함된 정보를 조회할 때 사용하는 연산자
-- _ : 임의의 한 문자를 의미한다
-- % : 몇 문자든 관계없음 , 앞에 몇 글자인지는 모르는데 일단 문자가 있을 경우

--EMPLOYEE 테이블에서
--사원 이름 가운데에 '중'이 들어가는 사원 정보 조회
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME LIKE '_중_';

--EMPLOYEE 테이블에서 주민등록번호 기준 남성인 사원의 정보만 조회

--내가 푼 것
SELECT *
FROM EMPLOYEE
WHERE EMP_NO LIKE '%-1%';

--선생님 코드
SELECT *
FROM EMPLOYEE
WHERE EMP_NO LIKE '______-1%';


--사원 중 이메일 4번째 자리가 '_' 인 사원의 정보를 조회
--ESCAPE 문자를 선언
--ESCAPE 문자로 선언함으로 #_는 이제 문자 하나를 나타내는것이 아닌 진짜 '_' 가 된당
SELECT *
FROM EMPLOYEE
--WHERE EMAIL LIKE '___#_%@%' ESCAPE '#';
WHERE EMAIL LIKE '___!_%@%' ESCAPE '!';


--IN 연산자
--IN(값1, 값2, 값3, ...)
--안에 있는 값 중 하나라도 일치하는 경우 
--해당 값을 조회하는 연산자

--부서코드가 D1 이거나 D6 인 부서 직원 정보 조회
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1' OR DEPT_CODE = 'D6';
-- 위 아래 같은 코드
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE IN ('D1', 'D6');


--부서코드가 D1 도 D6 도 아닌 부서 직원 정보 조회
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE NOT IN ('D1', 'D6');


/*
--연산자 우선순위
0. ()
1. 산술 연산자 ( + = / *)
2. 연결 연산자
3. 비교 연산자
4. IS NULL / IS NOT NULL , LIKE , IN / NOT IN
5. BETWEEN A AND B
6. NOT
7. AND
8. OR
*/