UML(Unified Modeling Language)


1. UML(Unified Modeling Language)

  • UML은 소프트웨어를 시각적으로 모델링 하기 위해 사용
  • UML은 소프트웨어를 모델링 하는 표준 그래픽 언어로 심벌과 그림을 사용하여 나타낼 수 있음

2 UML의 목적

  • UML의 목적은 소프트웨어 개발에 도움을 주는 것
  • 개발 과정에 여러 가지 다이어그램으로 설계하면 구조가 좋아지고 개발자들 간의 의사 교환이 쉬어짐

 

3. UML 다이어그램의 종류

3.1. 사용 사례 다이어그램

  • 액터사용 사례를 통해 시스템의 기능을 모델링 하는 데 사용
  • 개발하려는 시스템의 기능적 요구 또는 업무 프로세스의 개관을 나타냄
  • 요구분석 단계에서 많이 사용

use case diagram에서 많이 사용되는 심볼




3.2. 시퀀스 다이어그램

  • 객체 사이의 메시지 교환을 시간의 흐름에 따라 나타낸 것
  • 즉, 사용 사례로 표시된 업무 프로세스에 대해 시스템 안의 존재하는 객체가 어떤 식으로 개입하여 상호작용하는지를 나타냄

 

3.3. 클래스 다이어그램

  • 객체지향 시스템의 가장 근간이 되는 다이어그램으로 시스템의 정적인 구조를 나타냄
  • 또한 도메인(문제 영역)의 개념과 그것들 사이의 관계를 표시

 


 



 

 

3.4. 패키지 다이어그램

  • 관련된 클래스를 패키지로 그루핑하여 복잡한 시스템을 조직화하는 데 사용

3.5. 상태 다이어그램

  • 외부 자극에 대한 시스템의 동적 상태 변화를 나타냄
  • 외부 이벤트에 대해 민감하게 상태를 변화시키는 객체를 모델링

3.6. 액티비티 다이어그램

  • 시스템의 내부 프로세스를 단계별 작업 흐름 형태로 모델링
  • 시스템의 동적 특징을 나타냄

3.7. 배치 다이어그램

  • 노드, 컴포넌트, 커넥터 등 시스템의 물리적 자원 배치를 나타냄

 

 

 

디자인 패턴


1. 개요

  • 자주 반복되는 설계 유형을 디자인 패턴이라 한다.
  • 디자인 패턴은 체계적으로 문서화하여 범용적으로 사용할 수 있도록 정리한 것이다.

2. 기본 패턴

2.1. 개념 실체 패턴(Abstraction Occurrence Pattern)

  • 각 객체의 공통 정보를 공유할 때 사용한다.
  • 실체는 공통된 정보를 가진 멤버들의 모임이고, 개념은 공유하는 정보를 담는 클래스이다.

2.2. 플레이어 역할 패턴 (Player Role Pattern)

  • 하나의 클래스에 다양한 역할을 표현하고 싶을 때 사용한다.

2.3. 위임 패턴(Delegation Pattern)

  • 다른 클래스가 가진 특정 오퍼레이션을 활용하여 책임을 위임하고 싶을 때 사용한다.

2.4. 계층 구조 패턴

  • 계층 관계를 가진 객체들을 묶어 동일한 처리를 하고 싶을 때 사용한다.
 

5. 행위 패턴

5.1. 옵서버 패턴(Observer Pattern)

  • 옵서버 패턴은 특정 데이터나 객체를 모니터링하고 있다가 변화가 발생하면 시스템이 이를 알리고 연관된 객체들이 변화에 대응하는 작업을 실행하도록 만들어준다.

5.2. 중재자 패턴(Mediator Pattern)

  • 시스템을 이루는 객체들 사이의 밀접한 연관 관계를 효육적으로 처리해주는 패턴이다.
  • 객체 내부의 변화나 특정 작업의 실행이 다른 객체에 영향을 미칠 때 중재자 객체가 중간에서 서로 간의 변화나 메시지를 조정하여 시스템이 원활하게 작동하도록 해준다.

5.3. 책임 체인 패턴(Chain of Responsibility Pattern)

  • 사용자가 원하는 작업을 어떤 객체에게 시킬지 모를 때 그 작업을 다룰 만한 객체들의 집합에 던져버리는 패턴이다.

5.4. 커맨드 패턴(Command Pattern)

  • 작업을 처리할 객체 집단에서 처리를 담당할 객체를 직접 지정한 후 그 객체를 처리 박스에 요청하여 처리하는 패턴이다.

5.5. 상태 패턴(State Pattern)

  • 상태를 객체로 만들고 상태에 관련된 모든 행위를 하나의 객체로 모으는 패턴이다

 

 

 

구현


1. 구현이란?

  • 설계 명세를 토대로 분리하여 구현할 수 있는 작은 단위별로 프로그래밍하는 것을 말한다.
  • 사용자의 요구를 만족시키는 프로그램을 만들려면 상세 설계나 사용자 지침서에 기술된 것과 일치하도록 코딩을 해야 한다.

2. 코딩 표준

3. 리팩토링

  • 리팩토링이란 기능의 변경 없이 코드의 디자인을 개선하는 것으로, 문제가 될 만한 부분을 찾아내어 수정하고 재구조화하는 작업이다.
  • 리팩토링을 하면 코드를 쉽게 이해할 수 있을 뿐만 아니라 확장 및 재사용할 수 있다.
  • 더 읽기 쉽게 하고, 결합을 낮추며, 응집을 높여서 코드를 쉽게 변경할 수 있도록 하는 것이다.

3.1. 리팩토링 작업 과정

  • 작은 변경을 가한다.
  • 모두 잘 작동된다는 것을 확인하기 위해 테스트한다.
  • 모두 잘 작동된다면 다음 리팩토링으로 넘어간다.
  • 작동되지 않으면 문제를 수정하거나 원상 복구하여 시스템이 작동되도록 유지한다.

