본문 바로가기

Oracle

20일차 공부 Datebase, Oracle, select

1 교시

 

노트필기

 

2 교시

 

** 오라클 다운로드 : www.oracle.com - 회원가입을 해야만 다운로드 가능

1. 종류

11g, 12c, 18,c 19c 등 : 개발순서 (g-grid, c-cloud, i-internet)

 

eXpress Edition, Standard Edition, Enterprise Edition : 규모

집에서 공부할때는 eXpress Edition 이 적당하고 DB관리자가 되기 위해서 공부할 때는 Enterprise Edition을 설치

 

2. Oracle 11g xe 버전 설치

 

3. Oracle은 특별한 경우가 아니고는 Unix나 Linux에 설치해서 사용

비밀번호 입력란

 

=> 설치 확인 및 시작 옵션 변경

[제어판] - [관리도구] - [서비스]

두가지가 있으면 설치가 된것이다

 

 

우크릭 속성

 

 

두 가지 모두 수동으로 해야 접속시 자동으로 켜지지 않는다.

 

 

 

3~4 교시

 

** 오라클 접속

1. 접속에 필요한 정보

=> 오라클 접속 컴퓨터 정보 - localhost:1521(오라클 기본 포트)

=> 데이터베이스 이름이나 서비스 이름 - 이름(sid)이 xe

=> 사용자 계정 - sys(슈퍼관리자), sysdba(관리자) 계정이 제공

=> 비밀번호 - 설치할 때 입력한 비밀번호

 

2. 접속 프로그램

1) sqlplus : 오라클을 설치하면 자동으로 설치 - 관리자 프로그램

 

2) instant client : 오라클에서 만든 콘솔 기반의 접속 프로그램

 

3) sql developer : 오라클에서 만든 GUI 기반의 접속 프로그램 - 자바로 만들어짐

 

4) toad : 금융권에서 많이 사용하는 접속 프로그램

 

5) dbeaver : 하나의 프로그램으로 여려 종류의 데이터베이스에 접속이 가능  - 자바로 만들어짐

=> 자바로 데이터베이스를 접속하기 위한 드라이버가 있어야 한다.

 

3. 데이터베이스 사용시 필요한 것

1) DB Server

=> 데이터베이스 위치 - IP와 PORT

=> 데이터베이스이름 - SID 나 Service Name

=> 계정

=> 비밀번호

 

2) DB Client Program

=> DB Server를 설치하면 기본적으로 제공을 해주지만 DB Server가 설치되지 않은 곳에서는 직접 설치해서 DB Server에 접속해야 한다.

 

 

 

 

4. Sample Database 설치

1) system 으로 접속, 유저 생성

 

-- 유저 생성
CREATE USER scott IDENTIFIED BY tiger;  -- scott유저의 비번은 tiger

-- 테이블 스페이스 사용 권한 부여
ALTER USER scott
DEFAULT tablespace users;

-- 임시 테이블 스페이스 사용 권한 부여
ALTER USER scott
TEMPORARY tablespace temp;

-- 접속 권한 부여
GRANT CONNECT, dba, resource
TO scott;

 

2) scott 계정으로 접속

우쿨릭 - 연결 종료 - 에디트 커넥션 - scott tiger 입력

 

 

 

5 교시

 

scott.sql 데이터가 저장되어 있는 파일을 이용해본다.

DROP TABLE DEPT;

CREATE TABLE DEPT
       (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13) ) ;

DROP TABLE EMP;

CREATE TABLE EMP
       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);


INSERT INTO DEPT VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES(40,'OPERATIONS','BOSTON');

INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy')-85,3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);


DROP TABLE BONUS;
CREATE TABLE BONUS
(
ENAME VARCHAR2(10) ,
JOB VARCHAR2(9)  ,
SAL NUMBER,
COMM NUMBER
) ;
DROP TABLE SALGRADE;
CREATE TABLE SALGRADE
      ( GRADE NUMBER,
LOSAL NUMBER,
HISAL NUMBER );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT;


SELECT * FROM DEPT;
SELECT * FROM EMP;
SELECT * FROM BONUS;
SELECT * FROM SALGRADE;

 

