데이터 조회로 기본 다지기

Yun·2021년 3월 27일
0

DataBase

목록 보기
2/3
post-thumbnail

여러개의 조건 걸기

SELECT * FROM `copang-main`.member
    WHERE (gender = 'm' AND height >= 180)
        OR (gender = 'f' AND height >= 170);

AND 와 OR 를 사용 하실때는 먼저 실행해야 하는것들 끼리 괄호로 묶어주시는게 좋습니다

AND와 OR 간의 우선순위

이번에는 AND와 OR을 함께 사용할 때 흔히 하기 쉬운 실수를 알아보겠습니다. 아래의 SQL문을 보세요.

저는 지금
(1) 성별이 여자이거나(OR) 나이가 30세 미만

‘이면서’(AND)

(2) 키는 180 이상인 회원들을
조회하려고 합니다. 그런데 지금 실행 결과를 보면 height 컬럼의 값이 180 이하인 회원들도 많이 보입니다. (2) 키는 180 이상이라는 조건을 만족하는 row들이 조회되어야 하는데 어떻게 된 걸까요?
이런 결과가 출력된 이유는, SQL 문이 실행될 때, AND가 OR보다 우선순위가 더 높기 때문입니다. 즉, AND가 OR보다 먼저 실행된다는 거죠.
그래서 제가 쓴 위의 SQL 문은 사실 아래 그림처럼

이렇게
(1) 성별이 여자이거나(OR)
(2) 나이가 30세 미만이면서(AND) 키가 180 이상인 회원들을
조회하는 것으로 해석되는 겁니다.
AND가 OR보다 우선순위가 높다는 사실을 모르면 이런 실수를 하기 쉬운데요. 그럼 매번 이런 우선순위 정보를 기억해야할까요? 그럴 필요는 없습니다.
이런 우선순위를 신경쓰는 것보다는 사용자가 그냥 ‘먼저 실행되기를 원하는 조건’을 괄호로 씌워주는 게 좋습니다. 그 이유는 괄호는 AND보다도 우선순위가 높기 때문입니다.
그러니까 만약 원래 제가 의도했던 결과를 얻으려면 아래 그림처럼

먼저 실행되기를 원하는 부분에 괄호를 씌워주면 됩니다. 실행 결과를 보니 제가 의도한 결과가 잘 출력되었네요. 이렇게 조건에 괄호를 씌워주면 AND와 OR 사이의 우선순위를 신경쓰지 않아도 되고, 나중에 SQL 문을 다시 읽었을 때도 이해하기 편하다는 장점이 있습니다. 여러 조건을 걸 때는 이렇게 조건 단위로 괄호를 씌워주는 습관을 들이시면 좋습니다.

이스케이핑(escaping) 문제

%, _, ' 가 들어있는 문자열을 찾으려고 할때

SELECT * FROM member WHERE email LIKE '%%%'

라고는 할수 없습니다. 따라서 찾을려고 하는 문자열 앞에 \ 역슬래쉬를 붙여줍니다.

SELECT * FROM member WHERE email LIKE '%\%%'

대소문자 구분 문제

다음과 같은 설정이 되어있을땐 다음과 같은 명령어를 입력한다면

SELECT * FROM member WHERE email LIKE '%g%'

대문자 G 도 함께 검색 됩니다.

SELECT * FROM member WHERE email LIKE BINARY '%g%'

라고 검색한다면 소문자 g 만 검색됩니다.

데이터 정렬

정렬을 할때 Null 은 가장 작은값으로 취급되지만 DBMS 마다 다를 수 있습니다.

SELECT * FROM member ORDER BY height ASC; # 오름차순 정렬 ASC (ascending) 이 생략됨
SELECT * FROM member ORDER BY height DESC; # 내림차순 정렬 DESC (descending)
  • 조건을 건뒤 오름차순 으로 정렬
SELECT * FROM member WHERE (gender = 'm' AND weight >= 70) ORDER BY weight ASC;
  • 정렬에 대해서 실무적으로 중요한 부분 여러 기준을 두고 정렬 해야 하는 경우
# 우선인 정렬 기준 가입년도 그다음 정렬 기준 email
SELECT email, sign_up_day FROM member ORDER BY YEAR(sign_up_day) DESC, email ASC;

정렬할때 주의 사항


Data 의 Type 이 int 형의 경우 오름차순, 내림차순의 결과가 원하는 대로 잘 나올 것입니다. 하지만 Text 로 되어 있는경우

이런식으로 원하는 결과가 나오지 않을 수 있습니다.

이미 TEXT 타입인 컬럼에 있는 숫자값들을, 그냥 INT 등의 숫자형 타입으로 보고 정렬할 수는 없을까요? 가능합니다. 정렬할 때 그 컬럼의 값들의 데이터 타입을 일시적으로 변경해주면 되는데요.
이걸 하기 위해서는 CAST라는 함수를 써야합니다. CAST는 ‘틀을 만들다', '틀을 정하다'라는 뜻을 가진 영어 단어인데요. 보통 프로그래밍 세계에서 어떤 변수의 데이터 타입을 바꿀 때 사용되는 단어입니다. SQL에서도 같은 의미로 사용되는데요.
지금 아래 그림의 SQL문을 보면 CAST(data AS signed)라는 표현식이 있죠? 이 부분이 바로 data 컬럼에 존재하는 값들의 데이터 타입을 일시적으로 signed라는 데이터 타입으로 변환하라는 뜻입니다.
signed는 처음 보는 데이터 타입인데요. signed는 양수와 음수를 포함한 모든 정수를 나타낼 수 있는 데이터 타입입니다.

절의 작성 순서

참고 할만한 링크
Dev Mysql

데이터 일부만 추려보기

  • 위에서 부터 10개만 추려서 보기
SELECT * FROM member ORDER BY sign_up_day DESC LIMIT 10;

Row 는 0번째 부터 시작합니다
9번째 부터 2개를 불러와라 라는 의미입니다.

SELECT * FROM member ORDER BY sign_up_day DESC LIMIT 8, 2;

LIMIT 은 PAGENATION 과 깊은 관계가 있습니다!!

profile
개발 재밌따..ㅎ

0개의 댓글