|  테이블 정의

- 정형화된 데이터는 RDBMS의 기본 단위인 Table 형태로 저장된다.

- Table은 관계(Relation)라고도 불리며, 특정 종류의 데이터를 구조적으로 묶은 목록을 말한다.

  (1) 칼럼 = 필드 = 속성         : 변수 EX. email, name, addr...

  (2) 로우 = 레코드 = 튜플     : 실제 값 EX. kim1234@gmail.com, kim1235@gmail.com...

 

|  데이터 자료형

- 종류 : 숫자 / 문자 및 문자열 / Boolean / 날짜 및 시간 / 큰 객체 

- 각 DBMS마다 자료형을 표현하는 방식에 차이가 있다.

  Oracle MySQL/MariaDB SQL Server PostgreSQL
숫자 NUMBER
FLOAT
TINTINT
SMALLLINT
MEDIUMINT
INT
BIGINT
DECIMAL
FLOAT
DOUBLE
BIGINT
INT
SMALLINT
TINYINT
NUMERIC/DECIMAL
FLOAT
REAL
SMALLINT
INTEGER
BIGINT
DECIMAL
NUMERIC
REAL
DOUBLE
문자(열) CHAR
VARCHAR2
CHAR
VARCHAR
CHAR
VARCHAR
CHAR
VARCHAR
Boolean   BIT BIT BOOLEAN
날짜/시간 DATE
TIMESTAMP
DATE
TIME
DATETIME
TIMESTAMP
YEAR
DATE
DATETIME
DATETIME2
SMALLDATETIME
TIME
DATE
TIME
TIMESTAMP
큰 객체 LONG
CLOB
BLOB
TEXT
MEDIUMTEXT
LONGTEXT
BLOB
TEXT
BINARY
IMAGE
TEXT

 

|  테이블 생성/삭제/조회

A. DDL을 통한 테이블 생성과 삭제

📡 MariaDB

-- 테이블 생성
CREATE TABLE EVENT_INFO(
    START_DATE DATETIME,
    END_DATE DATETIMEl,
    SUBJECT VARCHAR(255),
    CONTENTS TEXT
);

-- 테이블 삭제
DROP TABLE EVENT_INFO;
더보기

📡Oracle

CREATE TABLE MEMBER
(
    ID       VARCHAR2(50),
    PWD      VARCHAR2(50),
    NAME     VARCHAR2(50),
    GENDER   CHAR(50),
    AGE      NUMBER,
    BIRTHDAY CHAR(50),
    PHONE    CHAR(50),
    REGDATE  DATE
)

DROP TABLE MEMBER;

☝️ 테이블 명명규칙 ☝️

- 일반적으로 DB 테이블 또는 DB 칼럼명대문자 스네이크 기법을 사용한다.

- pf. 과거 컴퓨터 속도가 느리던 시절 아스키 코드의 앞자리에 해당하는 대문자코드를 선호 

- pf. 회사마다 차이가 있을 수는 있다.

CREATE TABLE BOOTCAMP_MEMBER(

);

 

B. 데이터베이스 툴을 통해 테이블 생성(DataGrip기준)

더보기

|  데이터베이스 툴

- DBMS를 편리하게 사용할 수 있도록 하는 IDE툴이다.

- DataGrip이 가장 많이 사용되며, DBeaver 또한 자주 사용된다.

- 종류 : DataGrip, DBeaver, MySQL WorkBench, SQL Developer, 그 외 (Toad, SQLGATE 등...)

 

|  데이터베이스 툴 설치

(1) DataGrip 설치

https://dbeaver.io/download/

(2) DBeaver 

https://www.jetbrains.com/ko-kr/toolbox-app/ 

 

|  데이터베이스 툴 실행

- 필요 정보 : IP주소, port번호, database(instance) 이름, 계정명, 비밀번호

- 사용하는 DBMS에 맞추어 위 필요정보를 입력한 후 ping을 통해 연결 확인

- [tables] - 우측마우스 - Table 생성

- DDL script를 자동으로 생성해준다.

- 대체로 대다수의 데이터베이스 툴이 이와 비슷한 기능을 제공한다.

⭐️ Tip : [tables] - 우측마우스 - [SQL script] - [원본 DDL 복사] 로 SQL테이블을 그대로 복사할 수 있다.

 

C. 테이블 조회

📡 MariaDB

SHOW TABLES;
-- 또는
SELECT *
FROM 테이블명

 

 

[ 참고 및 출처 ]

부트 캠프 강의를 들은 후 정리한 내용입니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=on21life&logNo=221548738367 

 

|  개요

📌  인스턴스란? = database(데이터의 집합) = table space = 테이블이 위치하는 공간(디렉토리)
📌  계정은 왜 여러개 생성할까? 접속자마다 DB 관리권한이 다를 수 있다. 
📌  원격으로 접속하는 컴퓨터에 대한 접속권한도 고려해야 한다.

📌  SQL명령어 - DDL, DML, DCL

 

|  SQL (Structured Query Language)

- 의미 : DBMS와 소통하기 위한 구조화된 질의어

- 구분

데이터 정의어(DDL, Data Definition Langugae) CREATE, DROP, ALTER, TRUNCATE
데이터 조작어(DML, Data Manipulation Language) INSERT, UPDATE, DELETE, SELETE ( CRUD )
데이터 제어어(DCL, Data Control Language) GRANT, REVOKE, TRANSACTION, COMMIT, ROLLBACK..

☝️  데이터 정의어 : 테이블과 인덱스 구조를 관리

✌️  데이터 조작어 : DDL를 통해 테이블 구조가 잡히면 그 안에 넣을 데이터를 CRUD하는 언어

🤟 데이터 제어어 : 권한을 부여하거나 뺏는 등의 제어와 관련된 언어

 

|  데이터베이스 인스턴스 및 계정 생성 

A. 데이터베이스 생성과 삭제

📡 MariaDB

CREATE DATABASE /*테이블명*/;
DROP DATABASE /*테이블명*/;
더보기

📡Oracle

// 아래와 같이 테이블스페이스를 만들지 않으면 System(관리자=root)와 같은 공간 공유
DEFAULT TABLE SPACE USERS 기본테이블 스페이스;
TEMPORARY TABLESPACE 임시테이블 스페이스;

 

B. 데이터베이스 계정 생성

📡 MariaDB

- 데이터베이스 계정 조회

show databases;
use mysql;
select User, Host, Password from user;

