이것도 생각보다 질문을 많이 받았다(....)
쌩쿼리를 얼마나 사용할 줄 아냐? 라는 질문과 함께 라이브로 쿼리문을 짜는 것을 요청받았었다.
지금까지는 TypeORM을 사용하여 쿼리를 짜다보니, 솔직히 SQL을 사용할 일이 별로 없었다.
쿼리빌더를 사용한다는 것 자체가 쿼리를 사용한다는 것과 유사하지만, 그래도 쌩쿼리는 많이 사용해보지 못했다.
정말 모르겠을 때 이곳저곳을 찾으면서 쿼리로 구현하고 그것을 바탕으로 쿼리빌더로 만드는 경우는 많았지만 말이다.
그럼 여기서 드는 의문이 있다.
어짜피 작업은 ORM으로 할텐데 왜 굳이 SQL을 알아야하는 것이냐? 에 대한 의문이다.
이건 정말.... 단순하다.
내가 수없이 많이 받아본 면접 질문 중 한가지
예시) 레디스를 사용하셨는데, IN-Memory DB에 대한 특징을 알고 계실까요?
ORM은 SQL을 쉽게 사용하기 위하여, 접근성을 위해 만들어진 하나의 도구라고 생각을 하고 있다.
이 4가지의 원칙을 알아야한다고 생각한다. (이러니까 포스팅이 죽어라 늘어나고 있긴 한데...)
그래서 알아야만 하는 것이 SQL이다.
제일 중요한 것은 쓸 줄 알고 있다면 괜히 코드에서 검증하는게 아니라 그냥 디비에 직접 접근해서 데이터를 열람하거나 필터링할 수도 있다.
그래서 아무튼 알고 있어야한다(....)
SQL은 다양한 옵션이 존재하는데, 이놈은 실행되는 순서도 정해져있다.
그래서 이 순서를 생각 안하고 무작정 쳐버리면 내가 원하는 답이 안나온다(이러니까 ORM쓰지)
실행되는 순서
FROM => ON & WHERE => JOIN & GROUP BY => HAVING => SELECT => ORDER BY => LIMIT
여기에 소개하지 못한 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 구문
5번은 in절로도 활용 가능합니다!
Where u.name in('바보','치킨')