데이터 공부/데이터베이스 & SQL

03. SQL- SELECT 절의 활용 (A.K.A 1주차 수업 정리)

한소희DE 2021. 6. 8. 11:55

안녕하세요 한소희입니다. 공부를 통해 배운 내용을 작성하고 있습니다. 혹여 해당 포스팅에서 잘못된 부분이 있을 경우, 알려주시면 빠르게 수정 조치하도록 하겠습니다. 감사합니다.

 

 

나는 요즘 스파르타 코딩 클럽 - 엑셀보다 쉬운 SQL 수업을 수강 중이다.

내가 왜, 스파르타코딩클럽의 엑셀보다 쉬운 SQL 수업을 듣게 됐는지는 아래 이전 포스팅 링크를 통해 알 수 있다.

 

 

 

스파르타코딩클럽은 데이터 조작어(DML)를 중심으로 수업을 진행한다. 그래서 우선적으로, DML을 중심으로 학습한 뒤 추후 DDL이나 DCL을 개별적으로 공부할 것이다.

 

오늘은 1주차 수업을 모두 마치고, SQL 문의 SELECT 절을 이용하고, 다른 쿼리 문과 결합하여 활용하는 방법까지 복습해보도록 하겠다.

 

 

 

 

 

 

목차

SELECT와 WHERE 

특정 범위, 포인트 데이터 READ

특정 키워드 데이터 READ

중복을 제거한 데이터 개수 세기

과제 풀이

 


 

 

 

01. SELECT와 WHERE 

1-1. SELECT 문

SELECT 문이란, 기본 검색을 위해 사용한다.

 

 

SELECT 문에서는, 특정 속성만 출력할 수도 있고 모든 속성을 출력할 수 있다.

  • select 뒤에 * : 모든 속성 출력
  • select 뒤에 특정 속성명 : 특정 속성만 출력 (여러 개 가능)

 

'orders' table에 있는 데이터 전부를 출력해보자.

# orders table에 있는 데이터 전부를 출력
select * from orders

 

1-2. WHERE 문

 

WHERE문이란, 조건을 검색할 때 사용한다.

 

예를 들어, 'orders' table에 있는 데이터 중, 'payment_method' 속성 값이 'kakaopay'인 경우를 출력해보자.

select * from orders
where payment_method = 'kakaopay'

 

 

 

그리고 중복 명령을 하고 싶다면 and 연산자를 이용하면 된다.

만약, course_title 속성이 '앱개발 종합반'이고, payment_method 속성 값이 'CARD'인 인스턴스를 출력한다면 아래처럼 작성하면 된다.

select * from orders
where course_title = '앱개발 종합반' and payment_method  = 'CARD'

 

❓ 인스턴스 값이 CARD와 card인 경우를 구분해서 출력할까?
그렇지 않다. 알파벳의 대소문자와 관계없이 똑같이 출력된다.

 

또한 아래와 같이 산술연산 등도 가능하다.

# 포인트가 20000점 이상인 users 출력
select * from point_users
where point > 20000
​

 




02. 특정 범위, 포인트 데이터 READ

 

 

2-1. 특정 범위 데이터 - BETWEEN AND

 

만약, 2020년 7월 13일부터 2020년 7월 14일 데이터를 출력하고 싶다고 가정한다면 아래와 같이 BETWEEN AND 문법을 이용해 출력할 수 있다.

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

 

🔥 왜 7월 14일까지의 데이터를 찾는 범위를 7월 15일까지로 작성할까?

이게 되게 궁금했는데, 찾아보니까 between을 활용해 7월 13일부터 7월 14일을 찾는 데이터는,
2020-07-13 00:00:00 부터 2020-07-14 00:00:00까지의 범위만을 포함하기 때문이라는 것을 알게 됐다.

따라서 15일까지로 지정을 해야, 2020-07-13 00:00:00 부터 2020-07-15 00:00:00까지, 즉 13일과 14일의 데이터가 출력될 수 있다.

 

🔥 위와 같은 문제를 해결하는 방법이 없을까?

있다. 이것도 생각보다 단순했다. 구글링 하니 바로 나왔고, DATE를 사용하면 된다고 한다.
날짜의 형식을 2020-07-13 00:00:00 -> 2020-07-13 으로 바꾸어, between을 적용하면 해결된다.
예시는 아래 코드와 같다.
select * from orders
where date(created_at) BETWEEN '2020-07-13' and '2020-07-14'

 

 

 

2-2. 특정 포인트 데이터 - IN

 

만약, 2,3주차에 해당하는 comment 데이터를 출력하고 싶다고 가정하자. 그렇다면 아래와 같이 IN 문을 이용해, 괄호 내에 원하는 포인트 값을 작성해주면 된다.

 

# 포인트 찾기 - 2,3 주차에 해당하는 comment 데이터 출력하기
# SELECT 옆에는 내가 출력하고 싶은 필드값을 지정

select comment from checkins
where week in (2,3) 

 

 


 

03. 특정 키워드 데이터 READ

 

LIKE를 활용한다면, 특정 속성에 특정 키워드가 들어간 인스턴스를 출력할 수 있다.

 

 

