
6주차 학습 내용을 정리합니다.
데이터베이스, SQL, 제약조건, 서브쿼리, 조인, JDBC에 대해서 학습하였습니다.
데이터베이스
- 데이터 : 의미 있는 정보
- 데이터베이스 : 연관된 데이터들의 모음
- 관계형 데이터베이스(RDBMS)
: 모든 데이터들의 관계를 '행'과 '열'의 '테이블' 구조로 표현하는 데이터베이스
▪ 행(row) : 1개 정보 (= 튜플, tuple)
▪ 열(column) : 1개 행이 표현해야 할 정보의 묶음
▪ 필드(field) : 행과 열의 교차점, 한 개의 정보
▪ 스키마(schema) : 연관된 테이블들의 모음 (= 데이터베이스)
SQL(Structured Query Language)
- 데이터베이스 접근 시 사용되는 언어
- 종류
- DDL(Data Definition Language) : 데이터 구조 정의 언어
▪ CREATE TABLE [테이블명]
▪ CREATE DATABASE [스키마명]
▪ ALTER TABLE
▪ DROP TABLE
- DML(Data Manipulation Language) : 데이터 조작 언어
▪ INSERT
▪ UPDATE
▪ DELETE
- DQL (Data Query Language) : 데이터 조회 언어
▪ SELECT
- DCL (Data Control Language) : 데이터 제어 언어
▪ GRANT
▪ REVOKE
- TCL (Transaction Control Language) : 트랜잭션 제어 언어
▪ COMMIT
▪ ROLLBACK - SELECT
- 기본 구조

- 연산자

- 집계함수

- 실행순서