- 계정 생성하기

CREATE USER '계정명'@'호스트명' IDENTIFIED BY '비밀번호';
CREATE USER '계정명'@'localhost' IDENTIFIED BY '비밀번호'; // 로컬만 허용
CREATE USER '계정명'@'%' INDENTIFIED BY '비밀번호'; // 다른 ip도 허용

flush privileges;

rf. 원격 계정 접속 : 로그인 옵션에 [ -h  ip주소 ]를 추가한다.

 

// 원격 pc에서
mysql -h /*접속하려는 ip*/ -u /*계정명*/ -p /*비밀번호*/

 

C. 데이터베이스 계정 권한 설정

📡 MariaDB

- 계정에 테이블에 대한 사용 권한을 부여하는 것이다.

GRANT ALL PRIVILEGES ON 테이블명.* TO '계정명'@'호스트명' IDENTIFIED BY '비밀번호'; // 특정 IP
GRANT ALL PRIVILEGES ON 테이블명.* TO '계정명'@'%' IDENTIFIED BY '비밀번호'; // 전체 IP 대상

FLUSH PRIVILEGES; // 권한 설정사항 FLUSH
더보기

📡 Oracle

> 관리자 아이디로 접속 후
> 권한 부여
grant all                        --- 모든 권한 부여(위험)
grant connect to 계정            --- db 연결 권한
grant resource to 계정           --- db 자원(table, sequence) 생성 권한
grant dba to 계정                --- 시스템 자원 무제한 사용, 다른 사용자 권한 조정 등 강력한 기능에 관한 권한
grant select on 테이블 to 계정   --- 조회(SELECT) 권한 부여
grant create view to 계정        --- 뷰 권한 

> 권한 회수
revoke connect,resource from 계정
revoke select on 테이블 또는 뷰명 from 계정  -- 테이블 또는 뷰 권한 회수

 

D. 데이터베이스 조회

📡 MariaDB

SHOW DATABASES;
더보기

📡 Oracle

SELECT *
FROM ALL_ALL_TABLES;

 

 

[ 참고 및 출처 ]

부트 캠프 강의를 들은 후 정리한 내용입니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ragew&logNo=30047111788 

https://sgcomputer.tistory.com/247

|  데이터베이스의 순위

- 출처 : https://db-engines.com/en/ranking

- 2022년을 기준으로 데이터베이스의 순위는 아래와 같다

* 아래 [바로가기]를 선택 시, 해당 DBMS 사용 메뉴얼로 이동

- 예전에 오라클을 설치하는 것을 포스팅한 적이 있었는데 이번에는 MariaDB를 설치하는 법을 작성해보려한다.

1 Oracle RDMBS 오라클사 바로가기
2 MySQL RDMBS 오라클사 바로가기
3 Microsoft SQL Server RDMBS Microsoft 바로가기
4 PostgreSQL RDMBS PostgreSQL단체 바로가기
5 MongoDB NoSQL계열 MongoDB, Inc 바로가기

 

|  MariaDB 설치하기

1. Windows 환경

(1) 다운로드 사이트로 이동 [바로가기]

- 컴퓨터 OS환경에 맞춰서 설치하면 된다. (Package Type은 Zip으로 하는 것이 차후 세부설정을 하기 편하다)

(2) 다운되면 압축을 푼다.

(3) 관리자 권한 CMD에서 압축을 푼 경로로 이동 후 설치파일을 실행한다.

** 관리자 권한으로 열어주는 이유 : 보안 이슈로 서비스 등록을 처음할 때는 관리자 권한이 있어야만 가능

** 사용자용 CMD 관련 팁 : 파일탐색기 경로창에 "cmd" 입력 후 엔터를 치면 사용자용 cmd가 알아서 뜬다.

cd /* 압축 푼 폴더 경로 */
cd /bin

** 설치파일을 실행하기 전에, 명령어 옵션에 대한 정보를 --help로 확인하면 좋다.

mariadb-install-db.exe --help  // 설치파일에 관한 정보 확인

mysql_install_db.exe  Ver 1.00 for Windows
Copyright (C) 2010-2011 Monty Program Ab & Vladislav Vaintroub
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Usage: mysql_install_db.exe [OPTIONS]
OPTIONS:
  -?, --help          Display this help message and exit.
  -d, --datadir=name  Data directory of the new database
  -S, --service=name  Name of the Windows service
  -p, --password=name Root password
  -P, --port=#        mysql port
  -W, --socket=name   named pipe name (if missing, it will be set the same as
                      service)
  -D, --default-user  Create default user
  -R, --allow-remote-root-access
                      Allows remote access from network for user root
  -N, --skip-networking
                      Do not use TCP connections, use pipe instead
  -i, --innodb-page-size=#
                      Page size for innodb
  -s, --silent        Print less information
  -o, --verbose-bootstrap
                      Include mysqld bootstrap output
  -l, --large-pages   Use large pages
  -c, --config=name   my.ini config template file

> 이 중에서 서비스명, Root password를 지정하는 옵션을 뽑아 명령어를 쓴다.

mariadb-install-db.exe -S 서비스명 -p 비밀번호  // 오류가 뜬다면 관리자권한CMD인지 확인하자

- [작업관리자] - [서비스]로 들어가면 서비스가 잘 등록된 걸 볼 수 있다.

(5) 실행하기

A. 서비스 직접 실행

sc start MariaDB

B. mysql.exe로 실행

- MariaDB 압축파일을 풀었던 경로의 bin폴더로 가서 mysql.exe 명령어 option을 확인한다.

mysql.exe --help

>> 엄청나게 옵션이 많은데 다른 건 필요없고 아래 두가지만 확인하면 된다.

 -u, --user=name     User for login if not current user.
 -p, --password[=name]
                      Password to use when connecting to server. If password is
                      not given it's asked from the tty.

- 여기서 user는 root로 지정하고, pwd는 처음 설치할 때 지정한 root password를 넣어준다

(root는 서비스의 최상위 권한자이다.)

mysql.exe -u root -p 
지정한RootPassword 입력

- 실행이 잘 되었는지 아래 코드를 통해 확인해본다.

select version(); - 버전명 확인

show databases; - 현재 계정에서 확인할 수 있는 등록된 DB들

use mysql; - 사용

show tables; - 테이블 목록 확인

select Host, User, Password from user; - 호스트(로컬or외부), 계정, 비밀번호 확인

 

