DATABASE

데이터베이스 (오라클 다운, 기초)

강준석 2023. 1. 9. 18:09
728x90

관계형 데이터 베이스

데이터를 통합해서 관리

일관된 방법으로 데이더의 누락,중복을 제거(최소화)

여러 사용자가 동시에 관리

 

데이터베이스의 구성

테이블(표)

키 - 기본키, 외래키

각 레코드를 구별하는 유일한 필드 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인 데이터만 출력

 

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' 이 아니면 입사일 기준으로 오름차순 정렬
728x90