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 설치
- zip파일 처음에 압축해제 할 때 1of2, 2of2 하나씩 해제하기!
- setup.exe 실행
- ‘최소사양 만족 못했다’는 메시지 무시
- ‘데이터베이스 생성 및 구성’
- ‘서버클래스’
- ‘단일 인스턴스 데이터베이스
- ‘고급’
- ‘enterprise edition’
- 설치위치 지정 (oracle base: D:\app\itwill, oracle home: D:\app\itwill\product\11.2.0\dbhome_3)
- 구성 유형: 일반용/트랙잭션 처리(OLTP)-유저 많다, 조회되는 데이터의 양은 적다 / 데이터 웨어하우징(DW)-유저 적다, 조회되는 데이터의 양은 많다 / ‘일반용’ 선택
- 식별자(Oracle SID)
- 메모리 나중에 수정 가능, 문자 집합은 기본값으로, 샘플스키마 check
- ‘파일 시스템’
- 자동백업 사용하지않음
- 비밀번호 ‘oracle’
- ‘완료’
- JAVA 팝업 뜨면 ‘허용’
- ‘비밀번호 관리’
- ‘HR’, ‘SCOTT’ 잠금해제 및 비밀번호 설정하기(oracle)
orange6 std 설치
- 싹 다 넘기다가 ‘자동 업데이트’ 만 끄기
cmd 창에서
- Local에서 DB 접속 명령어: sqlplus system/oracle
- 원격에서 DB접속 도와주는 툴: orange, sql-developer, toad, dbeaver, golden
- sql 접속 후 conn scott/oracle 로 scott으로 접속
- scott 잠금과 비밀번호 설정 안 했으면 alter user hr account unlock identified by “oracle”; 입력해서 설정 가능. 이 명령어는 나중에 개발자들 계정 풀어줄 때 쓰인다.
orange6 에서
- DB 이름 ‘orcl’, user: scott, pw: oracle 선택해서 로그인
- 단축키들
- 주석 기호: —
- 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 < '아';