KDT 공부 일지 2026.01.30

김시코·2026년 1월 30일

KDT 공부 일지

목록 보기
20/27

2026년 1월 30일 금요일 - 5주차

이론

내장함수

SQL에서의 함수는 수학에서의 함수와 개념이 유사한데, 특정 값이나 열을 함수에 입력해서 연산을 수행 후에 나온 결괏값을 반환해준다. Java의 API랑 유사한 개념. SQL에서의 함수는 크게 2개로 나뉘는데, DBMS에서 기본적으로 제공하는 내장함수와 사용자가 직접 정의해서 사용하는 사용자 지정 함수이다. 그리고 Java랑 마찬가지로 함수의 종류는 엄청 많아서 하나하나 공부하는게 아니라 필요할때 찾아서 써야 한다. 함수를 공부할때는 스칼라를 가지고 연산하는건지, 벡터를 가지고 연산하는건지 구분 할 줄 알아야 한다
※ 현재 쓰고있는 교재는 Oracle 책이고, 실제 쓰고있는 DB는 mariaDB이기 때문에 함수의 차이가 발생 할 수 있으니 실제로 사용해보기 전에 확인 할것.

내장 함수 - Built In Function

SQL의 내장 함수의 종류로는 숫자 함수, 문자 함수, 날짜·시간 함수, 변환 함수, 인코딩·디코딩 함수, NULL관련 함수, 집계 함수, 분석 함수 가 있다.

숫자 함수

매우 중요한 함수가 많다. 많이 쓰이는 것 위주로 기술.

  • ROUND(반올림할 값, 자릿수): 반올림 해주는 함수이다.
  • CEILING(올릴 값): 올림 해주는 함수
  • TRUNCATE(버릴 값, 자릿수): 버림 해주는 함수. 통계를 구현하기 위해 많이 사용한다.
    • TRUNCATE 사용 예시
 -- 금액대별 통계를 위해 금액대를 버림함수로 구한 다음에 금액대끼리 묶어서 갯수를 출력
SELECT TRUNCATE(b.price, -4), COUNT(*) FROM Book b
GROUP BY TRUNCATE(b.price, -4)
;

문자 함수

DB만을 가지고 프로그램 만드는게 아니면 거의 쓰이지는 않지만 알아두긴 해야한다

  • REPLACE(대상 문자열(보통 필드명), 찾을 값, 바꿀 값): 문자열에서 특정 문자열을 찾아서 다른 문자열로 치환해주는 것
  • CONCAT(): 문자열끼리 더해주는 것. Java의 + 연산자랑 비슷하다. 좀 중요
    • CONCAT 사용 예시
      -- 위에 코드랑 같은건데, 문자를 다 변수명으로 관리하니까 따로따로 써야해서 이렇게 쓴다.
      SELECT * FROM Book b
      WHERE b.bookname LIKE CONCAT('%', '축구', '%')
      ;
  • LENGTH(문자열): 문자열의 길이 반환하는 것. 많이 쓰일수도 있긴한데, 웹쪽에서 대체 가능

날짜 함수

데이터베이스는 날짜를 가지고 작업하는게 많기 때문에, 제일 중요할 수도 있다. 특정 기간 내에 작성된 게시글, 특정 기간 동안에 가장 많이 조회된 게시글 등등... 근데, 현재 갖고있는 데이터베이스로는 다룰 수 있는 값들이 없어서 문제풀이는 불가능하고 사용 예시들이 될 것.

  • NOW(): 제일 중요하다. 이 쿼리가 실행됐을때의 시간을 출력해준다.
    • NOW 사용예시
-- Orders o의 orderdate가 Book테이블의 발매 예정일이라고 가정하고 진행
SELECT * FROM Orders o
WHERE o.orderdate < NOW()
; -- 이건 현재 시점에 발매되어있는 책들의 목록
  • DATE_FORMAT(날짜, '포맷'): 날짜형 데이터를 문자열 데이터로 변환해주는 함수. 포맷은 되게 여러가지가 있고 DB마다 다르니까 사용할때 찾아서 쓰기. 보통 통계를 내기 위해서 년도별, 월별 등으로 그룹화 할때 많이 쓰임. ex) 이번달 매출 통계, 요일별 고객 수 통계 등등..
    • DATE_FORMAT 사용 예시
SELECT o.orderdate, DATE_FORMAT(o.orderdate, '%y-%m-%d')
 Orders o;
  • DATE_ADD(바꿀날짜, INTERVAL 더할숫자 단위): 날짜를 더하는 함수.
  • DATE_SUB(바꿀날짜, INTERVAL 뺄숫자 단위): 날짜를 빼는 함수.
    • DATE_ADD, DATE_SUB 사용 예시
SELECT DATE_ADD(o.orderdate, INTERVAL 7 DAY) FROM Orders o;
SELECT DATE_SUB(o.orderdate, INTERVAL 7 DAY) FROM Orders o;
SELECT DATE_ADD(o.orderdate, INTERVAL 7 MONTH) FROM Orders o;
SELECT DATE_ADD(o.orderdate, INTERVAL 7 YEAR) FROM Orders o;
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) FROM Orders o;

날짜는 함수를 써서 더하고 뺄수 있으며, 문자를 날짜로 바꿀수 있고, 날짜를 문자로 만들 수 있다. 보통 출력을 위해 쓰는게 아니라 WHERE, GROUP BY, HAVING에 쓰기 위해서 한다.

