데이터 조회
데이터 조회
SELECT는 테이블의 데이터를 조회할 때 사용하는 구문이다.
FROM은 어디의 데이터를 조회할지 정하는 구문이다.
SELECT column값 FROM db.table
예시
SELECT * FROM school.member;
school이라는 DB에 member라는 테이블에서 모든값을 조회하게 된다.
USE를 사용해서 어떤 DB를 쓰겠다고 지정하게 되면 table이름만 작성해도 된다.
USE school;
SELECT * FROM member;
조건
WHERE
WHERE는 특정 조건을 만족하는 row만 조회한다.
WHERE 조건
SELECT * FROM school.member WHERE age >= 30;
age column이 30이상인 row만 조회.
BETWEEN
BETWEEN은 두 값 사이의 데이터를 조회.
BETWEEN a AND b
SELECT * FROM school.member WHERE age BETWEEN 30 AND 35;
age가 30에서 35사이 조회.
NOT
NOT은 조건에 해당하지 않는 데이터를 조회.
NOT 조건
SELECT * FROM school.member WHERE age NOT BETWEEN 30 AND 35;
age가 30에서 35사이를 제외하고 조회.
LIKE
LIKE는 특정 패턴과 일치하는 데이터를 조회한다.
LIKE 패턴
SELECT * FROM school.member WHERE address LIKE '서울%';
서울로 시작하는 모든 문자열을 조회한다.
‘%’는 임의의 길이(0자도 포함)을 나타내며,
‘_‘는 문자 하나를 나타낸다.
LIKE '___서울'
임의의 값 3자와 서울로 끝나는 데이터 조회.
escaping
특수한 기능을 가지고 있는 문자들(%, _, “ 같은 것들)을 그것에 부여된 특정한 의미, 기능으로 해석되지 않고 하나의 문자로서 나타내고 싶다면 문자앞에 백슬래쉬를 추가해 주면 된다.
이것을 이스케이핑이라고 한다.
LIKE '%\%%';
BINARY
테이블의 기본 설정에서 Table collation항목에 ci로 끝나는 부분이 있는데 ci는 case-insensitive로 문자열이 동일한지 확인할 때 대소문자를 구분하지 않는다는 의미다.
이러한 설정에 상관없이 대소문자를 구분하려면 BINARY를 사용하면 된다.
SELECT * FROM school.member WHERE address LIKE BINARY 'a%';
이러면 소문자a를 포함한 데이터만 조회되고 대문자A는 제외될 것이다.
IN
IN은 해당하는 값만 조회할 때 사용.
IN (a, b, ...)
SELECT * FROM school.member WHERE age IN(20, 30, 25);
age가 20, 30, 25인 데이터 조회.
SQL에서 !=와 <>는 같은 의미이다.
DATE
날짜 관련된 데이터는 DATE타입으로 설정하면 된다.
연도, 월, 일 추출
연도
WHERE YEAR(a) = 'b'
SELECT * FROM school.member WHERE YEAR(birthday) = '1999';
birthday의 연도가 1999인 데이터 조회.
월
MONTH(a) = 'b'
SELECT * FROM school.member WHERE MONTH(birthday) = '7';
birthday의 월이 7인 데이터 조회.
일
DAYOFMONTH(a) = 'b'
SELECT * FROM school.member WHERE DAYOFMONTH(birthday) = '11';
birthday의 일이 11인 데이터 조회.
날짜 간의 차이 구하기
DATEDIFF()
DATEDIFF는 두 날짜의 차를 구해준다.
DATEDIFF(a, b)
SELECT *, DATEDIFF(sign_up_day, '2020-10-10') FROM school.member;
sign_up_day에서 ‘2020-10-10’을 뺀 차이 일수를 알려준다.
CURDATE()
CURDATE는 오늘 날짜를 구해준다.
CURDATE()
SELECT *, DATEDIFF(sign_up_day, CURDATE()) FROM school.member;
sign_up_day에서 오늘 날짜를 뺀 차이 일수를 알려준다.
날짜 더하기 빼기
DATE_ADD()
DATE_ADD(a, INTERVAL b DAY)
SELECT *, DATE_ADD(sign_up_day, INTERVAL 300 DAY) FROM school.member;
sign_up_day에서 300일을 더한 날짜를 알려준다.
DATE_SUB()
DATE_SUB(a, INTERVAL b DAY)
SELECT *, DATE_SUB(sign_up_day, INTERVAL 300 DAY) FROM school.member;
sign_up_day에서 300일을 뺀 날짜를 알려준다.
UNIX Timestamp
UNIX Timestamp는 1970-01-01을 기준으로 총 몇 초가 지났는지 나타낸 값입니다.
예시) 1553526000
DATE타입을 UNIX Timestamp로 변환
UNIX_TIMESTAMP(a)
SELECT *, UNIX_TIMESTAMP(sign_up_day) FROM school.member;
UNIX Timestamp를 DATE타입으로 변환
FROM_UNIXTIME(a)
SELECT *, FROM_UNIXTIME(UNIX_TIMESTAMP(sign_up_day)) FROM school.member;
조건 여러개 걸기
AND
AND는 양쪽의 값이 모두 만족을 해야한다.
SELECT * FROM school.member WHERE WHERE height >= 170 AND age >= 20;;
OR
OR는 양쪽의 값 중 하나만 만족을 하면 된다.
SELECT * FROM school.member WHERE WHERE height >= 170 OR age >= 20;;
AND와 OR의 우선순위
AND의 우선순위가 OR보다 더 높다.
이런 우선순위를 신경쓰기 보다 그냥 괄호를 씌워 순위를 조정해 주는게 더 낫다.
정렬
row들을 특정 column을 기준으로 순서대로 출력한다.
ORDER BY
SELECT * FROM school.member ORDER BY age ASC;
age를 기준으로 정렬한다.
ASC(ascending)는 오름차순으로 ORDER BY의 기본값이 ASC이므로 생략해도 무관하지만 명시적으로 작성해 주는 것이 좋다.
SELECT * FROM school.member ORDER BY age DESC;
DESC(descending)는 내림차순 정렬이다.
두 가지를 함께 사용할 수 도 있다. 이때 앞에 작성된 조건으로 먼저 정렬되고, 동일한 값으로 정렬순서가 곂치는 데이터는 뒤에 작성된 조건으로 정렬된다.
SELECT * FROM school.member ORDER BY age ASC, height DESC;
age를 기준으로 오름차순으로 먼저 정렬되고, age값이 동일해 정렬순서가 동일한 데이터는 height를 기준으로 내림차순 정렬된다.
LIMIT
원하는 양만큼의 데이터만 조회하고 싶다면 LIMIT를 사용한다.
LIMIT 개수
SELECT * FROM school.member LIMIT 10;
10개의 row만 조회된다.
SELECT * FROM school.member LIMIT 10, 5;
11번째 row부터 5개의 row만 조회된다.
row는 0번째 부터 시작한다.
각 절의 작성순서
SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT
작성순서 문서
순서를 지키지 않으면 에러가 난다.
CAST
정렬시 기준의 데이터 타입이 INT인지 TEXT인지에 따라 결과가 달라진다.
INT를 정렬하면 하나의 숫자로서 크기를 비교한다.
예시) 1, 5, 12
TEXT를 정렬하면 앞에서부터 같은 자릿수끼리 하나씩 비교하게된다.
예시) 1, 12, 5
INT로서는 숫자의 크기대로 정렬되지만 TEXT는 한 자릿수씩 비교하므로 12가 5보다 작게된다.
이럴때 원하는 데이터타입으로 비교하고 싶다면 CAST()를 사용하면 된다.
CAST(column, AS 데이터타입)
SELECT * FROM school.member ORDER BY CAST(address AS signed) ASC;
TEXT형인 address를 정수형으로 비교하게 된다.
signed는 양수와 음수 모두 포함한 정수이고, decimal은 소수점, char는 문자열로 변환시킨다.
Leave a comment