2. MacOS 환경

(1) 패키지 매니저 "홈브루"를 설치한다.

- 맥의 터미널은 iterm2를 다운받아 터미널로 사용할 수 있다.(UI면에서 더 편리하다)

- 홈브루 설치 메뉴얼 : https://brew.sh/index_ko

: 아래 명령어를 작성해서 홈브루를 설치한다

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

(2) 홈브루를 통해 MariaDB 버전을 확인한다.

brew search mariadb   //MariaDB 각 버전 검색
brew info mariadb     //default version인 mariadb에 대한 정보 확인

(3) 홈브루를 통해 선택한 버전의 MariaDB를 설치한다

brew install mariadb

- 설치 후에, 다시 아래 명령어를 입력하면 설치된 버전이 체크된 걸 볼 수 있다

brew search mariadb

- 설치 후에는 설치된 경로를 알려주는데, 해당 경로를 꼭 따로 입력해주는 것이 좋다.

(4) 터미널에서 (3)에서 확인한 경로로 이동

- 현재 경로를 확인하고 설치 경로로 이동한다.

pwd   // 현재 경로확인
cd mariadb경로

- bin 폴더에서 ls를 통해 파일 목록을 확인하면,

  mariadb_secure_installation(주황색), mysql_secure_installation(보라색) 두가지가 있는걸 볼 수 있는데, 

  --> 주황색 표시된 mariadb_secure_installation이 실질적인 설치 파일이고,

  --> 보라색 표시된 mysql_secure_installation은 그걸 참조한다.

  *** 우리는 이 중에서, mariadb_secure_installation를 설치하면 된다.

(5) 관리자 권한으로 설치파일 실행 

// su : 관리자 권한 실행
// ** mac이나 linux는 꼭 앞에 ./ 현재 경로 입력해야 실행된다
su ./mariadb_secure_installation

- Root password 및 기타 설정을 설정한다

- 모두 설치한 후 잘 설치되었는지 확인하려면 아래를 입력하면 된다.

brew services info mariadb

(6) 서비스 실행하기

brew services start mariadb
//brew services restart mariadb 
//bres services stop mariadb

 

3. Linux 환경 

(1) 패키지 매니저를 설치한다.

- 우분투의 경우 apt, CentOS의 경우 yum을 통해 설치한다.

(2) MariaDB 버전 확인 후 설치파일 다운로드

- 패키지 매니저를 통해 MariaDB 버전을 확인하거나

apt search mariadb-server

- MariaDB 사이트에서 버전 확인 후 가이드에 따라 설치파일 다운로드[바로가기]

(4) MariaDB 설치파일 실행

sudo -i //관리자 권한 실행
find / -name mariadb-secure*  //파일 경로 확인
apt mariadb-secure-installation //설치파일 실행

(5) 서비스 실행하기

service mariadb start

 

원격으로 외부 DB서버에 접속하는 방법(윈도우 기준)

- 들어가기 전에

- 일반적으로 Root는 원격으로 접속할 수 없도록 되어 있다.
- Shell을 통해 원격접속을 할 때에는
   A. SSH를 통해서 DB컴퓨터에 접속 후 DBMS에 접근하거나
   B. DB컴퓨터에서 외부IP의 포트 및 계정 권한을 허용한 경우 접근할 수 있다. 

- Shell이 아닌 IDE(IntelliJ, Eclipse등)에서 접속을 할 경우에도,
  마찬가지로 DB컴퓨터에서 나의 접근을 허용해주어야만 접근이 가능하다.
- 원격 접속하는 걸 연습할 때는 xShell을 쓰면 유용하다 (xShell 다운 바로가기)
  현장에서는 PuTTY를 더 자주 쓴다.

 

사용자를 포함해서 개발자도 웹 서버를 통해 DB와 소통을 한다.

다만, 때에 따라 개발자가 DB서버에 직접적으로 접근을 해야하는 경우도 있는데

보안상 DB 서버는 따로 두는 경우가 많아서 이런 경우 DB 서버에 원격으로 접속하는 것이 필요하다.

원격으로 서버에 접속하기 위해서는 기본적으로 아래와 같은 정보들이 필요하다.

[ 원격으로 서버에 접속하기 위한 정보 ]

구분 설명 예시
주소(IP)  특정 시스템의 주소 - 내컴퓨터(로컬) : 127.0.01, localhost
- 외부 : 168.xxx.xx.x 
포트(PORT)  그 시스템 내 프로그램 위치 - 3306(MariaDB의 디폴트 포트)
- 22(웹)
...
계정  서비스 계정  
비밀번호 그 계정의 비밀번호  
인스턴스     

 

A. SSH를 통해 내 컴퓨터(윈도우)에서 DB컴퓨터(Linux)에 접속하기

(1) xShell을 설치하고 실행한다.

(2) IP주소를 확인하여 SSH를 통해 접속하기 (접근 시 비밀번호 작성)

ssh satcop@접속할ip주소

(3) 해당 ip 내에서 DBMS 접속하기

mysql -u root -p

 

B. DB컴퓨터(Linux)가 내 컴퓨터(윈도우) IP의 포트 및 계정 권한 허용

[ DB컴퓨터(Linux)에서 아래와 같이 작업이 필요하다]
1. DBMS 설정(my.cnf)에서 외부 IP도 DBMS 포트에 접속할 수 있게 설정하기
2. DBMS 계정을 만들어 외부IP와 연결하기

- 윈도우 cmd에서 아래와 같은 코드를 작성하여 바로 접근을 하려 하면 "can't connect to server on 'ip주소'"가 나타난다.

mysql -h 외부ip주소 -u root -p

- 이유는 DB를 담고 있는 PC에서 MariaDB 포트를 열어두지 않았기 때문이다.

- DB를 담고 있는 PC(linux)에서 아래의 명령어를 통해 현재 활성화된 포트를 확인해보면

netstat -anpt

- 아래와 같이 MariaDB 포트가 로컬컴퓨터에서만 열려 있는 걸 볼 수 있다. 

* 로컬 컴퓨터 주소 : 127.0.0.1

* MariaDB 디폴트 포트 : 3306

Proto  (생략)  Local Address    (생략)
tcp            127.0.0.1:3306

- DB를 담고 있는 PC(linux)의 MariaDB 설정파일(my.cnf)에서 외부ip 접근을 허가한다.