이는 우리가 데이터를 부분적으로만 알고 있을 때 활용이 가능하다.

만약, users 테이블에서 email이 daum.net인 것을 출력하고 싶다고 가정해보자. 그렇다면 아래 코드처럼 작성할 수 있다.

# LIKE - 앞이 뭐가 됐든 뒤에가 daum.net인 것
select * from users 
where email like '%daum.net'

 

 

LIKE의 더 많은 사용 예

사용 예 설명
LIKE '데이터%' 데이터로 시작하는 문자열
LIKE '%데이터' 데이터로 끝나는 문자열
LIKE '%데이터%' 데이터를 포함하는 문자열
LIKE '데이터_' 데이터로 시작하는 4자리 문자열 
LIKE '_한%' 두번째 글자가 '한'인 문자열

 


 

04. 중복을 제거한 데이터 개수 세기

 

우리는 SELECT 옆 DISTINCT를 작성함으로써 인스턴스값의 중복을 제거할 수 있다.

 

 

SELECT 문은 중복을 허용한다는 것이 기본값이다.

기본값이다보니, SELECT 옆에는 보이지 않게 ALL이 있다고 생각하면 된다.

 

그러나, 만약 우리가 중복 없이 데이터를 출력하고 싶다면, 이 기본값을 바꿔주어야 한다.

 

# DISTINCT - 중복제거 한 count_values 추출
select distinct payment_method from orders 
# 혹은 select distinct(payment_method) from orders 


# DISTINCT X COUNT - 중복을 제거한 필드의 개수 추출
select count(distinct(name)) from users 

 

 

 

4-1. 만약 전체 인스턴스에서 중복이 있으면 제거할 수 있도록 select count(distinct(*)) from users라고 한다면?

 

문득 궁금해서 시도해봤는데 아래와 같은 에러가 떴다.

❓❗ SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)) from users' at line 2

 

그 이유는 무엇일지 찾아본 결과,

※ 문서에 따르면, COUNT의 동작원리는 아래와 같기 때문이라고 한다.

 

🔥 COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

즉 COUNT를 쓸 땐 DISTINCT or ALL + 표현을 사용할지 또는 *을 사용할지 선택해주어야 한다. 따라서 위와 같은 문법은 성립되지 않는다.

 

따라서 이를 해결하기 위해서는, 중복 값을 제거한 table을 from에 배치하면 된다는 것을 알게 됐다.

아래 코드를 참고하자.

# DISTINCT X COUNT - 중복을 제거한 필드의 개수 추출
select count(*) from (select DISTINCT * from users) t1

 

🔥 뒤에 T1(t1)을 작성하는 이유?

구글링 해서 추가해야 한다! 찾아보자!

 

 

 

※ 참조문서 링크

 

COUNT (Transact-SQL) - SQL Server

COUNT (Transact-SQL)

docs.microsoft.com

 

 

 


 

05. 과제 풀이

 

1주 차를 마무리하는 과제를 풀이해보았다. 풀이 과정은 아래 코드와 같다.

# 1. 성이 남씨인 유저의 이메일만 추출하기
select email from users
where name like '남%'

# 2. gmail을 사용하는 2020/07/12-13에 가입한 유저를 추출하기
# 7월 13일 자정을 넘겨서 그런가?
select * from users 
where email like '%gmail.com' 
and created_at between '20200712' and '20200714'

# 3. 2번의 경우의 인스턴스가 몇 개인지 세어보기
select count(*) from users 
where email like '%gmail.com' 
and created_at between '20200712' and '20200714'

 

 


 

 

1주 차 수업을 마치며 - 

 

나는 학교에서 데이터베이스 수업을 수강하며 SQL을 공부했던 적이 있다.

하지만 시간이 많이 지난 터라 기억이 잘 나지도 않고, 이번 블렌디드 러닝에서 이 SQL 수업을 지원해준다고 하니,

복습과 새로운 개념을 추가해 기억하자라는 목적에서 해당 수업을 신청했다.

 

1주차 수업을 마치며, 문법 자체의 난이도는 쉬웠지만 중간중간 궁금한 점들이 생겨나기 시작했다.

예전 수업 때는 가르쳐주는 내용을 받아 수동적으로 공부했다면,

요즘은 '이 문법을 이렇게 바꿔보면 에러가 날까? 만약 에러가 난다면 어떤 에러인 건가?'라는 생각과 시도를 해보고, 스스로에게 '왜'라는 질문을 해가며 공부를 하고 있는 내 모습을 발견한다.

 

SQL의 필요성을 알기도 했고, 무엇보다 재밌어서 그런 것 같다. 그리고 앞으로 현업에서 실수없이 사용하려면 더 잘 이해해야 한다는 사명감(?)이 들기도 해서 그런 듯 하다. 이왕 공부하는데 제대로 공부해서, 꼭 목표하는 바를 다 이루어야겠다.

 

SQL을 자유자재로 조작해 대시보드(태블로)로 구현하는 내 모습을 상상하며, 오늘의 강의 리뷰는 여기서 마치도록 하겠다. 아자아자!