걷기 시작한 Coding Novice

SQL

Where 절과 자주 같이 쓰는 문법 써보기

Spell 2022. 5. 3. 18:29
  • 같지 않음 '!='
select * from orders
where course_title != '웹개발 종합반'

orders 테이블에서 '웹개발 종합반'을 제외하고 주문데이터를 보고싶다

 

  • 범위 'between'
select * from orders
where created_at between '2020-07-13' and '2020-07-15'

 

713, 714일 주문데이터만 보고싶다

 

  • 포함 'week'
select * from checkins
where week in (1,3)

1, 3주차 사람들의 오늘의 다짐데이터가 보고싶다

 

select * from checkins
where week in (1,3,7,9)

1, 3, 7, 9주차 사람들의 오늘의 다짐데이터가 보고싶다

 

  • 패턴 'like'
select * from users
where email like '%daum.net'

다음 이메일을 사용하는 유저만 보고싶다.

(여기서 '%'는 그 부분에 뭐가 있던 간에 라는 의미이다)

 

select * from users
where email like 'a%t'

a로시작해서 t로 끝나는 데이터를 보고싶다


[실습 내용]

1. 결제수단이 CARD가 아닌 주문데이터만 보고싶다

select * from orders
where payment_method != 'CARD'

 

2. 20000~30000 포인트 보유하고 잇는 유저만 보고싶다

select * from point_users
where point >= 20000 and point <= 30000
select * from point_users
where point between '20000' and '30000'

두가지 모두 같은 값을 도출한다. 하지만 첫번째는 2만 이상과 3만 이하라는 조건이, 두번째는 2만과 3만 사이의 값을 가지고 있다는 조건이 다르다. (비슷하면서 아주 달랐다)

 

여기서 의문점이 생겼다'저 두가지의 쿼리의 답은 같지만 서로의 장단점이 무엇일까? 또한 어떤 한계점이 각각 있을까?'

질의응답을 할 수 있는 Slack을 통해서 질문해본 결과 이형진 튜터님께서 말씀해주신 내용으로 이해가 되었다.

장단점이라 하기 보다는 길게 써야하는 문법을 짧고 쉽게 사용할 수 있도록 줄여둔 것이기에 사용에 있어 큰 차이는 없다고 보시면 됩니다. 저는 개인적으로 평소 'between' 을 잘 사용하지 않습니다. 그 이유는 질문해주신 상황과 같이 급하면 'between'을 생각하기 보다 생각하기 쉽고 직관적인 부등호를 이용하게 되기 때문입니다.

그리고 가장 중요한 이유는 쿼리를 작성하다보면 조건을 변경해야하는 경우가 수시로 생기기 때문입니다.
부등호를 이용한 조건의 경우 등호의 사용여부로 이하, 미만, 이상, 초과 등 을 표현하기 쉽고 표현범위가 자유로워집니다. 그리고 등호를 제외하기만 하면 되니 변경도 간편해집니다.

하지만 'between'은 A 이상 B 이하의 범위만 표현 가능하기 때문에 이상에서 초과로, 이하에서 미만으로 변경하기 까다롭고 결국 부등호를 가진 조건으로 돌아와야하기 때문에 번거로운 문제가 있습니다.

그리고 조건중 하나를 빼야하는 경우가 있는데 'and'를 이용해서 연결하면 주석처리가 쉬워집니다.

예를들면 위에서 제공해주신 쿼리에서 조건을 그냥 30000 이하로 변경하고 싶다면 어떻게 해야할까요?
'between'은 'where'에 들어간 조건을 모두 수정해야합니다. 하지만 부등호를 사용한다면 아래와 같이 조건 한줄만 주석처리 해버리면 바로 조건 변경이 가능합니다.
select * from point_users
where 1=1
--  and point >= 20000 
    and point <= 30000​

(1=1을 조건으로 추가해둔 것은 의미없는 조건을 'where' 에 붙여줌으로 단순히 모든 조건이 'and condition' 형태로 한줄씩 배치되도록 하기 위함입니다.)