기타 함수

  • IF(조건, true일때, false일때): 삼항연산자
  • CASE: 분기문 Java의 if랑 유사
  • IFNULL(null이 있는지 찾을 곳, null이면 출력할것): 값이 null일때 어떤 값을 출력할지 지정하는 것.
  • LIMIT(인덱스, 사이즈): 한번에 다 출력하는게 아니라 몇개씩만 잘라서 ㅊ출력하는 것. 보통 페이지로 나눠서 출력할때 쓰이고, DB에서는 자르기만 하고 페이지로 묶는것은 Java에서 한다.
    • 전체 사용 예시
-- 삼항연산자. 복잡도가 높아질 수록 사용빈도 올라감 (보통 출력할때 주로 쓰이는 편)
SELECT b.price, IF(b.price > 10000, '비싸다','싸다') FROM Book b;
-- IF(여기 조건에 따라서, 'true면 실행될거', 'false면 실행될거')

-- CASE문 (분기. if문 느낌)
SELECT b.*,
	CASE
		WHEN b.price > 30000 THEN '완전 비싸다'
		WHEN b.price > 20000 THEN '비싸다'
		WHEN b.price > 10000 THEN '적당하다'
		ELSE '싸다'
	END AS result
FROM Book b;

SELECT c.phone, IFNULL(c.phone, '전화번호 없음') FROM Customer c;	

-- 페이징
SELECT * FROM Book b
LIMIT 0, 3 -- 0번부터 3개까지
;

DML - 데이터 조작어

INSERT, SELECT, UPDATE, DELETE = CRUD
프로그래머의 기본이 되는 것.

  • INSERT INTO 테이블명(필드명1, 필드명2, ... 필드명n) VALUSE(값1, 값2, ... 값n): 테이블에 값을 넣는 것.
  • UPDATE 테이블명 SET 필드명1 = 값1, 필드명2 = 값2, ... 필드명n = 값n WHERE 값을 바꿀 조건: 값을 변경하는것.
  • DELETE FROM 테이블명 WHERE 값을 지울 조건: 값을 삭제하는것
    여기서 UPDATE와 DELETE는 WHERE없이 실행 시키면 진짜 인생 망하는 지름길이 될 수 있다. 모든 값이 변경·삭제 되기 때문에...

SQL 실습

-- 내장함수

-- 숫자
SELECT TRUNCATE(o.saleprice/3, -2) FROM Orders o;

-- 금액대별 통계를 위해 금액대를 버림함수로 구한 다음에 금액대끼리 묶어서 갯수를 출력
SELECT TRUNCATE(b.price, -4), COUNT(*) FROM Book b
GROUP BY TRUNCATE(b.price, -4)
;

SELECT b.*, TRUNCATE(b.price, -4) FROM Book b


-- 문자
SELECT CONCAT('111', b.bookname, '333') FROM Book b;

SELECT * FROM Book b
WHERE b.bookname LIKE '%축구%'
;

-- 위에 코드랑 같은건데, 문자를 다 변수명으로 관리하니까 따로따로 써야해서 이렇게 쓴다.
SELECT * FROM Book b
WHERE b.bookname LIKE CONCAT('%', '축구', '%')
;


-- 날짜
SELECT o.bookid, o.orderdate, NOW()
FROM Orders o;

-- Orders o의 orderdate가 Book테이블의 발매 예정일이라고 가정하고 진행
SELECT * FROM Orders o
WHERE o.orderdate < NOW()
; -- 이건 현재 시점에 발매되어있는 책들의 목록

SELECT o.orderdate, DATE_FORMAT(o.orderdate, '%y-%m-%d')
FROM Orders o;

-- 날짜 더하고 빼기
SELECT DATE_ADD(o.orderdate, INTERVAL 7 DAY) FROM Orders o;
SELECT DATE_SUB(o.orderdate, INTERVAL 7 DAY) FROM Orders o;
SELECT DATE_ADD(o.orderdate, INTERVAL 7 MONTH) FROM Orders o;
SELECT DATE_ADD(o.orderdate, INTERVAL 7 YEAR) FROM Orders o;
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) FROM Orders o;

SELECT * FROM Orders o
WHERE o.orderdate > DATE_SUB(NOW(), INTERVAL 7 DAY)
;

-- 삼항연산자. 복잡도가 높아질 수록 사용빈도 올라감 (보통 출력할때 주로 쓰이는 편)
SELECT b.price, IF(b.price > 10000, '비싸다','싸다') FROM Book b;
-- IF(여기 조건에 따라서, 'true면 실행될거', 'false면 실행될거')

-- CASE문 (분기. if문 느낌)
SELECT b.*,
	CASE
		WHEN b.price > 30000 THEN '완전 비싸다'
		WHEN b.price > 20000 THEN '비싸다'
		WHEN b.price > 10000 THEN '적당하다'
		ELSE '싸다'
	END AS result
FROM Book b;

SELECT c.phone, IFNULL(c.phone, '전화번호 없음') FROM Customer c;	

-- 페이징
SELECT * FROM Book b
LIMIT 0, 3 -- 0번부터 3개까지
;


-- DML
-- INSERT, SELECT, UPDATE, DELETE
SELECT * FROM Book b;
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(11, '새로운 책1', '출판사1', 400000);
INSERT INTO Book(bookid, bookname, publisher, price) VALUES(12, '새로운 책2', '출판사2', 500000);

UPDATE Book SET price = 0, bookname = '야호' WHERE bookid = 11;

DELETE FROM Book WHERE bookid = 11;
DELETE FROM Book WHERE bookid = 12;
profile
취업하고싶다...

0개의 댓글