전문가칼럼

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

재미있는 DB 이야기 ‘사라진 날짜를 찾아라’

전문가칼럼
DBMS별 분류
Oracle
작성자
dataonair
작성일
2015-12-07 00:00
조회
9973




◎ 연재기사 ◎


물탱크 구조로 알아본 오라클의 블록 옵션 ‘PCTFREE와 PCTUSED’


이산가족 찾기 생방송을 통해 배우는 DB 원리


개발자에게 맞는 DB 공부방법 찾기: 물리적 분류와 논리적 분류 그리고 인덱스


데이터베이스 인덱스의 오해와 진실


쉬운 것이 올바른 것이다. ‘인덱스 끝장리뷰’ (상)


쉬운 것이 올바른 것이다. ‘인덱스 끝장리뷰’ (하)


누구도 알려주지 않았던 ‘오라클 인덱스 생성도’의 비밀


누구도 알려주지 않았던 ‘오라클 쿼리 작성의 비법’


퀴리 최적화 및 튜닝을 위한 오라클 공정쿼리 작성법


만능 쿼리와 한 방 쿼리


오라클 옵티마이저 ‘CBO와 RBO’ 이해하기


재미있는 DB 이야기 ‘60갑자와 쿼리’


그림으로 배우는 ‘오라클 조인의 방식’ 이야기


반드시 알아야 하는 오라클 힌트절 7가지


오라클 플랜을 보는 법


개발자들의 영원한 숙제 ‘NULL 이야기’


알면 유용한 오라클 기능 ‘GATHER_PLAN_STATISTICS’


알면 유용한 오라클 기능들


오라클 DICTIONARY를 활용한 DB툴 프로그램 ‘FreeSQL’


이제는 말할 수 있다: 주식 자동매매 프로그램(상)


이제는 말할 수 있다: 주식 자동매매 프로그램(하)


개발자들이 자주 접하는 오라클 에러 메세지


재미있는 DB 이야기 ‘사라진 날짜를 찾아라’


오라클 랜덤 함수와 사용자 정의 함수


그림으로 배우는 ‘공정쿼리와 인덱스 생성도’


이병국의 개발자를 위한 DB 이야기: 디폴트 세팅의 함정과 오라클 파라미터


재미있는 DB 이야기 ‘놀라운 마방진의 세계’


오라클 운반 최소 단위 BLOCK


이병국의 개발자를 위한 DB 이야기: 이세돌과 알파고의 세기의 대결


이병국의 개발자를 위한 DB 이야기(30회) : DB 엔지니어의 가볍게 읽는 세상 이야기


이병국의 개발자를 위한 DB 이야기: 튜닝(31회) : 개발자를 위한 DB 튜닝 실전(1편)


이병국의 개발자를 위한 DB 이야기: 튜닝(32회) : 개발자를 위한 튜닝 실전(2편)


이병국의 개발자를 위한 DB 이야기: 튜닝(33회) : 개발자를 위한 튜닝 실전(3편)


이병국의 개발자를 위한 DB 이야기: 튜닝(34회) : 개발자를 위한 DB 튜닝 실전(4편)


이병국의 개발자를 위한 DB 이야기: 튜닝(35회) : 개발자를 위한 튜닝 실전(5편)


이병국의 개발자를 위한 DB 이야기: 페이징 처리에 대한 이해 (36회)


보기 좋은 떡이 먹기도 좋다 - 좋은 쿼리 좋은 성능


테이블의 수직분할과 수평분할에 대한 이해


DB 성능 제고를 위한 채번의 이해와 방식별 장단점 비교


이병국의 개발자를 위한 DB 이야기: 마지막회 : ‘개발자를 위한 DB 이야기’ 연재를 마치며



이병국의 개발자를 위한 DB 이야기: 함수(23회)

재미있는 DB 이야기 ‘사라진 날짜를 찾아라’



성공과 실패의 경험을 나누자, 용기와 희망을 나누자

개발업무를 시작으로 IT계에 입문했던 필자가 10년 가까이 DB엔지니어로서 활동하면서 얻은 경험과 지식을나누고자 한다. DB를 자주 접하는 SW 개발자뿐 아니라, DB 전문가를 꿈꾸는 대학생에서DB 분야에 입문한지 1~2년 된 기입문자가 쉽게 이해할 수 있도록 비유를 통해 쉽게 접근해볼 계획이다. 물론 전문가들이라도 다시 한번 개념을 정립하는 의미에서 필요한 내용이 될 수 있다.

