SQL 강의 - 1주차 (SELECT, WHERE/엑셀보다 쉬운 SQL)

박삐뽀·2023년 4월 24일
0
post-thumbnail

# 1주차에서 배울 것!

데이터 기초 상식

  • 데이터베이스란? 데이터를 관리하기 위한 시스템으로, 여러 사람들이 같이 사용할 목적으로 '데이터를 담는 통'이라고 생각하면 쉽다.
    원하는대로 데이터를 저장하고 사용하기 위한 통상적인 기능으로 CRUD를 지원한다.

    • C (Create):데이터 생성
    • R (Read):저장된 데이터 읽어오기
    • U (Update):저장된 데이터를 변경(업데이트)
    • D (Delete):저장된 데이터를 삭제
  • SQL(Structured Query Language) :
    DB에서 원하는 데이터를 불러오기 위해 요청(Query)을 날리는 언어

  • Select, Where절과 자주 쓰는 문법 연습해보기
    👉데이터를 불러오고 (Select), 조건에 맞게 필터링 하는 것 (Where) !
    SQL을 잘 하기 위해서는 원하는 정보가 어느 테이블에 담겨있는지 잘 찾는 것이 매우 중요하다.

# 기초 Select, Where절 예시

  • ex1 ) orders 테이블에서 결제수단이 카카오페이인 데이터만 가져와줘!
		select * from orders
		where payment_method = "kakaopay";

※ kakaopay가 아닌 "kakaopay"라고 쓰는 이유 👉 필드명이나 테이블명이 아닌 문자열로 인식시키기 위해!
kakaopay라고 쓴다면? 👉 syntax error가 난다.
[Unknown column 'kakaopay' in 'where clause'] 라는 문구가 뜨는데, [where절에는 kakaopay라는 칼럼(필드명)이 없다]라는 의미!

  • ex2 ) 조건을 여러 개 걸어줄 땐 AND 사용
		select * from orders
		where course_title = "앱개발 종합반" and payment_method = "kakaopay";

-> orders 테이블에서 수강 과목이 앱개발 종합반이고 결제 수단이 카카오페이인 데이터

  • ex3 ) point_users 테이블에서 포인트가 5000점 이상인 데이터만 가져와줘!
		select * from point_users
		where point >= 5000;
  • ex4 ) orders 테이블에서 주문한 강의가 웹개발 종합반이면서, 결제수단이 카드인 데이터만 가져와줘!
		select * from orders
		where course_title = "웹개발 종합반" and payment_method = "CARD";
  • ex5 ) 포인트가 20000점보다 많은 유저만 추출
		select * from point_users
		where point > 20000;
  • ex6 ) 성이 박씨인 유저만 추출
		select * from users
		where name = "박**";

# Where절과 자주 같이 쓰는 문법

  • != : 같지 않음
    ex) 주문 테이블에서 웹개발 종합반을 제외한 데이터 추출
	select * from orders
	where course_title != '웹개발 종합반';
  • between A and B : 범위
    ex) 7월 13일, 7월 14일의 주문데이터만 추출
	select * from orders
	where created_at between "2020-07-13" and "2020-07-15";
  • in : 포함
    ex) 1, 3주차 사람들의 '오늘의 다짐' 데이터만 추출
	select * from checkins 
	where week in (1, 3);
  • like : 패턴(문자열 규칙)
    ex) 다음 (daum) 이메일을 사용하는 유저만 추출
	select * from users 
	where email like '%daum.net';
  • where email like 'a%' : email 필드값이 a로 시작하는 모든 데이터
  • where email like '%a' : email 필드값이 a로 끝나는 모든 데이터
  • where email like '%co%' : email 필드값에 co를 포함하는 모든 데이터
  • where email like 'a%o' : email 필드값이 a로 시작하고 o로 끝나는 모든 데이터

# 일부 데이터만 가져오기 : Limit

테이블에 방대한 양의 데이터가 담겨져 있다면, 간단한 조회 혹은 소수의 결과물만 뽑으려 하는데도 시간이 오래 걸릴 수 있다.(당연하다. 조회할 데이터가 많으니까.) 그런 경우를 대비해 limit(제한)를 걸어 일부만 가져올 수 있다.

	select * from orders 
	where payment_method = "kakaopay"
	limit 5;

