본문 바로가기

데이터베이스

왜 데이터베이스를 사용해야 하는가? 요즘 웹 서비스를 개발할 때는 거의 모든 경우 데이터베이스를 사용할 것이다. 그런데 이런 데이터를 서버에 그냥 텍스트나 json 파일로 저장해서 읽고 쓰는 것과 어떤 차이가 있기 때문에 사용하는 걸까? 앞으로 백엔드 분야로 취업을 희망하고 있는 만큼 데이터베이스에 대해서도 공부를 좀 해보려고 한다. 데이터베이스? 먼저 데이터베이스에 대한 위키피디아의 정의는 다음과 같다. 여러 사람이 공유하고 사용할 목적으로 통합 관리되는 정보의 집합이다. 논리적으로 연관된 하나 이상의 자료의 모음으로 그 내용을 고도로 구조화함으로써 검색과 갱신의 효율화를 꾀한 것이다. 즉, 몇 개의 자료 파일을 조직적으로 통합하여 자료 항목의 중복을 없애고 자료를 구조화하여 기억시켜 놓은 자료의 집합체라고 할 수 있다. 단순히 파일에 .. 더보기
프로그래머스 SQL 고득점 Kit - GROUP BY 프로그래머스에서 SQL 고득점 Kit을 풀고 추가적으로 조사하여 얻은 지식을 정리하는 문서다. 문제를 풀 때는 익숙한 MySQL을 활용하였다. GROUP BY 이전 포스트에서도 몇 번 설명했었지만 GROUP BY는 레코드들을 특정 칼럼 값들을 기준으로 묶는 명령어다. 그래서 그룹화한 후 집계 함수를 사용하는 방식으로 많이 사용되는데 COUNT() 함수를 사용하여 해당 그룹에 몇 명이 있는지 출력하는 쿼리를 작성해보면 다음과 같다. MariaDB [vulnerable_db]> SELECT COMPANY, COUNT(NAME) FROM USER_TABLE GROUP BY COMPANY; +-----------------------------+-------------+ | COMPANY | COUNT(NAME.. 더보기
WITH (Common Table Expressions) 이 MySQL 문서와 이 튜토리얼을 읽고 얻은 지식을 정리하는 포스트다. WITH WITH란 키워드 자체는 들어본 적도, 써본 적도 없기 때문에 프로그래머스에서 SQL Kit 문제를 풀다가 처음 만났을 때 당혹스러웠다. 항상 모든 쿼리는 한 줄로 SELECT로 시작해서 조건으로 끝난다고 막연히 생각하고 있었는데 실제로는 더 복잡한 쿼리를 사용할 수도 있겠다는 느낌을 받았다. WITH 명령어의 목적은 해당 쿼리가 실행되기 전에 쿼리에서 참조할 수 있는 임시 테이블을 만드는 것이다. 이 임시 테이블 역시 특정 쿼리(서브 쿼리)의 결과로 생성되어야 하는데 적절하진 않지만 기존의 테이블을 활용하여 예시를 보이면 다음과 같다. MariaDB [vulnerable_db]> WITH MY_COMPANY AS (SEL.. 더보기
프로그래머스 SQL 고득점 Kit - SUM, MAX, MIN 프로그래머스에서 SQL 고득점 Kit을 풀고 추가적으로 조사하여 얻은 지식을 정리하는 문서다. 문제를 풀 때는 익숙한 MySQL을 활용하였다. 집계 함수 이번 Kit에서 다루는 함수들은 집계 함수들로 테이블의 여러 행에서 하나의 결괏값을 반환하는 함수들이다. 함수 이름에서 볼 수 있듯이 합계(SUM), 최댓값(MAX), 최솟값(MIN) 등을 구하려면 당연히 여러 행을 활용해야 할 것이며 이들의 결괏값은 당연히 하나만 반환된다. 레코드를 특정 칼럼 값에 따라 그룹화하는 GROUP BY 명령어와 함께 사용된다면 더욱 효과적이다. 알아둘 것은 집계 함수는 SELECT된 레코드들에 대해서 수행하는 것이기 때문에 WHERE 절에서 사용할 수 없다. 예를 들어 다음처럼 점수가 최고 점수인 레코드만 출력하는 쿼리를 .. 더보기
프로그래머스 SQL 고득점 Kit - SELECT 프로그래머스에서 SQL 고득점 Kit을 풀고 추가적으로 조사하여 얻은 지식을 정리하는 문서다. 문제를 풀 때는 익숙한 MySQL을 활용하였다. SELECT 기본적으로 SELECT는 레코드를 조회하는 명령어기 때문에 특정 조건(또는 모든)의 칼럼 값이나 문자열뿐 아니라 함수 실행의 결괏값을 얻어올 수 있다. 대표적인 예로 현재 시간을 반환하는 NOW() 함수를 SELECT 하면 다음과 같은 결과를 얻을 수 있다. MariaDB [(none)]> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2021-02-01 23:27:53 | +---------------------+ 1 row in set (0.000 sec) 보통 .. 더보기