3.2. 코드 스멜

  • 설계를 수정하기 어렵게 만드는 코드를 코드 스멜이라 한다.
    • 중복 코드
    • 긴 메소드
    • 큰 클래스
    • 많은 케이스를 가진 case 문장
    • 긴 메소드 호출
    • 지나친 널 객체 체크
    • 유사 데이터의 중복
    • 데이터 클래스(메소드는 거의 없고 속성만 많은 클래스)
    • 캡슐화되지 않은 필드
  • 이러한 코드 스멜을 줄이기 위한 방법은 아래와 같다.
    • 클래스 추출
    • 메소드 추출
    • 서브 클래스 추출
    • 템플릿 메소드 형성
    • 메소드 이동

beyond day 13

 

소프트웨어 공학 개요


1. 소프트웨어란?

  • 소프트웨어에서 소프트는 '부드럽다'라는 뜻으로 딱딱하고 변경하기 어렵다는 '하드'와 반대되는 개념
  • 소프트웨어란 입력된 자료를 처리하여 결과를 출력하는 프로그램과 프로그램의 개발, 운용, 보수에 필요한 자료 일체

 

2. 소프트웨어 공학

  • 공학적 원리를 소프트웨어 개발에 적용하는 것이 소프트웨어 공학
  • 공학이란 과학과 수학을 기초로 하여 구조나 기계, 시스템 등을 생산하는 데 체계적인 방법을 적용하는 것

 

3. 소프트웨어 개발 작업

3.1. 요구 분석

  • 무엇을 개발할지 결정하는 작업

3.2. 설계

  • 사용할 수 있는 기술을 이용하여 요구 사항을 어떻게 구현할 것인지 결정하는 작업

3.3. 구현

  • 설계한 내용을 구현하는 작업

3.4. 테스트

  • 프로그램을 구현한 후 기능이 원하는 대로 작동하는지 테스트하는 작업

3.5. 유지보수

  • 개발된 소프트웨어를 완벽해질 때까지 계속 발전시켜나가는 작업

 

 

 

 

요구 분석


1. 개요

  • 요구 분석은 무엇을 하는 시스템을 개발할지 결정하는 것

2. 도메인 분석

  • 도메인 분석은 소프트웨어 엔지니어가 개발하려는 분야의 배경지식을 알아가는 과정
  • 도메인이란 말은 소프트웨어를 사용할 것으로 예상되는 고객이 일하는 분야의 비즈니스나 기술을 의미
  • 도메인 분석으로 얻을 수 있는 장점으로는 빠른 개발, 좋은 시스템, 확장 예견이 존재

3. 요구 추출

  • 문제를 이해하기 위해 정보를 수집하고 사용자에게 무엇이 필요한지 찾아내는 것

3.1. 기능적 요구

  • 기능적 요구는 시스템이 무엇을 하는지, 즉 사용자나 다른 시스템을 위해 제공하는 서비스가 무엇인지 기술한 것

3.2. 비기능적 요구

  • 비기능적 요구는 소프트웨어를 개발하는 동안 고수해야 할 제약 조건으로, 사용하는 하드웨어의 제약, 소프트웨어 품질의 특성에 대한 수준의 범위를 정해놓은 것

4. 요구 문서화

  • 문제와 현재의 상태를 파악하고 요구를 도출한 후 해결책을 제시하고 소프트웨어가 어떤 기능을 가져야 하는지 정확히 기술하는 단계

5. 요구 검토

  • 도출한 요구 사항이 적절한지 검토하고, 수정이 필요하면 다시 요구 추출 단계로 돌아감
  • 요구 사항을 검토할 때는 관련자들이 모두 참석한 가운데 리뷰 회의를 진행

 

 

 

 

 

설계


1. 개요

  • 소프트웨어의 구조 설계는 품질 좋은 소프트웨어 시스템을 개발하기 위한 중요한 단계
  • 만약 소프트웨어 구조가 잘 설계되지 않으면 구현, 테스트, 유지보수에 큰 어려움이 뒤따를 것

2. 설계의 접근법

2.1. 하향식 설계

  • 가장 높은 수준의 구조부터 시작하여 점차 낮은 수준의 구조로 내려오면서 각종 설계 이슈에 관한 의사 결정을 하는 방법
  • 소프트웨어 구조와 사용될 데이터베이스의 종류를 먼저 결정한 후 특정 데이터 아이템의 형태와 사용될 개별 알고리즘을 결정하는 것을 예로 들 수 있음

2.2. 상향식 설계

  • 재사용이 가능한 낮은 수준의 기능을 먼저 정한 다음, 높은 수준의 구조를 만들기 위해 이것들을 어떻게 배치할지 결정

3. 설계의 종류

  • 아키텍처 설계
  • 클래스 설계
  • 사용자 인터페이스 설계
  • 데이터베이스 설계
  • 알고리즘 설계
  • 프로토콜 설계

4. 설계안 결정

4.1. 목표와 우선순위 결정

  • 본격적인 설계를 시작하기 전에 여러 가지 품질 측면에 대해 목표와 우선순위를 수립해야 함
  • 목표와 우선순위를 정할 때 고려할 품질은 메모리 효율성, CPU 효율성, 유지보수성, 이식성, 사용성

4.2. 비용 효과 분석

  • 설계할 때 고려해야 할 중요한 점은 비용을 줄이고 효과를 높이는 방법을 찾는 것
  • 새로운 기능이나 설계안에 대한 비용을 추정하기 위해 다음과 같은 요소를 고려
    • 소프트웨어 엔지니어링 작업에 드는 추가 비용
    • 특정 개발 기술에 드는 추가 비용
    • 사용자 및 제품 지원 인력에 드는 추가 비용
    • 소프트웨어 엔지니어링 작업 시 절약 시간
    • 매출 향상이나 사용자의 금전적 이익

'Software-Engineering' 카테고리의 다른 글

[Software-Engineering] UML / 디자인 패턴 / 구현  (0) 2024.05.30
[Software-Engineering] Git  (0) 2024.05.29

GIT


0. Linux 에서 GIT 사용

 

더보기

1. GIT 설치 및 KEY 생성