sudo -i                 //관리자권한 실행
find / -name my.cnf     //my.cnf (설정파일) 경로 확인
cd /etc/mysql           //해당 경로로 이동
vi my.cnf               //my.cnf 실행

[mysqld]                //설정파일에서
bind-address=0.0.0.0    //모든 외부ip접근 허가(또는 특정짓기)

service mariadb restart //MariaDB 재실행

- 허가를 하면 아래와 같이 모든 ip에서 3306포트가 열린 걸 볼 수 있다.

Proto  (생략)  Local Address    (생략)
tcp            0.0.0.0:3306

- 이렇게만 하면 접속이 가능해질까? 그렇지 않다.

  아래를 보면 알 수 있듯이 root 계정은 localhost에서만 사용가능하기 때문에 새롭게 계정을 만들어 주어야 한다.

use mysql
select Host, User from user;
+-----------------+-------------+
| Host            | User        |
+-----------------+-------------+
| 127.0.0.1       | root        |
| ::1             | root        |
| desktop-ivvs8i6 | root        |
| localhost       | mariadb.sys |
| localhost       | root        |
+-----------------+-------------+

- 새로운 계정을 만들어 주면서, 모든 ip에서 접속가능하게 설정하기

create user 'root'@'%' indentified by 비밀번호; // '%' : 어떤 호스트에서든 접속 가능
grant all privileges on root.* to 'root'@'%' indentified by 비밀번호;  // 권한설정
flush privileges;

 

|  사용된 CLI 명령어 정리

windows CLI 명령어

cd 경로 이동 cd ~ : desktop 폴더로 이동
cd .. : 상위 경로
cd .  : 현재 경로
[tab] : 일부 작성 후 [tab]을 누르면 유사파일명 자동입력
dir 현재 경로의 폴더(디렉토리)와 파일 목록을 보여줌 /w : 목록이 3개씩 표시
cls (=clear) 화면을 지워준다.  
--help 명령어 + --help를 쓰면
명령어 실행 전에 설명을 띄워준다
 
sc sc start 서비스명 : 등록된 서비스 시작
sc restart 서비스명  : 등록된 서비스 다시시작
sc stop 서비스명 : 등록된 서비스 멈춤
관리자권한이 있어야만 가능
exit CLI 종료  
ipconfig 현재 ip 주소 반환  

macOS CLI 명령어

cd 경로 이동  
pwd 현재 경로를 알려준다  
ls 현재 경로의 폴더(디렉토리)와 파일 목록을 보여줌 ls - al : 파일 목록을 상세하게 확인
su (=sudo) 관리자 권한으로 파일 실행  
find / -name 특정 파일의 경로를 찾아준다  
quit CLI 종료  

Linux CLI 명령어

pwd 현재 경로를 알려준다  
ls 현재 경로의 폴더(디렉토리)와 파일 목록을 보여줌 ls - al : 파일 목록을 상세하게 확인
find 특정 파일의 경로를 찾아준다  
sudo 관리자 권한으로 파일 실행 sudo i
ifconfig 현재 ip 주소 반환  
find / -name 특정 파일의 경로를 찾아준다  
service 서비스를 start/restart/stop ex. service mariadb start

 

 

[ 참고 및 출처 ]

부트캠프 강의를 듣고 정리한 내용입니다.

우분투와 CenOs https://forteleaf.tistory.com/entry/CentOS-%EB%8C%80-Ubuntu-%EC%84%9C%EB%B2%84%EC%97%90-%EB%8D%94-%EC%A2%8B%EC%9D%80-%EA%B2%83

openSSH https://velog.io/@hyeseong-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-ssh%EB%9E%80

|  파일 시스템과 데이터베이스 관리시스템

- 영구적인 데이터 저장을 위해서는 보조기억장치에 파일 형식으로 저장을 하는 것이 필요하다.

- 다만, 이런 파일 시스템은 응용 프로그램의 구조와 환경에 의존적이고(데이터 종속성),

  그렇기에 같은 데이터여도 구조가 다르다면 여러 개로 중복되어 저장되는(데이터 중복성) 단점이 있다.

- 데이터베이스는 이러한 파일시스템의 데이터 종속성과 데이터 중복성을 제거하기 위해 만들어졌다.

1. 파일 시스템 vs 데이터베이스 관리 시스템

  파일 시스템 데이터베이스 관리 시스템
정의 컴퓨터에서 자료를 쉽게 찾을 수 있도록 
파일 형식으로 보관 및 관리하는 체계
데이터베이스를 체계적으로 관리하기 위한 시스템
종류 FAT/NTFS(windows), ext(linux), APFS(macOS) 구분1 : RDBMS(정형), NoSql(비정형)
구분2 : 계층형/망형/관계형/객체지향형/객체관계형
장점 처리 속도가 빠르다.
구현이 간편하다.
비용이 저렴
데이터 종속성과 데이터 중복성을 해결
일관성, 무결성, 보안성 유지
데이터 공유 등..
단점 데이터 종속성*
데이터 중복성*
DB전문가의 부족
전산화 비용의 증가
대용량 디스크로의 집중적인 접근으로 과부하 발생
파일의 백업과 회복이 어려움
시스템이 복잡

 

1-1. 파일 시스템의 문제점

데이터의 종속성 응용 프로그램과 데이터간의 상호 의존관계 

* 프로그램 명세에는 보조기억장치에 들어가는 프로그램의 파일 구조 및 접근방식에 대해서 명시되어 있다.
* 프로그램은 이러한 명세에 따라서 동작하기 때문에
* 만약 데이터의 구성 방법 및 접근 방법을 수정해야할 경우, 이에 맞춰 프로그램도 수정되어야 한다.
데이터의 중복성 한 시스템 내에 내용이 같은 데이터가 중복되게 저장 관리되는 것

* 현실 세계에서는 여러 개의 프로그램이 하나의 데이터를 동시에 사용하는 경우가 있다.
* 예를 들어,
   대학교 도서관에서 책을 대여 기록을 담는 프로그램A가 있고,
   학교 재학생들의 명단을 담고 있는 프로그램 B가 있다고 하면 
   프로그램 A와 프로그램B 모두 학교 재학생들의 이름과 학번을 데이터로 사용할 것이다.
* 이와 같이 여러 개의 프로그램이 같은 데이터를 중복해서 저장/관리할 경우, 
   다수의 프로그램들을 시간차를 두고 수정하는 작업이 필요할 것이다. (동시 수정x)

 

1-2. DBMS의 논리적 독립성 / 물리적 독립성