- INSERT
- 기본구조
INSERT INTO [테이블명](컬럼명1, 컬럼명2, 컬럼명3, ...) VALUES (값1, 값2, 값3, ...);
// 모든 컬럼에 값을 넣을 경우 테이블명 뒤에 컬럼명 명시하지 않아도 됨!
// 단, 순서는 지켜야 함!
INSERT INTO [테이블명] VALUES (값1, 값2, 값3, ...);
// IGNORE 키워드
// :타입에 문제가 있어도 일단 입력하고 나중에 수정함
INSERT IGNORE INTO emp_copy VALUES (1, '길동', '홍', 1000, '2022', NULL);
- UPDATE
- 기본구조
UDPATE [테이블명]
SET [변경컬럼명]=[변경값]
WEHRE [변경조건식]
// 예시 : "입사월이 6월인 사원을 20번 부서로 배정하고 급여를 20% 인상"하는 코드
UDPATE emp_copy
SET department_id = 20, salary = salary * 1.2
WHERE hire_date LIKE '_____06%';
제약조건
- 제약(Constraint)
- 현실 세계의 데이터들을 모델링을 통해 테이블로 옮겨놓을 때, 현실 세계의 데이터 상태를 보존하기 위해 반드시 지켜야할 조건들 (= 데이터 무결성 보존)
- 예시
▪ 코드번호 : 빈 값 불가(not null) + 중복 불가(unique)
▪ 상품명 : 빈 값 불가(not null)
▪ 가격 : 0 이상 (check)
▪ 수량 : 0 이상 (check) - 5가지 제약 조건 ( 테이블 생성 시 설정 )
- NOT NULL 제약조건
- UNIQUE 제약조건
- PRIMARY KEY 제약조건
- 사용자 제약조건(CHECK)
- FOREIGN KEY 제약조건
- 테이블 레벨 정의 VS 컬럼 레벨 정의
- '컬럼 레벨'에서만 정의 가능 : NOT NULL
- '테이블 레벨'에서만 정의 가능 : FORIEGN KEY (maria db 에서만!)
- 나머지(PK, UNIQUE, CHECK)는 둘 다 가능!
CREATE TABLE board2(
-- <<컬럼 레벨 정의>>
seq INT NOT NULL AUTO_INCREMENT,
title CHAR(100) NOT NULL,
contents TEXT,
viewcounts INT DEFAULT 0,
writer CHAR(10),
-- <<테이블 레벨 정의>>
-- 제약 조건명은 DB안에서 중복될 수 없음!
CONSTRAINT pk_board_seq PRIMARY KEY(seq), -- PK 제약조건명은 무시됨!
CONSTRAINT fk_board_writer2 FOREIGN KEY(writer) REFERENCES users(user_id),
-- CHECK(컬럼명 LIKE ''),
-- UNIQUE(컬럼명)
);
서브쿼리(SubQuery)
- 기존 쿼리 내부에 또 다른 쿼리를 작성
- 종류
- 단일행 서브쿼리
- 다중행 서브쿼리
- 다중열 서브쿼리 - 단일행 서브쿼리 : 서브쿼리 조회 결과 값이 한 개인 경우 ( '=' 연산자 사용)
SELECT department_id, salary, first_name
FROM employees
WHERE department_id=(SELECT department_id FROM employees WHERE first_name='Kelly');
- 다중행 서브쿼리 : 서브쿼리 조회 결과 값이 여러 개인 경우 ( 'IN' 연산자 사용)
-- first_name이 Peter인 사원과 동일 부서 근무자의 부서코드, 급여, 이름 조회
SELECT department_id, salary, first_name
FROM employees
WHERE department_id IN (SELECT department_id FROM employees WHERE first_name='Peter');
- 다중열 서브쿼리 : 비교하는 컬럼의 개수가 여러 개인 경우 ( 'IN' 연산자 사용)
-- Kelly와 (1)job_id와 (2)department_id 둘 다 동일한 경우 조회
SELECT department_id, salary, first_name, hire_date
FROM employees
WHERE (department_id, hire_date)
IN (SELECT department_id, hire_date FROM employees WHERE first_name='Kelly');
- 연관형 서브쿼리
- 연관형 서브쿼리는 독립적으로 실행될 수 없음!
- 외부쿼리의 내용과 결합되어 쿼리를 진행함 → 바깥쪽에 있는 데이터와 비교가 필요하기 때문!
-- [1]각 부서별 최대 급여를 받는 사원의 이름, 급여, 부서번호 조회
SELECT first_name, salary, department_id
FROM employees
WEHRE (department_id, salary) IN
(SELECT department_id, MAX(salary) FROM employees GROUP BY department_id)
ORDER BY department_id;
-- [2]부서의 평균급여보다 더 많이 받는 사원의 이름, 급여, 부서번호 조회
SELECT salary, department_id,
(SELECT AVG(salary) FROM employees WHERE e.department_id=department_id)
FROM employees e
WHERE salary > ANY(SELECT AVG(salary) FROM employees WHERE e.department_id=department_id);
조인(JOIN)
- 집합 연산자(UNION, UNION ALL, INTERSECT)와의 차이
- 집합 연산자 : 행(row) 개수의 변화
- 조인 : 열(column) 개수의 변화 - 관계형데이터베이스에서는 중복되는 정보들을 최소화하기 위해 테이블들을 가장 작은 단위로 분리함
- 서로 다른 테이블들에 분산된 정보들을 가져와 종합하여 보여주거나, 계산된 결과를 보여줄 때 JOIN 필요
- 종류
- INNER JOIN
- LEFT/RIGHT OUTER JOIN
- SELF JOIN - INNER JOIN
- 가장 기본적인 조인 (Default)
- 양쪽 테이블 조건에 모두 만족하는 데이터들만 조인해서 가져옴 (null 없음)
SELECT first_name, department_name
FROM employees e JOIN departments d ON e.department_id=d.department_id;
- OUTER JOIN
- 조건 범위 밖에 있어도 조인함
- 조건 범위 밖에 있는 데이터들은 null로 표시
-- 부서 배정되지 않은 사원도 포함해서 보여줌
SELECT first_name, department_name
FROM employees e LEFT OUTER JOIN departments d ON e.department_id=d.department_id;
-- 단, 한명의 사원도 소속되지 않은 부서도 포함하여 조인
SELECT first_name, department_name
FROM employees e RIGHT OUTER JOIN departments d ON e.department_id=d.department_id;
- SELF JOIN
- 자기 자신과 조인하는 것
- 자기 자신의 테이블을 하나 복사하여 조인 → ALIAS 필수!
SELECT ME.employee_id 내사번, ME.first_name 내이름, ME.manager_id, MAN.employee_id, MAN.first_name 상사이름
FROM employees ME JOIN employees MAN
ON ME.manager_id=MAN.employee_id
회고
실습시간에 마주했던 SQL 문제들은 살짝만 꼬아서 나와도 무척 어렵게 느껴졌습니다. 하지만 실제 현업에서 마주하게 될 문제들은 더 복잡하고 어려울 것이기 때문에 앞으로 꾸준히 SQL문을 학습하고 다뤄보아야 할 것 같습니다.
참고
- 소문난 명강의 : 김상형의 SQL 정복(2021), 한빛미디어, 김상형
* 유데미 바로가기 : https://bit.ly/3V220ri
* STARTERS 취업 부트캠프 공식 블로그 보러가기 : https://blog.naver.com/udemy-wjtb
본 후기는 유데미-웅진씽크빅 취업 부트캠프 3기 백엔드 과정 학습 일지 리뷰로 작성되었습니다.
'유데미 스타터스 3기 > 학습일지' 카테고리의 다른 글
| 유데미 스타터스 취업 부트캠프 3기 - 백엔드 8주차 학습 일지 (0) | 2023.01.15 |
|---|---|
| 유데미 스타터스 취업 부트캠프 3기 - 백엔드 7주차 학습 일지 (0) | 2023.01.08 |
| 유데미 스타터스 취업 부트캠프 3기 - 백엔드 5주차 학습 일지 (2) | 2022.12.25 |
| 유데미 스타터스 취업 부트캠프 3기 - 백엔드 4주차 학습 일지 (0) | 2022.12.18 |
| 유데미 스타터스 취업 부트캠프 3기 - 백엔드 3주차 학습 일지 (0) | 2022.12.11 |