Oracle DB 1일차

Setting

DB 개념

  • DB: 데이터의 집합
  • DBMS: Database Management System, DB 관리 소프트웨어
  • 메모리: 연산하는 곳, 휘발성, instance랑 같은 말
  • 디스크: 데이터가 저장되는 곳
  • RAC: Real Application Clusters. 메모리를 여러 개로 구성한 방식

DBMS 종류

  • RDBMS: oracle, db2, sql-server(mssql), tibero, mysql, postgresql, mariadb
  • NoSQL: mongodb

Oracle 설치 시 주의사항

  • mac OS는 X
  • 설치 위치와 계정에 한글 이름 불가
  • 네트워크 연결 해제 후 설치 (네트워크 정보가 어딘가에 저장돼서)

Oracle 11g 설치

  1. zip파일 처음에 압축해제 할 때 1of2, 2of2 하나씩 해제하기!
  2. setup.exe 실행
  3. ‘최소사양 만족 못했다’는 메시지 무시
  4. ‘데이터베이스 생성 및 구성’
  5. ‘서버클래스’
  6. ‘단일 인스턴스 데이터베이스
  7. ‘고급’
  8. ‘enterprise edition’
  9. 설치위치 지정 (oracle base: D:\app\itwill, oracle home: D:\app\itwill\product\11.2.0\dbhome_3)
  10. 구성 유형: 일반용/트랙잭션 처리(OLTP)-유저 많다, 조회되는 데이터의 양은 적다 / 데이터 웨어하우징(DW)-유저 적다, 조회되는 데이터의 양은 많다 / ‘일반용’ 선택
  11. 식별자(Oracle SID)
  12. 메모리 나중에 수정 가능, 문자 집합은 기본값으로, 샘플스키마 check
  13. ‘파일 시스템’
  14. 자동백업 사용하지않음
  15. 비밀번호 ‘oracle’
  16. ‘완료’
  17. JAVA 팝업 뜨면 ‘허용’
  18. ‘비밀번호 관리’
  19. ‘HR’, ‘SCOTT’ 잠금해제 및 비밀번호 설정하기(oracle)

orange6 std 설치

  • 싹 다 넘기다가 ‘자동 업데이트’ 만 끄기

cmd 창에서

  1. Local에서 DB 접속 명령어: sqlplus system/oracle
    • 원격에서 DB접속 도와주는 툴: orange, sql-developer, toad, dbeaver, golden
  2. sql 접속 후 conn scott/oracle 로 scott으로 접속
    • scott 잠금과 비밀번호 설정 안 했으면 alter user hr account unlock identified by “oracle”; 입력해서 설정 가능. 이 명령어는 나중에 개발자들 계정 풀어줄 때 쓰인다.

orange6 에서

  1. DB 이름 ‘orcl’, user: scott, pw: oracle 선택해서 로그인
  2. 단축키들
    • 주석 기호: —
    • ctrl + -: 주석 처리
    • ctrl + shift + -: 주석 해제
    • 명령어 한 쿼리 실행: ctrl + enter
    • 명령어 한줄씩 확인: ctrl + j 근데 별로 쓸일 없는 듯?
    • 전체 명령어 실행: F5
    • ctrl + shift + u: 대문자 변환
    • ctrl + u: 소문자 변환
    • ctrl + shift + f: 자동 줄맞춤
    • ctrl + n: 새 접속
    • ctrl + o: 파일 불러오기(오픈)
    • ctrl + t: 새로운 탭

수업 필기

필기 내용

— 주석 기호: —
— ctrl + -: 주석 처리
— ctrl + shift + -: 주석 해제
— 명령어 한 쿼리 실행: ctrl + enter
— 명령어 한줄씩 확인: ctrl + j 근데 별로 쓸일 없는 듯?
— 전체 명령어 실행: F5
— ctrl + shift + u: 대문자 변환
— ctrl + u: 소문자 변환
— ctrl + shift + f: 자동 줄맞춤
— ctrl + n: 새 접속
— ctrl + o: 파일 불러오기(오픈)
— ctrl + t: 새로운 탭