논리적 독립성 응용 프로그램과 DB를 독립 시킴으로써,
데이터의 논리적 구조를 변경시키더라도 응용 프로그램은 변경되지 않음
물리적 독립성 응용 프로그램과 보조기억장치같은 물리적 장치를 독립시킴으로써,
DBMS의 성능 향상을 위해 물리적 장치를 추가해도 프로그램에는 영향을 주지 않음.

 

|  DB와 DBMS, RDMBS

데이터베이스 데이터의 저장소
DBMS(데이터베이스 관리시스템) 데이터베이스를 운영하고 관리하는 시스템

- DB의 특징

실시간 접근성 실시간으로 사용자의 요청이 있을 때 수 초 내로 결과를 제공한다
계속적인 변화 데이터베이스의 내용은 어느 한 순간의 상태이나, 데이터의 값은 시간에 따라 항상 변화한다.
동시 공유 데이터베이스는 서로 다른 업무 또는 사용자에게 동시 공유된다.

* 동시(= 병행, concurrent) : 데이터베이스에 접근하는 프로그램이 여러 개임을 뜻한다.
내용에 따른 참조 데이터베이스에 저장된 데이터는 데이터의 물리적인 위치가 아니라 데이터 값에 따라 참조한다.
데이터 독립성 데이터의 논리적 구조를 변경시켜도 응용 프로그램은 변경되지 않는다.

* 응용 프로그램과 데이터베이스를 독립시킨 것을 의미한다.(데이터 종속성 해결)

- RDBMS

RDBMS(관계형 데이터베이스) 정형화된 데이터를 관리하는 시스템으로, 가장 많이 사용되는 DBMS이다.

2-1. RDMS의 구성

- 테이블의 행과 열로 구성된다.

  열(columm), 필드(field),속성(attribute) ↓
행(row),
튜플(tuple), ---->
레코드(record)
     
     
     

2-2. RDMS의 종류

- 종류 : 오라클, MySQL, MariaDB, Microsoft SQL Sever, PostgreSQL, IBM DB2....

 

 

[ 참고 및 출처 ]

부트캠프의 강의를 듣고 정리한 내용입니다.

DBMS의 필수 기능 및 장단점 https://floating-library.tistory.com/75

데이터의 종속성과 중복성 https://rain-bow.tistory.com/20

 

■ 프로시저란?

- 어떤 업무를 수행하기 위한 절차로 자주 쓰는 명령을 절차적으로 지정해둔 형태

 

■ 함수와 프로시져의 차이점

https://mjn5027.tistory.com/47

 

[ Oracle ] 프로시저와 함수의 차이

오라클을 사용하다보면 자주 접하게 되는 프로시저와 함수. ​ 이 둘의 정의와 차이점에 대해 알아보자. 프로시저(Procedure)란? 넓은 의미로는 어떤 업무를 수행하기 위한 절차를 뜻한다. ​ 예를

mjn5027.tistory.com

 

■ 프로시져 코딩 예시

-- 수정
create or replace procedure book_update(v_name IN varchar2, v_price IN number, v_idx IN number)
is
begin
   UPDATE book SET name = v_name, price = v_price WHERE idx = v_idx;
   commit;
end;
/


--삭제
create or replace procedure book_delete(v_idx IN number)
is
begin
   DELETE from book WHERE idx = v_idx;
   commit;
end;
/

-- 추가
create or replace procedure book_insert(v_name IN varchar2, v_price IN number)
is
begin
   INSERT INTO book VALUES((SELECT nvl(MAX(idx), 0) + 1 FROM book),v_name,v_price);
   commit;
end;
/

 

■ 명령 프롬프트에서 프로시저 생성 및 실행하는 법

 

 

■ CallableStatement를 사용하여 프로시져 구문 쓰기

- CallableStatement는 PreparedStatement를 상속한다.

package mymain;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
//import oracle.jdbc.driver.OracleDriver;

public class MyMain_DBTest2_프로시져 {
	
	//DB Driver Loading
	//메인 메소드가 시작되기 전에 먼저 0순위로 선작업.
	static {
		// 0. 객체가 생성 되기 이전에 클래스를 메모리에 적재 
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception{
		// 1. Connection을 얻어오기
		//(1) 연결경로, 사용자정보 가져오기
		//            jdbc:oracle:드라이버종류:@IP주소:포트:db아이디   <<- JavaEE에서 Data Source Explorer > Properties의 URL복사
		String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
		String user = "test1";
		String pwd  = "test1";
		
		//(2) Connection 인스턴스를 싱글톤 방식으로 가져온다.
		Connection conn = DriverManager.getConnection(url, user, pwd);
		System.out.println("---------Success Connection-------");
		
		//2. Procedure사용할 객체
		String sql = "call book_insert(?, ?)";
		CallableStatement cstmt = conn.prepareCall(sql);
		
		//3. Parameter
		cstmt.setString(1, "And");
		cstmt.setInt(2, 22000);
		
		//4. 실행
		cstmt.executeUpdate();
		
		//5. 닫기 (열린 역순)
		cstmt.close();
		conn.close();
		
	}

}

 

 

[출처]

함수와 프로시저의 차이 https://mjn5027.tistory.com/47

■ MVC 모델이란?

https://m.blog.naver.com/jhc9639/220967034588

구분 내용
모델 애플리케이션의 데이터를 담고 CRUD하는 객체 (DAO 객체)
데이타를 기반으로 사용자들이 볼 수 있는 화면
컨트롤러 데이터와 사용자인터페이스 요소들을 잇는 다리역할
 

[개발자 면접준비]#1. MVC패턴이란

오늘은 개발자면접에 많이 나오기도 하는 MVC패턴에 대해서 알아보고자 합니다. 과연 MVC패턴이 무엇...

blog.naver.com

 

■ DB 모듈화 전체 구성

* 화살표 방향은 무시하고 전체적인 흐름만 보세요.

 

■ Connection(서버연결) 관리 객체

  드라이버를 로딩하고, DB 서버와 연결하는 객체 

 

- DAO가 Connection 관리 객체에게 DB 연결

