쿼리와 SQL

밖에 비 개쩌는데 누가 원시가이오가 풀었나…


본인쟝… 이래뵈도 몽고DB 이전에 액세스(odbc)와 MySQL(jdbc)를 썼었다. 근데 데이터베이스를 쓰다보면 쿼리 어쩌고 하는데, 쿼리가 뭔지 모르겠는겨. 그렇게 걍 쓰다가 전전직장에서 친해진 개발자님에게 쿼리가 뭔지 물어봤다.

본인: 쿼리가 뭐예요?

개발자님: 데이터베이스에 접근해서 뭐 해달라고 요청하는거요.

진짜 이게 쿼리임.

근데 데이터베이스가 뭔데 거기에 접근해서 뭘 해달라고 하는것인가… 데이터베이스는 ‘데이터’의 집합체라고 보면 된다. 그리고 데이터는 우리가 생각하는 그 데이터가 맞다. 핸드폰 요금제 말고… 예? 그 데이터 생각하셨다고요? 아 그럼 일단 데이터에 대해 설명을 좀 하고 가겠음.


데이터?

데이터는 문자, 그림, 소리 등으로 이루어져 있는데 크게 질적 데이터와 양적 데이터로 나눈다. 퀄리티와 콴티티인데 둘이 그럼 무슨 차이예요? 양적 데이터는 나이, 키, 몸무게, 온도, IQ 등 숫자로 나타낼 수 있는 것이고, 질적 데이터는 혈액형과 학점처럼 숫자로 표현이 불가능한 것이다. 물론 그렇다고 해서 ‘숫자로 표현할 수 있으면 무조건 양적 데이터’인 건 아니다. 왜, 가끔 설문조사를 하다 보면 나이가 아니라 나이대를 선택하는 옵션이 있을 것이다. 10~19세, 20~29세 이런 식으로. 이건 수치형 자료인 나이를 질적 데이터 중 하나인 범주형 자료로 만든 것이다.

각 데이터 형태에는 또 세부 카테고리가 있는데 질적 데이터는 순위형과 명목형으로 나눈다. 이 둘은 자료를 분류하는 데 있어서 ‘순서에 의미가 있는가?’를 보는 것이다. 혈액형은 A, B, O, AB 네 개로 나누지만 딱히 이 네 개의 순서에 의미는 없으므로 명목형이고, 학점은 A, B, C, D, F라는 순서에 의미가 있으므로 순위형이다. (학바학인데 0, +만 있는 데도 있고 -, 0, +로 나누는데도 있다. 본인은 전자) 명목형의 또 다른 예시는 Baltimore classification으로, 바이러스를 게놈이 뭐냐(DNA, RNA), 게놈 방향(+, -)이 뭐냐, mRNA 복제 방식이 뭐냐에 따라 나눈 것. 아, 분류를 한 사람 이름이 당연하게도 볼티모어다. 서던블롯도 서던이 만든거다 어떻게 사람 이름이 남쪽 ㅋㅋㅋㅋ 

양적 데이터는 연속형 자료와 이산형 자료로 나뉘는데, 둘의 차이는 ‘셀 수 있는가?’이다. 뭔 A cup of coffee같은 소리인지는 나도 모름. 아무튼, 연속형 자료는 자료가 연속되는거라서 셀 수 없다. 시간이 대표적인 예시. 어? 우리 몇시 몇분 이런거 얘기하잖아요. 아 그건 엄밀히 말하자면 시’각’이다. 순간은 셀 수 있지만, 흐름은 셀 수 없거든…


데이터베이스의 예

데이터베이스가 데이터의 집합체라고 했는데, 예를 들어보자.

ChEMBL이라는 데이터베이스에 있는 아스피린의 정보 중 일부다. 이 분자의 이름이 뭐고(이름도 관용명 계통명 있다), 켐블 아이디가 뭐고(Key값같은 거), 화학식이 뭐고, 진행 단계(약물 허가 단계가 어디인지를 말한다. 쟤는 시판중)는 어디고, 분자량은 뭐고, 동의어는 뭐고, 어떤 이름으로 팔리고(아세트아미노펜도 팔리는 약 이름 중 하나가 타이레놀인 것이다), 무슨 분자이고 이런 게 데이터베이스에 담겨있다. 저기서 분자량만 수치형 데이터. 켐블은 저런 약물들의 데이터베이스이기때문에 현존하는 약물 분자에 대해 저런게 다 있다. (물론 일부 없는것도 있기는 함)

