KDT 공부 일지 - 2026.01.27

김시코·2026년 1월 27일

KDT 공부 일지

목록 보기
17/27

2026년 1월 27일 - 5주차

데이터베이스 실습 준비

데이터베이스를 사용하기 위한 툴

Docker를 사용해서 mariaDB를 사용하는 것을 선택. DB툴은 DBeaver로 한다.
localhost: 내 컴퓨터의 ip주소를 말함. Docker를 통해서 DB를 생성 해두었기 때문에 가능.
DBeaver: 이와 같은 툴은 DB가 아니라 DB를 원격에서 접속하는 툴이다. DB는 Docker에 만들어져 있다.

본격적으로 들어가기 전, 알고가야 할것.

쿼리도 java와 마찬가지로 마지막에 ;을 써야 한다. 하지만, 다른 언어와 다른점은 꼭 쓰지 않아도 괜찮은 때가 있다는 것이다. ;는 문장을 끝낸다는 표현으로 쓰이며, 하나의 블록 내부에서 한줄이 끝날때마다 ;을 썼던 java와 다르게 하나의 블록 내부에서 값이 이어지는 경우에는 쓰지 않을 때가 있다. 쿼리문을 실행시키는 것도 지금까지와는 다른데, 한번 실행시키면 위에서부터 아래로 전부 다 실행 시키는 Java와는 다르게, 실행시키기 원하는 명령문에 커서를 가져간 후에 ctrl + enter를 눌러서 실행 시킨다. 그러면 그 명령문만 실행되고 다른것은 실행되지 않는다. 물론, 툴의 기능을 쓰면 맨 윗줄부터 순차적으로 실행시킬수도 있기는 하다. 잘 알아야 할 점은 이 DBeaver 툴은 절대로 DB가 아니고, 이 툴에서 쿼리를 실행시키면 툴 내부에서 DB가 동작되어서 결과가 나오는게 아니라 DB가 실행되고 있는 곳(Docker)으로 가서 명령문을 실행시킨 후에 나온 결과값을 가져와서 출력하는 것이다. DB에는 DDL과 DML이 있는데, DDL은 아직 CREATE TABLE만 써보았고, DML중에서는 SELECT문이 가장 중요한데 일단은 SELECT만 잘 하면 다 해결된다고 한다. 쿼리의 주석은 종류가 조금 있는데, 먼저 표준 주석은 -- 이고 DBeaver의 주석도 따로 존재하는데 #을 통해서 주석을 표현한다. 하지만 그냥 표준 주석을 사용하는것이 좋다.
데이터베이스도 데이터의 타입이 있는데, 크게 나눠보면 날짜, 문자, 숫자 등이 있다.

직접 작성해본 전체 쿼리문.

-- 다 필요 없고 SELECT만 제대로 하면 다 해결 된다.

-- DDL: 데이터 정의어
DROP TABLE Book;
CREATE TABLE Book(
	bookid INT,
	bookname VARCHAR(40),
	publisher VARCHAR(40),
	price INT
);

DROP TABLE Customer;
CREATE TABLE Customer(
	custid INT,
	name VARCHAR(20),
	address VARCHAR(100),
	phone VARCHAR(15)
);

DROP TABLE Orders;
CREATE TABLE Orders(
	orderid INT,
	custid INT,
	bookid INT,
	saleprice INT,
	orderdate DATETIME
);

