Computer Science/Database, SQL

[Codeit/MySQL] #3 데이터 조회

성중 2021. 4. 15. 21:22

SELECT와 WHERE

테이블의 데이터를 조회해보자

SELECT: 테이블의 원하는 데이터를 조회할 때 사용하는 구문

SELECT * FROM copang_main.member;

별표(*) -> ‘모든 속성’을 뜻한다

~ 테이블의 모든 row가 조회된다

 

SELECT email, age, address FROM copang_main.member;

이런 식으로 원하는 column의 row만 조회할 수 있다

*그냥 테이블 이름(member)만 적어도 실행되지만 테이블 이름이 중복되는 경우가 있을 수 있기에 데이터베이스 이름과 함께(copang_main.member) 적어준다. USE문으로 데이터베이스를 지정해줘도 문제가 없다.

 

WHERE을 사용해 특정 조건을 만족하는 row만 조회할 수 있다

SELECT * FROM copang_main.member WHERE email = 'taehos@hanmail.net';

 

SQL문의 작성 형식

1. 끝에는 항상 세미콜론(;)을 써줘야 한다.

2. 키워드들이 최소한 하나 이상의 공백으로 구분되어 있고, 세미콜론으로 마무리가 되어 있다면 문장 중간에 공백이나 줄 바꿈을 자유자재로 넣어도 된다.

3. 가독성을 위해 예약어는 대문자로 적고 사용자 지정어는 소문자로 적는 것이 관례이다.

 

조건을 나타내는 다양한 방법

속성값~이상/이하 -> 부등호

SELECT * FROM copang_main.member WHERE age >= 27;

 

구간 -> BETWEEN~AND

SELECT * FROM copang_main.member WHERE age BETWEEN 30 AND 39;

 

제외 -> NOT

SELECT * FROM copang_main.member WHERE age NOT BETWEEN 30 AND 39;

 

특정 텍스트가 포함된 문자열 뽑아 내기 -> LIKE

SELECT * FROM copang_main.member WHERE address LIKE '서울%';

서울% -> ‘서울’로 시작하는

%서울% -> ‘서울’이 포함된

%서울 -> ‘서울’로 끝나는

 

같음 -> =

같지 않음 -> !=, <>

 

정확히 이 중에 있는~ -> IN(a,b,c..)

SELECT * FROM copang_main.member WHERE age IN(20,30);

 

한 글자를 나타내는~ -> 언더바(_)

SELECT * FROM copang_main.member WHERE email LIKE 'c_____@%';

~ 이 경우에는 c를 포함한 6자리 문자열이 포함된 이메일

 

*주의할 점

1. 이스케이핑 문제

% ‘ _ “

이렇게 4가지는 표현식과 겹치기 때문에 문자열로 사용하려면 앞에 역슬레쉬(\)를 붙이자

SELECT * FROM copang_main.member WHERE sentence LIKE '%\%%';

 

2. 대(소)문자 문제

특정 대(소)문자가 포함된 문자열을 다룰 때는 BINARY를 앞에 붙이자

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

 

DATE 데이터 타입 관련 함수

데이터 형식이 DATE인 값들도 부등호 적용이 가능하다

SELECT * FROM copang_main.member WHERE sign_up_day > '2019-01-01';

 

BETWEEN~AND 적용도 가능하다

SELECT * FROM copang_main.member 
WHERE sign_up_day BETWEEN '2018-01-01' AND '2018-12-31';

 

1. 연도(YEAR), 월(MONTH), 일(DAYOFMONTH) 추출하기

SELECT * FROM copang_main.member WHERE YEAR(birthday) = '1992';

-> DATE 데이터 타입 속성의 연도가 1992인 것을 뽑아낸다.

SELECT * FROM copang_main.member WHERE MONTH(sign_up_day) IN(6,7,8);

-> 생일이 6,7,8월 중에 있는 사람들을 뽑아낸다.

SELECT * FROM copang_main.member WHERE DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31;

-> 각 달의 후반부(15~31)에 가입한 회원들을 뽑아낸다.

 

2. 날짜 간의 차이 구하기

SELECT email, sign_up_day, DATEDIFF(sign_up_day, '2019-01-01') FROM copang_main.member;

특정 날짜를 기점으로 그 날짜와의 차이를 구한다

3. 날짜 더하기 빼기

SELECT email, sign_up_day, DATE_ADD(sign_up_day, INTERVAL 300 Day) FROM copang_main.member;

DATE_ADD() -> 날짜를 더한 결과를 띄운다

SELECT email, sign_up_day, DATE_SUB(sign_up_day, INTERVAL 250 Day) FROM copang_main.member;

DATE_SUB() -> 날짜를 뺀 결과를 띄운다

 

4. UNIX Timestamp

UNIX Timestamp값: 1970년 1월 1일을 기준으로 총 몇 초가 지났는지를 나타낸 값

UNIX_TIMESTAMP() -> 일반 시간을 유닉스 타임스탬프로 변환

FROM_UNIXTIME() -> 유닉스 타입스탬프에서 일반 시간으로 변환

 

여러 개의 조건 걸기

AND -> 조건들을 동시에 충족하는 경우 출력

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

~ 성별이 남성이면서 서울에 거주하는 멤버

 

OR -> 조건들 중 하나라도 충족하는 경우 출력

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

~ 가입 날짜가 3~5월 사이거나 9~11월 사이인 멤버

 

AND와 OR을 동시에 사용하는 경우)

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

 

데이터 정렬해서 보기

‘정렬 -> row들을 특정 column을 기준으로 순서대로 출력하는 것’

ORDER BY 속성; -> 해당 속성의 row들을 작은 순서대로(오름차순) 정렬

SELECT * FROM copang_main.member
ORDER BY height;

* 정렬 순서가 이상할 경우 속성의 데이터타입을 체크해보자!

데이터 타입을 일시적으로 바꾸는 경우 CAST함수를 사용할 수 있다

 

내림차순으로 정렬하려면? -> DESC

SELECT * FROM copang_main.member
ORDER BY height DESC;

* 기본값인 오름차순도 ASC로 표현할 수 있다

 

특정 row들을 조회하고 정렬하는 경우~

‘WHERE’가 ‘OREDER BY’보다 먼저 나와야 함

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

 

심화) 다중으로 정렬하는 경우

A 속성을 기준으로 오름차순 정렬한 후 안에서 B 속성을 기준으로 내림차순 정렬..

SELECT * FROM copang_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;

 

데이터 일부만 추려보기

LIMIT n; -> 정렬 후에 상위 n개를 추려준다.

SELECT * FROM copang_main.member
ORDER BY sign_up_day DESC
LIMIT 10;

상위 9,10번만 보고 싶다면? LIMIT m, n;

LIMIT 8, 2;

~ 9번부터 2개를 출력하라는 의미 (row는 0번부터 시작이다!)

*LIMIT 속성은 페이지를 load하는 pagination과 관련 있다

 

본 내용은 Codeit의 '개발자를 위한 SQL 데이터베이스'를 바탕으로 작성되었습니다.