좀 간단한 예를 들어보자. 요즘은 동네 맛집이라고 해서 내가 사는 동네(혹은 대학가) 맛집에 대한 정보가 있는 사이트나 앱이 있다. 세종대 근처 맛집에 대한 정보로 뭐가 필요할까? 일단 식당의 기본 정보로는 맛집의 위치와 전화번호, 휴일 정보, 여닫는 시간 및 Break time에 대한 정보(브레이크 타임에는 장사를 잠깐 쉬고 다음 장사를 준비한다고 보면 된다), 업종(크게는 식당 or 카페, 세분류로 들어가면 한식 일식 중식 양식 이렇게 있다)이 필요할 것이다. 그리고 해당 식당에 대한 평가 데이터로는 평가한 사람과 별점, 평가 내용이 들어간다. 이런 데이터들을 차곡차곡 쌓아가는 게 데이터베이스.

그럼 엑셀을 쓰면 되지 않느냐… 할 수 있다. 엑셀도 작은 스케일의 DB를 관리할 때는 좋다. 좋은데… 이게 스케일이 좀 커지면 열다가 뻗고 수정하다가 뻗고 읽다가 뻗어서 작업자 혈압 수직상승한다. 그리고 엑셀파일은 동시에 열 수가 없다. 각각 엑셀파일을 받아서 열고 수정하는 건 할 수 있지만, 공유 폴더에 있는 엑셀파일을 동시에 열고 수정할 수가 없다. 세번째 직장에서 주간일지를 엑셀파일로 관리하는데, 금요일에 이거 쓸 때 되면 이것땜에 순서 정해서 쓰고 그랬다.


쿼리를 어떻게 할까?

그럼 위에서 ‘쿼리는 데이터베이스에 접근해서 뭐 해달라고 요청하는거’라고 했는데, 뭘 요청함? 위에 있는 세종대 근처 맛집 DB를 예시로 들어보자. 맛집의 기본 정보가

  1. 위치
  2. 전화번호
  3. 브레이크타임 및 여닫는 시간
  4. 휴일 정보
  5. 업종

이렇게 있다고 했는데, 앱은 이 데이터를 가져올 때 데이터베이스에 접근해서 가져오게 된다.

사례 1: 1시 반 강의가 끝나고 4시 반에 수업이 있는 김양상추씨. 공강시간에 도서관에 가자니 거기서 3시간동안 있기엔 또 졸려서 잘 것 같고… 끼니도 간단하게 빵으로 때울 겸 해서 친구들과 근처 카페를 가기로 했다.

사례 2: 오늘따라 중식이 당기는 김부추씨. 하지만 세종대 근처 맛집은 처음이었던 신입생 김부추씨는 근처 맛집 중에서 별점이 가장 높은 중식당을 한번 가보기로 했다.

사례 3: 대학원에 다니고 있는 박숟갈(Spoon Park)씨. 오늘은 교수님께서 박숟갈씨 논문도 나온 기념으로 고깃집에서 회식을 하기로 했다. 실험 끝내고 얼른 가서 먹을 수 있게 세종대 후문쪽으로 알아보라는 교수님 말씀에 후배인 김메탕씨와 함께 맛집을 알아보게 되었다.

위 세 가지 사례를 예로 들어보자.