맨 뒤 limit 숫자 작성 시 숫자만큼만 출력된다!

# 중복 데이터는 제외하고 가져오기 : Distinct

결제 수단의 가짓수를 알기 위해 distinct(구별되는, 별개의)를 이용하여 중복 데이터를 지워준다.

	select distinct(payment_method) from orders;
-예상 정답: 4개(kakaopay, CARD, TAXBILL, MONEY)
 dbeaver에서 해볼 것.

# 몇 개인지 숫자 세보기 : Count

주문 테이블에서 결제 건수를 세고 싶을 때

	select count(*) from orders

⭐응용 문제1
성씨 별 개수가 궁금하다면?

	select count(distinct(name)) from orders

중복된 성이 제외 되고(하나씩만 남음) count로 세어준다.

⭐응용 문제2
Gmail을 사용하는 2020/07/12~13에 가입한 유저를 추출하기

	select * from users
    where email like '%gmail.com'
    and created_at between '2020-07-12' and '2020-07-14';

# 새로 배운 내용

  • '!=' 에서 !(느낌표)는 부정(not)을 의미
  • 범위(between) 사용에서 7월 13, 14일 데이터를 추출한다 했을 때, 지나치듯 between 2020-07-13 and 2020-07-14 라고 생각할 수 있는데 실수하기 쉬운 부분 같다. (13일 0시부터) 14일 24시까지의 데이터를 원하니(=15일 0시 이후부터 제외해야 하므로) between 2020-07-13 and 2020-07-15로 작성해야 한다.
  • 같은 패턴이 반복되는 데이터에서(ex:이메일 형식) %를 기준으로 작성해준다.
  • 문자열은 ' ' 쓰고 숫자열은 X

# 참고할 만한 레퍼런스들

like(패턴) 다양한 문법으로 이용되니 그때그때 필요한 것을 찾아서 쓴다!
('how to use like in sql' 구글링!)

# 아이디어 메모

[꿀팁🍯] 이렇게 쿼리를 작성하면 편해요!

  1. show tables로 어떤 테이블이 있는지 살펴보기
  2. 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 쿼리 날려보기
  3. 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
  4. 테이블을 찾았다! 조건을 걸 필드를 찾기
  5. select * from 테이블명 where 조건 이렇게 쿼리 완성!

# 회고

  • 문자열일 때(또는 like문법 '%a'에서) 작은 따옴표 붙이는 걸 자꾸 까먹어서 에러가 뜬다. 에러 문장 자체가 익숙하지 않으니 어떤 에러인지, 어디서 잘못 된건지 뜯어 고치면서 보니까 간단한 쿼리인데도 오래 걸릴 때가 있다. 강사님께서 삽질 해봐야 한다고 하셨는데, 확실히 맨땅에 헤딩으로 혼자 고민하고 해결하는 시간을 가지니 기억에도 잘 남고 스스로 더 깨닫는 부분도 생긴다. 문제는 복잡한 쿼리를 보면 얼마나 더 난해할지..^^ 더 빨리 더 꼼꼼히 작성할 수 있도록 많이 연습해야 겠다.

  • 아래 쿼리가 왜 에러가 뜨는지 이해가 안됐다.

	select * from users
	where created_at between "2020-07-12" and "2020-07-14"
	and email like "%gmail.com";

왜냐면 2020-07-12(14)라는 필드가 숫자로만 이뤄져 있으니 숫자열, 따라서 따옴표를 안붙여도 된다.라고 너무 굳건히 생각해버려서.. 이런 저런 시도를 계속 하다가 결국 정답을 확인하고 나서야 아차 싶었다. 날짜는 2020년 7월 12일(14일)이니까 사실상 데이터타입이 timestamp이므로 ' '를 붙여야 한다. 보이는 것에 현혹되지 말고 본질을 꿰뚫어 봐야 답이 보인다...!

profile
Life is egg.

0개의 댓글