-- 데이터 입력
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(1, '축구의 역사', '굿스포츠', 7000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(2, '축구 아는 여자', '나무수', 13000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(3, '축구의 이해', '대한미디어', 22000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(4, '골프 바이블', '대한미디어', 35000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(5, '피겨 교본', '굿스포츠', 8000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(6, '배구 단계별기술', '굿스포츠', 6000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(7, '야구의 추억', '이상미디어', 20000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(8, '야구를 부탁해', '이상미디어', 13000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(9, '올림픽 이야기', '삼성당', 7500);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(10, 'Olympic Champions', 'Pearson', 13000);

INSERT INTO Customer(custid, name, address, phone) VALUES(1, '박지성', '영국 맨체스터', '000-5000-0001');
INSERT INTO Customer(custid, name, address, phone) VALUES(2, '김연아', '대한민국 서울', '0000-6000-0001');
INSERT INTO Customer(custid, name, address, phone) VALUES(3, '김연경', '대한민국 경기도', '000-7000-0001');
INSERT INTO Customer(custid, name, address, phone) VALUES(4, '추신수', '미국 클리블랜드', '000-8000-0001');
INSERT INTO Customer(custid, name, address, phone) VALUES(5, '박세리', '대한민국 대전', null);

INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(1, 1, 1, 6000, '2014-07-01');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(2, 1, 3, 21000, '2014-07-03');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(3, 2, 5, 8000, '2014-07-03');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(4, 3, 6, 6000, '2014-07-04');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(5, 4, 7, 20000, '2014-07-05');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(6, 1, 2, 12000, '2014-07-07');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(7, 4, 8, 13000, '2014-07-07');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(8, 3, 10, 12000, '2014-07-08');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(9, 2, 10, 7000, '2014-07-09');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(10, 3, 8, 13000, '2014-07-10');


-- 확인용
SELECT * FROM Book;
SELECT * FROM Customer;
SELECT * FROM Orders;

강사님이 올려주신 쿼리문.

아마 앞으로는 올려주신 이 코드를 기반으로 수업이 진행될 것 같다..

DROP TABLE Orders;
DROP TABLE Book;
DROP TABLE Customer;

-- Book 테이블 DDL
CREATE TABLE Book (
    bookid      INT             PRIMARY KEY,
    bookname    VARCHAR(100)    NOT NULL,
    publisher   VARCHAR(50)     NOT NULL,
    price       INT             NOT NULL
);

-- Customer 테이블 DDL
CREATE TABLE Customer (
    custid      INT             PRIMARY KEY,
    name        VARCHAR(20)     NOT NULL,
    address     VARCHAR(100)    NOT NULL,
    phone       VARCHAR(20)     NULL
);

-- Orders 테이블 DDL
CREATE TABLE Orders (
    orderid     INT             PRIMARY KEY,
    custid      INT             NOT NULL,
    bookid      INT             NOT NULL,
    saleprice   INT             NOT NULL,
    orderdate   DATETIME        NOT NULL,
    FOREIGN KEY (custid) REFERENCES Customer(custid),
    FOREIGN KEY (bookid) REFERENCES Book(bookid)
);


INSERT INTO Book (bookid, bookname, publisher, price) VALUES
(1, '축구의 역사', '굿스포츠', 7000),
(2, '축구아는 여자', '나무수', 13000),
(3, '축구의 이해', '대한미디어', 22000),
(4, '골프 바이블', '대한미디어', 35000),
(5, '피겨 교본', '굿스포츠', 8000),
(6, '역도 단계별 기술', '굿스포츠', 6000),
(7, '야구의 추억', '이상미디어', 20000),
(8, '야구를 부탁해', '이상미디어', 13000),
(9, '올림픽 이야기', '삼성당', 7500),
(10, 'Olympic Champions', 'Pearson', 13000);

INSERT INTO Customer (custid, name, address, phone) VALUES
(1, '박지성', '영국 맨체스타', '000-5000-0001'),
(2, '김연아', '대한민국 서울', '000-6000-0001'),
(3, '장미란', '대한민국 강원도', '000-7000-0001'),
(4, '추신수', '미국 클리블랜드', '000-8000-0001'),
(5, '박세리', '대한민국 대전', NULL);

INSERT INTO Orders (orderid, custid, bookid, saleprice, orderdate) VALUES
(1, 1, 1, 6000, '2025-07-01'),
(2, 1, 3, 21000, '2025-07-03'),
(3, 2, 5, 8000, '2025-07-03'),
(4, 3, 6, 6000, '2025-07-04'),
(5, 4, 7, 20000, '2025-07-05'),
(6, 1, 2, 12000, '2025-07-07'),
(7, 4, 8, 13000, '2025-07-07'),
(8, 3, 10, 12000, '2025-07-08'),
(9, 2, 10, 7000, '2025-07-09'),
(10, 3, 8, 13000, '2025-07-10');

이제야 실습 준비 끝... 앞으로는 이 데이터가 존재한다는 가정 하에 수업을 진행한다.


SQL - Structured Query Language

SQL문은 DDL과 DML로 구성된다.

DDL : Data Definition Language
DML : Data Manipulation Language

DDL과 DML

[DDL] - 데이터 정의어. 지금은 CREATE TABLE만 배웠다.

  • [CREATE문] - 테이블을 생성하는 문법이다.
    CREATE TABLE 테이블명(); 이게 기본 형태이고, 괄호 안에는 필드명을 작성해서 필드를 생성한다. 필드를 생성할때는 필드명 데이터타입 (키) 이 3개가 들어가야 하며, 데이터 타입으로는 숫자 INT, 문자 VARCHAR(최대 문자열 길이), 날짜정보인 년월일시분초를 받아오는 DATETIME이 있다.
DROP TABLE Book;
CREATE TABLE Book(
	bookid INT,
	bookname VARCHAR(40),
	publisher VARCHAR(40),
	price INT
);
...

[DML] - 데이터 조작어. 지금은 SELECT만 열심히 공부하면 된다.
개념: CREATE, READ, UPDATE, DELETE
문법: INSERT SELECT, UPDATE, DELETE

[INSERT문] - 테이블에 값을 저장하는 것.

  • INTO: 값을 저장할 테이블과 테이블 명을 선택하는 것이다.
    • 기본 구조: INTO 테이블명(필드명1, 필드명2, ... 필드명n)
  • VALUES: 실제로 넣을 값
    • 기본 구조: VALUES(값1, 값2, ... 값n)
    • INSERT문 사용법
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(1, '축구의 역사', '굿스포츠', 7000);
INSERT INTO Customer(custid, name, address, phone) VALUES(1, '박지성', '영국 맨체스터', '000-5000-0001');
INSERT INTO Orders(orderid, custid, bookid, saleprice, orderdate) VALUES(1, 1, 1, 6000, '2014-07-01');

[SELECT문] - 테이블 안에 있는 정보를 검색하는 것.

  • SELECT: 어떤 필드의 값을 가져올지 정하는 것인데, 여기에 필드명이 아닌 *을 넣게 된다면 그 테이블의 모든 필드의 값을 출력 할 수 있다.
    • 기본 구조: SELECT * FROM 테이블명;
    • 본격적으로 검색하기 전에 어떤 값들이 있는지 확인 후, 본격적으로 검색하는게 좋다.
  • FROM: 어느 테이블에서 값을 가져올지 선택하는 것.
    • 기본 구조: FROM 테이블명;
    • 여러가지 조건들을 추가할때는 테이블명과 세미콜론의 사이 부분에 추가한다.
  • WHERE: 조건절. 검색할때 조건을 주는 것이고 조건을 만족하는 행만 출럭하는것이다. if문 생각하면 됨.
    기본 구조: SELECT * FROM 테이블명 WHERE 조건식;
    • 다른 PL과 마찬가지로 조건식에 &&, ||, == 같은것들을 붙일 수 있는데, SQL에서는 AND, OR, = 으로 사용한다. = 은 조건과 같은 값을 출력할때 사용하는데, ==가 아니라 =인 이유는 sql에는 변수가 없기 때문에, 대입 연산자가 필요 없기 때문이다
  • BETWEEN: WHERE문을 쓸때 쓰이는 문법이다, 조건을 줄때 특정값들 사이의 값을 검색하고싶을때 비교 연산자를 사용하지 않고 가독성을 높이기 위해 존재한다.
    • BETWEEN 사용법
-- 가격이 10000원 이상, 2000원 이하인 도서를 검색하세요:
SELECT * FROM Book WHERE price >= AND price <= 20000;
SELECT * FROM Book WHERE price BETWEEN 10000 AND 20000;
이 둘이 같은거.
  • IN(): 가장 중요한 문법. 이 괄호 안에는 벡터를 넣을 수 있는데. 이 안에 있는 값이 하나라도 있으면 출력한다. 이때, IN의 앞에 NOT를 넣을 수 있는데, 이것은 Java에서의 !와 같은 역할을 하고, NOT는 꼭 WHERE에서만 쓰이는 것이 아닌 별도의 문법이다.
    • 단위값: 하나의 값. 변수 같은 느낌인건가?
    • 벡터: 1중 배열과 같은 느낌? 단위값을 묶는것이다.
-- 출판사가 '굿스포츠' 혹은 '대한미디어' 인 도서를 구하세요:
SELECT * FROM Book WHERE publisher = '굿스포츠' OR publisher = '대한미디어';
SELECT * FROM Book WHERE publisher IN('굿스포츠', '대한미디어');
# 이 두개의 결과값은 같다.

SQL 실습 코드

[sql 실습]
-- DML: 데이터 조작어
-- [CRUD] - SELECT만 공부하면 됨.
-- 개념: CREATE, READ, UPDATE, DELETE
-- 문법: INSERT SELECT, UPDATE, DELETE

-- 모든 도서의 이름과 가격을 검색(출력)하세요
SELECT bookname, price FROM Book;

-- 모든 도서의 도서번호와 이름, 춢판사, 가격을 검색하세요:
SELECT bookid, bookname, publisher, price FROM Book;
-- 로 해도 되지만, 모든 필드를 검색하는거니까 아래처럼 *로 써도 된다.
SELECT * FROM Book;

-- 도서 테이블에 있는 출판사를 검색하세요:
SELECT publisher FROM Book; # 이려면 모든 책에 해당하는 출판사가 나오기 때문에 중복값이 발생
SELECT DISTINCT publisher FROM Book;

-- 가격이 20000원 미안인 도서를 검색하세요:
SELECT * FROM Book WHERE price < 20000;

-- 가격이 10000원 이상, 2000원 이하인 도서를 검색하세요:
SELECT * FROM Book WHERE price >= AND price <= 20000;
SELECT * FROM Book WHERE price BETWEEN 10000 AND 20000;
# 이 둘이 같은거.

-- 가격이 10000원 이하거나, 가격이 딱 20000원인 경우:
SELECT * FROM Book WHERE price <= 10000 OR price = 20000;

-- 출판사가 '굿스포츠' 혹은 '대한미디어' 인 도서를 구하세요:
SELECT * FROM Book WHERE publisher = '굿스포츠' OR publisher = '대한미디어';
SELECT * FROM Book WHERE publisher IN('굿스포츠', '대한미디어');
-- IN은 나중에 서브쿼리하고 매우 많이 연동된다.

오늘은 딱히 복습할 내용이 없기 때문에 추가로 공부를 하기 원하는 사람은 예습 하기.
막힐것으로 예상되는 지점: 조인(join), 부속 질의(subquery)

profile
취업하고싶다...

0개의 댓글