— [데이터 조회 언어: select문]
— 테이블명 컬럼명 소유자정보를 사전에 알고 있어야 함
— 역할: 조회할 컬럼 선택, 연산, (함수 사용한)데이터 변환
select — 5. 컬럼선택
from — 1. 데이터 출처 (oracle은 from절 생략 불가(sql-server는 생략 가능))
[where] — 2. 행 선택
[group by] — 3. 그룹 연산
[having] — 4. 그룹연산 결과 필터링
[order by]; — 6. 정렬
— 수행순서: from -> where -> group by -> having -> select -> order by
— 따라서 select 절에서 정의된 별칭의 유일한 사용가능한 절은 order by절만이다

–select 24365; oracle에서는 오류, sql-server에서는 수행가능 select 24365 from dual; — oracle에서 dummy table(dual)을 사용한 조회 가능

select sysdate from dual;
select * from tab; -- 접속한 계정의 소유 테이블 목록 확인
select * -- 출력할 대상 정의(컬럼 선택, 연산, 함수출력)
from emp; -- 저장된 데이터 출처(테이블)

— 특정 컬럼 선택

select empno, ename, SAL -- 원칙적으로 select절에 *와 컬럼명은 동시 사용 불가
from emp; -- 변칙적으로 앞에 테이블명이나 테이블 별칭 사용 시에는 컬럼명과 동시 출력 가능

— 테이블 별칭 설정

select e.*, ename
from emp e;

— 연산

select ename, sal, sal*1.1
from emp;

— 함수를 사용한 데이터 변형

select lower(ename), sal, deptno
from emp;

— [from절]
— 조회할 데이터가 저장된 테이블 명 전달

— [where절]
— (조건을 통해서)조회할 행을 선택
— 조건의 형태: 대상 연산자 상수

select ename, sal, deptno
from EMP
where deptno = 10;

— 조건의 형태
— 단순비교: =, >, >=, <, <=, !=, <>
— 범위(포함) 연산자: between A and B, in
— 패턴 연산자: like
— 부정 연산자: not
— 널 연산자: is null, is not null

— 예제) 10번 부서원을 제외한 직원의 이름, 급여, 부서번호 출력

select ename, sal, deptno
from EMP
where deptno != 10;
select ename, sal, deptno
from EMP
where deptno <> 10;

— between A and B 연산자
— 문자, 숫자, 날짜 상수 전달 가능. A에 더 큰 상수 전달 시 공집합 출력

select *
from EMP
where sal >=2000
and sal <= 3000;

— in 연산자
— 범주형 데이터의 여러 카테고리 선택
— 일치하는 여러 대상을 한번에 조회

select *
from EMP
where ename = 'BLAKE'
or ename = 'SCOTT'
or ename = 'SMITH';
select *
from EMP
where ename in ('BLAKE', 'SCOTT', 'SMITH');


— 이름이 (‘BLAKE’, ‘SCOTT’, ‘SMITH’)를 제외한 모든 직원 조회

select *
from EMP
where ename not in ('BLAKE', 'SCOTT', 'SMITH');

— 예제) 부서번호가 20 또는 30

select *
from EMP
where deptno in (20, 30);

— like 연산자
— 패턴 연산자(문자열의 일부를 이용한 비교 조건)
— %(자릿수 상관X), _(자릿수 상관O) 를 사용하여 패턴 전달

— 예제) 이름이 T로 끝나는 직원의 이름, 급여 출력

select ename, sal
from EMP
where ename like '%T';


— 예제) 이름의 두번째 글자가 A인 직원의 이름, 급여 출력

select ename, SAL
from EMP
where ename like '_A%';

— null 연산자
— null: 정해지지 않은 미지의 값
— null을 포함한 산술연산(+,-,*,/)의 결과는 항상 null 리턴
— !=, = 같은 비교연산도 안됨. 쓰려면 is, is not 쓰기

— 예제) CLERK인 직원의 이름, 총급여(SAL + COMM) 출력

select ename, SAL, COMM, SAL+COMM
from EMP
where job = 'CLERK';

— 예제) COMM이 null인 직원의 이름, 급여, COMM 출력

select ename, sal, comm
from emp
where comm is null;

— [desc]
— oracle에서 테이블의 layout을 볼 수 있는 명령어
— 컬럼명, 컬럼순서, null허용여부, 컬럼의 데이터타입, 설명(comment)