  곧, Connection을 요청하면, Connection 인스턴스를 DAO에게 전달한다.

 

[코드 예시]

package service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBservice {
	
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버를 찾을 수 없습니다.");
		}
	}
	
	private static DBservice single = null;
	
	public static DBservice getInstance() {
		
		if (single == null) {
			single = new DBservice();
		}
		
		return single;
		
	}
	
	private DBservice(){
		
	}
	
	public Connection getConnection() throws SQLException{
		
		Connection conn = null;
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "test1";
		String pwd = "test1";
		
		conn = DriverManager.getConnection(url, user, pwd);
		
		return conn;
	}
	
}

 

■ VO (Value Object) : 칼럼의 맴버와 타입을 저장관리하는 객체

  DB의 테이블 칼럼을 필드맴버로 저장한 객체 

 

- 객체지향적으로 데이터의 속성 정보를 저장하는 객체이다.

- 일종의 구조체와 같아 보인다. 

   [Person이라는 객체 안에 name, age, addr]이 등록되는 것과 같이 객체의 속성을 저장한다.

 

Rf. 과거에 DTO (Data Tranfer Object) 라고도 불렀다.

    - VO는 읽기, DTO는 읽기/쓰기 모두 가능한 경우

 

[코드 예시]

package vo;

public class MemberVo {

	int ein;
	String name;
	String addr;
	String ssn; //주민번호
	int hireday;
	String id;
	String pwd;
	
	//Getter, Setter
	public int getEin() {
		return ein;
	}
	public void setEin(int ein) {
		this.ein = ein;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getSsn() {
		return ssn;
	}
	public void setSsn(String ssn) {
		this.ssn = ssn;
	}
	public int getHireday() {
		return hireday;
	}
	public void setHireday(int hireday) {
		this.hireday = hireday;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
	
	
}

 

■ DAO (Data Access Object) - DB정보를 CRUD하는 객체

  데이터를 DB에서 불러와, LIST형태로 저장하는 객체   *데이터 CRUD 담당    

 

- 기능 : Create / Read/ Update / Delete

- 메서드 : insert / select / update / delete

 

   selectList()       -->   테이블의 리스트 정보를 선택하여 반환
   insert(VO)       -->   신규 레코드 삽입
   update(VO)     -->    기존 레코드 수정
   delete(칼럼명)  -->   칼럼 삭제

 

[코드 예시]

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import service.DBservice;
import vo.MemberVo;

public class MemberDao {
	
	private static MemberDao single = null;
	
	private MemberDao() {};
	
	public static MemberDao getInstance() {
		
		if (single == null) {
			single = new MemberDao();
		}
		
		return single;
	}
	
	public List<MemberVo> selectList(){
		
		List<MemberVo> list = new ArrayList<MemberVo>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM member";
		
		try {
			conn = DBservice.getInstance().getConnection();
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				
				MemberVo vo = new MemberVo();
				
				vo.setEin(rs.getInt("ein"));
				vo.setName(rs.getString("name"));
				vo.setAddr(rs.getString("addr"));
				vo.setSsn(rs.getString("ssn"));
				vo.setHireday(Integer.parseInt(rs.getString("hireday"))+1900);
				vo.setId(rs.getString("id"));
				vo.setPwd(rs.getString("pwd"));
				
				list.add(vo);
				
			}
			
		} catch (Exception e) {
			
		} finally {
			try {
				if (rs != null) rs.close();
				if (pstmt != null) pstmt.close();
				if (conn != null) conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
		return list;
	}
	
}

 

■ SQL Injection

공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여, 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법

 

▶ 해커의 해킹 방식

//아래의 SQL문에 항상 참인 값을 넣으면 모든 정보가 노출이된다.
String sql = "SELECT * FROM test_member WHERE id = 'test' AND pwd = '1234'" + "or 1 = 1";

- 위와 같은 방식으로 SQL구문을 삽입하여 DB를 조작하는 공격을 SQL 인젝션이라 한다.

- 해결 방법 : PreparedStatement를 사용한다.

 

■ Statement와 PreparedStatment의 차이점

  Statement PreparedStatement
차이점 캐시 미사용 캐시 사용
절차 쿼리 문장 분석
컴파일
실행
--> 계속해서 위 세단계를 반복
쿼리 문장 분석
컴파일
실행
-> 처음 한번만, 캐시에 담아 재사용
결론 보안 낮음, 성능 낮음 보안 높음, 성능 높음

 

■ PreparedStatement로 JDBC프로그래밍 하는 순서

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class _00_preparedStatement {

	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 정보를 찾을 수 없습니다.");
		}
	}
	
	public static void main(String[] args) throws Exception{
		//1. 연결
		String url = "  /* url 정보 */";
		String user = "계정명";
		String pwd = "비밀번호";
		
		Connection conn = DriverManager.getConnection(url, user, pwd);
		
		//2. preparedStatement
		//1) SQL문에 '?'를 넣어 값을 넣을 parameter를 형성
		// parameter index   1        2
		//                   id = ?   pwd = ?  
		String sql = "SELECT * FROM test_member WHERE id = ? AND pwd = ?";
		
		//2) PreparedStatement안에 SQL문을 넣기
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		//3) SQL문의 parameter를 세팅한다.
		pstmt.setString(1, "사용자 아이디");
		pstmt.setString(2, "사용자 비밀번호");
		
		//3. 처리
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next()) {
			String name = rs.getString("name");
			String id = rs.getString("id");
			String password = rs.getString("pwd");
			
			System.out.printf("[%s]님의 아이디는 %s, 비밀번호는 %s\n",name,id,password);
		}
		
		//4. 닫기
		rs.close();
		pstmt.close();
		conn.close();
		
	}//end main

}

 

 

 

- 출처:

  - SQL인젝션 개념 https://dev-coco.tistory.com/158 [슬기로운 개발생활😃]

  - 캐시에 대한 자세한 내용 https://p829911.tistory.com/11

  - 그 외 ) 국비지원 수업 과정

- 참고 : 여기어때의 해킹 사건 https://show-me-the-money.tistory.com/entry/%EC%97%AC%EA%B8%B0-%EC%96%B4%EB%95%8C-%ED%95%B4%ED%82%B9-%EC%82%AC%EA%B1%B4%EC%9D%84-%ED%8C%8C%ED%97%A4%EC%B9%98%EB%8B%A4

■ JDBC란?
- 자바 APP과 DB를 연결하여 프로그래밍을 하기 위한 API (또는 이클립스에선 라이브러리라고도 부른다)
- 물리적으로는 jdbcXX.jar 파일을 의미한다.
- 우리는 jdbc.jar안의 드라이버를 통해 모든 종류의 데이터베이스를 사용할 수 있다. (EX. 오라클, mySql 등)

