이미지 - 스타터스 취업 부트캠프(STARTERS) 공식 블로그

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가지 제약 조건 ( 테이블 생성 시 설정 )
    1.  NOT NULL 제약조건
    2. UNIQUE 제약조건
    3. PRIMARY KEY 제약조건
    4. 사용자 제약조건(CHECK)
    5. 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기 백엔드 과정 학습 일지 리뷰로 작성되었습니다.

+ Recent posts