코드를 짠지 얼마 안된 회사는 ORM을 사용할지 모르지만, 실질적으로 조금이라도 오래된 회사는 DB작업을 수행할때 대부분 날쿼리(SQL)로 작성 되어있다는 이야기를 들었다. 하직 어느회사도 입사하지 못했지만, 어떻게 되었는 나는 백엔드 개발자를 지향하고 있고, 따라서 DB에서 무엇인가 작업을 하게된다면, ORM보다는 SQL을 써야하지 않을까 싶어서 이렇게 SQL작성방법에 대해서 포스팅을 적는다. 이번 포스팅에선 SQL에서 가장 많이 쓰이게 될 것이라는 조회관련 SELECT 구문에 대해서 어떻게 사용하는지 알아보자.
DB에 위와같은 데이터가 들었다고 가정하고 조회를 해보자.
가장 간단한 SELECT구문으로 Album테이블의 모든정보를 조회하기 위한 SQL구문을 작성해보자
SELECT
*
FROM album
album테이블(FROM album)에서 모든것(*)을 선택(SELECT)한다.
가 될 수 있다.
그렇다면 우리가 원하는 컬럼만 꺼내오려면 어떻게 작성할까? 위의 해석대로 모든것을 => 원하는 컬럼만 으로 변경하면
album테이블(FROM album)에서 모든것(*)을 선택(SELECT)한다.
=> album테이블(FROM album)에서 특정컬럼을 선택(SELECT)한다.
로 변경할 수 있을 것이다.
SELECT album_id, name FROM album
위와 같이 작성하면 Album테이블에서 album_id, name만을 조회해 가져올 수 있게 된다. 하지만 Album테이블의 name 컬럼명이 User테이블의 name과 혼동될 수 있기 때문에 원하는 컬럼명으로 바꿔서 꺼내줄 필요가 있다.
SELECT album_id '엘범아이디', name '엘범명' FROM album
위와같이 컬럼뒤에 문자열을 추가하면 원하는 컬럼명을 가지고 꺼내올 수 있게 된다.
그렇다면 이제는 원하는 데이터를 찾아오도록 해보자
SQL구문의 WHERE절을 이용해서 전체테이블에서 특정 필요한 정보만 꺼내보자.
SELECT
*
FROM album WHERE name = '돌고래'
위 구문은 Album테이블의 모든정보 중 name컬럼이 '돌고래'인 데이터만 조회해 오는 구문이다. =
동일연산자의 사용이 가능하다는 점을 생각해보면, 대소를 구분해주는 >
, <
연산자 또한 사용할 수 있다는 점을 알 수 있다.
SELECT
*
FROM album WHERE created_at > '2022-01-01'
위와 같이 >
연산자를 통해 2022=01=01
보다 늦게 생성된 모든 데이터에 대해서도 조회가 가능하다.
두 가지 이상의 조건을 걸고 싶다면 AND나 OR를 통해 두 가지 이상의 조건을 걸어서 데이터를 조회해 올 수도 있다.
SELECT
*
FROM album WHERE created_at > '2022-01-01' AND album_id < 20
AND구문을 통해서 2022=01=01
보다 늦게 생성되고, album_id가 20보다 작은 데이터들을 모두 조회할 수 있다.
일반적으로 검색기능에서 주로 사용되는 LIKE구문도 사용해보자
SELECT
*
FROM album WHERE name LIKE '%돌고%'
ablum테이블의 name컬럼중에 "돌고"가 포함된 모든 정보를 볼 수 있다.
SELECT
*
FROM album WHERE name LIKE '돌고%'
ablum테이블의 name컬럼중에 "돌고"로 시작되는 모든 정보를 볼 수 있다.
SELECT
*
FROM album WHERE name LIKE '%돌고'
ablum테이블의 name컬럼중에 "돌고"로 끝나는 모든 정보를 볼 수 있다.
위 세가지를 참고하면 %기호는 특정 단어의 앞 또는 뒤에 어떠한 다른 문자도 올 수 있다는 것을 의미한다.
수량을 세기 위해서는 어떻게 해야할까? COUNT를 이용한 구문을 사용하면 된다.
SELECT COUNT(
*
) FROM album
Album테이블의 모든 데이터의 개수를 샐 수 있다.
원하는 데이터의 갯수만 샌다면 어떨까?
SELECT COUNT(
*
) FROM album WHERE user_id 3
3이라는 user_id를 가진사람이 가지고있는 엘범의 개수를 샐 수 있다.
데이터가 너무 많을 때는 필요한 개수만 가지고 오려면 LIMIT구문을 사용할 수 있다.
SELECT
*
FROM photo LIMIT 10
photo테이블에 이미지가 1000개가 있는데 현재 페이지에서 10개의 이미지만 보고싶다면, LIMIT구문을 사용하여 조회할 개수를 제한할 수 있다.
그렇다면 다음 페이지의 10개를 보려면 어떻게 해야할까?
SELECT
*
FROM photo LIMIT 10, 10
또는
SELECT
*
FROM photo LIMIT 10 OFFSET 10
위와 같이 LIMIT뒤에 ,
를 기준으로 앞이 생략할 데이터의 수, 뒤가 보여줄 데이터의 수로 작성할 수 있다.
어떤 유저가 몇개의 엘범을 가지고 있는가? 를 조회할 때는 위의 COUNT만 쓰면 될 것 같지만, 각 유저에 대해서 묶어줘야하기 때문에 GROUP BY구문을 사용해서 쓸 수 있다.
SELECT user_id, COUNT(
*
) FROM album GROUP BY user_id
정렬된 형태로 조회를 해 오고싶다면 ORDER BY구문을 사용하여 작성할 수 있다.
SELEc
*
FROM album ORDER BY created_at
위와 같이 ORDER BY구문을 사용하면 기본적으로 숫자가 작은 순서대로(ASC) 정렬해 온다. 날짜를 컬럼으로 책정했기 때문에 오래된 엘범을 기준으로 데이터를 정렬해서 조회해 온다. 만약 최신순으로 정렬해서 가지고 오고 싶다면 DESC를 추가해 주면 된다.
SELECT
*
FROM album ORDER BY created_at DESC
위의 공부한 과정을 바탕으로 문제를 풀어보자
SELECT name '사용자명', user_id '사용자 아이디', login_at '마지막 로그인 날짜' FROM user WHERE login_at < '2020-01-01'
SELECT
*
FROM album LIMIT 10, 10
SELECT album_id, COUNT(
*
) FROM photo WHERE created_at >= '2022-03-30' GROUP BY album_id
궁금증
문제풀이의 2번에서
SELECT
*
FROM photo LIMIT 10 OFFSET 10
또는
SELECT
*
FROM album LIMIT ${page - 1}*
10, 10
와 같은 구문은 정상적인 접근이라고 할 수 있을까?