출처 :&amp;nbsp;https://dyjung.tistory.com/50

■ 데이터베이스를 연결하기 전에 점검할 사항

1. 현재 내가 만들고자 하는 앱은 무엇인가?
- 데스크탑 앱 : 로컬에서 설치, 실행되는 앱 프로그램
- 웹 앱 : 브라우저를 통해 실행되는 앱 프로그램

2. 현재 내가 접속하고자 하는 DB 서버의 위치는 어디인가?
- 로컬 서버인가?
- 외부 클라우드 서버인가?
* DB 서버와의 연결 시, 서버 url과 사용자명, 비밀번호가 필요하기에 미리 알아두는 것이 좋다.

3. IDE를 사용하고 있고 jdbc.jar파일 경로를 입력한 적이 있다면, 라이브러리 경로가 제대로 입력되어 있는가?
- 이클립스에 jdbc.jar 파일을 import하고 경로를 옮기면 이클립스는 옮긴 jar파일 경로를 인식하지 못한다.
- 이런 경우, 프로젝트의 [properties] - [Libraries] 에서 jar파일 위치를 재설정하는 게 필요하다.
- 자주 발생하는 미스사항이므로 미리 고려해두자.

+ 이클립스에서 처음 프로젝트를 생성할 때, JRE 버전 확인하기
- JRE 버전을 높히고 다시 낮추었을 때, jdbc.jar의 위치를 인식하지 못하는 오류가 있었다.
(이유는 구글링을 해도 나오지 않아 명확하진 않지만...)
- 처음 프로젝트를 생성할 때부터 JRE 버전을 유의해서 생성하는 게 필요하다.


■ JDBC 프로그래밍을 위한 환경설정

- 프로젝트 생성 시, jdbc.jar파일 경로를 입력하기

프로젝트 > [Build Path] > [Configure Build Path]


■ JDBC 프로그래밍 절차

[ Statement를 사용한 경우 ]
- Statement는 보안성 낮다
- Secure Coding을 위해 PreparedStatement를 사용하는게 좋다. (다음 포스팅 참조)

1. DB 드라이버 로딩

2. Connection 객체를 통해 서버와 연결

3. Statement 객체를 통해 SQL명령 처리
가. SQL 명령어 세팅 : String sql = "select * from table_test";
나. SQL 명령 -> DB전송
: conn.executeQuery(sql)
- 조회 제외 : executeUpdate() 메소드 사용
- 조회 명령 : executeQuery() 메소드 사용
다. 명령에 따라 구분 분석(Parsing)
라. 실행
- 조회 제외 : create, alter, update... 등 실행
- 조회 경우 : ResultSet 객체를 통해 조회 결과를 담아 처리

4. close() 메소드를 통해 연결 해제
*연결 해제는 연결한 순서의 역순으로 해제한다.


[1] DB 드라이버 로딩

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    /*  메인 메소드 * /

}
  - 오라클 : oracle.jdbc.driver.OracleDriver
  - MySQL : com.mysql.jdbc.Driver

 

▼ 위와 같이 드라이버 로딩을 하는 이유는? - 더보기 선택

더보기

- jdbc.jar 파일을 가져오면 라이브러리를 쓸 수 있는 상태가 된다.

- 자바 라이브러리처럼, jdbc 라이브러리에서 제공하는 클래스들이 있는데,

  그 중에 하나가 OracleDriver이다.

- 라이브러리만 가져온다고 클래스 내의 기능을 쓸 수 있는 것은 아니기 때문에, OracleDriver 클래스를 사용하기 위하여 드라이버 로딩을 해주는 것이다.

 


[2] Connection 인스턴스를 통해 서버와 연결

import java.sql.Connection;
import java.sql.DriverManager;

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    public static void main(String args[]){
         //서버 url, user, pwd 정보 가져오기
         String url = " /* 서버 연결 정보 */ ";
         String user = "계정명";
         String pwd = "비밀번호";  //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
         
         //DriverManager 객체를 통해 Connection 인스턴스 형성(싱글톤 방식)
         Connection conn = DriverManager.getConnection(url, user, pwd);
    }

}

* 이클립스 내에서 아래 서버 연결 정보는 [Database Connections] - [Properties] - [Driver Properties]에서 얻을 수 있다.

양식 jdbc:[DBMS]:[데이터베이스식별자]
Oracle jdbc:oracle:드라이버종류:@호스트명:포트명:SID
MySQL jdbc:sqlserver://호스트명:포트명;databaseName=DB


[3] Statement (또는 PreparedStatement *이 부분은 다음 포스트에서) 인스턴스를 사용하여
- Statement는 보안성 낮다. 중요하니 다시 안내

아래의 코드는 조회를 한 경우 이나, Statement의 execureUpdate() 메소드를 사용하면 그 외의 명령도 수행할 수 있다.
import java.sql.Connection;
import java.sql.DriverManager;

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    public static void main(String args[]){
         //1. [연결]
         //서버 url, user, pwd 정보 가져오기
         String url = " /* 서버 연결 정보 */ ";
         String user = "계정명";
         String pwd = "비밀번호";  //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
         
         //DriverManager를 통해 Connection 인스턴스 형성(싱글톤 방식)
         Connection conn = DriverManager.getConnection(url, user, pwd);
         
         //2. [Statement]
        
         //가. SQL문 세팅
         String sql = " /* SQL문 */ ";
         
         //나. SQL명령 -> DB전송
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql); //DB상에서 구분분석 후, 받은 결과
         
         //다. 실행
         //ResultSet는 커서 역할을 하며, 파일의 BOF에서 EOF까지 가리킨다.
         //.next()는 커서가 가리키는 곳에 레코드가 있음을 true or false로 반환한다.
         while(rs.next()){
             String name = rs.getString("name"); // 칼럼의 헤딩
             int score = rs.getInt("score"); 
             
             system.out.println(name + ":" + score);
         }
         
    }

}


[4] 사용한 것을 역순으로 닫는다.