전체적으로 DB의 기본 원리와 개념을 이해하고 테이블, 인덱스, 쿼리, 튜닝, 플랜 등 개발자들이 알아야 하는 DB 전분야에 대해 쉽게 이해하도록 설명하겠다. DB 기술서적이나 번역서보다는 조금 더 부드럽게 접근할 계획이다. 그렇다고 흔히 서점에서 만날 수 있는 개발자 위주의 SQL 소개서도 아니다. 이 연재는 시리즈로 나갈 것이다. 연재를 끝까지 읽는 독자라면,준전문가 수준의 DB 원리를 아는 것을 목표로 한다.



곶감 만들기에 도전하다.

지난 추석에 고향에 내려가서 곶감을 만들었다. 어린 묘목을 사서 마당에 심은 지 8년만이다. 지난해까지는 조금밖에 안 달렸고 게다가 열매도 부실했는데, 올해는 제법 많이 달렸다. 아직 이른 감이 있었지만 추석 연휴가 끝나고 자식들이 전부 떠나면 혼자서 곶감을 만드실 나이 드신 어머니 생각에 미리 만든 것이다.

그런데 얼마 지나지 않아서 문제가 생겼다는 것을 알아차렸다. 곶감에 곰팡이가 피고 있었고 더군다나 곶감이 되어 가는 것이 아니라 홍시가 되고 있었던 것이다. 아차 싶었지만 때는 늦었다. 곶감은 원래 첫서리가 내리고 약간 추워졌을 때 만들어야 하는데, 어머니의 노고를 덜어 드리고자 너무 빨리 만든 것이 잘못이었다. 곰팡이가 피는 이유는 통풍이 되지 않는 거실에서 말렸기 때문에 습도가 높아서 생긴 것이고 곶감이 아니라 홍시가 되는 이유는 기온이 높아서 감이 물러졌기 때문이다. 날씨가 추워질 때 곶감을 만들어서 처마 밑에 걸어 두었던 우리네 어른들의 지혜를 잠시 잊고 있었다.

예부터 곶감으로 유명한 상주 지역은 상강(24절기)이 지나면 곶감 작업을 본격적으로 시작하였다. 절기상으로 상강은 서리가 내리며 낙엽이 떨어지는 시기이며, 아침 저녁으로 공기가 차갑기 때문에 호흡기 질환에 주의해야 할 시기다. 이 무렵 농촌의 들녘은 가을걷이로 바쁜 때이다. 곶감뿐만 아니라 아이들이 좋아하는 밤, 대추, 땅콩 등도 이 시기에 수확한다. 상강에서 입동 사이에 만든 곶감이 최고로 맛있다는 어른들의 말씀에서 생활의 지혜를 엿볼 수 있다. 양력으로는 주로 10월말에서 11월초가 이 무렵이다. 이번 주에는 다시 고향에 내려가서 마지막 남은 감을 따 곶감을 새로 만들어야겠다.



동양과 서양의 달력

동양에서는 달을 기준으로 달력(음력)을 만들었고 서양에서는 태양을 기준으로 달력(양력)을 만들었다. 옛날부터 우리나라는 음력을 이용하여 날짜를 셌다. 음력은 농사와 밀접한 관련이 있었으며 우리 선조들은 음력에 맞추어 농사를 지었다. 실제로도 음력이 농사에 더 적합하다. 또한 3면이 바다로 둘러싸인 지리적인 부분을 감안하면 조수 간만의 차이를 발생시키는 달을 기준으로 하는 음력이 일상 생활에 영향을 더 미쳤을 것이다.

서양에서는 7일을 기준으로 생활했으나 음력을 사용한 우리나라는 1년을 24절기로 구분하여 15일을 주기로 생활하였다. 달의 변화 주기도 15일이므로 24절기와 달은 밀접한 관련이 있다고 생각 할 수 있지만, 실제로는 24절기는 태양과 밀접한 관련이 있다. 태양의 황경이 0도인 날을 기준으로 15도 간격으로 24절기를 나눈 것이다. 즉 지구가 태양의 둘레를 한 바퀴 도는 황도를 따라 15도 간격으로 24절기를 나눈 것이다.