사람에 따라 다를 수 있고 유용하게 사용하는 사람도 있으니 본인이 사용하기 편하신 방법을 이용하시는 것이 최고입니다.

 

3. 이메일이 s로 시작하고 com으로 끝나는 유저만 보고싶다

select * from users
where email like 's%.com'

 

4. 이메일이 s로 시작하고 com으로 끝나면서 성이 이씨인 유저만 보고싶다

select * from users
where email like 's%.com' and name = '이**'

  • 일부데이터만 가져오기 'limit'
select * from orders
where payment_method = 'kakaopay'
limit 5

orders 테이블에서 kakaopay로 결제한것만 보여주는데 5개만 보여줘

(정말 큰 테이블을 어떻게 생겼나 조회할 때 자주 사용한다)

 

  • 중복 데이터는 제외하고 가져오기 'distinct'
select distinct(payment_method) from orders

orders 테이블에서 payment_method 필드의 값이 어떤 것 들이 있는지 보여줘

(payment_method 필드의 값들 중 중복된 값을 제거하고 보여 달라는 말이다)

사용했을때의 예시

 

select payment_method from orders

사용안했을때의 예시

 

  • 몇 개인지 숫자 세보기 'count'
select count(*) from orders

orders 테이블에서 전체 값이 몇 개인지 보여줘

 

select count(*) from orders
where payment_method = 'kakaopay'

orders 테이블에서 payment_method 가 카카오페이인 것들이 몇 개인지 보여줘

 

 


[실습 내용]

1. (family name)씨가 몇개인지 궁금하다면?

이거 굉장히 어려웠다 처음 도전하는 나에게는.. 크흠..

select count(name) from users
and where distinct(name)

라고도 해보고..

select count(name) from users
where distinct(name)

라고도 해보고.. 아주 고생을 해봤는데.. 

실습하며 겪은 오류

대충 읽어보니.. 보자.. 2번째 줄에 ‘distinct(name)’ 근처에서 에러가 발생했으니 올바른 구문인지 확인을 해봐라?

해당 사진의 오류만 경험하게 되었다. 아 이것이 바로 '오.류.'라는 것이구나!

 

한참을 이상한길로 빠지다가 (아마 20분은 고생했던거 같다) 아직 배우는 단계에서 구글링은 반칙같고.. 정답을 확인 해봤다.

select count(DISTINCT(name)) from users

아?! 수학에서의 처럼 가로를 한번 덧씌워주면 우선 처리가 되는 거였어?

그래, 나의 무지함에 치가떨리는 순간이다.


오류를 겪은 김에, 처음에 말했던 '삽질'이라는 걸 해보자.

즉, 오류를 어떻게 해결해볼지에 대한 고찰이다.

이렇게 저렇게 하다보면 오류를 마주하게 된다. 그때 일단 오류를 잘 읽어보도록 하자. 그 안에 힌트가 분명히 있다고 한다.

 


Unknown column? Kakaopay? 
카카오페이라는 걸 모른다고?

! 카카오페이는 문자열이라서 작은 따음표’’를 적어줘야했구

 



3번줄에 name = “**” 근처에서 에러가 나왔다. 확인해봐라.
? and or 라는 연결시켜줘야 하는걸 빼먹었나? 등등을 유추

 

앞으로 삽질을 20분이고 30분이고 포기하지 않고 끝까지 해보는게 실력 향상에 도움이 많이 된다고 한다.

좋아 삽질하자!



 

'SQL' 카테고리의 다른 글

group by 사용해보기  (0) 2022.05.05
group by, order by 가 뭔데? (통계 관련 최대 / 최소 / 평균 / 개수)  (0) 2022.05.05
Select, Where 실전 퀴즈 풀어보며 익히기  (0) 2022.05.05
Select 쿼리문  (0) 2022.05.03
SQL study start  (1) 2022.05.03