** SQL

=> Strutured Query Language : 구조적 질의 언어

=> 관계형 데이터베이스 작업을 위한 언어

 

1. 분류

1) DDL(Date Definition Language - DBA(Data Base Administrator의 언어)

=> 구조를 만들고 변경하고 삭제하는 언어

Create : 구조 생성

Alter : 구조 변경

Drop : 구조 삭제

 

Truncate : 테이블 삭제

Rename :  테이블 이름 변경

 

2) DML(Date Manipulate Language - 개발자의 언어)

=> 데이터를 삽입하고 갱신하고 삭제하는 언어

Insert : 데이터 삽입

Update : 데이터 갱신

Delete : 데이터 삭제

 

3) DQL(Date Query Language - 개발자의 언어)

=> 데이터를 조회하는 언어

=> DB 이론에서는 DQL을 DML로 간주

Select : 데이터 조회

 

4) TCL(Transaction Control Language - 개발자의 언어)

=> 트랜잭션을 제어하는 언어

=> DB 이론에서는 TCL을 DCL로 간주

Commit : 작업 완료

Rollback : 철회

SavaPoint : 저장점

 

5) DCL(Data Control Language - DBA의 언어)

=> 보안, 무결성, 회복, 병행제어 등에 관련된 언어

Grant : 권한 부여

Revoke : 권한 회수

 

6) 개발자 한테 중요한 순서 (DB할 일이 있으면 이순서로 하자)

DQL -> DML ->TCl ->DDL ->DCL

=> DCL은 개발자가 사용할 가능성이 거의 없다.

=> 중견기업이상에서는 DDL도 사용할 가능성이 없는데 중소기업이나 스타트업 처럽 데이터베이스 관리자를 별도로 두지 않는 경우에는 개발자가 DDL도 수행

 

2. 데이터베이스 개체

1) Table : 실제 데이터가 저장되는 개체

 

1) Sequence : 일련번호

=> auto_increment

 

3) View : 자주 사용하는 Select 구문을 미리 만들어 둔 것

 

4) Index : 데이터를 빠르게 찾을 수 있도록 해주는 개체

 

5) Synonym : 별명

 

6) Stored Precudure : 자주 사용하는 SQL 구문을 하나의 이름으로 묶어 둔 것

 

7) Function : 자주 사용하는 코드를 하나의 이름으로 묶어둔것

=> SQL에서는 반드시 리턴 값이 있어야 한다. 

 

8) Trigger : DML 문장을 수행하기 전이나 수행 한 후에 자동으로 동작하는 개체

 

3. SQL 규칙

=> SQL에서는 예약어와 테이블이름 그리고 열 이름은 대소문자 구분을 하지 않는다.

오라클은 테이블 이름과 열 이름에 대문자를 사용하고 MySQL은 소문자를 사용한다.

 

=> 문장의 끝은 ; 인데 데이터베이스 접속 프로그램에서는 블럭을 잡고 실행하기 때문에 생략해도 된다.

java에서 SQL을 입력할 때는 ; 을 붙이면 안된다.

 

** SELECT : 데이터 조회

1. 기본 형식 (암기)

 

5- SELECT            조회할 표현식 나열(열을 분리)

1- FROM             테이블 이름 나열

2- WHERE           조건 나열(행을 분리)

3- GROUP BY       그룹화 할 표현식 나열

4- HAVING          그룹화 한 이 후의 조건 나열(행을 분리)

6- ORDER BY       정렬할 표현식 나열

 

=> FROM과 SELECT는 필수

=> 나머지는 선택

 

2. 테이블 구조 파악

DESC 테이블 이름;

=> DBeaver 에서는 안된다.

 

3. 테이블의 전체 데이터 조회

SELECT*

FROM 테이블이름;

 

ex) emp, dept, salgrade 테이블의 전체 데이터를 조회

 

SELECT * FROM EMP;

8열 14행

EMPNO : 사원번호

ENAME : 사원이름

JOB : 직무

MGR : 관리자 사원번호

HIREDATE : 입사일