달의 변화를 기준으로 한 달을 정하는 역법을 태음력이라 하고, 태양의 일주로 1년을 정하는 역법을 태양력이라 한다. 우리나라는 달을 기준으로 하는 음력과 태양을 기준으로 하는 24절기를 혼용하여 같이 사용하였기에 태음태양력을 사용했다고 말할 수 있다. 엄밀히 말하면 우리 선조들은 음력을 사용한 것이 아니라 태음태양력을 사용한 것이다.

달이 지구를 한번 공전하는데 걸리는 한 달의 시간은 29.5일이다. 0.5일을 가져가는 달을 큰달이라 하고 빼앗기는 달을 작은달이라 한다. 그래서 큰달이 6번, 작은달이 6번 존재한다. 지구가 태양을 한번 공전하는 데 걸리는 일년의 시간은 365일이다. 그래서 양력과 음력은 1년에 11일 간의 차이가 발생한다. 이러한 차이점을 극복하기 위해 태음태양력은 윤달을 만들어서 계절을 맞춘다. 윤달은 19년에 7번 발생한다.

양력: (31일 * 7달) + (30일 * 4달) + (28일 * 1달) = 365일

음력: (30일 * 6달) + (29일 * 6달) = 354일

양력(365일) - 음력(354일) = 11일



사라진 날짜를 찾아라

오늘날 전세계가 표준력으로 사용하고 있는 그레고리력은 1582년 교황 그레고리 13세가 기존에 쓰이던 율리우스력의 역법상 오차를 수정해서 공표한 것이다. 현재 우리는 공식적으로 양력(그레고리력)을 사용하고 있으며, 전통 명절이나 농사 등 생활의 폭넓은 저변에서 음력(태음태양력)도 같이 사용하고 있다. 오라클 DB에서 날짜와 관련된 규칙은 그레고리력을 따른다. 오늘 연재의 내용은 그레고리력에 대한 이해와 더불어 오라클 DB에서 날짜와 관련된 다양한 규칙에 관한 것이다.

우리는 1년을 365일로 알고 있지만 지구가 태양을 한번 도는 데 걸리는 정확한 시간은 365.2422일이다. 소수점 아래 남아도는 0.2422일 때문에 4년에 한 번씩 하루가 늘어나게 된다. 그래서 4년에 한번씩 윤년이 생겨난 것이다. 평년인 해는 2월이 28일까지 존재하지만 윤년인 해는 2월이 29일까 존재한다.

만약 1년이 365.2422가 아니고 365.2500 였다면 정확하게 4년마다 하루씩 증가한다. 4년에 한번씩 윤년으로 정하여 하루를 추가하면 되는 것이다. 그러나 안타깝게도 소수점 아래가 0.2422 이기 때문에 4년, 100년, 400년 주기로 보정을 해 주어야 한다. 이것이 그레고리력의 핵심 내용이다. 그레고리력은 율리우스력의 오차를 극복하였고 오늘날까지 세계 표준으로 사용하고 있는 중이다. 하지만 그레고리력도 역시 완벽한 보정을 하지는 못했다. 추가적으로 4000년을 주기로 보정을 하는 방안이 현재 과학계에서 논의 중이라고 한다. 하지만 지구가 태양 주위를 도는 속도가 미래에도 항상 일정하다고 볼 수 없으므로 이 같은 논의는 무의미 하다는 주장도 있다.

column_img_2234.jpg

[그림 1] 율리우스력과 그레고리력

1년을 365.25로 인식한 율리우스력의 한계를 극복한 그레고리력은 1년을 365.2425로 계산하였다. 그레고리력의 구체적인 보정 내용은 다음과 같다.

첫째, 연도가 4년으로 나누어지면 윤년으로 한다.
(4년, 8년, 12년, ….년은 윤년이며 2월이 29일까지 존재함)

둘째, 1582년 이후의 연도는 100년으로 나누어지면 평년으로 한다.
(100년, 200년, …., 1500년은 윤년, 1700년, 1800, …년은 평년)

셋째, 1582년 이후의 연도는 400년으로 나누어지면 윤년으로 한다.
(1600년, 2000년, 2400년, …년은 윤년)

넷째, 1582.10.05 ~ 1582.10.14 기간은 존재하지 않는 날이다.
(1582년까지 누적된 역법상의 오차를 일괄 해소하고자 10일의 기간을 달력에서 제거함)