사례 1의 경우 업종이 카페인 세종대 근처 맛집을 찾아야 하니까, 데이터베이스에서 ‘업종이 카페인 맛집’을 찾을 것이다. 그리고 추가적으로 브레이크타임에 대한 정보가 필요하다면 ‘업종이 카페이면서 브레이크타임이 없는 맛집’을 찾게 된다. 이 때 앱을 통해 데이터베이스에 접근해서 업종 = 카페인 맛집을 보여달라고 쿼리를 때리게 된다. 비슷하게 사례 2는 업종 = 중식 인 맛집을 별점이 높은 순으로 정렬해서 보여달라는 쿼리를 때리게 되고, 사례 3은 업종 = 고깃집인 식당을 찾은 다음 지도를 통해 위치를 체크하면 된다(요즘 맛집앱은 지도에 띄워준다).

참고로 나때는 중식 당기면 만강홍… 운을 시험하고 싶다면 만강짜장이었다. 만강짜장이 복불복의 상징이 된 이유는, 이건 기본적으로 매운데 매운 정도가 그 날 조리하시는 분 컨디션에 따라 다르기 때문… 현재는 이전하면서 세종원으로 이름을 바꿨다.


SQL

Structured Query Language의 약어. RDBMS(관계형 데이터베이스)에서는 얘가 국룰이다. 데이터베이스에서 데이터를 조회/입력/수정/삭제/저장하기 위해 필요한 질의언어. 즉, RDBMS에서 CRUD를 진행하기 위한 질의언어이다. 실제로도 써보면 그렇게 어려운건 없… 아냐 어려워… 빡세…

SQL 구문은 크게 데이터 정의, 조작, 제어로 나뉜다.

데이터 정의

수정이나 삭제… CRUD는 맞는데, 이건 데이터베이스단위로 들어간다. 즉 테이블이나 데이터베이스를 만들고, 이를 수정하고, 삭제하고, 초기화(TRUNCATE)한다. 삭제가 왜 딜리트가 아니냐면 딜리트는 밑에 따로 나옴. 근데 Read가 없… 

  • CREATE
  • ALTER
  • DROP
  • TRUNCATE

데이터 조작

위에껀 데이터베이스 자체를 만들고 없애고 하는거고, 얘는 데이터베이스 안에 있는 ‘데이터’에 대한 CRUD이다. 위에 있는 맛집 앱을 예로 들자면, 데이터 정의는 맛집에 대한 데이터베이스 자체에 적용하는거고, 얘는 맛집 데이터베이스 안에 있는 맛집 데이터에 적용하는 것. 즉, 맛집의 생성/수정(정보 수정)/삭제가 이쪽이다.

  • INSERT (CRUD의 C)
  • SELECT (MySQL의 SELECT * from table 할 때 그거, CRUD의 R)
  • UPDATE (CRUD의 U)
  • DELETE (CRUD의 D)

데이터 제어

위에놈은 모디피케이션 아니고 매니플레이션인데 얘는 왜 컨트롤이여 위에 두 개는 데이터베이스와 데이터에 대한 CRUD이고, 얘는 접근 권한(리눅스로 치자면 rwx)같은 걸 한다. 네개 중 위 두 개는 접근 권한, 아래 두 개는 트랜잭션(쪼갤 수 없는 업무 처리의 최소 단위) 관련. 

  • GRANT
  • REVOKE
  • COMMIT
  • REROLL

GRANT와 REVOKE가 서로 반대 개념인데, GRANT는 특정 사용자에게 데이터베이스에 접근해서 뭔가를 할 권한을 주는거고 REVOKE는 반대로 권한을 뺏는다. COMMIT은 RREROLL과 서로 번대되는 개념으로, COMMIT은 트랜잭션을 저장하고 현재 트랜잭션을 종료하는 것이고, REROLL은 반대로 현재 트랜잭션에 작업했던 내용을 전부 취소하고 되돌리는 것.

COMMIT과 REROLL이 이해가 잘 안 된다면, COMMIT은 깃헙의 커밋을 생각하면 된다. 깃헙에 뭘 올릴때는 풀로 가져오고(변경사항 이런거), 커밋으로 OK하고(코멘트 추가요), 푸시로 밀어서 그걸 반영해야 올라간다. 그니까 깃헙에 올릴때는 풀-커밋-푸시 삼단콤보가 중요하다. REROLL은 롤백이라고 보면 된다. 작업하다 뭐가 뻑났어 그러면 ctrl+z 하는것처럼.