SAL : 급여

COMM : 성과금

DEPTNO : 부서번호

 

 

SELECT * FROM DEPT;

3열 4행

DEPTNO : 부서번호

DNAME : 부서명

LOC : 부서위치

 

 

SELECT * FROM SALGRADE;

3열 5행

GRADE : 급여등급

LOSAL : 최소급여

HISAL : 최대급여

 

 

 

 

6~7 교시

 

4. 테이블에서 특정 열 조회

SELECT 열이름나열

FROM 테이블이름나열;

 

EX) EMP 테이블에서 EMPNO와 ENAME을 조회

SELECT EMPNO, ENAME

FROM EMP;

 

5. 숫자로 된 열에 산술 연산자를 이용해서 산술 연산한 결과 조회

=> 산술 연산자 +, -, *, / 사용 가능

=> 날짜 데이터는 하루를 1로 계산해서 연산이 가능

=> NULL 데이터와 연산을 하게되면 결과는 NULL

=> NVL(컬럼이나 연산식, 값이 NULL 인 경우 적용할 값)을 이용하면 NULL인 데이터를 기본값으로 변경해서 연산을 하는 것이 가능

적용할 값은 컬럼의 자료형과 일치하는 데이터이어야 한다.

 

EX1) EMP 테이블에서 ENAME과 SAL에 12를 곱한 결과를 조회

SELECT ENAME, SAL*12

FROM EMP;

 

 

EX2) EMP 테이블에서 ENAME SAL * 12 + COMM 결과를 조회

SELECT ENAME, SAL*12 + COMM

FROM EMP;

 

 

EX3) EMP 테이블에서 ENAME SAL * 12 + COMM 결과를 조회

COMM이 NULL이면 0으로 계산

SELECT ENAME, SAL*12 + NVL(COMM, 0)

FROM EMP;

 

 

 

6. 열 이름에 ALIAS 설정

=> 열 이름에 별명을 부여하는 것

=> 열 이름 다음에 빈 칸을 두고 별명을 기재하면 된다.

중간에 AS를 삽입해도 된다.

=> 별명에 공백이 잇거나 영문 대문자가 있으면 ""로 감싸야 한다.

=> SELECT 절에 작성하기 때문에 이 별명은 ORDER BY에서만 사용이 가능

=> 연산식이나 함수의 결과를 조회할 때 많이 사용

 

EX) EMP 테이블에서 ENAME, SAL * 12 + COMM 결과를 조회

COMM이 NULL이면 0으로 계산

SAL * 12 + COMM을 연봉이라는 열 이름으로 조회

SELECT ENAME, SAL*12 + NVL(COMM, 0) 연봉

FROM EMP;

SELECT ENAME, SAL*12 + NVL(COMM, 0) AS 연봉

FROM EMP;

두 문장의 결과는 같다.

 

 

7. 열 결합 연산자- ||

=> 2개 이상의 열이나 표현식을 하나의 열로 묶어서 조회할 때 사용하는 연산자

=> 오라클 만을 이용해서 보고서를 만들 때 주로 이용

 

EX) EMP 테이블에서 ENAME의 업무는 JOB입니다. 로 조회하기

SELECT ENAME || '의 연봉은' || JOB || ' 은 입니다'

FROM EMP;

=> 개발자들은 2개의 컬럼을 가져와서 출력할 때 직접 결합하는 형태를 많이 사용하기 때문에 개발자들은 이 연산자를 거의 사용하지 않는다.

 

8. 중복 제거

=> SELECT 절에서 맨 앞에 DISTINCT를 추가하면 중복을 제거하고 조회

=> DISTICT 뒤에 2개 이상의 열 이름이 오면 모든 열의 값이 일치하는 경우 제거된다.

하나라도 중복되지 않은 값이 있으면 조회가 된다.

 

EX1) EMP 테이블에서 JOB 열의 중복을 제거하고 조회

-- 중복을 제거하지 않고 JOB을 조회

SELECT JOB

FROM EMP;

-- 중복을 제거하고 JOB 조회

SELECT DISTINCT JOB

FROM EMP;

