데이터 조회 2

순동·2022년 3월 12일

📌 여러 개의 조건

  1. AND

✅ 성별이 남자이고, 주소가 서울인 회원

SELECT * FROM copang_main.member
WHERE gender = 'm'
	AND address LIKE '서울%';

✅ 성별이 남자이고, 주소가 서울이고, 나이가 25세 이상 29세 이하인 회원

SELECT * FROM copang_main.member
WHERE gender = 'm'
	AND address LIKE '서울%'
    AND age BETWEEN 25 AND 29;

  1. OR

✅ 봄(3~5월) 또느 가을(9~11월)에 가입한 회원

SELECT * FROM copang_main.member
WHERE MONTH(sign_up_day) BETWEEN 3 AND 5
	OR MONTH(sign_up_day) BETWEEN 9 AND 11;

✅ 남자 회원 중 키가 180 이상이고, 여자 회원 중 키가 170 이상인 회원

SELECT * FROM copang_main.member
WHERE (gender = 'm' AND height >= 180)
	OR (gender = 'f' AND height >= 170);
  • ANDOR을 섞어서 사용할 경우 먼저 사용될 조건을 괄호()로 감싸준다.
  • ANDOR보다 우선순위가 더 높다.

✅ 데이터 조회 과제

  1. 나이가 20대이고
  2. 가입한 달이 7월인 회원들만
SELECT id, email, age, sign_up_day FROM copang_main.member
WHERE age LIKE '2_'
	AND MONTH(sign_up_day) = '7';

📝 문자열 패턴 매칭 조건 사용 시 주의

  • LIKE : 문자열 패턴 매칭 조건을 걸기 위해 사용되는 키워드
  • % : 임의의 길이를 가진 문자열(0자도 포함)
  • _ : 한 자리의 문자

두 가지 주의사항이 있다.

  1. 이스케이핑(escaping) 문제

    빨간 박스 표시 처럼 문자들이 포함되어 있을 경우
    퍼센트(%) 기호가 포함된 row를 찾는다고 가정하자.
SELECT * FROM copang_main.test WHERE sentence LIKE '%\%%';

어떤 문자가 그것에 부여된 특정한 의미, 기능으로 해석되는 게 아니라 단순한 문자 하나로 해석 되도록 하는 것을 이스케이핑이라고 한다.

MySQL에서 이스케이핑을 하는 방법은 해당 문자 앞에 역슬래쉬(\)를 붙여주는 것이다.

SELECT * FROM copang_main.test WHERE sentence LIKE '%\'%'

SELECT * FROM copang_main.test WHERE sentence LIKE '%\_%'

SELECT * FROM copang_main.test WHERE sentence LIKE '%\"%\"%'

  1. 대소문자 구분 문제
    방금 전에 사용한 테이블에서 소문자 g가 포함된 값들을 찾아보자.
SELECT * FROM copang_main.test WHERE sentence LIKE BINARY '%g%'

BINARY를 붙이는 건 단지 알파벳 비교 뿐만 아니라 대소문자 구분까지 할 수 있도록 문자열을 비교하라는 뜻이다.

SELECT * FROM copang_main.test WHERE sentence LIKE BINARY '%G%'


📌 데이터 정렬

SQL에서의 정렬은 row들을 특정 컬럼을 기준으로 순서대로 출력하는 것을 의미한다.

✅ height 컬럼 기준으로 정렬

SELECT * FROM copang_main.member
ORDER BY height;
SELECT * FROM copang_main.member
ORDER BY height ASC;
  • ORDER : 순서
  • BY : ~에 의해
  • ASC : 오름차순 정렬 (ascending)
  • ASC를 입력하지 않아도 기본적으로 오름차순 정렬을 한다.
SELECT * FROM copang_main.member
ORDER BY height DESC;
  • DESC : 내림차순 정렬 (descending)

✅ 남자 회원들의 몸무게가 70kg 이상인 사람들을 조회 후 정렬

SELECT * FROM copang_main.member
WHERE gender = 'm' AND weight >= 70
ORDER BY height ASC;

✅ 가입년도 기준으로 가장 최근에 가입한 사람부터 내림차순 정렬, 같은 년도 가입한 사람들은 이메일 기준으로 오름차순 정렬

SELECT email, sign_up_day FROM copang_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
  • ORDER BY : 이름을 먼저 쓴 컬럼을 우선으로 정렬이 차례대로 수행된다.


📝 절의 작성 순서

순서의 법칙을 지키지 않으면 SQL문을 실행했을 때 에러가 발생한다.

자세한 사항은 https://dev.mysql.com/doc/refman/8.0/en/select.html 를 참고하길 바란다.

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

📝 정렬 주의사항

정렬 기준의 데이터 타입이 숫자형(INT), 문자열형(TEXT)인 경우에 따라 정렬 결과가 달라진다는 것이다.

  • INT 타입의 경우 숫자의 크고 작음을 기준으로 정렬이 수행된다.

  • TEXT 타입의 경우 숫자의 대소가 아니라 한 문자, 한 문자씩 문자 순서를 비교해서 정렬이 수행된다.

따라서 숫자값이 담긴 컬럼을 정렬 기준으로 할 때는 그 컬럼의 데이터 타입이 숫자형인지, 문자열형인지에 주의한다.

이미 TEXT 타입인 컬럼의 숫자값들을 INT 숫자형 타입으로 보고 정렬할 수는 없을까 ❓

이걸 하기 위해 CAST라는 함수를 사용해야 한다.

  • CAST : 데이터 타입을 바꿀 때 사용된다.
SELECT * FROM copang_main.member
ORDER BY CAST(data AS signed) ASC;

위의 SQL문을 실행하면 TEXT 타입의 값이 INT 타입의 값일 떄와 같은 결과가 나타난다.

만약 소수점이 포함되어 있다면 signed 대신 decimal을 적어주면 된다.


0개의 댓글