데이터베이스 (오라클 다운, 기초)
관계형 데이터 베이스
데이터를 통합해서 관리
일관된 방법으로 데이더의 누락,중복을 제거(최소화)
여러 사용자가 동시에 관리
데이터베이스의 구성
테이블(표)
키 - 기본키, 외래키
각 레코드를 구별하는 유일한 필드 ex) 주민등록번호, 아이디
중복불가능, 빈칸(null) 불가능
학생테이블 | |||||
학번 | 아이디 | 이름 | 국어 | 영어 | |
1001 | aaa | 티모 | 100 | 34 | 행(레코드) |
1002 | bbb | 베인 | 30 | 77 | |
1003 | ccc | 가렌 | 95 | 88 | |
1004 | ddd | 카직스 | 13 | 99 |
DBA : 데이터베이스 관리자
DBMS : 데이터베이스 관리 시스템 (오라클,mysql)
데이터 추출,조작,정의, 제어 등등
오라클(SQL)
특: 사용이 쉬움
비절차적인 언어(작성한 순서의 영향을 받지않음)
표준문법으로 작성
https://www.oracle.com/database/technologies/xe-prior-release-downloads.html
XE Prior Release Archive
Getting Started: Support Oracle Database Express Edition (XE) is a community supported edition of the Oracle Database family. Please go to the Oracle Database XE Community Support Forum for help, feedback, and enhancement requests. Note: Oracle Support Ser
www.oracle.com
SQL
https://www.oracle.com/tools/downloads/sqldev-downloads-2143.html
Oracle SQL Developer Downloads 21.4.3
This archive. will work on a 32 or 64 bit Windows OS. The bit level of the JDK you install will determine if it runs as a 32 or 64 bit application. This download does not include the required Oracle Java JDK. You will need to install it if it's not already
www.oracle.com
(압축만 풀면된다)
데이터 정의어 -> 테이블을 생성,삭제,수정(create,drop,alter)
데이터 조작어 -> 레코드를 추가,삭제,수정,검색(inert into, delete, update, select)
데이터 제어어 -> 권한 관련 ( commit, rollback, revoke(권한을 뺏다),grant(권한을 준다) )
자료형
number : 숫자
varchar : 문자
date : 날짜
N VAR CHAR 2 (크기)
VAR : 가변길이인지
VAR 없으면 : 고정길이
N : 유니코드(모든 문자가 2byte) -> 크기를 글자수 단위로 처리
N(x) : 한글 -> 3byte , 영어,숫자 -> 1byte / 크기는 바이트로 처리
2 : 4000byte
없으면 : 2000byte
데이터베이스 종류
1. 관계형 데이터 베이스 :
테이블로 구성( 컬럼과 레코드로 )
sql문법 사용
중복최소화 -> 정규화가 필요
속도는 느림 , 정확도가 필요할 경우 -> 관계형 데이터베이스사용
2. key-value 데이터베이스 :
키-벨류 구성 (서브용 DB)
중복신경안씀 -> 정규화필요x = 속도는 빠르나 정확도는 떨어짐
3. 그래프 데이터베이스 :
4. 도큐먼드 데이터베이스 :
키-벨류 구성
중복신경안씀 -> 정규화필요x = 속도는 빠르나 정확도는 떨어짐
5. 검색특화등등 이것저것 많음
EMP
EMPNO : 사원번호
ENAME : 사원이름
JOB : 사원직책
MGR : 직속상관의 사원번호
HIREDATE : 입사일
SAL : 급여
COMM : 추가수당
DEPTNO : 부서번호( 해당사원의)
DEPT : (부서테이블)
DEPTNO : 부서번호
DNAME : 부서명
LOC : 부서위치(지역)
SALGRADE : 급여 정보 테이블
GRADE : 급여등급
LOSAL : 급여 등급의 최소 급여
HISAL : 급여 등급의 최대 급여
검색문(select)
기본틀)
기본틀 작성 방식)
SELECT (필드명) FROM (테이블명) WHERE 조건식 ;
지정테이블 정보 불러오기
SELECT * FROM EMP;
--EMP테이블의 데이터를 출력
지정테이블에 임의의 가명 붙이기
SELECT ENAME AS 이름, sal AS 급여 from emp;
:필드에 가명붙이기( "가 명" or 가명 - 띄어쓰기,특수문자를 넣을경우 " " 따움표안에 써야함)
임의로 조회할때만 테이블명 가명으로 표시
테이블의 정보 불러오기
DESC EMP;
--EMP 테이블의 정보를 불러온다
필드의 중복된 값 없이 출력
SELECT DISTINCT DEPTNO FROM EMP;
--DEPTO(지정필드)의 중복된값 없이 데이터 출력
필드의 사칙연산 적용시켜 출력
SELECT sal, sal*12 FROM EMP;
--SAL(지정필드)의 데이터에 12를 곱하여 출력
조건에 만족하는 값만 보이게하기
SELECT *
FROM EMP
WHERE deptno = 10;
--DEPTNO 데이터가 10인 데이터만 출력
=, !=, or, and 등등 조건넣기
ex) 사원번호가 7500이상인것만 사원번호, 사원이름, 직책, 급여만 출력
SELECT EMPNO 사원번호, ENAME 사원이름, JOB 직책, SAL 급여
FROM EMP
WHERE EMPNO >= 7500;
ex) HIREDATE : 입사일이 81년 5월1일 이전 것만 출력
SELECT * FROM EMP
WHERE HIREDATE < '81/01/01';
ex) 사원번호가 30이 아닌것만 출력하시오
SELECT * FROM EMP
WHERE EMPNO != 30;
ex) 급여가 3000이상이고 부서번호가 20인 데이터만 조회
SELECT * FROM EMP
WHERE SAL >= 3000 AND DEPTNO = 20;
ex) 급여가 3000이상이거나 부서번호가 20인 데이터만 조회
SELECT * FROM EMP
WHERE SAL >= 300 OR DEPTNO = 20;
ex) 3가지 조건을 동시에 사용
급여가 3000이상이고 부서번호가 20이며 입사일이 82년01월01일 미만인 데이터
SELECT * from emp where sal >=3000 and deptno=20 and hiredate<'82/01/01';
ex ) 급여가 3000이상인 데이터 중에서 부서번호가 20이거나 입사일이 82/01/01이전인 레코드만 출력
SELECT * FROM EMP
WHERE SAL >= 3000 AND (DEPTNO = 20 OR HIREDATE < '82/01/01');
(괄호를 씌우므로써 부서번호가 20이거나 입사일이 82/01/01이전의 레코드가 먼저 계산)
ex) 급여가 2500이상이고 직업이 MANAGER인 사원이름, 직책, 급여, 부서번호만 출력
SELECT ENAME, JOB, SAL, DEPTNO
FRON EMP
WHERE SAL >= 2500 AND JOB = 'MANAGER';
ex) 직책이 MANAGER, SALESMAN, ANALYST인것만 출력
SELECT *
FROM EMP
WHERE JOB ='MAN AGER' OR JOB ='SALSEMAN' OR JOB ='ANALYST';
-----------------------------------------------------------------------------------------------
SELECT *
FROM EMP
WHERE JOB IN ('MAN AGER','SALSEMAN','ANALYST');
IN을 사용함으로써 더 간단(or과 같음)
NOT IN : 반대속성
EX) 부서번호가 10,20인 데이터만 출력(in 활용)
SELECT *
FROM EMP
WHERE deptno in (10,20);
ex) 급여가 2000이상 3000이하 데이터만 출력( between 활용)S
기본구성) 컬럼명 between(and와 동일) 최소값 and 최대;
not between : 반대 속성
SELECT *
from emp
where SAL BETWEEN 2000 AND 3000;
~~~를 포함하는
LIKE
ex) 이름에 K를 포함한 데이터 출력
SELECT * from emp WHERE ename like '%K%';
%K% : K를 포함한 모든 문자
K% : K로 시작하는 모든 문자
%K : K로 끝나는 모든 문자
_K% : 두번째 글자가 K인 모든 문자
_K : K으로 끝나는 총2글자인 문자
K _ _ _(실사용에선 띄어쓰기도 인식하여 쓰면 안댐) : K로 시작하는 4글자인 모든 문자
ex) 사원이름이 AM을 포함하는 데이터만 출력
SELECT * FROM EMP
WHERE ENAME like '%AM%';
(동일하게 not 을 쓰면 반대속성 -> not like)
ex) 특수기호 % 가들어간 사원이름을 출력
SELECT * FROM EMP
WHERE ENAME LIKE '%\%%' escape '\';
escape '\' : 지정한 기호( \ )뒤에 나오는 것을 문자로 인식시킨다
(like에 쓰이는 와일드카드기호( _ 와 %)를 인식 시켜려면)
값이 null 인것을 조회하기
SELECT * from emp WHERE comm is null;
is를 사용
is not : 반대 속성
정렬(ORDER BY)
- 급여를 오름차순 정렬시키기
SELECT (필드명) FROM (테이블명) WHERE (조건식) ORDER BY (필드명) (정렬기준 ASC:오름차순, DESC:내림차순);
EX) 1300이상의 급여를 오름차순으로 정렬
SELECT * FROM EMP
ORDER BY sal>=1300 asc; --오름차순정렬(기본값이 오름차순이라 생략가능)
만약 NULL값이 있을시 ASC(오름차순)은 제일 뒤로 밀려남
반대로 DESC(내림차순)은 제일 상위로 올라감
EX)급여가 1200이상인 레코드를 조회 (1차적으로 이름을 기준으로 오름차순, 2차적으로 급여를 기준으로 내림차순 정렬)
SELECT * FROM EMP
WHERE SAL>=1200 ORDER BY job ASC, sal DESC ;
추가로 정렬속성을 넣을시 ' , ' (콤마) 를 사용 (먼저쓴 정렬를 기준으로 두번째 기준실행)
가명을 사용해서도 가능
SELECT empno 사원번호,ename 이름, sal 급여 from emp order by 급여 asc;
연결 연산자
변수1 + "연결" + 변수2
ex)
SELECT ENAME ||'s job is '|| JOB AS 이름과직책 FROM EMP;
+ 의 역할을 || 가 대신한다
종합 연습문제
--ex) emp테이블에서 이름이 s로 끝나는 데이터를 출력하시오
SELECT * from emp WHERE ename like '%S';
ex)EMP테이블에서 부서번호가 30번인사원중 직책이 SALESMAN인 사원들의 사원번호,이름,직책,급여,부서번호를 출력
SELECT empno, ename, job, sal, deptno
FROM emp
where deptno = 30 AND job ='SALESMAN';
--ex) EMP테이블에서 부서번호가 20과 30인 사원중 급여가 2000이상인 데이터를 추출
-- 정렬 : 1차적으로 부서번호순으로 내림차순 2차적으로 급여순으로 내림차순 정렬
SELECT *
from emp
WHERE DEPTNO in(20,30) and sal >= 2000
order by DEPTNO DESC, sal DESC;
--ex) 급여가 2000이상 3000이하가 아닌 테이블을 출력
SELECT*from emp where sal not between 2000 and 3000;
--ex) 이름이 E를 포함하고 부서번호가 30번이면서
-- 급여가 1000이상 2000이하인 데이터 중 이름,사원번호,급여,부서번호순으로 출력
SELECT ename,empno,sal,deptno
from emp
WHERE ename like '%E%'
and deptno=30
and sal not between 1000 and 2000;
--ex)추가수당이 없고,직속상관이 있으면서 직책이 MANAGER,CLERK인 사람 중 두번째 글자가 L이 아닌 데이터를 출력
--(입사일 기준으로 오름차순 정렬)
SELECT
* FROM EMP
WHERE comm IS NULL --추가수당이 NULL이고
and mgr is not null --직속상관이 null이 아니고(직속상관이 있다)
and job in ('MANAGER','CLERK') --직책이 'MANAGER','CLERK' 이고
and ename not like '_L%' order by hiredate asc; --이름중 두번째 글자가 'L' 이 아니면 입사일 기준으로 오름차순 정렬