=> DISTINCT는 맨 앞에 1번만 나와야 하고 뒤에 나오는 모든 열에 영향을 미친다.

 

 

**프로그래밍이 수행되는 과정

데이터를 수집 -> 데이터를 가공 -> 처리 -> 결과를 출력 -> 결과를 저장

 

 

 

 

8 교시

 

**where

=> select 구문에서 테이터를 행 단위로 분리하기 위한 절

=> from 다음에 위치해야하고 생략할 수 있다.

1. 연산자

연산자 의미

= 같다

>보다 크다

>= 보다 크거나 같다

< 보다 작다

<= 보다 작거나 같다

<>, !=, ^= 같지 않다

NOT Column_name = 같지 않다

NOT Column_name > 보다 크지 않다

 

ex1) emp 테이블에서 sal이 3000이상인 사원의 empno, ename, sal을 조회

select  empno, ename, sal 

from emp

where sal >= 3000;

 

ex) emp 테이블에서 job이 MANAGER인 사원의 empno, ename, job, sal, deptno를 조회
SELECT empno, ename, job, sal, deptno
FROM EMP
WHERE job = 'MANAGER';  -- 조건은 대소문자 구분을 해줘야한다. manager 라고 쓰면 에러

 

 

 

2. 날짜

=> 날짜도 숫자 데이터처럼 크기 비교가 가능

=> 날짜 및 시간 표현 : to_date('날짜문자열', '날짜서식')

=> yyyy:년도4자리, mm:월2자리, dd:일 2자리, hh:시간2자리, hh24:24시간제, mi:분, ss:초

=> 날짜끼리 산술연산이가능하고 숫자 데이터와 산술연산이 가능

하루를 1로 계산

 

ex) emp 테이블에서 1982/01/01 이후에 입사한 사원(입사일이 HIREDATE)의 ename, sal 데이터를 조회

SELECT ENAME, SAL

FROM  EMP

WHERE  HIREDATE >=to_date('1982/01/01', 'yyyy/mm/dd');

 

-- emp 테이블에서 1982년에 입사한 사원(입사일이 HIREDATE)의 ename, sal, hiredate 데이터를 조회
SELECT ENAME, SAL , HIREDATE 
FROM  EMP
WHERE  HIREDATE >=to_date('1982/01/01', 'yyyy/mm/dd') AND HIREDATE <=to_date('1982/12/31', 'yyyy/mm/dd');

and는 and, or는 or

 

3. between and

=> between A and B : A 와 B사이 - A와 B 포함

=> B가 A보다 크거나 같아야한다.

위의 문제를  WHERE  HIREDATE between to_date('1982/01/01', 'yyyy/mm/dd') AND 

                             HIREDATE <=to_date('1982/12/31', 'yyyy/mm/dd');

으로 작성해서 풀 수 있다.

 

 

4. in

=> in(값을 나열) : 나열된 값 중에 포함된 데이터를 조회

 

ex) EMP 테이블에서 JOB이 MANAGER 또는 ANALYST인 사원의 모든 정보를 조회

select *

from emp

where job in ('MANAGER', 'ANALYST');

 

 

EX2) EMP 테이블에서 DEPTNO의 값이 10 또는 30인 사원의 ENAME, SAL, COMM을 조회
단 COMN 이 NULL이라면 0으로 출력
select ENAME , SAL , NVL(COMM, 0) 
from emp
where DEPTNO in (10, 30);

 

 

**JAVA 문제

1. 하나의 문자열을 입력받아서 이 문자열이 펠린드롬인지 확인하는 문제

펠린드롬은 앞에서 읽으나 뒤에서 읽으나 동일한 문자열을 의미한다. (예: 101,1001)

=> length() : 문자열의 길이, charAt(int idx) : idx 번째 문자를 char로 리턴

내가 한거

 

 

 

 

 

 

 

 

 

 

2. 배열이나 리스트를 이용해서 0-1023 사이의 정수를 입력했을 때 이 숫자를 이진수로 변환해서 출력하기 - 무조건 10자리로 출력

7 : 0000000111

21 : 0000010101

1023 : 1111111111