# git linux 설치

# GIT 설치 확인
$ git --version

# 설치가 안되어있다면 설치
$ sudo apt update
$ sudo apt install git
$ Y

# git 이름과 이메일 정보 저장
$ git config --global user.name '[유저이름]'
$ git config --global user.email '[GIT 이메일]'
$ git config --list

# 기존 키 삭제하고 새로운 키 생성
$ rm ~/.ssh/id_rsa
$ ssh-keygen 0t ed25519 -C '[GIT 이메일]'
GIT 정보 저장
key 생성
생성된 key 확인

2. KEY 다운로드

SSH 폴더
id_ed25519.pub 윈도우로 다운로드
다운로드 받은 KEY를 삭제

3. KEY GIT 설정

Settings
ssh Key 생성
다운로드 받은 id_ed25519.pub를 복사해서 key에 입력하고 Add SSH key
Key 생성 완료

4. linux에 git clone

ssh 복사
# linux에 git clone
$ cd develop
$ git clone [Git에서 복사한 ssh]
$ yes

# clone 되었는지 확인
$ls
linux에 git clone

 

4. linux에서 README.md 생성

$ cd gittest

#README.MD 파일 생성
$ ehco "GIT TEST > README.md
$ ls
README.md 파일 생성
# GIT ADD
$ git add .
$ git status
ADD
# git에 commit

$ git commit -m "commit 내용"
COMMIT
# git push
$ git push
psuh
linux에서 변경한 내용이 githurb에 반영됨

5. github 에서 수정한 내용 linux에세 확인

변경 사항
# git pull

$ git pull
$ cat README.md
github에서 수정한 것을 linux에서 pull하여 확인

 

1. Git

  • Git 이란 소스코드를 효과적으로 관리하기 위해 개발된 분산형 버전 관리 시스템이다.

