SQL을 얼마나 사용할 줄 아시나요?

·2022년 7월 5일
61

컴퓨터개론

목록 보기
12/14

이것도 생각보다 질문을 많이 받았다(....)

쌩쿼리를 얼마나 사용할 줄 아냐? 라는 질문과 함께 라이브로 쿼리문을 짜는 것을 요청받았었다.

지금까지는 TypeORM을 사용하여 쿼리를 짜다보니, 솔직히 SQL을 사용할 일이 별로 없었다.


한달동안 좋아요를 많이 받은 게시글 3개를 리턴하는 쿼리문

쿼리빌더를 사용한다는 것 자체가 쿼리를 사용한다는 것과 유사하지만, 그래도 쌩쿼리는 많이 사용해보지 못했다.
정말 모르겠을 때 이곳저곳을 찾으면서 쿼리로 구현하고 그것을 바탕으로 쿼리빌더로 만드는 경우는 많았지만 말이다.


그럼 여기서 드는 의문이 있다.

어짜피 작업은 ORM으로 할텐데 왜 굳이 SQL을 알아야하는 것이냐? 에 대한 의문이다.

Why SQL?

이건 정말.... 단순하다.

내가 수없이 많이 받아본 면접 질문 중 한가지

예시) 레디스를 사용하셨는데, IN-Memory DB에 대한 특징을 알고 계실까요?

ORM은 SQL을 쉽게 사용하기 위하여, 접근성을 위해 만들어진 하나의 도구라고 생각을 하고 있다.

  1. 그렇다면 이 도구가 왜 생겨나게 됐는지
  2. 어떤 장점 그리고 단점이 있는지
  3. 동작원리는 어떻게 된건지
  4. ORM이 없을 때는 어떻게 해야하는지

이 4가지의 원칙을 알아야한다고 생각한다. (이러니까 포스팅이 죽어라 늘어나고 있긴 한데...)

그래서 알아야만 하는 것이 SQL이다.

제일 중요한 것은 쓸 줄 알고 있다면 괜히 코드에서 검증하는게 아니라 그냥 디비에 직접 접근해서 데이터를 열람하거나 필터링할 수도 있다.

그래서 아무튼 알고 있어야한다(....)

SQL의 구성

SQL은 다양한 옵션이 존재하는데, 이놈은 실행되는 순서도 정해져있다.
그래서 이 순서를 생각 안하고 무작정 쳐버리면 내가 원하는 답이 안나온다(이러니까 ORM쓰지)

실행되는 순서

FROM => ON & WHERE => JOIN & GROUP BY => HAVING => SELECT => ORDER BY => LIMIT

  • 1. FROM
    • 얘는 기준점을 이야기한다. FROM board b 이렇게 적혀있으면 보드의 테이블을 기준으로. 라는 의미를 뜻한다.
  • 2. ON
    • 얘는 조인문의 조건을 확인한다. LEFT JOIN board_side bs ON 'bs.boardId'='b.boardId' 이런식으로 적는데
      bs.boardId와 b.boardId가 같은 것을 가져온다는 의미다.
  • 3. JOIN
    • 조인을 할 때의 대상을 지목할 때 사용한다. 조인의 종류도 여러가지라 이부분도 공부를 해야한다(....)
  • 2. WHERE
    • 조건문을 걸어주는 구문이다. Where b.board = "1" 이러면 보드아이디 1번을 가져오라는 의미를 가진다.
  • 3. GROUP BY
    • 얘는 그룹을 만들어줄 때 사용하는데 솔직히 자주 사용해보지 않아서 찾아봐야한다.
    • 나같은 경우에는 Group_concat 구문을 활용하여 관계로 묶여있는 테이블을 한개로 합칠 경우에 사용했었다.
  • 4. HAVING
    • 얘도 사용해보지도 못했다(...) 집계함수를 가지고 조건비교를 할 때 사용한다고 하는데, 좀 알아봐야할 것 같다.
  • 5. SELECT
    • 이것은 보고싶은 컬럼을 지정할때 사용한다. b.boardId 이런식으로 보고싶은 것을 특정할 수 있다.
    • 아니면 b.* < 이런식으로 붙여서 board의 관련된 컬럼을 모조리 다 가져올 수도 있다.
  • 6. ORDER BY
    • 이것은 정렬을 할 때 사용하는 구문이다. order by updateat asc 이렇게 쓴다. asc, desc 두가지의 선택지가 있다.
  • 7. LIMIT
    • 이것은 최대 보여주고 싶은 개수를 지정할 때 사용한다.