그레고리력과 오라클 DB

소프트웨어 개발자들에게 달력의 역법은 중요한 부분이다. 특히 전 세계를 상대로 소프트웨어를 개발하는 개발자에겐 더욱 그렇다. 예를 들어 세계 표준인 그레고리력을 사용하지 않거나 혼용하여 사용하는 나라에 소프트웨어를 수출하는 경우에는 그 나라의 특성에 맞게 소프트웨어를 개발해야 한다. 번거로운 일인 것은 분명하나 그레고리력 이외의 역법에 대해서도 추가적으로 지원할 수 있도록 고려 되어야 한다. 하지만 이번 연재에서는 다른 역법은 배제하고 그레고리력에 기반한 오라클 DB의 날짜 관련 규칙에 한정하여 설명한다.

우리는 프로그램의 쿼리문에서 다음과 같은 조건을 빈번하게 사용한다.

WHERE 일자 BETWEEN AND

여러분은 이러한 쿼리문에서 조건의 시작과 끝에 대해 고민한 적이 있는가 그레고리력에서 날짜의 끝은 없지만 오라클에서는 끝이 있다. 아래 쿼리를 실행해 보자.



SELECT TO_DATE('99991231', 'YYYYMMDD') + 1 FROM DUAL
=======================
ORA-01841
----------------------------------------



위의 쿼리를 실행하면 오라클 에러가 발생한다. 날짜의 범위를 넘어선 것이다. 그렇다면 날짜의 처음으로 가서 테스트 해 보자.



SELECT TO_DATE('00010101', 'YYYYMMDD') - 1 FROM DUAL
=======================
0000/12/31 00:00:00
----------------------------------------



0001년 01월 01일에서 하루를 뺀 쿼리를 실행하면 0000년 12월 31일의 결과가 리턴 됨을 알 수 있다. 그렇다면 0000년 12월 31일은 실제로 존재하는지 다시 한번 쿼리를 실행 해 보자.



SELECT TO_DATE('00001231', 'YYYYMMDD') FROM DUAL=======================
ORA-01841
----------------------------------------



오라클 에러가 발생한다. 0001년 01월 01일에서 하루를 빼면 0000년 12월 31의 결과가 리턴 되지만 정작 그 날짜로 다시 조회하면 없는 날짜라고 에러가 발생한다. 예전에 오라클은 수학같이 확실한 정답이 있는 것이 아니라고 언급한 적이 있다. 단지 오라클은 규칙이 있을 뿐이고 우리는 그것을 지켜야 하는 것이다. 혼란스럽지만 어쩔 수 없다.

날짜와 관련하여 시작과 끝에 대해서는 주의해야 한다. 오라클 프로시저를 작성 할 때나 혹은 데이터 컨버전시 날짜의 시작과 끝의 경계가 모호한 상황에서 날짜 타입으로 형 전환 시 예기치 않는 오류가 발생하는데 그 원인을 찾는 것이 쉽지 않기 때문이다.

이번에는 그레고리력에서 존재하지 않는 1582.10.05 ~ 1582.10.14 기간을 오라클은 어떻게 인식하고 있는지 알아보자. 이 기간은 율리우스력의 누적된 오차를 보정하고자 그레고리력에서 10일치를 일괄적으로 제거한 날이다. 존재한 날을 제거한 것이 아니고 애초에 존재하지 않았던 날이다.