2. Git 설치

  • Git 공식 홈페이지에서(https://git-scm.com) 운영체제에 맞는 Git을 다운로드 후 설치한다.
  • Git 설치 후 명령 프롬프트에서 아래의 명령어로 설치된 Git의 버전을 확인한다.
git --version

 

3. Git의 주요 용어

3.1. 저장소(Repository)

  • 저장소는 파일 / 폴더의 저장 공간으로 파일이 변경 이력 별로 구분되어 저장된다.
  • 원격 서버에서 관리되며 여러 사람이 공유하기 위한 저장소를 원격 저장소(Remote Repository)라고 한다.
  • 개인 PC에서 관리하는 저장소를 로컬 저장소(Local Repository)라고 한다.

 

더보기

- 원격 저장소 생성

버튼 클릭
new repository 클릭
저장소 생성
생성된 저장소

- .gitignore 파일 설

.gitignore 검색
키워드 입력
.gitignore 생성됨
.gitignore 파일 수정
commit changes
commit changes

더보기

- 이미 저장소가 있는 상태에서 clone 생성

새로운 repository 생성
repository 설정 후 생성
생성 완료
복사
main 클릭
터미널 open
복사했던 code 붙여넣기

 


더보기

-  저장소가 없 상태에서 clone 생성

repository 생성
복사
폴더 샏성
폴더에서 터미널 open 하여 복사한 code실행

3.2. Commit

  • 로컬 저장소에 파일이나 폴더의 변경 사항을 기록하는 작업을 Commit이라고 한다.
  • Git은 Commit을 시간 순으로 저장하며 이전 Commit 상태부터 현재 Commit 상태까지 만들어 보관한다.
  • Commit 내용을 통해 변경 이력과 변경 내용을 확인할 수 있다.

 

3.4. Branch

  • 저장소 내에서 다른 작업에 영향을 받지 않는 독립된 단위의 저장소를 Branch
  • 즉, Branch는 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어 주는 기능

3.5. Checkout

  • 현재 Branch를 다른 Branch로 전환하는 것을 Checkout

3.6. Merge

  • 특정 브랜치의 작업 내용을 다른 브랜치에 병합하는 것을 Merge라고 한다.

- 원격 Branch 추가

relaese 더블 클릭
확인
원격 브랜치 추가


- source tree에서 브랜치 추가

브랜치 클릭
notice 브랜치 생성
원격지에 notice 브랜치 push
notice 선택 하고 push

 

3.7. Clone

  • 원격 저장소의 내용을 로컬 저장소에 복제하는 것 Clone

기본 브라우저여야만 함
clone 생성
인증
clone 생성 완료

3.8. Push

  • 로컬 저장소에서 변경된 이력을 원격 저장소에 업로드하는 것 Push

3.8. Pull

  • 원격 저장소에서 최신 변경 이력을 다운로드하여 로컬 저장소에 적용하는 것 Pull

4. .gitignore 파일

  • Git에서 관리하지 않는 파일들의 목록을 작성하는 파일을 .gitignore 파일
  • .gitignore 파일은 저장소 최상위에 저장되어야 정상적으로 동작
### Java ###
# Compiled class file
*.class

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

### Windows ###
# Windows thumbnail cache files
Thumbs.db

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

 

5. GIT FLOW

GIT FLOW 전략


5.1 local 저장소 생성

local 저장소 gitflowtest 생성

5.2 README.md 파일 생성후 커

README.md 파일 생성

 

README.md 파일 commit

5.3 브랜치 이름 변경

master 브랜치 이름 변경
main으로 변경
깃플로우 선택
Git Flow 저장소 초기화
브랜치 구조가 변경됨

5.4 Git Flow 기능 생성

Git Flow 기능 시작
board 기능 추가
feature 브랜치가 생성됨
게시판 페이지.txt 파일 생
게시판 페이지.txt 파일 commit
Git flow 다른동작 후 새기능
notice 기능 추가
notice 기능 생성됨
공지사항 페이지.txt 파일 생성
공지사항 페이지.txt commit
게시판 기능 구현 완료한 후 commit

5.4 merge 작업

기능 마무리
기능마무리 후 확인 (board도 같은 작업 수행)

5.4 배포

더보기

현재 과정 git_branch

새 릴리즈 시작
새 릴리즈 추가
release 브랜치가 생성됨
게시판 페이지.txt 파일 수정
게시판 페이지.txt 파일 수정된 것 commit
공지사항 페이지.txt 파일 수정
공지사항 페이지.txt 수정된 것 commit
릴리즈 마무리
develop과 main에 병합

5.5 hotfixes 브랜치 사용 (버그 발생 시 사용)

핫픽스 추가
게시판 페이지에 버그가 발생했다 가정하고 board hotfixes 브랜치 생성
board hotfixes 브랜치가 생성됨
게시판 페이지.txt 파일 수정
게시판 페이지.txt 수정된 것 commit
핫픽스 마무리
핫픽스 마무리 후 확인

 

5.6 GIT 원격 저장소 생성

저장소 생성

 

저장소 이름 및 설정
code 복사
GIT 과 local 저장소 연결
develop 브랜치도 push
연결이 되었는지 Git의 저장소 내용 확인

 

실습


# 테이블 수정 삭제

1. department 테이블에서 location_id 열에 FOREIGN KEY 제약 조건 추가하시오.

더보기
ALTER TABLE department ADD CONSTRAINT FOREIGN KEY(location_id)
REFERENCES location(local_code);

 

2. location 테이블에서 national_code 열에 FOREIGN KEY 제약 조건 추가하시오.

더보기
ALTER TABLE location ADD CONSTRAINT FOREIGN KEY(national_code)
REFERENCES national(national_code);

 

# 조인

1. 테이블을 다중 JOIN 하여 사번, 직원명, 부서명, 지역명을 조회하시오.

더보기
SELECT e.emp_id AS '사번',
	e.emp_name AS '직원명',
	d.dept_title AS '부서명',
	l.local_name AS '지역명'

FROM employee e
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
ORDER BY emp_name
;

2. 테이블을 다중 JOIN 하여 사번, 직원명, 부서명, 지역명, 국가명 조회하시오.

더보기
-- 부서가 있는 사원만
SELECT e.emp_id AS '사번',
	e.emp_name AS '직원명',
	d.dept_title AS '부서명',
	l.local_name AS '지역명',
	n.national_name AS '국가명'
FROM employee e
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
INNER JOIN national n ON l.national_code = n.national_code
;


-- 부서가 없는 사원도
SELECT e.emp_id AS '사번',
	e.emp_name AS '직원명',
	d.dept_title AS '부서명',
	l.local_name AS '지역명',
	n.national_name AS '국가명'
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
LEFT OUTER JOIN national n ON l.national_code = n.national_code
;

 

부서가 존재하는 사원만
부서가 존재하지 않는 사원

3. 테이블을 다중 JOIN 하여 사번, 직원명, 부서명, 지역명, 국가명, 급여 등급 조회하시오.

더보기
SELECT e.emp_id AS '사번',
	e.emp_name AS '직원명',
	d.dept_title AS '부서명',
	l.local_name AS '지역명',
	n.national_name AS '국가명',
	g.sal_level AS '급여 등급'
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
LEFT OUTER JOIN national n ON l.national_code = n.national_code
INNER JOIN sal_grade g ON e.salary BETWEEN g.min_sal AND g.max_sal
;

4. 부서가 있는 직원들의 직원명, 직급명, 부서명, 근무 지역명을 조회하시오.

더보기
SELECT e.emp_name AS '직원명',
	j.job_name AS '직급명',
	d.dept_title AS '부서명',
	l.local_name AS '근무 지역'
FROM employee e
LEFT OUTER JOIN job j ON e.job_code = j.job_code
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
;

5. 직급이 대리이면서 ASIA 지역에서 근무하는 직원들의 사번, 직원명, 직급명, 부서명, 근무지역, 급여를 조회하시오.

더보기
SELECT e.emp_id AS '사번',
	e.emp_name AS '직원명',
	j.job_name AS '직급명',
	d.dept_title AS '부서명',
	l.local_name AS '근무 지역',
	e.salary AS '급여'
FROM employee e
INNER JOIN job j ON e.job_code = j.job_code
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
WHERE l.local_name LIKE 'ASIA%' AND
	j.job_name = '대리'
;

6. 보너스를 받는 직원들의 직원명, 보너스, 연봉, 부서명, 근무지역을 조회하시오. (단, 부서 코드가 없는 사원도 출력될 수 있게 OUTER JOIN 사용)

더보기
SELECT e.emp_name AS '직원명',
	e.bonus AS '보너스',
	e.salary * 12 AS '연봉',
	d.dept_title AS '부서명',
	l.local_name AS '근무 지역'
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
WHERE bonus IS NOT NULL
;

7. 한국과 일본에서 근무하는 직원들의 직원명, 부서명, 근무지역, 근무 국가를 조회하시오.

더보기
SELECT e.emp_name AS '직원명',
	d.dept_title AS '부서명',
	l.local_name AS '근무 지역',
	n.national_name AS '근무 국가'
FROM employee e
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
INNER JOIN national n ON l.national_code = n.national_code
WHERE n.national_name IN ('한국', '일본')
;

 

# DDL

0. 데이터베이스 생성

더보기
$ sudo mariadb -u root -p
# password 입력
$ create database university;
$ show databases;
$ grant all privileges on university.* to 'beyond'@'%';
$ show grants for 'beyond'@'%';

 

1. 학과(tb_department) 테이블을 생성하시오.

더보기
CREATE TABLE tb_department(
	department_no VARCHAR(10) PRIMARY KEY,
	department_name VARCHAR(20) NOT NULL,
	category VARCHAR(20) NULL,
	open_yn CHAR(1) NULL,
	capacity INT NULL
);

2. 학생(tb_student) 테이블을 생성하시오.

더보기
CREATE TABLE tb_student(
	student_no VARCHAR(10) PRIMARY KEY,
	department_no VARCHAR(10) NOT NULL REFERENCES tb_department(department_no),
	student_noame VARCHAR(30) NOT NULL,
	student_ssn VARCHAR(14) NULL,
	student_address VARCHAR(100) NULL,
	entrance_date DATE NULL,
	absence_yn CHAR(1) NULL,
	coach_professor_no VARCHAR(10) NULL
);
ALTER TABLE tb_student ADD CONSTRAINT FOREIGN KEY(coach_professor_no)
REFERENCES tb_professor(professor_no);

3. 과목(tb_class) 테이블을 생성하시오.

더보기
-- 과목 테이블(tb_class)
CREATE TABLE tb_class(
	class_no VARCHAR(10) PRIMARY KEY,
	department_no VARCHAR(10) NOT NULL REFERENCES tb_department(department_no),
	preattending_class_no VARCHAR(10), -- 외부
	class_name VARCHAR(30) NOT NULL,
	class_type VARCHAR(10)
);
ALTER TABLE tb_class ADD CONSTRAINT FOREIGN KEY(preattending_class_no)
REFERENCES tb_class(class_no);

4. 교수(tb_professor) 테이블을 생성하시오.

더보기
CREATE TABLE tb_professor(
	professor_no VARCHAR(10) PRIMARY KEY,
	professor_name VARCHAR(30) NOT NULL,
	professor_ssn VARCHAR(14),
	professor_address VARCHAR(100),
	department_no VARCHAR(10) REFERENCES tb_department(department_no)
);

5. 과목 교수(tb_class_professor) 테이블을 생성하시오.

더보기
-- 과목 교수 테이블(tb_class_professor)
CREATE TABLE tb_class_professor(
	class_no VARCHAR(10) REFERENCES tb_class(class_no),
	professor_no VARCHAR(10) REFERENCES tb_professor(professor_no),
	PRIMARY KEY(class_no, professor_no)
);

6. 학점( tb_grade) 테이블을 생성하시오.

더보기
CREATE TABLE tb_grade(
	tern_no VARCHAR(10) NOT NULL,
	class_no VARCHAR(10) NOT NULL REFERENCES tb_class(class_no),
	student_no VARCHAR(10) NOT NULL REFERENCES tb_student(student_no),
	`point` DECIMAL(3,2),
	 PRIMARY KEY(tern_no, class_no, student_no)
);

실습준비


# 실습 준비1

--  DDL for Table DEPARTMENT
CREATE TABLE department (	
    dept_id CHAR(2) PRIMARY KEY, 
    dept_title VARCHAR(35) NOT NULL
);

INSERT INTO department(dept_id,dept_title) VALUES ('D1','인사관리부');
INSERT INTO department(dept_id,dept_title) VALUES ('D2','회계관리부');
INSERT INTO department(dept_id,dept_title) VALUES ('D3','마케팅부');
INSERT INTO department(dept_id,dept_title) VALUES ('D4','국내영업부');
INSERT INTO department(dept_id,dept_title) VALUES ('D5','해외영업1부');
INSERT INTO department(dept_id,dept_title) VALUES ('D6','해외영업2부');
INSERT INTO department(dept_id,dept_title) VALUES ('D7','해외영업3부');
INSERT INTO department(dept_id,dept_title) VALUES ('D8','기술지원부');
INSERT INTO department(dept_id,dept_title) VALUES ('D9','총무부');

--  DDL for Table JOB
CREATE TABLE job (	
    job_code CHAR(2) PRIMARY KEY, 
	job_name VARCHAR(35) NOT NULL
);

INSERT INTO job(job_code,job_name) VALUES ('J1','대표');
INSERT INTO job(job_code,job_name) VALUES ('J2','부사장');
INSERT INTO job(job_code,job_name) VALUES ('J3','부장');
INSERT INTO job(job_code,job_name) VALUES ('J4','차장');
INSERT INTO job(job_code,job_name) VALUES ('J5','과장');
INSERT INTO job(job_code,job_name) VALUES ('J6','대리');
INSERT INTO job(job_code,job_name) VALUES ('J7','사원');


--  DDL for Table EMPLOYEE
CREATE TABLE employee (	
    emp_id CHAR(3) PRIMARY KEY, 
	emp_name VARCHAR(20) NOT NULL, 
	emp_no CHAR(14) NOT NULL, 
	email VARCHAR(25), 
	phone VARCHAR(12), 
	dept_code CHAR(2), 
	job_code CHAR(2), 
	salary INT, 
	bonus DOUBLE, 
	manager_id VARCHAR(3), 
	hire_date DATE, 
	ent_date DATE, 
	ent_yn CHAR(1) DEFAULT 'N'
) ;

INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('200','선동일','621235-1985634','sun_di@kh.or.kr','01099546325','D9','J1',8000000,0.3,null,'90/02/06',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('201','송종기','631156-1548654','song_jk@kh.or.kr','01045686656','D9','J2',6000000,null,'200','01/09/01',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('202','노옹철','861015-1356452','no_hc@kh.or.kr','01066656263','D9','J2',3700000,null,'201','01/01/01',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('203','송은희','631010-2653546','song_eh@kh.or.kr','01077607879','D6','J4',2800000,null,'204','96/05/03',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('204','유재식','660508-1342154','yoo_js@kh.or.kr','01099999129','D6','J3',3400000,0.2,'200','00/12/29',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('205','정중하','770102-1357951','jung_jh@kh.or.kr','01036654875','D6','J3',3900000,null,'204','99/09/09',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('206','박나라','630709-2054321','pack_nr@kh.or.kr','01096935222','D5','J7',1800000,null,'207','08/04/02',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('207','하이유','690402-2040612','ha_iy@kh.or.kr','01036654488','D5','J5',2200000,0.1,'200','94/07/07',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('208','김해술','870927-1313564','kim_hs@kh.or.kr','01078634444','D5','J5',2500000,null,'207','04/04/30',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('209','심봉선','750206-1325546','sim_bs@kh.or.kr','0113654485','D5','J3',3500000,0.15,'207','11/11/11',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('210','윤은해','650505-2356985','youn_eh@kh.or.kr','0179964233','D5','J7',2000000,null,'207','01/02/03',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('211','전형돈','830807-1121321','jun_hd@kh.or.kr','01044432222','D8','J6',2000000,null,'200','12/12/12',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('212','장쯔위','780923-2234542','jang_zw@kh.or.kr','01066682224','D8','J6',2550000,0.25,'211','15/06/17',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('213','하동운','621111-1785463','ha_dh@kh.or.kr','01158456632',null,'J6',2320000,0.1,null,'99/12/31',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('214','방명수','856795-1313513','bang_ms@kh.or.kr','01074127545','D1','J7',1380000,null,'200','10/04/04',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('215','대북혼','881130-1050911','dae_bh@kh.or.kr','01088808584','D5','J5',3760000,null,null,'17/06/19',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('216','차태연','770808-1364897','cha_ty@kh.or.kr','01064643212','D1','J6',2780000,0.2,'214','13/03/01',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('217','전지연','770808-2665412','jun_jy@kh.or.kr','01033624442','D1','J6',3660000,0.3,'214','07/03/20',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('218','이오리','870427-2232123','loo_or@kh.or.kr','01022306545',null,'J7',2890000,null,null,'16/11/28',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('219','임시환','660712-1212123','im_sw@kh.or.kr',null,'D2','J4',1550000,null,null,'99/09/09',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('220','이중석','770823-1113111','lee_js@kh.or.kr',null,'D2','J4',2490000,null,null,'14/09/18',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('221','유하진','800808-1123341','yoo_hj@kh.or.kr',null,'D2','J4',2480000,null,null,'94/01/20',null,'N');
INSERT INTO employee(emp_id,emp_name,emp_no,email,phone,dept_code,job_code,salary,bonus,manager_id,hire_date,ent_date,ent_yn) VALUES ('222','이태림','760918-2854697','lee_tr@kh.or.kr','01033000002','D8','J6',2436240,0.35,'100','97/09/12','17/09/12','Y');

COMMIT;

실습 테이블


# 실습 준비2

CREATE TABLE location(					
	local_code CHAR(2) PRIMARY KEY,
	national_code CHAR(2),
	local_name VARCHAR(40) NOT NULL
);

INSERT INTO location VALUES
('L1', 'KO', 'ASIA1'),
('L2', 'JP', 'ASIA2'),
('L3', 'CH', 'ASIA3'),
('L4', 'US', 'AMERICA'),
('L5', 'RU', 'EU');

SELECT * FROM location;

location 테이블 생성
location 테이블에 데이터 삽입


# 실습 준비3

CREATE TABLE `national`(
	national_code CHAR(2) PRIMARY KEY,
	national_name VARCHAR(35) NOT NULL
);

INSERT INTO national VALUES
('KO', '한국'),
('JP', '일본'),
('CH', '중국'),
('US', '미국'),
('RU', '러시아');

SELECT * FROM national;​

national 테이블 생성
national 테이블에 데이터 삽입


# 실습준비4

CREATE TABLE sal_grade(
	sal_level CHAR(2) PRIMARY KEY,
	min_sal INT,
	max_sal INT
);

INSERT INTO sal_grade VALUES
('S1', 6000000, 10000000),
('S2', 5000000, 5999999),
('S3', 4000000, 4999999),
('S4', 3000000, 3999999),
('S5', 2000000, 2999999),
('S6', 1000000, 1999999);

sal_grade 테이블 생성
sal_grade 테이블에 데이터 삽입

 

 

 

NON EQUAL JOIN


1. NON EQUAL JOIN (비등가 조인)

  • 다른 JOIN은 같은 지를 비교하지만 NON EQUAL JOIN은 조인 조건에 등호(=)를 사용하지 않는 조인
-- NON EQUAL JOIN 실습
-- 조인 조건에 등호(=)를 사용하지 않는 조인문을 비등가 조인이라고 한다.
-- employee 테이블과 sal_grade 테이블을 비등가 조인하여 직원명, 급여, 급여 등급 조회
-- INNER JOIN이기 때문에 조인 조건을 만족하는 경우가 아니면 출력이 안됨

SELECT e.emp_name,
		e.salary,
		s.sal_level
FROM employee e
INNER JOIN sal_grade s ON e.salary >= s.min_sal AND e.salary <= s.max_sal
# INNER JOIN sal_grade s ON e.salary between s.min_sal AND s.mas_sal과 결과 동일
;

급여를 기준으로 등급 출력

 

mariaDB 리눅스에 설치


1. 패키지 매니저 update/ upgrade

# 패키지 매니저 update
# 패키지 매니저의 목록을 update

sudo apt update

apt update

# update된 패키지들을 upgrade
sudp apt upgrade

apt upgrade

2. mariadb 설치

# mariad-server 설치
sudo apt install mariadb-server

mariadb-server 설치

# maraidb-client 설치
sudo apt install maraidb-client

mariadb-client 설치

# mariadb 버전 확인
mariaddb --version

 

 

3. mariadb 설치 확인

# maraidb 설치 확인

#1
netsstat -tnl | grep 3306
#2
systemctl status mariadb

#1
#2

sudo mariadb-secure-installation

4. 로그인 테스트

# mariadb 로그인 테스트
sudo mariadb -u root -p

로그인

# mariadb 버전 확인
select version();

# databases 확인
show databases;

버전과 데이터베이스 확인

# mysql 데이터베이스 접근
use mysql;

# 테이블 목록 확인
show tables;

mysql 데이터베이스에 접근하여 테이블 목록 확

5. 데이터베이스 생성

# 데이터 베이스 생성
create datavase tesetDB;

show tables;

testDB 생성

# testDB 접근
use testDB;

testDB 접근

# beyond 유저 생성
create user 'beyond'@'%' identified by 'beyond'

select host, user, password from mysql.user;

beyond 계정 생성 후 확인

# beyond 계정에게 testDB 모든 접근 권한 부여
grant all privileges on testDB.* to 'beyond'@'%';

show grants for 'beyond'@'%'

flush privileges;

권한 부여
권한 확인

5. mariadb 설정

# mariadb 설정

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

bind-address 수정
외부 아이에서 접근이 가능하도록 수정

# mariadb 재부팅
sudo systemctl restart mariadb

6. HeidiSQL로 접근

mariadb 포트 포워딩 설정
세션 추가

 

트리거(Trigger)


 

1. 트리거(Trigger)

  • 트리거는 테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때 자동으로 작동되는 개체

2. 트리거의 종류

  • 테이블에 삽입, 수정, 삭제 작업 후에 작동하는 AFTER 트리거
  • 테이블에 삽입, 수정, 삭제 작업 전에 작동하는 BEFORE 트리거

 

3. 트리거 생성

  • 트리거를 생성하려면 CREATE TRIGGER 구문을 사용
DELIMITER $$
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE|AFTER INSERT|UPDATE|DELETE ON 테이블명
FOR EACH ROW
BEGIN
    -- SQL 프로그래밍 코드 작성
END $$
DELIMITER ;
더보기

TABLE 작성

-- 트리거 실습
-- 상품 입/출고 관련 예시

-- 1. 상품에 대한 데이터를 보관할 테이블 생성
CREATE TABLE tb_product(
	pcode INT AUTO_INCREMENT PRIMARY KEY,		-- 상품 코드
	pname VARCHAR(100),								-- 상품 이름
	brand VARCHAR(100),								-- 상품의 브랜드 이름
	price INT,											-- 상품의 가격
	stock INT DEFAULT 0								-- 상품의 재고
);


-- 상품 데이터 삽입
INSERT INTO tb_product(pname, brand, price)VALUES('아이폰12미니', '애플', 950000);
INSERT INTO tb_product(pname, brand, price)VALUES('갤럭시23', '삼성', 950000);

##########################################################################################

-- 2. 상품 입/출고 상세 이력 테이블 생성
CREATE TABLE tb_prodetail(
	dcode INT AUTO_INCREMENT PRIMARY KEY,						 -- 입출고 이력 코드
	pcode INT REFERENCES tb_product(pcode),					 -- 상품 코드(외래키)
	STATUS VARCHAR(2) CHECK(STATUS IN('입고', '출고')),		-- 상태
	amount INT,															 -- 수량
	ddate DATE DEFAULT CURDATE()									 -- 상품 입/출고 일자
);

-- 상품 데이터 삽입
-- 1번 상품이 2024-05-01 날짜로 10개 입고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(1, '입고', 10, '2024-05-01');
## 트리거가 사용되지 않았을때의 입출고 관리
-- 1번 상품이 2024-05-02 날짜로 5개가 출고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(1, '출고', 5, '2024-05-02');

-- 1번 상품의 재고 수량도 변경해야 한다.
UPDATE tb_product
SET stock = stock - 5
WHERE pcode = 1    
;

-- 2번 상품이 2024-05-06 날짜로 20개 입고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(2, '출고', 20, '2024-05-06');

-- 2번 상품의 재고 수량도 변경해야 한다.
UPDATE tb_product
SET stock = stock + 20
WHERE pcode = 2
;


## 트리거 생성시에 는 insert 작업만 해주면 됨
DELIMITER $$
CREATE OR REPLACE TRIGGER trg_pro_stock
AFTER INSERT ON tb_prodetail
FOR EACH ROW
BEGIN
	-- 상품이 입고된 경우 (재고 증가)
	IF NEW.status = '입고' THEN
		UPDATE tb_product
		SET stock = stock + NEW.amount
		WHERE pcode = NEW.pcode;
	END IF;
	
	-- 상품이 출고된 경우 (재고 감소)
	IF NEW.status = '출고' THEN
		UPDATE tb_product
		SET stock = stock - NEW.amount
		WHERE pcode = NEW.pcode;
	END IF;
END;
DELIMITER;

4. 트리거 삭제

  • 트리거를 삭제하려면 DROP TRIGGER 구문을 사용
DROP TRIGGER 트리거 이름;

뷰(View)


1. 뷰(View)

  • 뷰는 테이블과 똑같은 모습을 하고 있는 가상의 테이블
  • 뷰는 기본적으로 읽기 전용으로 많이 사용하지만, 뷰를 통해서 테이블의 데이터를 수정 가

2. 뷰의 생성

  • 뷰를 생성할 때는 CREATE VIEW 구문을 사용
CREATE [OR REPLACE] VIEW 뷰 이름 
AS 서브 쿼리
[WITH CHECK OPTION];
-- VIEW 실습
#1 뷰 생성
CREATE VIEW v_employee
AS SELECT e.emp_id,
	e.emp_name,
	d.dept_title,
	j.job_name,
	e.hire_date
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN job j ON e.job_code = j.job_code;

#1


-- 사원의 사번, 직원명, 성별, 급여를 조회할 수 있는 뷰를 생성
#2
# OR REPLACE : 같은 이름의 뷰가 존재한다면 해당 뷰의 내용을 해당 쿼리문으로 덮어씀
# SELECT 쿼리에 함수나, 산술연산이 기술되어 있는 경우 별칭을 지정해야 한다.

CREATE OR REPLACE VIEW v_employee
AS SELECT emp_id,
	emp_name,
	if(SUBSTRING(emp_no, 8, 1)='1', '남자', '여자') AS gender,
	salary
FROM employee;

SELECT * FROM v_employee;

3. 뷰의 수정

  • 뷰를 수정할 때는 ALTER VIEW 구문을 사용
ALTER VIEW 뷰 이름 AS 서브 쿼리;
-- 뷰 수정

ALTER VIEW v_userbuy
AS SELECT u.userid,
	u.NAME,
	b.prodName,
	u.addr,
	CONCAT(u.mobile1, u.mobile2) AS 'mobile'
FROM usertbl u
INNER JOIN buytbl b ON u.userId = b.userID
;

4. 뷰의 삭제

  • 뷰를 삭제할 때는 DROP VIEW 구문을 사용
DROP VIEW 뷰 이름;

 

5. 뷰의 DML 작업

  • DML 작업이 가능한 경우
-- 뷰를 이용해서 DML(INSERT, UPDATE, DELETE) 사용

#1 v_job 생성

CREATE OR REPLACE VIEW v_job
AS SELECT *
	FROM job
;

 

#1 v_job 뷰 생


#2 VIEW INSERT (job_code = 'J8', job_name = '알바' 데이터 삽입)
INSERT INTO v_job VALUES('J8', '알바');

SELECT * FROM v_job;
SELECT * FROM job

#2 view에 데이터가 삽입됨

 

#3 원본 테이블에도 데이터가 삽입


#3 VIEW UPDATE (J8 직급명을 인턴으로 변경)

UPDATE v_job
SET job_name = '인턴'
WHERE job_code = 'J8'
;

#3 데이터의 내용이 변경됨
#3 원본 테이블 값도 함께 변경


#4 VIEW DELETE (J8 직급명인 데이터를 삭제)

DELETE
FROM v_job
WHERE job_code = 'J8'
;

#4 데이터가 삭제됨
#4 원본 테이블의 데이터도 함께 삭제

  • DML 조작이 불가능한 경우

1. 뷰 정의에 포함되지 않는 열을 조작하는 경우

#1 v_job 뷰 생성

CREATE OR REPLACE VIEW v_job
AS SELECT job_code
	FROM job
;
-- 1.INSERT
#1 VIEW에 정의된 열에 값을 삽입하는 것은 불가
#  제약 조건에 위배되는 값을 넣어도 에러 발생
INSERT INTO v_job VALUES('J8', '인턴');

#2 데이터 삽입이 가능
INSERT INTO v_job VALUES('J8');

-- 2.UPDATE
#1 v_job 뷰는 job_code만 접근할 수 있기 때문에 에러발생
UPDATE v_job
SET job_name = '인턴'
WHERE job_code = 'J8'
;

#2 데이터 수정이 가능
UPDATE v_job
SET job_code = 'J0'
WHERE job_code = 'J8'
;

-- 3.DELETE
#1 v_job 뷰는 job_code만 접근할 수 있기 때문에 에러발생
DELETE
FROM v_job
WHERE job_name IS NULL
;

#2
DELETE 
FROM v_job
WHERE job_code = 'J0'
;

 

 

2. 산술 표현법으로 정의 된 경우

#1 v_emp_salary 뷰 생성

-- 사원의 연봉 정보를 조회하는 뷰
CREATE VIEW v_emp_salary
AS SELECT emp_id,
			emp_name,
			emp_no,
			salary * 12 AS 'salary'
	FROM employee
;

-- 1.INSERT
#1 산술 연산으로 정의된 컬럼은 데이터 삽입이 불가능
INSERT INTO v_emp_salary
VALUES ('100', '홍길동', '940523-1111111', '30000000');

#2 산술 연산과 무관한 컬럼은 데이터 삽입 가능
INSERT INTO v_emp_salary(emp_id, emp_name, emp_no)
VALUES ('100', '홍길동', '940523-1111111');

-- 2.UPDATE
#1. 산술 연산으로 정의된 열은 데이터 변경 불가능
UPDATE v_emp_salary
SET salary = 30000000
WHERE emp_id = '100'
;
#2. 산술 연산과 무관한 열은 데이터 변경 가능
UPDATE v_emp_salary
SET emp_name = '고길동'
WHERE emp_id = '100'
;

-- 3.DELETE

# 가상으로 설정된 값을 입력하고 변경하는 것이 아닌
# 조회해서 삭제하는 것은 가능
DELETE
FROM v_emp_salary
WHERE salary = 36000000;

 

 

3. 그룹 함수나 GROUP BY  절을 포함한 경우(DISTINCT도 동일)

#1 v_emp_salary 뷰 생성
CREATE OR REPLACE VIEW v_emp_salary
	AS SELECT dept_code,
				FLOOR(SUM(salary)) AS 'sum',
				floor(AVG(salary)) AS 'avg'
		FROM employee
		GROUP BY dept_code
;

-- 1.INSERT
#1 그룹 함수로 생성된 열은 가상의 열이기때문에 삽입이 불가능
INSERT INTO v_emp_salary VALUES('D7', 8000000, 4000000);
#2 GROUP BY로 생성된 테이블의 dept_code열에는 삽입이 불가능
INSERT INTO v_emp_salary(dept_code) VALUES('D7');

-- 2.UPDATE
#1 그룹 함수로 생성된 열은 가상의 열이기때문에 수정이 불가능
UPDATE v_emp_salary
SET SUM = 6000000
WHERE dept_code = 'D2'
;

#2 GROUP BY로 생성된 테이블의 dept_code 열은 수정이 불가능
#	원본 테이블의 해당 dept_code인 열이 모두 수정 되기 때문
UPDATE v_emp_salary
SET dept_code = 'D7'
WHERE dept_code = 'D2'
;

-- 3.DELETE
#1 GROUP BY로 생성된 테이블의 dept_code 열은 삭제가 불가능
#	원본 테이블의 해당 dept_code인 열이 모두 삭제 되기 때문

DELETE
FROM v_emp_salary
WHERE dept_code = 'D2'
;

 

 

4. JOIN을 이용해 여러 테이블을 연결한 경우

-- 1.INSERT
#1. 에러발생
INSERT INTO v_emp_dept VALUES
(100, '홍길동', '000523-3123456',  '해외영업3부');

#2 에러발생
INSERT INTO v_emp_dept VALUES
(100, '홍길동', '000523-3123456',  '총무부');

#3 에러발생
INSERT INTO v_emp_dept(emp_id, emp_name, emp_no) VALUES
(100, '홍길동', '000523-3123456');

-- 2.UPDATE
#1 실행 가능
UPDATE v_emp_dept
SET dept_title = '총무1팀'
WHERE emp_id = '200'
;

#2 실행 가능
UPDATE v_emp_dept
SET emp_name = '서동일'
WHERE emp_id = '200'
;

-- 3.DELETE
#1 오류 발생
DELETE
FROM v_emp_dept
WHERE emp_id = '202'
;

+ Recent posts