desc emp;

— [컬럼 별칭]
— select문에서 출력되는 컬럼명의 임시 이름(원본 이름 변경X)
— select절에서 정의
— 사용법: select 컬럼명 as 별칭(as 생략가능)
— 컬럼별칭의 재사용은 order by절에서만 가능

select ename as 사원명
from emp
where 사원명 = 'SMITH'; -- 에러 발생
select ename as 사원명
from emp
order by 사원명; -- 가능


— 컬럼 별칭 정의 시 쌍따옴표 필요한 경우
— 1. 별칭에 공백을 포함하는 경우
— 2. 별칭에 특수기호를 포함하는 경우 (oracle에서 #은 예외적으로 괜찮다)
— 3. 별칭의 대소문자를 구분하고 싶은 경우 (기본적으로 oracle은 모두 대문자로 출력)

select ename as 사원명, hiredate "입사 날짜", comm 보너스
from emp;
select ename as "사원명!"
from emp;

— 문제 (24.10.14 Monday)
— test_data.sql 전체 실행(F5) 후 아래 쿼리 작성

desc student;
desc emp;


— 1. emp 테이블에서 담당업무가 MANAGER인 사원의 사원번호, 성명, 업무, 급여, 부서번호(deptno)를 출력하라

select empno, ename, job, sal, deptno
from emp
where job = 'MANAGER';

— 2. emp 테이블에서 job이 MANAGER, CLERK, ANALYST가 아닌 사원의 사원번호, 성명, 업무, 급여, 부서번호를 출력하라

select empno, ename, job, sal, deptno
from EMP
where job in ('MANAGER', 'CLERK', 'ANALYST');

— 3. emp 테이블에서 15% 인상된 급여가 3500 이상인 직원의 이름, 기존급여, 인상된 급여를 출력하라

select ename, sal as 기존급여, sal1.15 as 인상된급여 
from EMP 
where sal1.15 >= 3500;

— 4. emp2 테이블에서 정규직과 인턴직을 제외한 직급 중 부서번호가 1008번이거나 취미가 오락인 직원의 이름, 고용형태, 부서번호, 취미 출력

select name, emp_type, deptno, hobby
from emp2
where emp_type not in('정규직', '인턴직')
and (deptno = 1008 or hobby = '오락');

— 5. student 테이블에서 “ㅅ” 성인 학생의 이름, 학번, 제1전공번호(deptno1) 출력

select name, studno, deptno1
from student
where name like 'ㅅ%';

—————————————-정답————————————————

— 1. emp 테이블에서 담당업무가 MANAGER인 사원의 사원번호, 성명, 업무, 급여, 부서번호(deptno)를 출력하라

select empno, ename, job, sal, deptno
from emp
where upper(job) = 'MANAGER'; -- 싹 다 대문자나 소문자로 바꿔놓고 하면 헷갈려도 해결가능
-- 또는 initcap() 을 써서 카멜표기법 형태로 바꿀 수도 있음

— 2. emp 테이블에서 job이 MANAGER, CLERK, ANALYST가 아닌 사원의 사원번호, 성명, 업무, 급여, 부서번호를 출력하라

select empno, ename, job, sal, deptno
from EMP
where job in ('MANAGER', 'CLERK', 'ANALYST');

— 3. emp 테이블에서 15% 인상된 급여가 3500 이상인 직원의 이름, 기존급여, 인상된 급여를 출력하라

select ename, sal as "기존 급여", sal1.15 as "인상된 급여" 
from EMP 
where sal1.15 >= 3500;

— 4. emp2 테이블에서 정규직과 인턴직을 제외한 직급 중 부서번호가 1008번이거나 취미가 오락인 직원의 이름, 고용형태, 부서번호, 취미 출력

select name, emp_type, deptno, hobby
from emp2
where emp_type not in ('정규직', '인턴직')
and (deptno = 1008 or hobby = '오락'); -- 괄호 안 넣으면 and 가 or 보다 먼저 수행됨

— 5. student 테이블에서 “ㅅ” 성인 학생의 이름, 학번, 제1전공번호(deptno1) 출력

select name, studno, deptno1
from student
WHERE NAME >= '사'
AND NAME < '아';

Leave a Comment