SQL SELECT

권태형·2023년 5월 1일
0

SQL

목록 보기
3/6
post-thumbnail

코드를 짠지 얼마 안된 회사는 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


위의 공부한 과정을 바탕으로 문제를 풀어보자

  1. 2023년 1월1일 기준으로 지난 3년동안 로그인 하지 않은 유저를 뽑아서 휴면계정 처리를 하려고 한다. 위 조건에 만족되는 데이터를 사용자명, 사용자아이디, 마지막 로그인 날짜를 출력해보자.

SELECT name '사용자명', user_id '사용자 아이디', login_at '마지막 로그인 날짜' FROM user WHERE login_at < '2020-01-01'

  1. 관리자가 모든 앨범을 볼 수 있다고 가정하고, 각 페이지마다 10개씩 앨범이 보여지는데, 두번째 페이지에서 보여지는 앨범 리스트를 뽑아보자.

SELECT * FROM album LIMIT 10, 10

  1. 각 앨범마다 2022년 3월 30일 이후에 업로드된 사진이 몇개씩 들어와 있는지 확인하고 싶다. 앨범이이디를 기준으로 위 조건으로 출력해보자.

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

와 같은 구문은 정상적인 접근이라고 할 수 있을까?

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글