SELECT TO_DATE(‘15821004', 'YYYYMMDD') + 1 FROM DUAL
=======================
1582/10/15 00:00:00
----------------------------------------



1582년 10월 04일 다음날은 1582년 10월 15일이라고 조회된다. 즉 1582.10.05 ~ 1582.10.14 기간이 사라진 것을 알 수 있다. 그렇다면 사라진 날짜중의 하루로 조회 해 보자.



SELECT TO_DATE(‘15821011', 'YYYYMMDD') FROM DUAL
=======================
1582/10/15 00:00:00
----------------------------------------



사라진 기간 중의 하루인 1582년 10월 11일을 조회하니 1582년 10월 15일로 조회된다. 결국 사라진 열흘 동안의 날짜는 모두 1582년 10월 15일로 인식됨을 알 수 있다.

이번에는 윤년에 대해 알아보자. 그레고리력에서 윤년은 다음과 같다. 연도가 4년으로 나누어지면 윤년이다. 단, 1582년 이후에 100년으로 나누어지는 경우는 평년이고, 400년으로 나누어지면 다시 윤년으로 한다. 그렇다면 내년(2016)은 윤년인지 평년인지 오라클 쿼리로 작성해 보자.



SELECT DECODE(CASE WHEN MOD(연도, 4) = 0 THEN 1 ELSE 0 END
+ CASE WHEN MOD(연도, 100) = 0 AND 연도 > '1582' THEN -1 ELSE 0 END
+ CASE WHEN MOD(연도, 400) = 0 AND 연도 > '1582' THEN 1 ELSE 0 END,
1, 'Y', 'N') AS 윤년
FROM (SELECT '2016' AS 연도 FROM DUAL) --> 입력 값



그레고리력 규칙을 이용하여 요일 구하기

오라클에서 제공하는 날짜 관련 함수를 사용하지 않고 요일을 구하는 방법을 알아보자. 그러기 위해서는 그레고리력의 역사적인 사실을 먼저 이해해야 한다. 그에 앞서 오라클 함수를 이용하여 요일을 구하는 쿼리를 살펴보자.

SELECT TO_CHAR(TO_DATE('20151110', 'YYYYMMDD'), 'DAY') AS 요일 FROM DUAL

아주 간단한 쿼리이다. 하지만 오라클에서 제공하는 날짜 관련 함수들을 전혀 사용하지 않고 요일을 구하는 방법은 쉽지가 않지만 천천히 살펴보자.

요일은 월, 화, 수, 목, 금, 토, 일 7일 주기로 반복됨을 우리는 안다. 먼저 요일 구하는 공식에 대해서 알아 보자. 기본적이고 중요한 공식이다.

(연번호 + 월번호 + 일번호) / 7 = 요일번호

각각의 연, 월, 일에 대한 고유 번호가 있으며 그 합을 7로 나눈 나머지 값이 요일번호다. 만약 요일번호가 1이라면 월요일이고 2라면 화요일이다. 즉 1, 2, 3, 4, 5, 6, 0 각각의 번호가 월, 화, 수, 목, 금, 토, 일 각각의 요일에 대응한다. 만약 연번호, 월번호, 일번호의 합이 14라면 14 / 7의 나머지가 0이므로 일요일이 된다. 그렇다면 연번호, 월번호, 일번호 구하는 방법에 대해 구체적으로 알아보자. 2015년 11월 15일 일요일을 예로 들어 설명한다.

일번호는 15일 그 자체이므로 15다. 월번호는 11월이므로 4다. 그에 대한 설명은 아래 그림으로 대신한다.

column_img_2235.jpg

[그림 2] 1월부터 12월까지의 월번호

1월부터 12월까지의 월번호는 각각 1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6 이다. 그 중에서니 연번호는 역으로 구해보자. 우리는 2015년 11월 15일이 일요일임을 이미 알고 있다. 일요일의 요일번호가 0인 것도 이미 알고 있다.

일요일 = 0 = (연번호 + 월번호 4 + 일번호 15) / 7

일요일의 요일번호가 0이므로 나머지가 0이 되기 위해서 연번호는 2가 되어야 한다. 즉 2015년의 연번호는 항상 2가 될 것이다. 그렇다면 2015년 크리스마스는 무슨 요일인지 계산하여 검증해 보자.

2015년 12월 25일의 연번호는 2이고 월번호는 6이고 일번호는 25이다.

(연번호 2 + 월번호 6 + 일번호 25) / 7 = 5 = 금요일

와우! 황금 연휴의 시작이다. 그렇다면 작년의 연번호는 무엇일까 일년은 365일 이므로 7로 나누면 나머지가 1이다. 하루가 남는다. 그러므로 다음 연도는 항상 1씩 증가하고 이전 연도는 항상 1씩 감소한다. 그러므로 2014년의 연번호는 1이다. 작년 크리스마스는 무슨 요일인지 검증해 보자.

(연번호 1 + 월번호 6 + 일번호 25) / 7 = 4 = 목요일

그럼 내년의 연번호는 3이므로 크리스마스는 토요일인가 절대 아니다. 그레고리력에 따라 내년 즉 2016년은 4로 나누어지기 때문에 윤년이다. 윤년은 2월이 29일까지 있으므로 1년은 366일이며 7로 나눈 나머지가 2다. 이틀이 남는다. 그러므로 윤년인 경우에 연번호는 2가 증가한다. 올해의 연번호가 2이므로 내년(윤년)의 연번호는 4가 되는 것이다. 내년 크리스마스 요일은 다음과 같다.

(연번호 4 + 월번호 6 + 일번호 25) / 7 = 0 = 일요일

우리는 이미 그레고리력의 내용을 알고 있다. 또한 일번호와 월번호도 알고 있다. 이제 윤년에 따른 연번호를 계산 할 수 있다면 요일을 쉽게 구할 수 있다. 그것이 비록 수천년 이후라도….

지난 연재의 문제로 출제하였기 때문에 정답은 뒤편의 [지난 문제의 정답과 풀이] 과정에서 확인 할 수 있다.



달력 팝업 창 쿼리 만들기

달력 팝업 창 쿼리는 예전 연재에서 한번 언급된 적이 있으나 이번 연재의 주제와 연관이 있어서 다시 한번 내용을 소개한다.

column_img_2236.jpg

[그림 3] 달력 팝업 창

위의 그림은 웹사이트에서 빈번하게 볼 수 있는 달력 팝업 화면이다. 이전달, 다음달 표시 버튼을 클릭 시 해당월의 달력을 구현하는 퀴리는 여러 방법이 있다. 대개 GROUP BY 절을 이용하지만 아래 쿼리는 GROUP BY 절을 이용하지 않는 방식으로 구현해 보았다. 쿼리에서 LAST는 해당월의 마지막 날을 의미하며 WEEK는 해당월의 주간 시작 위치를 의미한다(단, 입력 변수는 YYYYMM).

SELECT CASE WHEN (LEVEL*7-6-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-6-WEEK) END AS 일
, CASE WHEN (LEVEL*7-5-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-5-WEEK) END AS 월
, CASE WHEN (LEVEL*7-4-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-4-WEEK) END AS 화
, CASE WHEN (LEVEL*7-3-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-3-WEEK) END AS 수
, CASE WHEN (LEVEL*7-2-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-2-WEEK) END AS 목
, CASE WHEN (LEVEL*7-1-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-1-WEEK) END AS 금
, CASE WHEN (LEVEL*7-0-WEEK) BETWEEN 1 AND LAST THEN TO_CHAR(LEVEL*7-0-WEEK) END AS 토
FROM DUAL
, (SELECT TO_CHAR(LAST_DAY(TO_DATE('201412','YYYYMM')),'DD') AS LAST FROM DUAL)
, (SELECT TO_CHAR(TO_DATE('201412','YYYYMM'),'D')-1 AS WEEK FROM DUAL)
CONNECT BY LEVEL < = CEIL((WEEK + LAST) / 7)



연재를 마무리 하며

요일 구하는 함수 하나 설명하기 위해서 이번 연재 준비에 많은 시간을 보냈다. 비록 함수 하나에 불과 하지만 그 안에는 수많은 노력과 땀이 포함되어 있다. 이번 연재를 통해 배운 사실은 결코 쉽게 만든 함수는 없다는 것이다. 그러한 함수를 만들어준 오라클 엔지니어들에게 감사한 마음을 전하면서 이번 연재를 마친다. 다음 연재는 오라클이 기본적으로 제공하는 함수 중에서 유용한 함수를 설명하고자 한다. 또한 개발자들이 직접 만든 함수에 대해서도 소개하고자 한다.



[지난 문제의 정답과 풀이] 원리를 이해하고 논리로 풀어가는, 쉬어가는 DB 문제

지난 연재에 출제한 ‘원리를 이해하고 논리로 풀어가는, 쉬어가는 DB 문제’에 대한 정답과 해설은 아래와 같다. 문제를 풀면서 DB 원리를 하나씩 배우고 이해할 수 있다.



column_img_2237.jpg

column_img_2238.jpg

[이번 호 문제] 원리를 이해하고 논리로 풀어가는, 쉬어가는 DB 문제

각 연재의 말미에 간단하면서도 재미있고 생각해 보는 문제를 출제하려 한다. 모든 문제는 DB의 원리를 이해할 수 있는 문제로 출제할 예정이다. 문제를 풀면서 DB 원리를 하나씩 배우고 이해할 수 있다. 정답과 그에 대한 설명은 다음 연재에서 한다.



column_img_2239.jpg