로그스태시에서 엘라스틱서치로 데이터를 집어넣기 위해 짰던 쿼리문

오라클 SQL 강좌 DBA 커뮤니티 구루비

여기에 소개하지 못한 DISTINCT라는 것이 있는데, 이건 정말 들어보지도 못했고 사용도 못해봐서 제외했다..

그래서 컨닝페이퍼는요

내가 질문을 받았던 것은 2가지가 있었다.

범위를 찾는 쿼리문을 작성하시오.
특정 값을 찾는 쿼리문을 작성하시오.

범위를 찾는건 BETWEEN으로 짤 수 있고 특정 값은 LIKE 문으로 짤 수 있다는건 아는데
그..... 참 네 SQL에서 안써봤어요(훌쩍훌쩍)

1. 유저의 모든 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u;

2. 유저의 이름이 바보인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u
WHERE u.name = "바보";

3. 유저의 이름이 "바"로 끝나는 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u
Where u.name LIKE "%바";

4. 유저의 이름이 "바"로 시작하는 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u
Where u.name LIKE "바%";

4. 유저의 이름이 "바"가 포함되어있는 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u
Where u.name LIKE "%바%";

5. 유저의 이름이 바보이거나 치킨인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u
Where u.name = "바보"
OR u.name = "치킨"

6. 유저의 이름이 바보고, 성별이 여자인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM user u
Where u.name = "바보"
AND u.gender = "여자"

7. 유저가 소지한 포인트가 20원 이상인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM `user` u 
WHERE u.userPoint >= 20;

7. 유저가 소지한 포인트가 20원 이상인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM `user` u 
WHERE u.userPoint >= 20;

8. 유저가 소지한 포인트가 20원 이하인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM `user` u 
WHERE u.userPoint <= 20;

8. 유저가 소지한 포인트가 20원 이상이거나 200원 이하인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM `user` u 
WHERE u.userPoint BETWEEN 20 AND 200;

9. 유저 이름이 바보고, 성별이 남자이며, 소지한 포인트가 200원 이상인 테이블을 조회하는 쿼리를 짜보세요.

SELECT u.*
FROM `user` u 
WHERE u.userPoint >= 200
AND u.gender = "남자"
AND u.userNickname = "바보";

10. 회원가입 된 순서를 조회할 수 있는 쿼리를 짜보세요.

SELECT u.*
FROM `user` u 
ORDER BY u.createAt  ASC; (먼저 가입한 사람이 위로)

SELECT u.*
FROM `user` u 
ORDER BY u.createAt  DESC; (늦게 가입한 사람이 위로)

아니 설마 관계 구현한걸 라이브 생쿼리로 짜보라고 하는 곳이 있을까?

나 이너조인밖에 모르는데

11. 게시글 1번을 작성한 유저의 모든 테이블을 가져오는 쿼리를 짜보세요.

SELECT b.*, u.*
FROM board b 
LEFT JOIN `user` u ON b.boardWriter = u.userNickname 
WHERE b.boardId = "1";

컨닝페이퍼는 뭔가 더 필요하다고 생각이 들면 주기적으로 추가하겠습니다..

설마 라이브 쿼리에서 얼마나 짜라고 하겠어요 신입한테.....아닌가? 아님...공부해야지 뭐


추가 예정 : IN 구문

profile
물류 서비스 Backend Software Developer

6개의 댓글

comment-user-thumbnail
2022년 7월 12일

5번은 in절로도 활용 가능합니다!
Where u.name in('바보','치킨')

1개의 답글
comment-user-thumbnail
2022년 7월 14일

글 잘봤어요!!
SQL의 구성 에서 순서가 정해져있다고 하셨는데, 순서에 맞게 설명 적어주시는 것도 좋을 것 같아요!!

1개의 답글
comment-user-thumbnail
2022년 7월 15일

it 보안쪽에서 근무중입니다 Mariadb mysql cratedb 와같은 RDMS 만 다루다보니
쿼리문입력, JOIN, Procedure 등 이런한 작업을 많이하는 편이라 오히려 TypeORM이 저한데는 낮설네요 ㅋㅋㅋ당연하게 SQL문이 익숙하고 나름 편?하다고 생각했는데 , TtpeORM 대해서도 공부해봐야겠네요

1개의 답글