import java.sql.Connection;
import java.sql.DriverManager;

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    public static void main(String args[]){
         //1. [연결]
         //서버 url, user, pwd 정보 가져오기
         String url = " /* 서버 연결 정보 */ ";
         String user = "계정명";
         String pwd = "비밀번호";  //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
         
         //DriverManager를 통해 Connection 인스턴스 형성(싱글톤 방식)
         Connection conn = DriverManager.getConnection(url, user, pwd);
         
         //2. [Statement]
        
         //가. SQL문 세팅
         String sql = " /* SQL문 */ ";
         
         //나. SQL명령 -> DB전송
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql); //DB상에서 구분분석 후, 받은 결과
         
         //다. 실행
         //ResultSet는 커서 역할을 하며, 파일의 BOF에서 EOF까지 가리킨다.
         //.next()는 커서가 가리키는 곳에 레코드가 있음을 true or false로 반환한다.
         while(rs.next()){
             String name = rs.getString("name"); // 칼럼의 헤딩
             int score = rs.getInt("score"); 
             
             system.out.println(name + ":" + score);
         }
         
         //3. [역순으로 닫는다]
         rs.close();
         stmt.close();
         conn.close();
         
    }

}



[출처]
- JDBC https://dyjung.tistory.com/50
- 데스크탑 앱 또는 웹 앱 https://appmaster.io/ko/blog/deseukeutab-aeb-ddoneun-web-aeb-jangdanjeom

■ 데이터의 무결성

- 데이터가 실제 현실 세계의 자료와 차이가 없는 수준의 정확성을 보이는 것

- 여러 사용자가 동일 내용의 테이블을 중복하여 사용할 경우, 데이터에 이상현상 발생 가능성 높음

-> 제약조건으로 데이터 자체의 무결성 유지

-> 정규화를 사용하여 테이블을 분해

-> 동기화

 

■ 조인

- 정규화한 테이블을 역정규화하는 키워드

- 원리 : 각 테이블의 Key를 사용하여 연결한다. 

- 장점 : 중복된 레코드 수를 줄인다. 이상현상을 방지하고 성능이 높아진다.

  1) 오라클 조인      - WHERE를 사용한 방법
  2) 공통 SQL 조인   - ANSI 방식

 

■ 조인의 종류

종류  
INNER  JOIN 조인 조건(두 테이블의 키)에 일치하는 데이터만 가져온다.
OUTER JOIN 조인 조건에 일치하는 데이터 및 일치하지 않는 데이터 모두 가져온다.
*일치하지 않는 데이터는 : NULL로 가져온다.
CROSS JOIN 별도의 조인 조건 없이 두 테이블을 조언 시 가능한 모든 경우의 데이터를 가져온다.
SELF    JOIN 자기 자신을 하나의 테이블로 취급하여 조인하는 방법
*칼럼명이 중복되므로 반드시 ALIAS를 사용하여 조인 필요

 

■ ANSI 조인

 

  INNER JOIN  

SELECT 
  a.APPLY_NO AS 순번,
  c.COM_NAME AS 기업명,
  c.COM_CAT AS 기업분야,
  c.COM_FOCUS AS 주력요소,
  TO_CHAR(a.APPLY_DATE, 'YYYY-MM-DD') AS 지원일자,
  a.APPLY_STATE AS 지원상태
FROM MY_APPLY a INNER JOIN COMPANY c
     ON a.APPLY_NO = c.APPLY_NO;

>> 결과

 

  OUTER JOIN  

 

  LEFT OUTER JOIN    

- 좌측테이블을 기준으로 조건에 일치하는 데이터 추출, 조건에 맞지 않으면 NULL

SELECT
  c.COM_NO AS 순번,
  c.COM_NAME AS 기업명,
  w.SALARY AS 연봉,
  w.OVERTIME_PAY AS 야근수당,
  W.FACILITY AS 시설
FROM COMPANY c LEFT OUTER JOIN WORK_ENV w
     ON c.COM_NO = w.COM_NO;

>> 결과

  RIGHT OUTER JOIN    

- 우측테이블을 기준으로 조건에 일치하는 데이터 추출, 조건에 맞지 않으면 NULL

SELECT
  c.COM_NO AS 순번,
  c.COM_NAME AS 기업명,
  w.SALARY AS 연봉,
  w.OVERTIME_PAY AS 야근수당,
  W.FACILITY AS 시설
FROM WORK_ENV w RIGHT OUTER JOIN COMPANY c
     ON w.COM_NO = c.COM_NO;

>> 결과

 

  CROSS JOIN  

SELECT
  c.COM_NO AS 순번,
  c.COM_NAME AS 기업명,
  w.SALARY AS 연봉,
  w.OVERTIME_PAY AS 야근수당,
  W.FACILITY AS 시설
FROM WORK_ENV w CROSS JOIN COMPANY c

>> 결과

- 심플컴패니2에 해당되는 연봉, 야근수당, 시설을 입력한 적이 없는데, 심플컴패니에 해당되는 부분이 추출됐다.

 

  SELF JOIN  

- 반드시 ALIAS를 써서 자기 자신의 테이블을 구분할 수 있게 해야한다.

SELECT
  c.COM_NO AS 순번,
  c2.COM_NAME AS 회사명,
  c2.COM_CAT AS 카테고리
FROM COMPANY c JOIN COMPANY c2
     ON c.COM_NO = c2.COM_NO;

>> 결과

 

■ 오라클 조인  ---- WHERE를 사용한다.

 

  INNER JOIN  

SELECT
  a.APPLY_NO AS 순번,
  c.COM_NAME AS 기업명,
  c.COM_CAT AS 기업분야,
  c.COM_FOCUS AS 주력요소,
  TO_CHAR(a.APPLY_DATE, 'YYYY-MM-DD') AS 지원일자,
  a.APPLY_STATE AS 지원상태
FROM MY_APPLY a, COMPANY c
WHERE a.APPLY_NO = c.APPLY_NO;

 

  OUTER JOIN  

 

  LEFT OUTER JOIN    

SELECT
  c.COM_NO AS 순번,
  c.COM_NAME AS 기업명,
  w.SALARY AS 연봉,
  w.OVERTIME_PAY AS 야근수당,
  W.FACILITY AS 시설
FROM COMPANY c, WORK_ENV w
WHERE c.COM_NO = w.COM_NO;

  RIGHT OUTER JOIN    

SELECT
  c.COM_NO AS 순번,
  c.COM_NAME AS 기업명,
  w.SALARY AS 연봉,
  w.OVERTIME_PAY AS 야근수당,
  W.FACILITY AS 시설
FROM WORK_ENV w, COMPANY c
WHERE w.COM_NO = c.COM_NO;

 

 

[출처]

- 뉴렉처 강의

- https://tragramming.tistory.com/74

+ Recent posts